From c611d0d853e534e1e0d8eb4d48c269f061445fe8 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Mon, 6 Feb 2017 12:25:03 -0500 Subject: [PATCH 1/9] *: vender code and make a Dockerfile --- Dockerfile | 8 + glide.lock | 18 + glide.yaml | 8 + vendor/github.com/gorilla/context | 1 + vendor/github.com/gorilla/mux | 1 + vendor/github.com/vbatts/go-httplog | 1 + vendor/labix.org/v2/mgo/.bzr/README | 3 + vendor/labix.org/v2/mgo/.bzr/branch-format | 1 + .../labix.org/v2/mgo/.bzr/branch/branch.conf | 1 + vendor/labix.org/v2/mgo/.bzr/branch/format | 1 + .../v2/mgo/.bzr/branch/last-revision | 1 + .../labix.org/v2/mgo/.bzr/checkout/conflicts | 1 + .../labix.org/v2/mgo/.bzr/checkout/dirstate | Bin 0 -> 12463 bytes vendor/labix.org/v2/mgo/.bzr/checkout/format | 1 + vendor/labix.org/v2/mgo/.bzr/checkout/views | 0 .../labix.org/v2/mgo/.bzr/repository/format | 1 + .../3e6c1cf43ea6d1aa3348e4f5d16312f2.cix | Bin 0 -> 15169 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.iix | Bin 0 -> 14209 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.rix | Bin 0 -> 14328 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.six | 5 + .../3e6c1cf43ea6d1aa3348e4f5d16312f2.tix | Bin 0 -> 42010 bytes .../v2/mgo/.bzr/repository/pack-names | 6 + .../3e6c1cf43ea6d1aa3348e4f5d16312f2.pack | Bin 0 -> 459533 bytes vendor/labix.org/v2/mgo/.bzrignore | 2 + vendor/labix.org/v2/mgo/LICENSE | 25 + vendor/labix.org/v2/mgo/Makefile | 5 + vendor/labix.org/v2/mgo/auth.go | 412 ++ vendor/labix.org/v2/mgo/auth_test.go | 935 +++++ vendor/labix.org/v2/mgo/bson/LICENSE | 25 + vendor/labix.org/v2/mgo/bson/bson.go | 682 ++++ vendor/labix.org/v2/mgo/bson/bson_test.go | 1466 +++++++ vendor/labix.org/v2/mgo/bson/decode.go | 795 ++++ vendor/labix.org/v2/mgo/bson/encode.go | 462 +++ vendor/labix.org/v2/mgo/bulk.go | 71 + vendor/labix.org/v2/mgo/bulk_test.go | 89 + vendor/labix.org/v2/mgo/cluster.go | 616 +++ vendor/labix.org/v2/mgo/cluster_test.go | 1559 ++++++++ vendor/labix.org/v2/mgo/doc.go | 31 + vendor/labix.org/v2/mgo/export_test.go | 42 + vendor/labix.org/v2/mgo/gridfs.go | 732 ++++ vendor/labix.org/v2/mgo/gridfs_test.go | 644 +++ vendor/labix.org/v2/mgo/log.go | 133 + vendor/labix.org/v2/mgo/queue.go | 91 + vendor/labix.org/v2/mgo/queue_test.go | 104 + vendor/labix.org/v2/mgo/raceoff.go | 6 + vendor/labix.org/v2/mgo/raceon.go | 5 + vendor/labix.org/v2/mgo/saslimpl.go | 11 + vendor/labix.org/v2/mgo/saslstub.go | 11 + vendor/labix.org/v2/mgo/server.go | 444 +++ vendor/labix.org/v2/mgo/session.go | 3517 +++++++++++++++++ vendor/labix.org/v2/mgo/session_test.go | 3260 +++++++++++++++ vendor/labix.org/v2/mgo/socket.go | 673 ++++ vendor/labix.org/v2/mgo/stats.go | 147 + vendor/labix.org/v2/mgo/suite_test.go | 240 ++ vendor/labix.org/v2/mgo/testdb/dropall.js | 47 + vendor/labix.org/v2/mgo/testdb/init.js | 103 + vendor/labix.org/v2/mgo/testdb/setup.sh | 54 + .../labix.org/v2/mgo/testdb/supervisord.conf | 62 + vendor/labix.org/v2/mgo/testdb/wait.js | 58 + vendor/labix.org/v2/mgo/txn/chaos.go | 68 + vendor/labix.org/v2/mgo/txn/debug.go | 108 + vendor/labix.org/v2/mgo/txn/flusher.go | 996 +++++ vendor/labix.org/v2/mgo/txn/mgo_test.go | 101 + vendor/labix.org/v2/mgo/txn/sim_test.go | 389 ++ vendor/labix.org/v2/mgo/txn/tarjan.go | 96 + vendor/labix.org/v2/mgo/txn/tarjan_test.go | 44 + vendor/labix.org/v2/mgo/txn/txn.go | 518 +++ vendor/labix.org/v2/mgo/txn/txn_test.go | 521 +++ vendor/launchpad.net/goyaml/.bzr/README | 3 + .../launchpad.net/goyaml/.bzr/branch-format | 1 + .../goyaml/.bzr/branch/branch.conf | 1 + .../launchpad.net/goyaml/.bzr/branch/format | 1 + .../goyaml/.bzr/branch/last-revision | 1 + .../goyaml/.bzr/checkout/conflicts | 1 + .../goyaml/.bzr/checkout/dirstate | Bin 0 -> 5692 bytes .../launchpad.net/goyaml/.bzr/checkout/format | 1 + .../launchpad.net/goyaml/.bzr/checkout/views | 0 .../goyaml/.bzr/repository/format | 1 + .../dfefc85269662e7e438e0069b6349695.cix | Bin 0 -> 3749 bytes .../dfefc85269662e7e438e0069b6349695.iix | Bin 0 -> 3344 bytes .../dfefc85269662e7e438e0069b6349695.rix | Bin 0 -> 3430 bytes .../dfefc85269662e7e438e0069b6349695.six | 5 + .../dfefc85269662e7e438e0069b6349695.tix | Bin 0 -> 18126 bytes .../goyaml/.bzr/repository/pack-names | 6 + .../dfefc85269662e7e438e0069b6349695.pack | Bin 0 -> 583825 bytes vendor/launchpad.net/goyaml/.bzrignore | 14 + vendor/launchpad.net/goyaml/.lbox | 1 + vendor/launchpad.net/goyaml/.lbox.check | 20 + vendor/launchpad.net/goyaml/LICENSE | 185 + vendor/launchpad.net/goyaml/LICENSE.libyaml | 19 + vendor/launchpad.net/goyaml/Makefile | 39 + vendor/launchpad.net/goyaml/apic.go | 742 ++++ vendor/launchpad.net/goyaml/decode.go | 473 +++ vendor/launchpad.net/goyaml/decode_test.go | 519 +++ vendor/launchpad.net/goyaml/emitterc.go | 1682 ++++++++ vendor/launchpad.net/goyaml/encode.go | 221 ++ vendor/launchpad.net/goyaml/encode_test.go | 379 ++ vendor/launchpad.net/goyaml/goyaml.go | 307 ++ vendor/launchpad.net/goyaml/parserc.go | 1096 +++++ vendor/launchpad.net/goyaml/readerc.go | 391 ++ vendor/launchpad.net/goyaml/resolve.go | 155 + vendor/launchpad.net/goyaml/scannerc.go | 2710 +++++++++++++ vendor/launchpad.net/goyaml/sorter.go | 104 + vendor/launchpad.net/goyaml/suite_test.go | 12 + vendor/launchpad.net/goyaml/writerc.go | 89 + vendor/launchpad.net/goyaml/yamlh.go | 712 ++++ vendor/launchpad.net/goyaml/yamlprivateh.go | 173 + 107 files changed, 30522 insertions(+) create mode 100644 Dockerfile create mode 100644 glide.lock create mode 100644 glide.yaml create mode 160000 vendor/github.com/gorilla/context create mode 160000 vendor/github.com/gorilla/mux create mode 160000 vendor/github.com/vbatts/go-httplog create mode 100644 vendor/labix.org/v2/mgo/.bzr/README create mode 100644 vendor/labix.org/v2/mgo/.bzr/branch-format create mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/branch.conf create mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/format create mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/last-revision create mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/conflicts create mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/dirstate create mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/format create mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/views create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/format create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.rix create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.six create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.tix create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/pack-names create mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack create mode 100644 vendor/labix.org/v2/mgo/.bzrignore create mode 100644 vendor/labix.org/v2/mgo/LICENSE create mode 100644 vendor/labix.org/v2/mgo/Makefile create mode 100644 vendor/labix.org/v2/mgo/auth.go create mode 100644 vendor/labix.org/v2/mgo/auth_test.go create mode 100644 vendor/labix.org/v2/mgo/bson/LICENSE create mode 100644 vendor/labix.org/v2/mgo/bson/bson.go create mode 100644 vendor/labix.org/v2/mgo/bson/bson_test.go create mode 100644 vendor/labix.org/v2/mgo/bson/decode.go create mode 100644 vendor/labix.org/v2/mgo/bson/encode.go create mode 100644 vendor/labix.org/v2/mgo/bulk.go create mode 100644 vendor/labix.org/v2/mgo/bulk_test.go create mode 100644 vendor/labix.org/v2/mgo/cluster.go create mode 100644 vendor/labix.org/v2/mgo/cluster_test.go create mode 100644 vendor/labix.org/v2/mgo/doc.go create mode 100644 vendor/labix.org/v2/mgo/export_test.go create mode 100644 vendor/labix.org/v2/mgo/gridfs.go create mode 100644 vendor/labix.org/v2/mgo/gridfs_test.go create mode 100644 vendor/labix.org/v2/mgo/log.go create mode 100644 vendor/labix.org/v2/mgo/queue.go create mode 100644 vendor/labix.org/v2/mgo/queue_test.go create mode 100644 vendor/labix.org/v2/mgo/raceoff.go create mode 100644 vendor/labix.org/v2/mgo/raceon.go create mode 100644 vendor/labix.org/v2/mgo/saslimpl.go create mode 100644 vendor/labix.org/v2/mgo/saslstub.go create mode 100644 vendor/labix.org/v2/mgo/server.go create mode 100644 vendor/labix.org/v2/mgo/session.go create mode 100644 vendor/labix.org/v2/mgo/session_test.go create mode 100644 vendor/labix.org/v2/mgo/socket.go create mode 100644 vendor/labix.org/v2/mgo/stats.go create mode 100644 vendor/labix.org/v2/mgo/suite_test.go create mode 100644 vendor/labix.org/v2/mgo/testdb/dropall.js create mode 100644 vendor/labix.org/v2/mgo/testdb/init.js create mode 100755 vendor/labix.org/v2/mgo/testdb/setup.sh create mode 100644 vendor/labix.org/v2/mgo/testdb/supervisord.conf create mode 100644 vendor/labix.org/v2/mgo/testdb/wait.js create mode 100644 vendor/labix.org/v2/mgo/txn/chaos.go create mode 100644 vendor/labix.org/v2/mgo/txn/debug.go create mode 100644 vendor/labix.org/v2/mgo/txn/flusher.go create mode 100644 vendor/labix.org/v2/mgo/txn/mgo_test.go create mode 100644 vendor/labix.org/v2/mgo/txn/sim_test.go create mode 100644 vendor/labix.org/v2/mgo/txn/tarjan.go create mode 100644 vendor/labix.org/v2/mgo/txn/tarjan_test.go create mode 100644 vendor/labix.org/v2/mgo/txn/txn.go create mode 100644 vendor/labix.org/v2/mgo/txn/txn_test.go create mode 100644 vendor/launchpad.net/goyaml/.bzr/README create mode 100644 vendor/launchpad.net/goyaml/.bzr/branch-format create mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/branch.conf create mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/format create mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/last-revision create mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/conflicts create mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/dirstate create mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/format create mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/views create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/format create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.cix create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.iix create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.six create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.tix create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/pack-names create mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack create mode 100644 vendor/launchpad.net/goyaml/.bzrignore create mode 100644 vendor/launchpad.net/goyaml/.lbox create mode 100755 vendor/launchpad.net/goyaml/.lbox.check create mode 100644 vendor/launchpad.net/goyaml/LICENSE create mode 100644 vendor/launchpad.net/goyaml/LICENSE.libyaml create mode 100644 vendor/launchpad.net/goyaml/Makefile create mode 100644 vendor/launchpad.net/goyaml/apic.go create mode 100644 vendor/launchpad.net/goyaml/decode.go create mode 100644 vendor/launchpad.net/goyaml/decode_test.go create mode 100644 vendor/launchpad.net/goyaml/emitterc.go create mode 100644 vendor/launchpad.net/goyaml/encode.go create mode 100644 vendor/launchpad.net/goyaml/encode_test.go create mode 100644 vendor/launchpad.net/goyaml/goyaml.go create mode 100644 vendor/launchpad.net/goyaml/parserc.go create mode 100644 vendor/launchpad.net/goyaml/readerc.go create mode 100644 vendor/launchpad.net/goyaml/resolve.go create mode 100644 vendor/launchpad.net/goyaml/scannerc.go create mode 100644 vendor/launchpad.net/goyaml/sorter.go create mode 100644 vendor/launchpad.net/goyaml/suite_test.go create mode 100644 vendor/launchpad.net/goyaml/writerc.go create mode 100644 vendor/launchpad.net/goyaml/yamlh.go create mode 100644 vendor/launchpad.net/goyaml/yamlprivateh.go diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ca702dc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM fedora +RUN dnf install -y golang +RUN mkdir -p /usr/local/src/github.com/vbatts/ +ENV GOPATH=/usr/local +ADD ./ /usr/local/src/github.com/vbatts/imgsrv/ +RUN go install github.com/vbatts/imgsrv +EXPOSE 7777 +ENTRYPOINT ["/usr/local/bin/imgsrv"] diff --git a/glide.lock b/glide.lock new file mode 100644 index 0000000..e468e90 --- /dev/null +++ b/glide.lock @@ -0,0 +1,18 @@ +hash: e99d6e208d9806cd3133aaf20912a1e3ece517fc36c3ad1e67631bc2ba7b4009 +updated: 2017-02-06T12:03:37.357927455-05:00 +imports: +- name: github.com/gorilla/context + version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 +- name: github.com/gorilla/mux + version: 392c28fe23e1c45ddba891b0320b3b5df220beea +- name: github.com/vbatts/go-httplog + version: becd5526f5dcce33a513c4c0ef2c70c761ca66e0 +- name: labix.org/v2/mgo + version: "287" + subpackages: + - bson +- name: labix.org/v2/mgo/sasl + version: "" +- name: launchpad.net/goyaml + version: "51" +testImports: [] diff --git a/glide.yaml b/glide.yaml new file mode 100644 index 0000000..b130ad5 --- /dev/null +++ b/glide.yaml @@ -0,0 +1,8 @@ +package: github.com/vbatts/imgsrv +import: +- package: github.com/gorilla/mux +- package: github.com/vbatts/go-httplog +- package: labix.org/v2/mgo + subpackages: + - bson +- package: launchpad.net/goyaml diff --git a/vendor/github.com/gorilla/context b/vendor/github.com/gorilla/context new file mode 160000 index 0000000..08b5f42 --- /dev/null +++ b/vendor/github.com/gorilla/context @@ -0,0 +1 @@ +Subproject commit 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 diff --git a/vendor/github.com/gorilla/mux b/vendor/github.com/gorilla/mux new file mode 160000 index 0000000..392c28f --- /dev/null +++ b/vendor/github.com/gorilla/mux @@ -0,0 +1 @@ +Subproject commit 392c28fe23e1c45ddba891b0320b3b5df220beea diff --git a/vendor/github.com/vbatts/go-httplog b/vendor/github.com/vbatts/go-httplog new file mode 160000 index 0000000..becd552 --- /dev/null +++ b/vendor/github.com/vbatts/go-httplog @@ -0,0 +1 @@ +Subproject commit becd5526f5dcce33a513c4c0ef2c70c761ca66e0 diff --git a/vendor/labix.org/v2/mgo/.bzr/README b/vendor/labix.org/v2/mgo/.bzr/README new file mode 100644 index 0000000..f82dc1c --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/README @@ -0,0 +1,3 @@ +This is a Bazaar control directory. +Do not change any files in this directory. +See http://bazaar.canonical.com/ for more information about Bazaar. diff --git a/vendor/labix.org/v2/mgo/.bzr/branch-format b/vendor/labix.org/v2/mgo/.bzr/branch-format new file mode 100644 index 0000000..9eb09b7 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/branch-format @@ -0,0 +1 @@ +Bazaar-NG meta directory, format 1 diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf b/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf new file mode 100644 index 0000000..6e3d0e2 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf @@ -0,0 +1 @@ +parent_location = http://bazaar.launchpad.net/~niemeyer/mgo/v2/ diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/format b/vendor/labix.org/v2/mgo/.bzr/branch/format new file mode 100644 index 0000000..dc392f4 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/branch/format @@ -0,0 +1 @@ +Bazaar Branch Format 7 (needs bzr 1.6) diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/last-revision b/vendor/labix.org/v2/mgo/.bzr/branch/last-revision new file mode 100644 index 0000000..b04b872 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/branch/last-revision @@ -0,0 +1 @@ +287 gustavo@niemeyer.net-20140701140051-90be2tvk93pcczzi diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts b/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts new file mode 100644 index 0000000..0dc2d3a --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts @@ -0,0 +1 @@ +BZR conflict list format 1 diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/dirstate b/vendor/labix.org/v2/mgo/.bzr/checkout/dirstate new file mode 100644 index 0000000000000000000000000000000000000000..ce83042d9f2844ee62ea9e14c921ce0bb95868a9 GIT binary patch literal 12463 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 N_^v1&Z1a`i{~zhb>`VXv literal 0 HcmV?d00001 diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/format b/vendor/labix.org/v2/mgo/.bzr/checkout/format new file mode 100644 index 0000000..e0261c7 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/checkout/format @@ -0,0 +1 @@ +Bazaar Working Tree Format 6 (bzr 1.14) diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/views b/vendor/labix.org/v2/mgo/.bzr/checkout/views new file mode 100644 index 0000000..e69de29 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/format b/vendor/labix.org/v2/mgo/.bzr/repository/format new file mode 100644 index 0000000..b200528 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/repository/format @@ -0,0 +1 @@ +Bazaar repository format 2a (needs bzr 1.16 or later) diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix b/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix new file mode 100644 index 0000000000000000000000000000000000000000..426a58daad887b08323830269729e13483232177 GIT binary patch literal 15169 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 literal 0 HcmV?d00001 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix b/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix new file mode 100644 index 0000000000000000000000000000000000000000..42ad105e8281e2d06ed9b64d9ecbaedf824479b0 GIT binary patch literal 14209 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 hgM*XQ8FW_yHSY3@P=xP^3U`E8gNQMM8k!gyR0? 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 literal 0 HcmV?d00001 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/pack-names b/vendor/labix.org/v2/mgo/.bzr/repository/pack-names new file mode 100644 index 0000000..68b65e7 --- /dev/null +++ b/vendor/labix.org/v2/mgo/.bzr/repository/pack-names @@ -0,0 +1,6 @@ +B+Tree Graph Index 2 +node_ref_lists=0 +key_elements=1 +len=1 +row_lengths=1 +xœ ı€0ÀÔ™‚ò`R8 /ÊÂÂÆíõŠ{Þ;Î+<«„-¬T · w¡Ù7LÀÉ¥@…A¹MúC£ƒ 6ëÕOx \ No newline at end of file diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack b/vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack new file mode 100644 index 0000000000000000000000000000000000000000..3421040f86793d6639e04c0e7d9976a3a9a8bf04 GIT binary patch literal 459533 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�akJWhJ*sP9Y9JA)<%w0T8fymI5)xhK*MBO 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

ST^lyD*#?|*(6y1at!09@76h3jC4@X{>TrU#L9 zUIv6!=ya}?@B|nx1GNq#UNzmN4mJPbI}!fh=P&O}P54r(Zny#I?`|8cWac88_vRa- zOgJ@LX(<6in=5Vf)A<#Msi0zVbZGjEFz+wPte3~M9qy;)8g%cPHy6+u1D;?*A$TL+ zE7}TO>j^wE%^lpnrEhy^h56QltGlP`F+10S1C@9F}8N$AOi}cMI17M8Ih2ZoW5q-gUew* zDs_}+I#~O2qCgf)x@(?RB1E=ulEu;~S+FX7&m%SG0b~mQ>0wBD2oK=e>(wnMzMa!W zEqk*Dsh=56Fw*6s6^|t7LYNY$+aH1?A?GUHJ{`WVozSiAr3(5k*;*=`2K2HHu2_sN zZPLN77pnrvviDb$(^oUml@4olmz=~iJ#RJbt)%6_r&uuoPV%JbD;8tXw8ih~CihS? z9l)#gd!hdOfAQO2!q9iQFwxBc2GI8B3Or7ydy5hX)heUAuK;N=a3ieF{=MWL=$<6n z5KKC;AO1hJ-kFO+G&eXfH3|x6V`4FS3N$x2I5r9~H#9ahF$#E`?7a(|rAbvMI91(E z!v_N5AT8b1(AYpDeY4~JP!VWop{lxCXi(NwVd9y2^Koxx-hBHgM_YWbje)p--{JqjHnlrnzWkYEw`f+DOL^ULzrR91%eWAhTWO{5tgbFkFRu+Y`b%oC z9OpQGcBj{7dUdc8*7`5%b<0B8EXz~9GHkAxC}AX+=V54 zE#-$yef(w<&wsb;lL51k{U0!jnJKs@?vyKp(>uYLyc9zA} z0ozz@;?{C^y4PPW+gjjEGA6t-of;P7np!f8Zgxqn&Cl*r-UMwXn#I&!$5))o-q*D1 zY}6IkU*Lnqw50kQtKCN16oSjbRw1~`v5M%ji`(E%F^tfiqsB~1-ifY?^(9v~R&6MC zakcT;CSOC)p@ynO6b7~v09-($zr2ZDORj=?uRBPIsg9 zl91Zy*~MPmSnr6-bDp5lMB2XG@rYH*1s0z|M;#{neseCwxzOj+D^fHj3n!h8PAAN@ zq?l?lOjMpVuPJ%SY_2lvh8xG!<>`;@b`Hs4{FWyX#27wngfy&t3Wt-cM!8gSOx{=e;XuKNJB7HGSzxu{);lu$ z+)sNpYlVa_@mzOS-*7ed-*f4oM zEzL9*S{F)(qNI-^$6Qm;$tF0($V!CDz0S7AhGVoeFMFaBS|0Q6L?aT!>C+3$d-{|&SoL<;x?vpm0$m|bxKEePzzR0E1 zrn4;i-5xsG+N{&Pys_L=$&xoBB@Jf=r8|7hdjJ|HlJ#0tC0SuLvhIdjWf- z2R3^`n55B|&i!(iBc|;n<4&TBPOrN@fNzg8b9H%X4R99o3@O-bqJpM%0V5Gb#VC@j z(bUZGA4b5%!90e5Zn{sVIgSxuMsyRj8Q1W4IvnNd1QxN<$^p{N&91CxVQN|*h?Vt* z;YbzW5 zjoG#R1ayKn6D|0?eov-T~pS-rkIm~U#~EY_rCNm^K;11sP)ULy_^+MuA7 z!b+mHd+vMHJ;y{i=o%3&Y?;9l^L~+wnHpzf*kJ|@5oIT6G6$q*Fe%F3jo-qrpjO!McEP* z;H~qj7!Y?@7R|T6OS?we-oELM*lN)#?uYqV!MGg;x=Lv{}9 zM_6rxw+eE>l6J#=If!A%-UeYXzkgpIk)pFC<9ro!d1-!ut+9E2c?W&G zpPp#W)aA)e3#jE(I(9ghRX1*fF@>@-fRhcrr0NV$iD%`r;e~@;gaC+Xt6)B`41Oka z2F=#m@91gA;6{#09-QqsEhd`oNso5m=QNk97Aw4#@IQuE&$zB|Mu-yS zE9YI7Hh^G}dmfbKweb!={N>q?-)6G8@Af-_Rts7+uw~JiUP&%2vO!?W{f#n6O#rnp zG-+9!%&A833{VOmV*mmZwG?g>09gabVz%c#7CMQEt(q6RX?2m!HqirC2U`py{1KQAma$a9ueGtjp3aCUr1x~Tt>iuljD7AS zA1a0MTb@J`SI4grr=1r`(Gj6>ywp$({vi7(H7ycTv2?7;jbqm7p)^)j7pDd@$LrPZ zlf&3;CScgRy^g>p5*-KyPuAJk+7k0C-R??FaUsOoI4yz{h4WfO8uBz(WC#L(Y=TtL z@&GDIF%Rpd`TAziT^Ji*@ACqav>FqY@9Xnqs61Bffz$+0IT)FBpxPb?AYnDs!c9~{ zISGW`zz{g8yr1UE%2;c8U-X-x(PU=7+wsW^9yD9gF#>_onnX~sXvJy}0vHHj0Pa7U zqCiP3-*$j2VP!DZJobgY@!L!`_nm%^f#VMI@SPRu=GNx2NM*&$<~aoO6qNQ-3+27h zF-L*mn4)(qX%VYZg>h3n!5&2?XoJ=6$^mvUdMf+;-h>S&lfnMZPbLT$KHzLoK`?|n z;GgOXqMb^~xom1kuml0b+h{F@cz1OXQMWtjFXyS$@73d{Sx^N_Btgyq@L8^@>Zg9MW_8q*W*b$K#BXia1l zN*CIx7~lh0bke~40WKo!Xz?cN;hc%<3 z%CaP;LMe(*Fl+3-U68R`Oc3>U`aD@Cjd#BA7z)oWWbJ7W0AQadpXi(?_)}|!~U>)(37fGkp3b;W6O4Z0r(T0*# zY+_k?I8#v+aZ2g+rGNK~(@)Gla*FzW!4uEZp_tpsq>+z1g96B#5qCVWcTqIs4s6#yt7u#R#SQI&!zcy;M*kNc_X+w)WB_eR+M!`1)S%SR~elZ(eaQ1PeFL5 z0?#mTv(4@KWwhsYx@%NtA6YfB9jow#vDXJ@shC>pYZsbpnqTAdPD*fgz0rmQ*G#AmEg030lDve7uX3cmM)pHKAj{c?F?f;XfkN&_fo@!s! zT>mmk91*ZL=GWJ|HLE$hu#|gS^NqG%6nKdUk7#RvQM;N!j!Y>^M-VIKvyMq^+fDn1 zCx5U#b<>$UqVqCnRd~&=(#dU7l%(N<2vK{m3Q!EjY`pY?U-+aazVX9PzsnX|5)3#( zGvFb`fr1zTeYvbskVW9zQ75-EsrKJJ<0CH_CcbL8qK?^GSu-on_UppJTv|2_l*>dl z0S*g*HI)RJ!_#50v1D=#Ofye|y7U*%eBbHzHD90_`-*5nm3+%-Wy;1-FHg}v-Sqdz{#tk-)9R;OG}OA zp`a7xl+H#v?GR-$7GH$&=yMTESip5O1g_i1pL##(roHDWUosVf@gZ8QDyUjm0ix;( z#u{sM1>RY5{7qnhrpzmT>B*<>x$$UCw;y0H+tpJ0Bz^}J@X;IFXWjZ`mu|ZCyHCCG z!#BM2$dMZXQ-{N#^l=zBd{B;DX}CXcxMnhQ1V#WysD~SANImTef5}k1XKB|}u#PYN zET+3`R@K$DuTW=;dsi z0@vMWqFdVP&xQVC;{)Jfj@2!5O_sUsYYie!TCLl2w~7G4YqUJ^Do_g+ee>}fBwn8^TNX>FLzD; z;<@2gGnpUr9bl7%IJ0WyJe$^YTQg0`rby^pX}CpIt%XdO#`g^?S>~jr_bhpsz7dRc zd7j{oAdIPXr|)YT^n8ymtH|IH5#3_gM$R&6z zY~fchV{=4oI%m@Mlp2^OtpXslcu3ZdsG4>3D8xv8eB!z>c;F%S;o|qZF zg6~9<4SIDUP!fh9{?q=|4ZQu+8-Cyw+udpbf7~$wUT9-3^T5{^oSJKZCaR+S!>B?` zHCX4ZELgu@rfji>SpY(@&?18J5M`A1r<*(4Ke+MYeS|wK#wE1r@LqA#Ar={Xt8??4 z>rIhC`b4N8!I4x-BY>SI1G@uwkYqx;P2h2U-Wt7WUqH4@;$I#|Ec@K9CBOpBQtczuQy;1$9i(}_1;(#~M}zc$Zr zKhb>K`H^Gx5o?8&0#MC>L!8E1mvDR)5hB7w2v{l4I5`u=+8=uS2k+fWz7?voxWajl z=lRu*jaj?CKHFqZ!6?bBSd3*rc{jU&w3e(DRJ-#+*S--1C( zVGuzSGo88FIK2f8Z7r<tb{R}bC*lk~=54yn5Wg$(p)^gxft~26`_L97brZa$QDY1_4 zORQ@jy#BWK*S_%EFAz8cHdF}8ovzBUA7^FMn{sxcJJ(e77IX5-VYwGCtxd2bU3hRz zd0%5igmD7#OAoVl+YdhFdF?Mf$(Y40AkG#qkN zHo(_f&xg?#(A63a_n)yqbEZQfa<`80_WVu%67zfbjXJN6o(UXY7zHbq-OT+Nr z+1Oz&CqXD-6I~m`iu3fPs8uQfe~0ddCyVWEw?4nU>DKSOK(>T_CH!Bf&iH9Tv|s#;*Y8-AA$rkS znD@Y6hNw-t?sp+&9ud5l6u(od5x>h)dcL=FKv2#9g?&0&k_O zNCO5nvpP5W*J-Z@@{MB}Q=x&H~G*L@It71$APwXnWANYv0pbLJ zPXc&~*xcgmrbbLlSTVuqpd;;)Ua7 zfV}TMb(S_gASw@S_IiFW*jhG*66`lN7Mhx~nig{+(&IKht|rSdL*Z(^)9pUYVat{e{a%D=;c8JByoZ8?*goChPKYSM~)c5#lQh zIx>tN%$2eUxQvVrRiK${U`~jN3=(DSTc7aW_NSh8Ggl^;f;A;!B47p8n;IAcXp|I| zD9hglttl@Q0a)%2=`80m zg&jQ~xg zI3>aqOuQnXCYZF$uH;Y~@8E1GBG7QTM^tjb1KfsOHLU{&a*cJx3jA3F%^Ol#(OAEu zzHO4RaeCzPHeO{oOszcEfcioSs|`mK#}a|-L%@x2f#{HHJ4{R4AzE*~@hnAX1Wc`@ z=};&Eep7L4QEajSJUS);L<*yKfdN3li&B{bm|G|gEM4QTfglWB!)X8d`M*d@z5~-t z@XiS#4>D1-=Y}Q4z{xmZowXXyzknn+K;p9f>pTCy{0rAT)E~CbenDr)%bl4D6|f+I zTsj3L3{04+2+D$_a4f`>!5JXX;V-s7)%g+@E%`DbYObIyfJ+fZClDtk z!{|9Ls=~N-Lgzz};i0wAe)Eei?6=_dxAD~-vuvO6Vt&BThN4UO!(B6Jf8xbwcNN_J z#fv*bwf*!+wY4w4dupUE+V8)6>L>wUAk0WR3Q~89T`L-(ty#fy7IE}XcCG3$_(r2%~qLNPCbZe)2iv=Yz{Efn5lA=V&vQkJKq66cLC4@57oWrAn7PU??pw-hTKo?>w}+_)9N5gopo& z^HS1@h@oAZ!OHa7dR(4f?=HHT#rX#0%TQu8K@+3lcknA#2dqONtOBb;Sr)j1F8l7I z;TI>dg7#NmIyFMIzi{*JNJRt|(M3BaZSY{F9#V-K zU?M@b_+vmj#CW0XgiClR@hRaA&=7-obBaKoLYJTeCFV(hEbX9N4yWgbfyiH#F}=I} z=g+yB#Q?4kc*0_?pwDndB?_7j%gjsIP6n@42;3!D z0M4u-Zf${1+;IP7SN*`OmcR*}L3Nf=cS+BbnN_P6)9eguYKTIBOkjCwf=%2RTa^NY z0aU3jDTB6vpp68#aYu&oW6Y=hmY1I!NAK;Q;peVKVW)Q_1uq8Ln`L3HNXoJV!Owth zp=KL>rNRw`1uEP?+2Q-QFNREmj&T|94A$iAKrh7EHE+6$46)D<4N+1?S#-^T?nQ$- z3BU^U?dYn!)Ns?}BRoIaN(jB`Xa&Y0>3A?npNx$HzvIGMlMN4ag~dk@p(Po7Ns$;`)BqI&y!p;IQ@HjnIro((c_WDG? zx}tGT$Dkb50rA#EEF-5l{w^hLZ3+qGQA&VkIyh8vKf@{K&tK6B+K-525( zzVcrFXwp>sqzj|b+688Y9G|igLf+bv(;FhJb_c6wZ2;S=C3*vpj$aTmH3y?(#yLxs zcA^(xHMH$V+iUz`5dQn0{M+g9nG{y#_L8oH5!n5kV9u>$*I?3f%B`m3XQqfMHCY5Nqo$VJ5pSO#+hg9P2q zT2!fsN;U$-%e7BF{ek~>b$)K|Dh$ckYp~%?odrE!%`;oNtjHC!{{m4Qw?%vVV>;K< zPrvc)w_Y4IXbIY0y#uWP42TlT(q%ehmX0zzGY=&?@LYuT;r(0ca(~v+$WiR%cipu! z@NwIGaC!d+E|ROqFh2Y-lsRX_pt6oA>Jgr{JQFE{ZVE zt#Jiz%LGVn^C_rW*M@)0qYWSlUv)>XnV9$k!WQKw1pb=q%|(H88BC6GRGC z7^zdG+F&`Acr$*74_x|0^S!6eQnyzeCpb-_j8}jQScs~U5`rv#=attHxK|pW9Fb^y z7JlbF_l+E6(VPxlXzRieuL<07&Zdj>B>}=v)dhiRr{nUA~4}~A6 z^qM)lI;XwH8`2iay7vK8o`|3kp&cQpmx)~4i= zQJhtT+W?a#J_6k7c7p1qUwTS7eQsOrpfuWcirCcBJGQ#CI*?&bHn2hn&rzWPonp%H zhf+Gq(xFOHl)A-XVO~M<#t?Uj zN=By}O%fUQ*&AoreBZF2H+Ca(ypP%b2*&-@BgPFBY+?X$^`NjSfKVDVhA~H#nRX++SuO$BL?zhF}$#DwYMaIrD~tw%N;Z_25_LsZCu(2n z$=2zSy&_P9Py{L+kxfO<%=uV#N+EcjIaQ7b%z;dRw(A4gH_O|}H|DOL& zuVy43L+Y}6b93Ey7w2L5i?iJZ>(``|Ii)HASw^@;N*xRoFlp1s5Qhf$pt6!?H!fWI z(;Ghg^!C3~_g+q-`Oee-_v?-TENmCBv_JecX9;Swe~5nrB(&ufceLN|3b8+;w?F!d zi|x~2dDnqR*}mqL=l3F9`_B7sZa?xR zxc|OA|Jz=8)p_!p?OR`UmONhjXRmtIu7_%0_Ua3Jex?11SD%AJ@Q-W5*WI^kQtdB) z-ML}%)QzvXcTa`wH{myXl7ADV(BApqJoV8y=lk!!c`63$Xb+z&&nasbeAU8M3)Nf8 zF!l)cRh16IdQ1G$8=m|xPF)kZyyej?m-bU%KQ-=TfB0)|o(fqwN>eq`Q&x$gby=x8 zCxVqWCT3%bRB2eF(2MqupYhQVviYM^k22YO+vyX?r2U8AFm=pCfB(9@iN5c}uRk?3 zNFftr0gwZZHqowgQnaU(z;qGflyi;_h&|Pw)=XYeAg_7l&3DKQa%||ZD{BMFhOlD` zZQ1!?l42=TIA!3k_TRkXD<4(T!{F~C#1B|s!K5gAq?!aTECZ{GGDa}Mmj_Krt2PI zf!=@rEmL%4P1z)p?!8kTCipkXCq$G3j22*0bdJfk!bz560FP&(E!^PRM? zCd$%g-IRk35jRs)A$Fi@Ff$FMIScHNOD(|E#TU2+_*FVJpvVjydq6r5o;pf84`P*U zN7e522c_{7uRe1pi-1ecltPu#0tW~bpc-^pyHw7!GlDKHT1%lq(Z3%^HtHWc!=@d;_2ncS* z=NJ*+LZPBEpe7I9-n;Y%H!h!=JS+WyQ}pe-ysCzapun7?a+GVGq_-+mPA7p>FAvD2 zSaN@esB)O1M@2Q^#fVRLHuN-$a+Nc&p!+>78X+p!hKJA0ITXs|^V&yN3Ob`J;glki zA*{wRz0Di;_UYndZ+sb*5bw+xpmx2cRkzDGmgi-YlHfAZ?J2`E_!)DmBoH*Zqo6Bu zJV;9IA-9N89=U;j{tM3Bsg!q|4rXOAp>TM62R?5J*i#}kbfpBo6dUK^G4K43`TMV% z$PU_f2fptN#)DrO0b<|b{XX|gD{*;c*=)=qsAiiuGrm@QPGbaMmO*C&bvt2UJkmut zNvgi+jTP5I<=Y#tBZj1^M(CH7N@r2T;~eUPSIxQ#?%)Y6iJ7<=mtubkX#183J91J+ z=95FfhsOjEli+q0UK8xG0Q2gkVhZH;!FY#ugm(8GP=5O#;>(UyTzh}IbEuEsIQ_|! z>ZAQYIQaQFCOt-ZC%=aXK!M{W~Dwn?^yX$kydcm)=tuCK!Xp=Svmo4ZV0wIur zrJY<>>7-v!_JB!_d(&Xac)+*^cLedpTq-DnL;M;H8Ve?Pt*}%p;1t56#_zHM?^U#r zhSkU?l;!t5dSyxTpURaNtp(*;dl|CRL6%%n;^6x{z~7c^DH)6;C&kd9cAB=IEqp>@ z{Lyv4buER_{=tpYa|_)x6UzM5%xWI=doP;r_QG<1s=qwFT|o)Uhz>zC>x9}{TO0Ie zS2vb?9=Ks$5UjN1G_Z`3HUzD+$A8FZvLPo5&S-0ynpD}o;fWu( zQkR|yAToNw2i}!#_iJ4o0+{4f1q9G&cYhgmxa+HQ^HC=#3fUe|REx1D!SP*c& zLphl*Izz>FC8J!e(I#(;;9y-ffV+=XKZ|6j*lYT!VfkZ!$&hUV6iB%VBEQkZ5 zR;NkWKrin8LT;)?P%q1#U1acBo449h&q@YzG#C|ote`LQ9B-O~La>w3gPI>4S zQ9c-fK7G zS$;sb?dxZcI27HltzW&iF=9JQ(J@8UP9Q+GwCQ?_(=$r=Wz!qX(gPeqNn4o}R4%Ge zNp2RDDhB_nDnUb70bIh^h<6>8rTA5I=ME^Wee>M86HB^%`ux;Yi0}Q^UVQEE%wM?j zq|a|ZbU=p|y0bN>`D|~|GPSa_uxNV?SZso)uR6eZ0Q+q+)-w*IiQgwU7p*AHu9 z$3NG?d((9%7ao2;1%eV(&h(;zE>w?D(B(5pNd=zj@M&E$3@rmDfzkzxS=a7MAPY@+PafrqB+5gvZS@#G8x9jm}Sl+P3p_=~lqs7mOY9muL5DQP07 z@cdXlSUA}iowxuj2RYR&dRt)-hLQ!@FYF(gy?l*@-G1#8 zZs9u6{Q@au2DPy=1KYse({&(`G3gX@kU{xvp{hxQ+P-}881wyK9!W9j-kFY)64aYA zWVB_ufLxno9W2NDLM5S#S0TV@BBoh=P^h|h%T$U!+v1sXh+xjcBn;I{$eJ$f$qL?5 zla47->|$5C>?mE zuEX1Hl$maIfsYU+8}#9orpsnV@kfP{-ut;QVaTfegVm`~sgc`?XrH|{wJY8B8`nN} zcD?@&%ex+CkzLapU7u@Vedgp@w=jYK<36lr#c0Euu3$2wWDzB)Y+?{5I%5%zql|R* zloIQWe$=PwVon#XadPcDuKS-)oY{;YxYJX$IB6&W7T|=z#c?N-Ps*hjnFFkk+6N5* z%du}seXis?hmYKP&JE9wL`U;5aDI?&x2rZ+S7k%htia|eFE0vkeX5>pgECSvB_m}L z!p8&9Q$-WcuYDf$pMHKNM;tiTe9bFwZvXn5_~qlp51ks*QJ$p!)9X*2<3bPX3%X8! zc4aUV*VsZ$qAak`@J!j9F<7X(IQ#;P&T0WL0aelzg?w3%B?ytnD6yA55tq_=8ADJ20q>kLmo zDc4j6pVw#@3&t=pl%jB-`-xCV0nIy3uguSHPMejb+4-8frV;c&h7y5QqeHDc7p|%( zqShL-pjy-5tag|oNpCP5Gm(!xyc0RQT`o^C*IAFeyHTgvGViaknYhp}x=}fNGc-|p z1~{XLG6xlgOaHi;%_i(_%4l|dy zP>eImM-@K$mA)Cwu5}k>+*oRySBk2LQZX1AD^HfHYG|gt;I@ifsphEAwW0DgZp3*b zrvJy|PX7p+{$sbEY5ycpOnBqz6Rs|rqtv<+%EEN7EZGg_SC^yMqT4Bsd)ikvA<>pt zplTq6foZE!Fl_+0lz5<1YPwTHtLxR@aqozk{^aLyrmg$VbH^Q|V~B76oDFe1$D}Rs zt}%xBzUw}5HQ2EIqHn(QDj?s7p02s4A}z{wmcwk4gBiPSLs=P2v-W8(>|BBQeap*l znTk3iKLAW%8B)XQe!rAD9v#yr$cy z%|gIp)!PA$Bj?k$p*cNOMm+8U%O$X zKL6F}vGv*h=IgKJ`Wv;qf<@N8F5!d$8ip(c86}>rPo+ z@n&PCJHNg;H_ewf8?GX}oRvOhU|Fq8)x{t#FiJC}=L6~806|=tZc~wNe&hSPSJL%a zM@dywpl)r0&jzbxe`|Kl4mKKVExo+vq@(-@?imP3(Ogk+Xnb z`uk!5&wRNWzEZ91k{zrHs)Fp*7OPG1!(yAoI{Kv~kEmx-P|6xm5O8>3m9NA1@|gF> z=)bk!fA$g5+%NyV(Omnl{>jUaU35yQPV#YKb}=mV8IbS#2Ed$%r5cs$uqb14M#6!M z;md!qTDqvIs!59P*7*Fds(Zv$$D9!r{{M@=tR)16!2uuDDHFRV!jajbe< zOXATF9~^So6;LacJ)_+^9;rrrPs)_t#o$A8PyG_4Lsc{#t5o$jjT? zU(X&P!M^9Q`vrSWGAjDVhWi*?^<;O$m$@~V#;{s#sUVn5E+!y zQsEZiYGV!e!xs~%WVaTa@&P-3Zn~g_b->QV&0A7(hKLT$BW`wJ^m#V+QB zq+;bAHM5j-znC!1rRd7FCPr&HJ*x>=PnYUJg$v#Dk5(AE+!LJ9)rm4ZAv|=I>fyDj z^CNW=M2RlP2o9edlPWuFbFDcuP1VJmkS3JuJY5j?W>|cGWPb{|nOe zF0b`6-)d4;8pw`Ss4eS~D!qvnrBpF0rV^*ecBC0rzc<6`_wC>K3p+LIAGjBP#|2l4 zf$qh{CFb({Dib;9jrpcjPpR!L>u5_XwkE6K)5P#Utme^JRbaf0_xwmaU(TQ5C2$Gq zVPUSxS8kZIBA0{#Wv~@cLWr*v<)}8$cH#To<$K?-Mn6`Em8R1dn>s9St+=A+w+4Kz z5#)X8bt;&?Hy%sDVtIja8lQ?)+y=q$;W{k&wtHi3xA=SeU%rC8z^{>wO*Mh8{FK6l zr?(_2zeg0Wy`*OaA}8&6w z>+n*cg5t6gbmI+d(A({cSv&e>LNnfROIy(`tQb#TG={AP_*PUpGxF9js`d_}$3iw( z#oPy;gv>cPt{dxse-E6V{N!8iyOQ$T8-H}_c#Zz}^#>5q7#iLAqq~~Se9Tp57=L7` zsKV$vTCkCON%uaL%CR!*8VR6xHU4r^>~yUSV4Hx#lK?Www6(IfDmQ1S(wAD=Xo|Ka zP$5LHOiQ*y3A3RlgL={E?d)l33 zqs|tr2RVFz(IZ3$L1mgeBB~B1<_r#jkOQ3fXwdM(uawW6o-}M;8>Kw@qUXaW<2OwV zO+Jrgd}=ro-Y6GDj2XBRU=s8T7*qwoML_`xI5G!1Ue@$NhJS<{()V3IQZMvn9>6P7 zrYC4AUxuF8j7soGrSSvRnPCf4y!zvY%YU1kL!Mo6Aq0;cuGW^XeUPj?WIOG} z&>PQ`MP4ku5F^>}QSesY@%;8VcYf!QTKTg_P%HeUw@lGvWP&NsTH}=Q6+p^3RydbY z6c;U3qRncUNu{hjMv45TXFADNDy}Ld0Jkb3fqc-mOWTS-C`tOQ$wEyO3l;RD8&p*Yi+`A8 z9qt!&SYV5@Rco2>>ORHzVu>YzG$85is{3euQ2fq|R|=NR~2!=*I`JoRlqa%;ys zutPeZg;UnW*=iL)ARHJsB~q>QuAux`i`mNZKnPA@96AWLVNo=rydsd ze&+?jnE-QFUh&St9G^~W^J+$VxnBBPjY(8V!53@5;CSE~Zr$P^5uDd0(wkkyW}X|r z^Nz~phX=NIRt}>ZmQxhw2Iy?p0MA!evd zzU|2#`k7m)dMh+OCoHrqs-(Ikp&)J>E{h^&>oBltolKcCtUV#dx9xWwU=(!S^GWjzI@x}|9toP?MhoPlHt>}T6Ow$u#lE>Z?WrEqz$>Lk<~Q3v1b^) zI>!R1r{D-FDSD5N>I#=?bz`m8?7)^2?4y0*&+#Lj(Rcma%g0yN&)hJQs*b6wi}!7> zF(w6%FM@Yfdy&2FOc`h(ZU+R4B<7PjA475D9bh56~l2XJc+|9mcyl6PITsUzu(~WYN>BK*Vs34K>%QRjxWnrBs&E@F7B@sK(3) z)5#Z?`_pB4YOyRXmKUYa>-V}T?0esko?`WMW2rOO@2@W|ZEVfWZA=F@5Dh)b7U+2( zR_T@x)@kJt{)bB}Bwi#P#RktbLLnc%7BbzBgMM#+nv`JePe1XWj-Dz+Sqr`U&a+O4 zwKXP5mqL?~!MouTJ5nptC?F8`$k}{*-FxnP7!38Zr>}{jwttS%jq)n5`DddLYi|Fi ze|C{n)875whX<=(rA+OcZ|(q!dg(a5;clD-b3-Jv(NisZ5fXV6HGFE9FqIi!1AqOv z-`uBxTZZra(z81fu5DpeQ07nF2r1jee*4NdPwgB(N`W7flIxC$sn?a=RmWEH5?`2a z3`~?4=0sA4VQJ8llrnnsnyshzV5tH~2$3q|3w=n<=eI$Uq=GY@MICb2EX>H2usj=< z`%MUr#o|nK^t2-)aW!CVR1r_R=#x!Fo4_4C_pJ4hke;FYh+t6C2-m4SyR>dM*9OxY zOJZ%Q+Z6JtrC=lgvOURPUkCL&sp7NoYX(;p6d!3zw9nhu*2g+Rl65j&4^B0l{=- zYI=EN)9XR4Q4Ja)fWB495wN>@dNE!R{1JuNJf(Y4@fqlQc;qM!KUL74_7{#b`ky`3 z{y$%KrhU%Se)l-z9~zHkK(d;5W}KZ}o$YmJm{_ADQA&Q`mZeCX7_L5g&2%M~$F)u1 zAC_^#U#9U?1bHVIkLV9}D;=W*Ll6$I5_*rFh>#qNfb+WGBa+Hr4srj^GuLN!tVlTRJ7S?^pZmE7)X($AMso#U@_}=(6)vFt2DJ?C}Z?V$tH!eqkNK1A5=}C1?mzIo?HG7T08B5HB%cL8uX?m#o<7d$o z0fbKQawSg-c7I_iRy|aDZ zbH8n9NDn^uPw3y5K7Pk%P7hbGqkstw^R;z3ySzEG80PznY$G)L9o#WLx$XMi**^G{ z7xG)L37oy!!1FCTo&W-ouG5{Fu_1*tt^4!c_2tkQD%3}h4Kb!YynF;1_jGPqRT8;U zMepbsO9VOG_7#>#ZvbmI{&{Eou=K#ALqF|(zkL1?lcZh_t-_tDZi z%tdo&5sM?eAd2>c`S>*5IqIX5>o)u12u33%Opibn|BUuTxu;5 z&kf?7Pgo^@F2hxVuI@RqE37P0z&*6BqFRX+CVa5bR4!8G#NPq=tZOXvZpYq#nOMpH z^6#yZDLP1QDu5mUOcC@ROmI>2;%#Iuuqs?B&;d|A5I+DLDU{BP@BZqWxv@TGz#WD- z=v7LmNz5;c&FQ%< z#BD%6a0=#3jcHhYAB?QjK+nAddcroAQ0ZQkA6D+o<)n6S?}$-2UR;UAFrO_zBp9dE zbk~(e4)zYfPOo>!0(dUBGi)9PV|wSQmy8%9Ze1nM3hy{ctdvp4=m6>yb1?<`-i?}Es97zJ*@3lvAseR^l4k_?tol7VO9!Y9~|DX={9wfkS{`_}Ex{v|#;iOr+Y zEp2}Axn#FPsr=l7&mG!c`>!8-#hx=3A31kG&p&<85#RoyGaa3V(BK zoEKGuARJ`|!uZSHjfwWX&p9(i_xPQm7hZYNf^sjcRDlBra2IOKQOn`2w<|D~?TZ2o zY=`+y;IlJc%MB4{N>9&iG!Za`B}&*Wu$L@A&YkiC027QJAOwPD3I2B93G5g~*#5~! z*h%eb_hN%!Om+}&=DSYkIUQ#$v(pW;R&Y2Nqq3uSK@+_w84WX3gS{}R5u~K1C);)} zHjv~U)`Vbmwj=5Jbm<~GQwp=jU)Y2{Rd6)A@~geSFqvWR-Qj>=?yPJgdP*S&v%SG) zf4Z`H6D4~s)0D69Qbk#uQI&!Bmv))a5jzmX`Qnac*tKUVfOmeEBoSZO|-C_iJ}!)DK=y zKiSI1J?q@wPtb1Te3z{Z*i7oJDAQZ(HB>j;!fw2SnU!4NUp){kcbSKjY)r!2Dgp4g z670C;ei36DXZ&(+!s9j=W5W2s8$*YqaHK_k=Tci(}2@3-+W!eUiOg93c?_@&R87JYA}D2rj%@s;vno!ZUbDDMipVvPP?+ zBc(paR-xIR-s^VeH-5YE*2LZ%q4&|QfD%WgD!}oqDhJ^1qVPrpV3uSY-HD9JN-73z zyf_g1{!zo-u$7DOnA(nA3kHf{lo1K-Es3XN6cbrwXBx*2XDH) zz4)~6*dLHDE|)rA(#ljA^f&}O)$JYs;eD@epQLp|%FJN}E}MzbKWv-BU!b{;vP-xx zW&@o!N^ewB)+g=3mj#nW6<(dvTF?bpA>}Z&<)NSGudW<7i;EpDt|){t+N1e?DNHJa z{^`|~W5p1NcPF~IDU5>M)<|rPSMW&{3yDOtLZ|I=n*!~AgvL}CR))epW^5NR5qU@s z6LdiBPa=q&PdsKki?9Mf9u0j+y?pWS&vfv>{D}pan{M1)%y~;8&=IQL1GasyoB8Avc9;MhXi<0`ejJ3!~ z7W%L(#_xdIpGX$lpSWQxtDwg@14qOnaL0{y0O=tx#CcExKqD^-wt&qy?A(N3_w#Xt`oi`DlFzbSO`0kW_Bb9X5*Paealo zf+)u7fZCs26w71!io~^ImUh-EyoM7(q^N4OX83Tm2+SDTA#e?dA3ItS$F6il4>w8@ zW4H=;6_Oa&Di}Rin~kO`Em{YVPa6f#$rK-y1~oFYn+qqQy*eO@-e6%cJ>EixDEwhj zOwa+^pGXutpSXS;n=n~hIuoHn99$Z%FyEZCBo4@GP+WK=hRL$dGkK&W#_<$_jgZ6` zopEB;$5upTaBtW_8gB2S_)`$K8zO%guDVTd_F2h{!~ zqS*Pwc;SP2<2dG@9b7{8(qzXaJsK%9BmpX&iv_4qjkC%fDTw1$da)x8!^}xKK>Mo@ z#Pkhg*+f9Fa3zSGMXL$R zVtHJfK-|bNJLQ=(SQ5GdRMhGzF+4d#I26Q@`G)SoA1#S7f`>SaGbiZ)?XN}>V>*iA zYrFJ#=J4_vZLTW`tQF|-04I3`0`-n(4pB(HUlbd(A2V+75QkyrBpsmriA1sUiLru5 zt|D2GjzUjH6)%DTpeQMcqP3&SAV$l~Yi>CA!*|vXPh_m%aTsP!&;hl-3Q3G<69Mp2 zJ0T$ioS;3LpF|LQUpPGm9nD!K zkvMbCa4!p&iCM-HyrZxgJiUfORU*L5t#L<*;rJZ}vWUYNbAk@2{Z$BJyvPAg5p9wj ztScdul8ek>;IdYxypNuq{jFM4TD|rA4Pt4vo94zgh{FhTg7#>B5;^RBVGM%^2$8aK z>luI~IH)qgi%2*Ai=ji#%7hG_j`J9k`Y17sWf1Z(zMP-~YJU}i7|$Rm4>ei|;A9hB z_%tC}n+hw+^T=Q>Fc1~%@TnHIpK~mikjK>LMR^!pPS9MQ2wGnLK-0eIj;D{@m#8U3 zkZvsn^v^{G;WS|6EHYt)qjTsGbqEbNQo18#FxLL1JPa%+XpiPsBZYDHFC#NT8O=+D z4Md?q!X=DD7XYjZBLN2|ry)rUcK@Onq|h7N6b^&R37X3jLCVV?IMx&#Ju~CAOaf?u zRmZI55}~tFT}VN1JS0jxgMS18Wk<+hJX1J~Cnso+=2s(y@wT$FViBmpsX%oJ1D#Oo zQd10&1^gvegk_EmFOD4)!*X|VyueTX@i3U2paW`uGC>SKF($!anOh~bf$FVNywKye zbU9hXQb515EQ*#%m4tBsORa1!j=Q^bQ65H=6Ev460+g3OaBSG1TD_H1y&GeEphDxi zBrfT+no7CUsI4mzWK+;h;3H%(R@hL7;p7DE(fn$pup2h+9kp#60G9$mYO0=6t&X0H zN~LL&jIfVk&L9>1f*7{nCpjwZ@=d?7eO>Mkf8)L@rh>H>K7Mop<$wOz&FyN>bA2ZlXbGOSnL(LDursmMqZQj&}&i(3_4O3YOA?xKrIer zK>qyWA9%;9_LfgP^&00pw*UAO7u&_ZyrET(yRB_Ld35J`~K6&F~F6V`{Px$}YdlN9r zvZ_q=bMlkun(GE8B6YvvPw(hH{^O5q z_9ptYAM}@hn!C5Wglfaca-+n)m1K2i||G`|Iz2%DKP)eILl(kAL7) z_eCE#_pwg@dG5aa&+oWy@9+Qc2XpteAH3t7-+l6ja`#Oi+Ve2<&eI=G-M4*s*TcN& zix2It{6*^C@R3v9KmUvK9_FbZ$=#2A{R!2AAQO>Px6Z&%iX{I z*q&d0&R^#4cl_0)ul`i-{>x9F>VDIw&mFAa`*iMp%V*9Vthan7cW?gdJ9e9nM&R9low{3} zJ=Oj0&pu@jxoofb=x1~H2R?W9F+Tpe+&%sIJ&*C(&+}o~>|AQssf+7jT1*AIk|tOP zn+<@d6o|KE6_^-z)&q~It%EF<2hFu)T7b7S9<;^m&Su~LemPgCnW4ir+_*wTCv-?{ z(@kNL4ANFr=m3tTq7lQg*)N*Hbbsl;-_d>HJMPyV{hMZIaDJ%ssC@}S_ecMx#iM3# zSnfmI7gF~pzwl3Y;N?qS$lWJ>F|_dVU%q(D9=v{Ya}U95Jos4jj#nsnrBbocWyiCj z3^l4#QZ%nJIj<_Ub6|||Yw&&z-mk&?<%0Ka`f^_m-udNYkb{>6OMCYe?n@8;%U>D0 z29VbP@)|&1Hh}!fAKloY=1E#nr!p@+Ez?s8H0o|>B{(i)%Fsb{MrY+E-&F`s2reM& zXN!*9@@gja`-68t|F9)r?>T4ZIb0(U7UmLrux)`d3A48I2C*MR&QkY5Axy+Gdk)srKm9j>V^ zfYUs=AnCl2v6@bO8p)%MELkt3q!#a9@V3zwU3L-77{Avkp+*-~);zPq5JCXm6R4$ys#3T03QDEciUwbKWsUR~4eEmn=3aV0zi{E&YhZp2%&&p@VZgk{ zzjmav2cxN2ayQ=jknV|Bce)vzeZlC^^w{-9Snp?K(|Ng{f2IPKu;NLv? zmUC(j?Z)EXMl-SxZKj{R9zQuiai3v@#V=ei>U=D8hbh*5xY|0G)9!=n&h(A+)oVuD zk<8)`ZtOT7V@^qOZ*oO^HzFF^C=%MVmEWm%q~)|R#JFfzAgKgVF|0&Qh31s>(7wqD zkO`h;HO8h&9ptzTJT#VXxBR{`tpA?t_E`TzuYBm4{si5Vcb;D*`b^z8XZ=n zbNKT*%LAUQP_Z#@nJpz#+vFOVihFv^^HuxBm{)Ywt8Y8g{owe`&^vW6HN$pO0zuXA zI%a*oO!?J~ke8MhR^(*E3^gtZ%0s`)Y*nJROu1xy*K4MtOF}YVCAH{qXIgX&xnGSs zWL2v1OiMurxmXH{m8vN5peQ<2 z0kOg3n^Z2=G(z>8PG7Y7Uw07m!{j__=~e5Mppy7>h42!bq`cmeim*9xE$H+-r@kD! z+pFU0-kV0Z72`EG*y9Ghulc5t+b-UEKRu9Q?X_O-HQzMCkHR2N-44)_`W1JkqDmWi zW-G7D#r27;+60Ms%rg8|RcAFMgb4)_B3J0<%1n)!iaH@cLnw*^8TPTi{m?P%xXPJh zB2)`uPL&%F@}0|(4v#>u#pr@awNac~c`x*XpSk3I(0k*<@%lpycp8kAQ?n7lsjuAh zik+5eqAtaUR^snluW z5VxrqFlUYsRBNWz7IY3*YngHtEH{ekIo}H%;ptbNBlJG`k48?Pv0(2zzjFt;^*PA3k7szZdw!t=sJ$CFEsip@yxE z$vD2@!uag$8f&5t)FjYQtB*?UalmXVphQ@nolcsAa|^8^`GcT^d@^3|4c|J#FSCW; zeAQSOk9KntT*#0F;Ep;;9opJt!4}FZD1v%%=9-fBZF5$pjv2W(A31XCm1N7eUQM>_ z{m(~@+Fd}8l|_{0%1!o z*(eEZuG>02JDYm6tV|Vd7JjaG1F$@<&H^bT@tI56El)FjdJ;%Zw%fpc!)oKR4vYEB7yxf)?B zppjF*8`e+5K0d$w{R2d+p1FBsXX&u_^qWU6X4&@&cav6`hQOTDn1|kql0*QCBwhuS zL}ZCk-;%10w!U%RI(A@h=sk>M{Ep9t&p8109L$Ed3kF)pN$-me+geXP%rC6YiS_k4 zztm)DYGOcbssmD@=d?+cS*gtU=%h5fc*TlsxG}Ev+aqy@(?cIBsw^dhUIojKfvT)y zvS->+s??Og6ymtwpj zm$JUyC?vg$D8WeLWW~}(n2A$tc6@%E&o@q)=#6*WQd3Bts}{vOt#SrJsi0%B(6Mb4 zmF7a)^|&4L*A76Q_By7aF;m`o>9sFGW2{t>P9m`9P@N1m@<5d=qbeF9i<^BzR`0!X z>cMOXxOF(j%jtNL^Pe{?b6U$-Ia@`QXQl}lwtEYqmQcyKfYe8XE%@MGee03SVz}yam48EVG z%pey4(Z+-FiOfN9qE1;eBZDf*DRK$X;Fqnw5D}*ldW{_s$LJ_;Iy6T)Zb!i#0PQ-P z0&@r%Ii?hZPmmh;4DR5w*4bLjH9%NH^{DM-!IH=N?N#kx_ZLQo<2GaWikt6b#@?y# z!2K_WaoSi{olzm=$ha~|sHB8cpi?U3lzfg>Qpa!;YvY_3x<9$MH=V689TQfjTwJzt za<0y9`l&{;l5>Kx)0W8$LBn#En)(WWPGl!7rg_oHU~)rlTmh5&4F~WFys{(S$qhH1 z$-HWo$HV4Q*;t_U#)f6uOVpVuB@BzI`k)zgO&3sAbRr0Ys_>g6ob_(uyuFxdz{E^( z905>CkSGcnRPoU;7ez#%~^kHXOHS^uGT4My{l3 zKHS*7&wSs=;bw2Qe&=IG?ndg;ORt3Kdj%PZ7CV^c!~$3cOuVSPnd-QlTbo-2lXTfY z_9re8^R!_)d;Ge$rBZqG2%^AK)S7xFIl<4cg~9hLgyq>LUPPj`VQD-In6yeKXH_s3 zp^>URQga#0_hAc{-eLZqgDiF(*kNvO(M?FnmF;Y9tmJjRFf&!xr^a~&=Ysmqic1>@-u39J1FUTZatrW#6r5G)EwSC?XM*{F_JY@rNqGFO+3ywQhQBsBllC)HzJyEhk zY1`s%X9@14<_vpsmSMSySYBaSE4@v%cpW%{2WX)f9zF%gJZKYT%=RkVko)C=2f`1* zi=@LS;@O-3ufsA+JW%hJ zAJ_$F|KcvYb-JHZSc zk*Gpf&9%YQa*#P}7m^LQpHj8*qTz}*deD`?44l2h$iTZWd2P%FiYGP3f|pzoNcN?p zmHiFVDVfltZ-yS4{Q- zQd#60sr{Aptl;0kz96khDS~txAeOlzEdTz?3=(bB15$IYRcA)bF0iS&`Q>rFG3VCi zn+mZVQ#H)!m<3`Gf=FQwLYPrMzGyM5iq;#27X5PzSA_rcp7@wPvn8+S{oBW!zbAL( zhNc^iN>v2Q-uvVVSd$bfXh|)x4I*PTMOKppoYSmo2&EFdU|H6G1}laqnSD2Y-Y7Eq7Lr|B?kR>YtKEXn87-#Po14l5$m(U31xH<&%&=-$+ z+{jU$?;hwfy-z>x5-`#84Snm-q1DnyEt93TfU#z-3v^uskWv`g15YpNuyZ?NOEVW1CJKe@D$LPLgg-%kU$+R+l6ahv1|Hc%tt#y(XK&- zR7$$L;4=y1d! z3*a`5gi6r&QjekUbb=428XbhQF;Vhc2(S(hLTHc=I=-s1@it(jq}cJ8cN{5RbpNFp z3K!k`+XGs^zt!WlHwF=zn#?QdL`Ybs-m3 zN~+3Nt7|l@TGcpV?P2#`F5owh8~SA4K*K9er^|T?F-HL#)g*<7oGiRZ=z8#GL;b0Z z-lK@fTRK5R9;GEAmC1k#f=5Q&!4z7N22Q6SjExOtFz>kOKU`kynfZ~kvgc}WE_z|+ zs`f>s$gHiD%c(;uS{rVpFA4lmWy&A-v2onwB(njJd2m#Ov2KqZ!UxPGYxn5hXYr%IEkE!9zGquN++8cCgwpJ%4 zg0_K4Mm@7@ia<~&a6zt)Bz{e|8I2Uaz zMqESzk>m>#n9kDFP$S?IVUP~QTwP(1Uhzm-Pd|Dwr#WXGvzlj@i!EDqYHLD=$);HA zZ1tunA7vC!11URAtJAW06QfUrn90MB9Fym-=MB6utxYRWtwbTZv|*qmB~w*s0pMi- zxoi{!Zi0VVw&P#V80cT81+$V-nx|HsO}-+`YFXUa6ud0SxdwiaG8YcKNK>VTppwnJ zYTR3MC4JQymvYu%UUGX$+_d-1aCW!h@_Qb9ZM2h$0;mPfOO8nZCk&*aPDxW&^kAV< zov}Il#%a?p%za5*wD-n1vQzT0cSG8>g!l5nfb%oy5&_N?XvyAN@^*FBONSx&L&u#v zY}~9a&riqAsRfr^ooYPQbLZOEq&V;-WE%zJh(F#6Q8oB_bScVA7^2kq7&7q2hI)Y% zIvoLs$wdpPEb}163?Ifz5D5q)3S>EC`i{$dU@$e_cA0ph`-Ml}z*+*9RB@7n0qO)u z;@YJ|nc_xhZnFe@(Q|9jrc!?X)J@%wpZe)*{&wtuaB_SXAUtV&7a;u71p%RN-QIi0 zN7yxsT{4T&Fv!GBg@$O)y;ql$1{HHm2%l@nRa9nUVp=mof_CwG7b~S3bh6IHaYzn9 zeUyVUr3!<QJ-YBiV8Z@!B@PO13aR4-?@chnD~lMQqjv(Q z5T`nIW_@9KW_@WQP3Eo1)wQOAi?Ga?2akc_t4h3rx5z4@hoq<`TgHnJtrLg~IKii` zg@-HD3Ft49G00iXf{{5F7ER?!BlK$~p?kffj#{$XnA=rhegRv5?8JM%r~3&t#MZwv z(*5tJzHP9HueqosW1F8|gl(^Qi8_IzQe& zXL<78J<1rN(Xp6xHpv9V5}eeQ%oHFgv=x^!XDWe=N69m#7`yiT3|+?I&(VPk<>-8j zm1$d(O`yt*gUd(oS|=R~h0^?(JvYtoXzce_hnOYZ7wdbX`FgL}*v{~!FFv<%PKNK% zjPp;Ox>t`gz2xXv+oi%9PRQ z6VqdB*^f_dESM$*n~jCKWF|ldC$B}K9oE8>@=E6M`uA5 zi(__N3+Ealn-=t0q&!kV>0RAVeajyWc7sdQ&JKU&tO(;u@Gverza-H?joW+9k0C$~ zwb}0tv{^s>O9>|=t-)kxUBDxT5?IL)E|x0eODA~MCaQ)@{JF=Q`13!GnVxEitQu|* z3Y~+#bh4)CB#3e{jt%`1$BqD5)qd zgYXa$S}|T>s4Qz$Hj7HT7n+(()^_6cYt7>_E~~&aQV9XjI19NTBzMI~X^f*)b0aL1 z9P`y6{9K%LIG7#ZdM~geef`JydYCO+CLooMB`6>)7)qogFq}$zGH$9DEVuR1f-Rhk zsryGwKSbs8nBmC=%bhJ$F2TV3IZ%p7;Ue&$109J}$-tV%op;Lk2(9^R*YC0BNquW; z$tUP@nCX-4DECHqXkLflP`m+()4M0>l@e{uTSrU!Sy0m-+23_LV|H9EITzK0$QVly z01T4X^VHU<(%@1B*hGz1Yi`RU*`xE1Q?5O*gJ=jzjY-3m=}ay;JH9+4{37#$u{lXv~_(EC9(P` z>kDST#mhUkadsvtTL>C}K{^IaTZFz(8>t^M~>dtrej7Ol}j3SN;3|LU925_P+BMMh2kP zzq{Wb?6wOo>R3Vb)u^n9QW4K3BliISZD&G- zs?0Q7Uy7^ii<_#EJiu$HoO+=YbCIi*T8Uyk(;1jujDcpQT?v4?+Xa4)8+uy>N^J_& zPStp7D#~jaZsZx0n&bZ#XsdC926L|s1iMfXugz_u74s5!j^2t?gY$q{q6zpT6=#%u z1)DYP=kGcNcPqyf_B2r?@2t+OtgKCMOioSbxrJCa5O#EhJ!1x&P*CGsxfmrC(hVBH zi8+9yV~N(~nL5vzUvc6_W(&1WmZ?_ntB$rxFA6@*>q;%MArgg68P7$XPS0j&Jn8!J z`M5kk_e;-vD81hpxDx0NOO*A-siL02Rgp>+mzb#+`1TcTyv$t>1Hle3G zD2-=;u<^zCDg)wFPD!ZBEz`nPYcTeNRE@OG37TlPlEo-N-7wkN(rjgBZgoj-a5fuV zYG6s&oF&PM)x~Ei3mypoDXSC$?5xI6Ok~uvM09`Q>wo`;`?sTdHm0)-h|NnYi+L(; zP0f1SXkH@dgUQ8JRzvo9I?C#)LP4E{LIg2ouBe8)HRnf)+kk??167??orRbt?EL)9 z^wJ`m9G{wnDl>_S8Df~2Ooo@N7-mCZoN8PYyo5_t6u6ggtraeSBrkm;ZPhcuwdTCD zVHer>?6lliU3EDw>qb@T@Wup@gJ>L8^@i*)A}g*F5IM2{hYY5%?fT7Zm@aj4rgTr; z_u=1Q|2Nyv7vKJ{-QOOu-ETPYkGr3H;J0=k{eW-0DF$Dt+Y%KKq%wJ)D;jK<11n%$ zH45tt2CjkUcYo+XFWm!r_&Z}jsOk_ExPVyYI^%gbuBzE65g8rZ%ux%~_Nr|6zPC}5 zF6MaY1bmdT1}&^dco$J}1H|;!u376c-GYcE*!p6lIB~C47ERk>?9S zdh5c5F<}+&%o`o1!di%1$}cZ2!ZUgGEU8MpUIZvf<~490OLR41LK|sS@q$`SDo(q> z`Gu#>4Gz6qo(3MgALjR-_OxAPVn6n@k;m;u*WUL&9Wi|yFne21A2~m61L}J3d-~2f z(R1Ld_poQQ)!)tqrCxkSzbQfQm!E-~0wj8W`HZtMz4w3o;>ZPq`b&GS_{EVY9(d~X zZhq#-P5VuW-oi6!WB06^_x>||W2c|p(?)LWR3fVtJPXsjL?7V#a3=^*8>#sjf`xXN z7VuEP{f>tMC!}YpvkH({UYwd*-%N{Mk54xNNQe~^dvp8HE9`#0^mpwsoPd)CNp`M(~*SMUwQTaP$wsjmi?)NZ2+uUrQ9LyQCK zETSCn)QO!MEj!Nj-tNdKq`9`zP^U^u1wCbvv`%bo(u&R!v5<^)+!(M@rQ~_x{+dJn z3_akDHzBSSoi*VQ2R79R01Z^+qX;gP7sf!gA!x!O+b&Qv`uh{nqwu2V4)&tf>|+SL zG1f>`(ZM#LtUM2hB)k-EHM4ZW3^XmpcEf=0MJT!f2cf23NC*wG4{WhMN>ZfT#i;2hcf)dMyLyVy&Fi&zbd+E7k5T7ZcPFiK~v&n_!gV zWhO6;&&l!Bqzc7o5|v@1Wm<6Ns*=drfrC-~KjA4E%_k68=lZp)kJWSDcNKfinUNL{ znVq?^GPf}^E6S?foLE>MZ)!|VQwn>8uq;&A8cr2SDtZwTNQRZ*=9DcCYHhYx+=kpQ zL#TRcBnQR}0SpBN9h|9q9Ca)MNLFeNO^S7Y9d!k{Xm9D?ZI>cFR^J-JldpK+q9Ga` z6F?nK4c9WAwv5z=CRzkkg(;ea1+fAVsJy_3q~|Rv(RHpCMrY3;uBj?qz+9(QXcZL) z@$}Y1^CW0-i*RhEy5=jl<_b?Dej}CQ;8z0S~6TgRM~I{ z5YcWQz2e06kL9!)+Syu2n>xzX<+*uPrr2_m5ak$ydeJ3_Vhb%xL8(+I<|yc3rlZ_d z?oVA- z_v^ng@}Mz@$6T4L%IC<9)|I-!vZxA+5CSGRojCKg600_Pua=|bjhtesT2m)Y$%4%Y z^p1Nvs8V8)F;|@TnMaV-At)8)6Jwmbsu~}>)6TMLEH?xqF;fRdfhReC z`S#K{e{bS9=$HB~P0#(&)wDvr~^5gC}wrmBhwPAL%x6pgmpu;W}=c;!$JM(m<8=-@X(2Lv8p zc|}C3U_g;m_bm|X3W;brIj=k4d3!(ho4dA~@C~Urtr%kxcyDMY(?fF_@3IL@C|Y)B z(Im|?T#@t3v9xfmD~{4qco8-Egm9gl;LgfQ^<9KUzy@%m+GRjgzoKEZwJEhP zVa%2S8cPHtgMrj2sO&zqLlaCJm!e}0IUn2hTuSYL8?Xq=B^5jqw1%u*t^(K=Q>>YV zWHCl?S|bMTm>z}GKIgt~5D!cf(=#R1Z*Ksp(lormXEuE|zLj&qE%>(=wquf8VbDj@ z6VsMYi_}OHz~yalZJLpGl_@}>S2eNVWQf9*qAIhEb&}CUxSdLIQl%uLcxOVb&dkot zl*O5i6}E0ulOY2VF|fj%jgkh%Vn{hHho>rRX0;e5X!Y6j>v5kr`EA|*apLVe8+t>Z z7Sltz!jcKZA~p1&hM|Dr)cb-{E5pbcrXJN6bGw&RhTk?-@Bv+Fk<8m5lt@8wm#HTb zh9cT5lgz4EOhegUecyM^J?s82Jw5bujIC77Jmf5BD=o5I0VDW^xAY#KI+i9QiO@*V z*H1(5r!n1f)HD@qG$1v!^=ouu~ONhc_C))+WUqW;|;MsdKa7^%+|xEYPm^B(ZX?yo)I$8R0#F4QTA z>eTQkloVj`Mbq#kpoy;ro}#_22qul>)||nG$Fw`+uQfN`L|v^VUb?ERsCln6RKm$i z>ak3G06vke6^&$45G34o=3y)oorQ^|jhRI?zi6FVQ42E-hrfbZ1lpOZ5-_f_CR(6^ z1X*aS<^bOXJxrVaaRygz8~Tdio5@?JjZhXkCyFAAk(SExR2jVsCFxQC@kaEE8gGNs zEp$&Ryr!Ay2){NSXD6nYJfGoiYq_biCWCj^Ldc?+a8zEv7AsUL+(av-r*2FXZ(aA} z-}DE!54{^Wv^605pHnq zN$=}lJaRTA6;FI)N2?IwY65&GS!gdy2~tu;W(>j|q6X-i zC4|sc^;g$$8Hl>4+5(OjX#E(B3>kbL{>f`3wGXZjJJ>AXQ_>FFFX}z$C1-mS_vT)L z_kaz1Z=km;{|b8Vyx6|=}`>VwWD*icRsL)sjfVKL;0{H}c=O5I_M((pv^rCON^V2K9} zxd=r|#r9)PERy5NzPxP*7L<%fS`wB%QXM?-HmS2$R_LT_23$tko{r>r1Hr6+D<2cJ zldM)iG8R#2cT^{8B}4t0VfO$UTpcA(n*Pzh^IWxcJJ1RjT)TA$)P_Md6l*F4)DnP8 z4IL5{zH|gD;zEx7hLh(zcJH+>-Co!k=&!x&U$$#mr~S_Nzig0tIOA2lUw&Di`uD&3 ze_uA@?zY`A%s1YQaRYaVih)EFABiAlsR7$n77Q+{-b?G-P|J6P+VkC{S6{weJh1)h z-@knSbAkPze(L3CsrId$(HTy`fkPd;A(t7e^XpslIWET~@K`RK%_>mSiQrYX74aP` zgPH6MG%04P2g{|n;&u$(!Od&!Gs1^#C)+yDe=hW~G!)g)eXT+4=EW%g0u`#}}wbl5P ztRPj*X#E7{ z%kfW8mD+4$thB&m$Pg58F;vL&K!|AkVGt3vrv7Vy18qB7Gs|-`6MA)elC7?)aY`0T z9Hw%W3a>c}>;f$0lx3vMFRKWRMGl~|+_T~HtM`Ata^&WnN%M!V92sSW+9J_8PVga6 zT1DZRAtIBQVo<<_vV=?~9x8Y9&{omF2l1P>v%ER8Im7*0U{i8@D#Go+hm2w>h>Twe zksAw^oV`uO_>v>IBS<-90R+x=9@NnLQL`0lsP0ydp-^4^EQSl<>$Lv?^UnbwN#CJ zkB$`+gOUuyk8(Z0BM}S()Ey##DKKu~l_nX*a@vX}IB#u;XbG||E5bL0bSrg`2_|*L z7|;TX5F&yOj$*k!uUq|Ycj*16SD(fH9Siq9_38^V$>&~H+t7DNDJtoFY!}U;C>8f4 zs1P$MmD(!S(Afn-Mychll+dF#COynphS?ZwsDuVHN`XR&vj$HmMWhDf)hXF(PwG9n zW6a*vZx4vgchf#!z3yV|b309N&A0?IcIwos*RIw%5f^!0unlA{bOLqfl)gCVNsM>p z)q%NrY9*0?$qBr!q4Xs)G#tHxCV`;xeToBPiChPksU38*nf5>t@d882KpAP8SS~`Gr+DP|+a<@?jWR>Ym(Z?`l8-=N5RL_% zn2`?Q8}T+7&}8GvF}u*|{*X%vrrTNFU{UCeG8fAVbmUCK0#OI&Jx{eT489Y9X+vtB zLj)*zS!Mye&{{6~u0<~g2@3eg+)@oHX-W}^vBKJxM!;aOB`u7gT_vq(d2Ikrz;VF& zy-B{(W&~&wtN|TS5UvY?ar7KaMA$%8(1;>=v0vD@fYaXAk1C`NeP^UQ=8=g8d~uA)ZS1y0|A@ChU`w}?B88HI=$t!!&Vu{_j>kq+x)-% zYW{U+f$6rsAqCS~bXFFmoSdo?VWzMUHrED&rd!l&u4~5737AD<&l!aL9Dp!D~wJ z=ldLU>V3}}0DGS}ad`~iyZ(2Nk1gEwy8y~cDdMnIQBq*6VqvL*|ABNDYLN`N3=ocV zA^|ASUvk2A`)+I>*eJd4eIp)h|B=2MFa5vRrJni_&Liqs0>y`9d$HSbBok` z+Db$9`+&CwvaB6xx()#|=FOMM zHu$|!7NxUA6$olN|5a1aw6G1ariJ8m_KS`iiJ)lvRv#nE;Y~1WEVKypataQSj)WKl znTDcnH}IfwN&%GqxMq&)Qq2ao)ckIP z-!NOg?c#0u_Y}HKuF6!c18rm?Mka(C9XX;kRD&U&~k?8F^CWL5&fC%!`&RphdL17KG zpLQ~V<^~22tf2vx>NahiF2nQ;nR}`@K$(!q3flJy)O?2a$Fw0IhU)@BxjDaO`4QQO zegqb-Bh;vIX(eN`*4QmDv1nLIkY5mbR#^O> zRiOezJH(xg(3#9-C>$7D+d*|eh8VkjXfSDsFw>F7t*3dhrB^0r!p3-}+N@bK5OIY1 zh-ih^5qN@t2ltXXMnG~%%ABR8uC_iN#`tE>A$Mu3n$&HiH8?yYqCBLlr5$2P6%rtY z8ro9chonLuaN1~75u_*amca|CKvTn^S>--;BM#=$KS&!Enqd+$(;1gyVXMx1H7m@# zTv>1EV3K#W3PH*_7K}b(h4#fELV%4`M1`CY`;6>9;XyAuG}hrwZ{2a|9)I(IrJNyv z^sG1c0jYi6zk2h2c=WArLCpBmW3@D%;>L~xM^&!vHOr);1Hy_Lu4L90&aj0J-l{67 z&70~Q8lOGtA_zs$o{oMgTABx23RDo3@`!=|lyjjCGjLkY<$eW14v1arZyou;i!u^k zZgi|rMofRZgGZ-0o)z%qFkP(_feE~s!mGpa!H6R@jWqc-zp~Uu%+OYd6ODD4}LJ`Fz z$z#O?;FKWcsHhJWBMH1j+j5VAJ8DPeO8?(aS1NX~kQ~K!9F%5w% zC@qMFpF3A7?JS7Mlnq4rXxARVTpG%Q673A8>o_=%huapbBAreMtQb0jk}D6CM?}4G zqA*G{nmIKnnfSgZ-Rg*$gn(2$&5(`_NFf5 zBG6HtWL2SL;;7*Q+nZyz54~SvsaDMIip!GGbdZ;dFq5}<<+!Pu)0R#m*O30WUE^@v z?6A}KyZ-DlLUP|Lm2#bBFE&D6*pkX@vAkFsCJJq`np`5wx=`5{L@!x^mkxgb&Cv3o z+l^(0=`%JRe7{nt`V<|Nfb^Es4piv?ZIG-{p)krfswT(WDDV1tF2`xppE~)vBeUrb zk}p%9uhX`}=i=fD+gL1Hdbv()E;OF`k|d@tufqByL#+TuP8D(}f!6{vnU%pb&RrpX z(R=5+w@+&RqxT$sgW*tSc+-iuvVD$m=rhMSF3v8$`L(aOcMao9PQI1(e&l_3&zrA| zQ9FGmGZ3!OQEQt)EbGnb<-G3aHdY!+?^V(8b}fc#+&iO{$_Bwy1!apjk`6L~Co;Xg zINa`UJ7-w%m9}~ibVbcJf?PUTY$+m_Y<(aC9vkJ99hg#cROb5hiNlzyeF4jB%$h@| zD;ov(AW14$X{b0hpgARg2;)?jg?sMKl@M2wfqN4l*q#>cn7!cx$E@Ri>QHl|z4cT7 zd{@%&zTbJ_dCl*uT0uGX~xq+m?pwnq_NcGQfBZSuECDLf~zoAYnBVoM(3&MRk_!I{&~D~~1|^Fn zforF%LA0$iV%QqUkk6oottuAUEue))7g@o*X+J@EXq}jZDd3r|T?6442C&O#d7ArF zkCX~ScP8A-xLL513$wH1E=(^%kyP3N)5QxJ7X=<^hT5TRZEr%N2sN-P!Eh7M4vrL5H-HDjqw}fQnu66; zt5U6~28yc))h2nleUrRsFgn!ll#(GWOFK>sQXf zhTr{*Vc779k6e(xTxRERLIMF~XKqJ3Szk`39~C@ zi~wptmA?cJG28-5ir1KEOl;E^a*p1UKRN&|e(R&VPKxcZQm^^g!I0vfIQUHaj*mvH z3BS2g^2#RVdkW-_8_ta;ZtEe)aL)5zo`mqo4>rY-OgWSR=uO2|jqmMEMPGM3 z@|}v3sd8UxpkqK(9ig?&z&x5Gu+6hiz2v4F&R@TgO%rBjx{vslN8fL!kjeHpy5D?# z=Oq38c_R;RKZ^jENuFhKP9-UIrqUc$QPTzM6_cdgsRVjs1#8pTclp7|eNOB3U0}Dt z>0`z$)&Av_W1i`hEHs$XDWwRgD#0@iD*ZyGBo4j*eMC;ujwGH-B`Rs2HRCZzkg%Xd+dYEAG6;eiLIoz$P7iF_ zc@%E($?INnQ}4l_8M)ztEEx2<=i>AX!SYO;St2PS3)LPsEYhhy z27V#EumY}PMPRl%h&OZjLR zlMZ)bVrG1PYhgl~C6%WeNBularL$XJ)mP0k`wLwwneWlp-FqM{Ni@WyTeWk zyxRU-aCd)zUvTok1B_b|O9P9ERH-usIv`#{;w)AkRV;yeo2C@J$h84s(^ty?w=0iM z2<^D(%r4DvHaoGtZkKYLnGg+?AP*F>ovA#~PIyqY|Jy=>M>A8D1F35?^_Dokx$xD4 z&jm77@0PzC;aAP*OF?I~Whc&gzmXQjqL^4nd}5}NhEwB1&jOWW6Tt-PzyR3t)Eh`D z<9%TONsPW7TwdbtkN&?s_(XZ`m)n{~iDf!)5HTAR{-T)+s^x&W((?xn32Yc5QD1po z4W^=3J0ueI2|xHWs|J!MFsTwNM8-X*CT&#ED_R3xL3NLnMl?G}>cxSrvF%;dNlSJ( zFi9*LIXzt$)%wPILz@*faEnmJY)BS5+ZkFMLU@g|6;LZR;DeQvv+63b(wPaxp-nrg zZp@5Vm(*m{<956>iF!t}46n3pOFO77R_PE7z9lP%POTma$Trl6=s-(j=h?e=$5#%z zf_&gf_0_LjQvP-EQv?q>3gzaL$#ldPd=1LadCOx-3bX`RVB1rG)g+EV2C+NdK|btU zp(0yKch)yWVoMX*PP6qHOxz|2T5)C0#X=4F1Y|TKeM&|#DC10Z+HIi1Rz|7ztmf5V zuHmoDfmb}6BrI1{bHsV@o65Pe96XrHiBOT;7#onCyO;0iZVYeE z@btb=Gii^w26EwpVUf1@rI4ahGPZ6MvjevlT02pOUQ*i1+HPl2`-9@N%ZZ9&(SH;5 zz%^7ATZ`T41{d#1FTU@;KR8ZHp%^ud<()Xaw8^)8nbtu}O-Tg!B(orjTx=4qI1%u; z2=%HOW5H)MxK~DmZ>W{eeiZ{x55Ij3sYVBan?uM&*sP%d;f|#(NXUKWo(iirZM#Ww zpvU7cl;B5I;yP+>V^Xbp?v__(Hm0YjZevy$Xj{G0#TG6!cz({*t%&+}2M3uInU{@Y zZRNgPLhFY2*E>VB^Su#G!*ty(|K$6>?}xhin#)_F0O*LGzG_2Z!5Ei*IDuD;>x5|Cn&@loi394!ARH>n4QzhQem`vS< znM<<3L!~O7+UfE^RVHqwEg1}yrnTUSmH9QOP(1zQa!zipp&sfW%PbWEQQ@=>k&Iyq z>F=ry6=xR8`$kgf2+YG#Chv~dX*r-@uthpL zokMl$k}9H5)$qM#zK7k_2n}H1nuUrmj(1iS;w)8_H6=P3TH&%bRsc=Ef%-1WKqEpq z@SQwcXZ5-mS9(L2t;NlTk?&WFr{!PQ z`kL@WIc0=9i$AI`s-=b-IZ(4MQ3%v$|+Yi7H8Jh=E(D? z-bOSc6-BX>N{Bd)d*#YJ6@`Jub`c*cnzmQOo)X_f?S&EJ&R0cyF&V)I&Qz$S7^z`8 z8CeVuh%$|oUT>d-rG)|IDe~u?9_?V1dhF@ zo;vaPgW_55%iF)))*5=kbteYY8hX`rC;Is?r>;M73r*MF6RyX1sD$%>xc-;*;#dR?0j!9ka z?BnlqqQ4FM8}t_{aPj&3oY=V@4Lbah^K5J$%_K}ZJ^)Ch!8uq?Pvp}62dOET^E zJ4V}qZ4-;TX;54_$^<|XqACkU`I8Zt;i>d`4G}Yz}g1A$>@%UsU3&h$C&rGz33@NS?}-5^7Z)|Pzx946Zr^Q=-cQ~S_dhel^yHL2O}!}q z`iKG$jvji~s9>xhPnW>Sz?7ujSRu{sZV&q#rT4-6oft%PfA-|%8tKPVl=1LS-r1Zs zMV5s%Zt~)EU7`cNgmEBy9D&pd!6E=o=qyB`ZkK>SkhWq&%)$;`TN|V^p-XoeejxoZR5!BFDKfGuQAWflT;!cHlOcjUMEzTHdy^r=x<*0AxW- zz=ORX1hyABd+u}py>pkQf z@PSv6Id+^b>yT1ZR7A=v%od?wrBbM^pmLGLB%K2oCyYE5Q8?z2f7ihSQX4BXb*YX% zXGoAlgovjAO(r2LB78@H34w_ePWq-_fAI)y^u8C4Jj8g$L{6BV(ASKL6Dw(BqCQAg znMBFzIt80d<6^;tw#+9c3p?GR;yaR5N5w@kItY_LXUIy6`q?5gas+x5-& zIb3+7H9{>r8)ai_WjV5Op%=Dhr!yFBFjOMFWM?bHr_*g6Z(TWUbp&eRlcn{sk(Tdk zZ(32K5@ebL>6~BPTHTtRb7o`0uTQNu)I)>%%4zR>)Fy%?$7HB%d|-$fR6iVYJnObW zs=PRl>An4dC(Hru->Pv9C7^}tXgxJI$(H46S(tTeQwVs_9-vB)DaJ7>zUC_9B7pll zux{aep`NUv&s{rrbgCLK zXq_c@qMez&3r|Cwv_MOF0s8JObz6X4H2%wrb0pjp?HMSqBLpww-VU33!#~Ftn{^3Q zR=~9P7F0pQJ52_XGe|fNM68Bt?kUmNfxFj?1`dkiu}xE?fIa-JiYxPbrQI{-!C9}Zj8WfE@Fk~u#>$vcEdK<|M(5t zVE@(|w!!|v-?$6x7ryZvT4iZ{Uy6=jQOhN47BewDFJ>8QYKYdsgXt8gh#A2tR26WE z&(w@TXP>1kRbYAn5r+nWb|@{KOOCXqhd+r*u`?EGum~zrMXh2g6@JdC+-V?$xEr%bo$sp-{4KCuK0pHrFXCPV@Y)1CwOz={;8 zCsd#=K1C*9M0PqAhyY>E>B+FK;d*a)=&tB}Xj}Zv!53t%N?Y`uI|*<{u2nK%ahNiy zs08p2Rv_>Is2QVXrcfUk^9yK@BN+4FKh)|gHTvOP@=kJLZq@1Otu-ySmS;*Mickvt zn3gIn?M)O!1gfCSQ!0SnVx_9qwCJbzWyl!68#|6ir7`IdC`lt^Qr4bjP|7T*^(&Z0 z=85$?$6ujl9zIauE0%dLOi3!S$Q|el-nAmYLLp_)X4U38G@{+vzfja3_&F2@wa(dr zcynIB$sHB02Dh;plih&Z(uHlwXlCvfhQ96K7>e;6Oqp_5pUXw(T>z>AgAB3N&vw*qf& z8==f_e%2qhYCs)vM~QfteH7puIhqnwuoy1fs;v`Eo%`?+{%%?H{nsA~6~N(OG~aPc z8{>0jZYr&;`mj)HqpC=@76=_JX}JYcShC`2p-Fqra;_RsVI!Q~%YBy#G3cXX(6uT{ zXfcQdsE{Om0uunXz`3LIE=x#Y38srUXY3{L2|U$}H#ypeE>wydmP|=02iiv+=9$mJ zP?H#ut)&y1Ozm|bdZ|uBu3bZs8{Lxk^ zq-xZZMnSzKLanOODp8;3o1OKncjoNb^^WbegC#WQ>^a~0zV~-~p7;G-I(#Nbrt$m7 za*p4I2L<=gHu}afRfJE1QygV4y+V;9Cp8DBfs%LG`hK5gnKUoWbhWIW>u2)0t<8M7 zmUw<(YdjCIzyqE?^Zqzo!f=By%dQ`rtLwXlk)zKwH`Lou1{{jT&v zz76vJ?{_aOZ>;2!tktEcq6b`nb8jqtVAK!=;lemLEX1X%0=cb>2jzqC?1FN8-Cz*6 zeByRj&kgZi1;??nk<;NoNE~OL8Q~N0hnGjM9dF>=4#lRER!ybcl$)0>oL<-J%+_kY zG)Ojx2+p%#YiGHyW1nNi480yXXC1gnD551NcG9>1{VUtGk|R~78|zN2ojSWAPw8_j z9T>pH9u!kvfYCYU&{-8h#v&U{xXeZ{26Qi{!Ao^zyOs%veyXD=kX z98PTvKI_mMs7)pXDkLcm2rhTX!duByNG1U+`tamrFS-*sZ0yh}p6E;|&BtqL;8 zP1Pn?M151c0qC*v+HG0ISuxURHEkDa3+3#^^|p2nBphg@XQxxO-ee(FuIf-`KZKp9l1IR}gZQF7$C zckF#bBede$ZCL;u!Sfn3-3}-1h3!jgMxWUdYnRd>LQkG`T3$t{IIa)aq*F0LYUVQr z?R5iwBuH{2si1_W1t0FQ0p14ji5(n`=`=qg=+KZt(pxq#Ulr?}DEYS(*?{&%Nv z?XW`L@ve{GK5>O!;*TW(p5p;}O+uV484_sFqXrP08XR`R1KDUGZm7P#2Jhefx_x}~ zov)jRkG}A_eIfZ};tE;h5>6WorLus)7f7-w)t%Eav<{~UzYtX^ptwacJy0(q*Uv+) zvwtBb3%GII^pbR(#x5mH9ls0ZVWGD**?Q$|6*6~-uydOLGIR%p?Wa(Ndp|WDpm{}u zukvV{-E25j$l6dtFf6D7)DW;xq2XS`^+KQhE4eSGKWRbYkEQzp*pb(`sRY*z=mW^^ zEuw*l*5R)38m?WAY05iafAtq{B*x!fSd4pK%&=+A76{hLs$RA5@@wm-*M?B4?heEP zo>zFqzMZA20`{mP=U1~L1pJvh1j-z=Z}>EbclKTl$Z``>o4*9ItKPEfWw!}WmA!JJ zTPn7&4QHeOqr%DE_%tIP_JK$Oylx!WAK zLr@>Q>n1EvNh1{ZT&Ejr8=KKw2xqo~T)BLHeE^C>Knxig%2AxkkO*|cDR?4Ds351K zS;e{aQ5;k~bSDUKv_PZA{vgwu;?|iWw%1qAZf;*#UmI)#R0E`C^INSscqg$ZE}KHJ zjv`o=amWlE25gFR1xpb^`mP!_#I+2NJ(+^FZB0g&VfrKhN)b&Hy9bMFcWQ4<75;d# zu+6?OT)!`ICkSxwi)v^h`wqrgjFf=A3Oqi=W(E6^I8zN`NP_BuLWFRGjH7Xp-xK$p zpWWK}|MllBOid43f4;e7nNVSR5=xisn=;T+S!@PNW&2|fwhr!^MHxvZ!$3K^R(JmA z(yP8zU;V|sw|0Ky6({cEi;w;C%f^MBioy{`3UIN5G8K!EA4GPxO9Cm&?6OuXQ|3c( zH>(3LoBiH&@=^z!-*q-U0Gn3ad}mUJwI-SrdQ}ir>Kw8;1arWM#W`B@2GTgoPPxWT zSNrD0xQv*2GF(de;_Bcz7Fnm(RIh1FLTJi?>XQyt!(;)r8c}I4q39-j#^^S=`8z## zYUS+d6|LIxnZ6QFtqvh5_HB~@|MucL zVuz~X?AKmDv5RWe?8Oh<{1M!)vdk_#aNu#vb+qWq4;(~`=7efI#l0-{wW&y@p(ol$ z50ojuVPi_Q+Nxp=(F&HVLQm!%vfeh~{M=oiSo}zB%rxKE){^j=v)DzL*P9~L|Ba_P+y=`pR|iv zco;U~nc;@L%Vg}GCwV%zl830qT+}<>METS_G3dsq46J}b>~nwlj&l>^ zQ1c-0SXNK1y|5|M+R8>aby<3shU8(D;Org-6rwcNsy>!4U^#%fRra9s&ZfaI^>|;e z;Bh%V`+f8L&8WXEbij+IN@KBkXYN{OYXu-;2p}T#IFoGzJrV4wyieaooQ|7f{5Gj{ z&;k6XSc(}1K&b3e%fdb>fCd8?rN63gv-f@fVuxtIy0{vRPvgJ~Qp{tHSkN9AA(sqf zz>$DT1TZhD3-oFLJ~syzRo}WA@mWj_(lE0Hoh! zvyg*Sk9R8)H=HBbWphGfy$dWPsj;~q%!UK4?My3EudYq%Rjg; znvK`|jUU8nQ4jdi(kv@zon0Ydn=uGgGG zv!QY_iX5UGuX0PVZ+!MI{t#62mKA0!bx*3)2Foy-2Z^PbN=uE=?}LI(0k7oI&$%c1 zxyRL(H#hZ&&>9>D$VkKgc_>FrvZnx-Evw=*Qio8CYy&~ z{nM?sv(pb96k+)sv(G#G(6>_QrV*Zxl??h|QI`vOXcC8|VhNl$5G4Hbm3fIKG*KPr!iud^MZ>>Khk}k{^8j zO>C`87NJOx<>|V)9MXjqzmm4CsC{j~|LK6x-C!BO?GAy`b0jDh!^1%fr=TL$)iE#b zptF%TUrDBrTAS(0MZIb_!^R32o;$BD4}>cQ3R{`!0mKJS377}RpSvF$e0GQ?3D$&q z{mj%h{?z@c-sf&6_bYi1K3mpSi8dDB6FJ>V-#LIP6;!9*Gm z_8{?K2WHv*%fABh@XXWF*{2`5u}`G-&HnfiEa0A>!_zELp-ij+@LzQnL)!*=3lWzb z4O@TeI*Y)o0P~^ax!IG7XTC^BJ&$aBSOOD^m}JMiI#t;HuVn-(@O=-n z1z~|m?X@GCuM_F$vI+~GO3NJx8Scb%pEb}ri+C%D2>wK1l?_Jk%zUGtrve|pdtnv8 zO5F<=3MsM>vx$(Iv;v3XIxO4*c87q#3^JHlaT3BoVE)a!iHeHdxTlx3yr8_0efi9) zTt0nvuuaAQKd0e@*w&rnZLkV41=%7Hb2Yx{-YwKf+{7OAgL8kh3(-jWf!32KMX~89 z$6`T^ivmrmwdqz0aqw>G{gLY7&U=pEd!LTYD4W?7Q?^=_Mg#}ki5#%m8at3;p#g3H z9LAQa?>W9SZ5|=91ePLn3HJ)xQ7V*30<$tp6UaMe{3D=+8mmY6Es>@3Qn>~uB}>iD zB#$5jN(geGQ{~($KzRRntFgU4t^BfQ*GUe8MNEy_DR8vdHSl=?ORt(;1T6=5A*}8e zdF&6Xhsq;C$pPvGlw1Xn25Xs^7iy1zU_9HLy7Af4kmUSxG%V_pP%ZK}xF!TT{KfXI zh@=v$t3_1_irW?U&|yjbni3Iyd+K!t9pV=wGg@HQlIgQnV~J$qlqu*7goI_ayW210 z*HqI|RUQ{sD`I6k4gmhfvE4Y8%Hoa!FZ z3~b~g{ZnE;vrqph9NrbfnEj_8-A#@kU)=L!k9+d*jko^TzSMX=&;7tf8D=Bd2QQ`K z;2tUmqJyg`nI+Z`Y+C{V8y7&c|f)UjeZzC%ktEPQ%{0^Anpw<03%BDklq*5R!A1a|@vUA$b)5 zE`bmg`;N*CqH5wzoGtL$4^Y1h+kILaa3jVUE-64PSiTh1lma3ona=A*gXVWnET27b zc71i362He>^BepB>6pQCocNag@7Cil;hIi6CpuGV!K)9nKeTE$X<|p|346|m| zdz81LmoIs%kV<)_*o1fL)_XW#i@IDcU+m@5+ECzwQ}1w}k>?ZzKH9EaO- z%CaXo>v>93nr+TvsggZ@d=ss)PdV6*m|N#F>MF1iys+*u+72^=8n9_h59CQgWT--~ z+$0#H+|AqH>#5BU7oh3Tm4d+Jnh+g0xk!OqVsS%PnVni>?;u>-2U^;=W+ro7CZL&N zYOu&H!L}_Jnel*WaP44{xF@zXl!u(W)IWLNW3RkE_gsbrbI*VHorps~eejI1QV(F! zP4%@Gjb~4p3Cl^U4wsV=ptaiF2mPbF?jKz^zij}flMsmLpp?;6-B}&(*y0vzAwk;! zV0?g=g$utK`^2+8V4JZ;C8!nFNKg(+f(dp3U?(^QK10d83(zWU4zSPJKYhpKp83`| z`^GzN4aC2MkN?)WRx$g+J14t+=Gh7~yOLNen<5q@yWpu{32v0r71WuYn;3qvv-t8#j?nHIk!`0mMXxm(;Se&e#wNVtq*6LY?t1F{3s7)w!<*{AE{2@fBcCuH~>cckIBok4g5G6(*P zY$M;`vOCAohnrOO*`I&+QQKks$XT?#{*`j_oiP zasSsS`t0lPo;*G_fs3wuk9j@xlm_Rd@EL!Wu^@FLY7~#SEpp}Oxzh=WBPrZ|BF|n|6Nh1+U%t z$_w7J^ZO?r+#6o8^Y4cHcK-G7-klfuhjxDUTmIS3yZjq>zVyQTc0T{YpWOL%y!SKT z`q`bk!b3YBdC_A#KODyC=sUk0e&nh+Ch=;Y?VZOaOFQp~ul>wV{Mk<&8(%ycDV1;T zyzM)FWqkd`xEo>rZ@k(JV&{?Xx_bQb5U><`iCQbwRGw_>Yb*ZLC4Xk~e7v+Vm?mZR z@IM|3qMD1Ar;Cz3y$F^nFj@5AM*w050QBoG|JJgtFt`=7C*l_6M%-=)Lp#2Oh3pxdoxV z%P-CT>j#eM+bP-E$q!x`eE*L>c6Fr)wsv*oF#3~7) zr`o}B2>g+Vc4sls;yE}X8}85gscV3EEo}J>D_2gQJUswTD&}4|Zvr>X*!r(CRaYf@V+U>u+M|`o-kpNtxT)%5`HZ}@ zzJ0M>GAGyjz!PW_RqNc5D!muOMoW#o33>47QjV^gaeEsd*yocExn8Fw1Xa6^Ek-4I zyr1CBOHFok5KeTb;RhUW($VQVws z7mTMiYRZmZ1OKtbSUTh+E4XiAM^XHd$uxOn=vdVd48x{7Y<%C76Va!hDPi;C$;nYW zMEu0k38ry&sT&&_!J?R?Uwa6lgHFLvRBB8q32|VH`B7Bk_oTJPWg`lZFHBTG(8@On zf|Gjiy+^ndcoWOXMOGe79Q??0M^;x|rB!x%adkzVzPy?@?76<3#pywZo|RE4bxKmP zt6T;HbgIYN#w2?KLMjZ~QY$&i@a(Chh=KoMF^SCHyE3`sQRhQUu?b2j$+0b`u}c7- z=8G>*vnFMbMk;^6KEZ8QBhEbuQct(fS$8g8Ufta6`ApbQL-$d`@`Fm+gaVDKg7YAX zWZp>bDTb63yYKo)_Oho&hhDF;kSJ&oxG%ynX-Zmy$L>K{03vYUC|b#4V8QK^iLi6j z=nocj+fSJq&ECB+neJ)F>~C#M!VyXu)JiBf_3IbU`3o1$%9G(DaOn1sCA8Kg;ovMn zLlBlNaSNym)(iM33`7GcHTWRJ;|}A{>#0;M3nC>eAcIZZU}gG%X+?wG@~jk}LtM9P zgL^cR{_=BI(weQ8KwsiiZ=LCS%WW;6TRq#(F0T%P#|ivj14=SH*o>B^Q`|VLGUm)V zc-h&(!}!Apj(;5Bn6q%4Ho#|*+vUvgiLuEXZIaPPC~65*PSueJ^grLO2msyH zoB(Y&nPFYm)5{mqsy%mMrPTE}@QA8NScGaWc-Hj>$?owjduKR9wzi(F&4aWdjM#FH zZd@@tute#nn}`p7ZS|to>&D5IwV`vyTm|81h0xcg>I)|ofC_s9l3~o)>&6dbw%}np z_Tb##$gt~FVARql=G#dySzCfCNif|qDKKzrOdd2OyYuLae(fn#)!F~q0(K=L#2-u0 zSka6&tTN##0zixvwlwyV1KTb|bOrTH3Q7jBax_ZzZ;$`>?NPGXOD|96x{U{SwNP2` z(rHMd7pqR5TInXO*t0`}H-;jL4*5wnCR#XrB1;Y-?i_H)B30`Lo|PP?8N7$36TU}V zBUCvt6+H*$I8~==0G)NAc4L7zV9!AEF{-E7TV1OHv&XjgrGwu-sebABm%jVkuRG1v zY8Y-L=SRK^dMSM=#SsQs3n54*7FAPIg)dZ~HL@58Nexo#F{l5kQsCQ&cPYsff)h!1 zt=JX>?t~*M957?!MAHB)mDs&%oHAG2!a6kjI9jc73d{s0$+ zP}puPbWed1(6q|tip_);2UdEDJ5hQMGkhri4}NI<(z05u+v5CoHrs1w&JEdl&HYLa z0A=D!v9tLK>)@ah;UAU&Y<0;XDj~!oJ4`wfT-$d+}?d<#CH(A_WKQn~I z%X3y8@S9fPO-)#+sA4ZF#Chd?%28=mtQWcsUJLt_%j6r+MVZXL`csdmQSBjcp>&w8 zUEVl%x}V<+>w5k2%9-`Sc+O|4%GAPBkYoxg{D8hPyUD}UoB|H2W#G7Pb%krqxt_?C zeT%(jy)m%4ffg8}5lf;^&Sh4qbKC$>lQc)fs=xB5GT%jW00_oRFK?}%Zkze?ay-p! z95Xlsik?83l($CNR&7sB6k|;n#NmMGhVxM%b7w}G^Om6;E=li7u-tt~)rrQo)d*I> zXzxP_!gF5MU~M!{=G178Xg~cliuTH)Dv+))U3Obi&&Jgu8&|E#!E(b* z$_9Re1+IZ9hD@1bmO8*$7-TeFKm95)TYLYm`yGGlpTGY|yzkQ~uG#1Q#^jk{iYzry zoCh&ACzn^(*6rmr*-oC?$a!d`C_R>cu=%Q#HpR#;N)51HcYr-;P%41q9;T{~T3o+* z`@{ulEJ@3`lomLx!r24n1|MxUk%RPNkzkN)+8+%!FVt=x-mM9kKX$@!nk($j3M?P1 zHN9|A!55WUfIoDD?;6|bgIJ2Egjil@a^L*m(VN@{?)vg=lHr?nHJ1%1^;B=1lV`T# zr6grNTh4&4GT+Mq+iBx^>nQ*^c#(B;r3!=u-%M?eBk|ZU{6?~cDA^gu!E182DH;u6 zVpy<}e1IA?PI0j+Bz9mJq!7E+$=7KDuXDmR?Kq4!Q~w&+uwd>X!HBKBd*h-OO!S5( z*zoMtg#UK@c4@-wGe2_!=Zg<4Nt1l;q9)6dCj*u%n3fVbbyat^KTNshv1x+1(zSF? zepn6|u!EO$MSw+=DvJx*86k4EY-DInimaK!_ZdNT9QU(vqbFFIZL2Y3=YEc=&7RFT zfN=n5EWBrxN`opx+U)fHY?bz>ZrSc9@m`ffclgg#sf%Yv6J?w;g@XVc`|<@>Voj3! z3L}Zzx392}Zp^;+VLbJIanD})C;~EVmj8aDi>$;*J1m%i^wk2ZGIhN;F{UiSgKHaU zvqHt|rHB_nDR#U+sec_(boSaUXx%`Eg|a|G*wqJuf2!>Dgeo`kN<{?11x>Okqwwm*FA z*2F)1`9}{zXM9mU`eaS><^(i*!N-ooKEHU&-uSkx`DkSD&{o1Zvjfst#br8Tq;4!H z)Un5|EDgoL!)g_uA<`MM8w59#Sbmjtiq#ndhg1+6a>lc01d3=x6PdrLtLwT9V`hMj<)M#3G<)nXF*; zN~t^#wbyPT&ADpE9UCE?V?HS>D7xj;S>Lnc5KWspU`=WSz#<6h?fmQ64g~Csifmid zLN(w%%DU8DwFUIe0wQ~6yl4-M{j@sx**2Y2E7W&GnXo8m6aE4agjZonw0xHm+rjyo~0ADvtq$$ovMPR6boQ% zI9ot=$D~Cz4ym{v0=kB7GWfWU9XmMq@U}nkv19VqRActMzj^H8`bWo~jBY3%b4eMd zs~cu*W$Sba;?&mK*^6?pCJOSF+H=V4;L>_!*%gPa1JM|`iRN{$oVh#}1m8)zvHRFc zO~sju{X$({(-&Ls+v_U>{FN43c0DF#u_d?`9CDTuo5Mu~qNB&O8G9w{?9+|ei+%xc z^T;LsyOUd$`0RInVe-hGA*Jz+zsEQ3s0IGohmQT}0^e|f|JM^JFz#jE zBI8r{&c6C#Jm`Kb6Qq$snCa$)a%t^cT2|{#UShXFX#mA~%NnpnwhYKB61y`eEm(XB z*B*gX`N3%P<5=d<>lvOY>tsMvn`4NHE>xOp?a$b9i^Uhv;qG{1}cd#))S-O1zu`K$u6X^ka*U?sUZrEBnRY^o^PjCy~9 z7rxD=A3bt7vI(40?xZhy>|ZGg?F2YJ#FVV#M(o)3_sHP_Z%Y8h8ST6)$-$JnWxHlP z4oj(QWd9hOtq&ClSMQEMc=Gb*&%#&qUf4UWiO31Npu^n+5IF;&UA-aoN;Yzkl0FPY z%x4r78C&yskU}eQeaYNssQ_ke;N&hLJGfFZva+vF5Z81Cx&>u=uI+Uw$!vV1r|WB= z%ByReTP~l3PM;o92ZK5o%C6wsXGgIs`2PW0zP6D< zGBGhY3JPaqVljFOGBGeQ3NbY@GB^r&ob6gos3cbv?tX86oOT`)Ck7@2#KGu@nQE$T z{dNebI71jwL9#PCvHrWdtLwkIJH1tiD`hN$WTlQvH_Af{2yVueKj6w`7Evb&g3Ex4 z=&i1*?ps}*Id$vJ&VKLFoO}A7@4M&TTj!oz?^q9?)yGrURITR+k|^@h01X6XFzEHT zK@yqfE0OOf3}QK!LrCUiUgk$knnrdskC%QZ#E~}T7;d1&zL$5)|L_MA1&*1rcAQ$$ zOtpPc1{2*T&L#ypvfn}T}_8ak{Bu)ZPTP_$*=oyh8sIEJl#QCgm z8nCHILE?B$QZSSfY$Q>@$7YfS!+4xeQ7OV^G7Ui*n9r0joFER*_?Seq>^bja-so1{RG3iLul` zn+u^7D3ef_yAw*1z2Od{b0Xfqh?N;z5X_UMznsiz_g8^SCJ8kK$VRt1u5TACg#hj~i3&YT z&9uxDDv^wg`S`WTYH3a!OI&d72rXI4*;>OAlT~YjTy%4lCk*=y)~lbh-0Tp)wc~eCt$nK z5L;|V1BOeUj?dSpX2n#=uv3)#AW@Stj8!5`LAeD|Cm|oqS{o*#o3tVw%&(el^FliK zWq#u0&*C^y5I*tokHQ$SjWZZ8j5r@9uC`!W_Uh?l)h`#I5&Gs-J`fyNw93^0csCS4u458c79-Re|q{_<5d&SuU|D~e?7VRix=POXa2d*oE{&) zeev|l<@-m*kB0%(|q{D)4vVAebG>U{;53^#MUM#dvKM{9nSuJ^@VcWpZu`Fedl`9QuyHI z_}T^I)%W+A2>VU4E0@jB<{3oo1SS=^pFAsZGKVl0&hfqFSoT9j@C1F~&cf2q`11Sb ztv7Brh!y_umh$kHl6XsrPaVry7Q2c^GQMYx1d*{KeJq3_7YEb%Sk52*eK*@jTA=pO zxL0|`t_9G7V$}F%QNJZi#bTC9b6Q5W94yERK14wHJAnm;3T-D~m-m|N(?T^$KKUK47VSv(u_ zj?;u5rk1)>M<3vI)N-xmGg9w!J8HSsN+)hFp2c?4YeEe(kIu%t<20d%PxekxY?GAK zohH>VbEinQrKmei>S5|m!K|QYZg5f$Q+Enx1jRnLTW)aFDVP=imS}oSsA1+#!E8&h z<20d%sXGO;AacB>&x97{?G(v240Vr5HO$;8j)keS&fV%B6Iz(JQxw}U)IBEE@ExL4 z5Q|LJXgIu8!mOPFSVd5Gm(aqzouXH)uixg?z1=Ed)=q(|BB*;yXkp$?K`YiHCulyv zq#9=K6tuP!yFPFAFmnqOnw1#cM4o2Mcr{a@=mcUzk4>F-Y8+#PLZo3 z*l~BOg`i9V28q{Lt)dQ zu<20PbSP{(6gEBP!lti2csld0UdtG{)#ANp_q^j-G;ks<%=qs>YiByB2fGVk1T*yf$%)Aw!)eZo-s z^GC46eHwt*1?7a(kTvv4{{Eg(7#&I6D<@aNIY}qsRXe^E7 zm?%*aJ;t_(9*#z`lbYZh%^XPw&73otGh-G?`S=j zOj?@AW+X)>f*dDVRV0#3R3)2^iS*5cBn#;|L@%iZ$*h!_CV(mat7J0>C8@-vNhu~E zj35!xB1wtqq?E~sags_a=cG71WTu4-{3QaML_(RBDR9Y!1X1a95@Xx_K z^i-lu>UhPJI8*?#fu@WA_#$LsLOF+@bjHa_Mv93+9Ug%~l1dT)5+PYzm*aV;LA$Yp zASHp9#nFLgExggu0gB^UKylG9BAnc~63Zq%Gp_&~* zJCN455M!ZoSd?g0EFud@5i!GOlZt625r+b@Viux(BV|+*4IqX=SJEn=F-Imulr11j zA)*|Iw<3xWpp{fIB4Jzu83o9o4RJCFAM*I5DwCO6loT#|L`{h?lsu>{p-84t=42*) zs;ZNP|Bsy*h?3~Yv9Z%VqY(nnCr3w44fIF)N$=h8F+%!APToB_aQws=IWaQW9~q63 zp5cCYJ3KZz&^tahG8#oNzMd#l_R()W!*`R&T_;B)(I^=iB?Chz2L}KiG%(sTJT?%C z2Fbv1-{5%v!0_=P0T^U>WDJ1}4h#*9LCLX^AZ@y^CK)+Kh9aYVC*WsK@4(=|*xj_r zV*_Ku*xa#^QL5SGWY6f>K;QUa&nP)LK6-K_8X-tu|3I{FuxDT>(jNjGpj{F<6&W5Q z(Gxv`gL&kRoF0yh5(dypF6oT`rairb5p0f9+dnWG=^I0`%%?tJA|N>!B+-+Rz5#eZ zK#{v5Kvd7@-9cmxfQ?4(9EWo7o%Ht%^&AHp{e|4IvIfCGC-sewMure~U`cemH##;j zHa-?1$45r`Dchrw(NhC`k?752a3o3@Hy(`yp^>qkAg2nT0OOzp6z?664p0^j439-d zN5@Z&4U7y2pwCYOhXB(asNGL_Ju*yb24;!9FW<)jP^-9T< zl7`{N+vH0KSvfYH65=?L9G+4pR7F0FfBC#kAyV);HZ8_xd_+{2Ocyn1plu z5iA;eJ158R-wYTwpEuxTBcCjbu?!jtG%ra(1sjI;MF8WFN+@$^^q3hFhzgJrBBA42 znhH%iivt-LNqCnD>XuXnqoZci%q+8SWL8PffTdw2V003&ItLhINZ_bAE2sn*Bus#v zp2op*5{M*zl^l!)$QXPXQ&LJonVO3NF{c5oCcc1ej!?1bZi2r;1C)jSp$k62*G1Zc#5V!|hA$Rto6&xJ^oeV0t1h6s}xIyTY*z%LjVRh?1C#Y_}``>p8F z5+T+g${aX1k^8bRRt8CXVYz5RI49;6YjY?@5mN_b=xZB1ivFlL3HVOyjHaT;Nu}Nc zjFD+EAqpyrncn3gUJH?DRFx&l84E!7qPM*CBB4=HjN3$a3>4%548hq{O5vk8APf43 zrJ>uX?*p1=bS15Y^i4|e7mn6kk)bBnKQ$YR0g02@L}IQA32zTCo`jc?ZEq8FL^hG3 zpfYK2ST2x}88V?L33BnmMO{OTj?2n^-;|gc1j-}nw37A($$kc*C=ScD0TK+9pxZrs+RItV9WHlKm1qJsKR#ULI9k8mVa+8&K^BJ;~R^v(F_AoJlW z>Yyb46QAfhd^oSG4qwjN2|O4Qq&K@Ld|!T|~D9rpLVo zA8oEZQfNTA7ziP?)pE0^h$`~Wy*8Ji9IuCj)MdqP3%7AH=N}4`h+vMl5q#v36mS%n61!6ZMhpwpwI+JQWu*%gcaxn`Ao7p1BA3c%ic`NIHS* zoniRD1OD%X|Bt}`H-g2*NyFJ7k+FDMkf*?zP?3rzj(uJS&H$rF%2o~Q>p@ln_ktl{c3q;XIK&7H+5KyBK zR;V~fOBl(XM8cKL@^%v0#9^S7oXRj+TK+~eTuQt;>e58MGT55vtVWwu0TqiN8;k(YLiGCx}7D&@#-es+0@~o9;#bK*b&fXQ51)kRMl_g@yt=^7R1&eA3U5i5(z43)UA?L*e4uhD@uMqXgn&DXNlLavD zLV_#ONnB=xBU)R)7}~r|5_E#Wa5i*czm!<0P)dX-QzZNrz8U_#g&c){4jnQ^@@|6d zg@(oR8H-F6>B>@4C97wod$5c&3GIN^w$nC>FPX4FvoDAMqhMd6)dU@7nIAhLT#d=7 zxX)`|?a>jSn*;!8`@uWMBcpep9XUx3k?_Iek+HKwBcl=cUD}QwVW+y`GIh%+I8zD^zm#579LKSNY+pFY(gV(Ews~fh)>D_2 zSUJf}CrkU=taQNu&~~vNeOl7c74o^QN;_DhPuTQpId#Pq>;^DqcP#$Ue`Jw|{>y2I zZg&`>D_x?g56KcVtq;f*4#yq!8IGyQpy6b0qpPS(s;EontS`348qRvh)$6Q>ot^de z>Yeqlqh(MR$28y`D6j}5BS;Bh0(S_~XeQkSj@uA3S%K{qr2G1?2k83xj6&3eD5l_n zZcY?&&obKxk9!_*UsPHIK~{0IJX9Y8@P#`JQF-vo7^}jzX#rHz5`kbHoD={*s?W^P z^|j&~pIwm`$5s_;StOkvQl|(D7V_vye8SnF>B1YIpi8)E$glsx1s{MFz)S>*ZtgAy z3A`0jDKYM25=-Bx(#x?_dt0~@7rpF{Rq8zRf+2>iC0?yNqlhnHb$J-vm?EQqa2lutizytp~0yhw<$UseNE8E2Sb%1daS3ElH3k_jZ4OrWV0(zr{pzDC=j7kR^$ zV=@GgL$D*%rp!w4V*(U*25^~D^uz}8gjWRqiD_9#ke*pV%Jd5v0Yw47LG!&+Bnm; zamhdq;$w)}FaGvmyLc0f0Y}6aA#e2Eu@+k~EY4C6I~$;;iYJ(kGfcYn@gh^9(4aEq z_nk&ABm3wcNzVApG#T#hJQ@mxOp8@+xUFo$el%dTd|b)owYSITC>8Wb4X}?hWI~Jy z^wgFN?vEFtD`7yIkg$LFZg(aS6bKguy7d~mj?2RV)gmnkWlD;L2pO29AQj9UAe>ZM zfpITM!7woti87(`-PbBfDlqU_262^bYfq)cxD*2s=%O|GpiddgwxQ*X{fIW@K(Y61 zqc@YqLmcM7a5OSHrh5{GTY-&O_unE6zWErGq4Veh+!%*IpQDq~8KAz7;hj*N@=(#}vgB&|azolzX_^ z0r^LjdRUMZZchA_=}2LL1Yc_K;26cgIEy2PyhT{>qCVc- zu#)G?xt`k9=Bc&2o|@~a)#|AMZwoBE^^(fE7`3YRyeY5bjR+|CyROwGaIIXw z#`SAlzh;^GHB(B4c0?E7U>w69)z{<)@>QAJR7d-!L%O9EO|PzRDm~u=E5~p+-~euE z<)yo*1v~~)neh8)b+-5)go*foVkjTtN3jJ09L6oJ)S~oY%+cQ=-W2F!ldt275)Y9m zn{}xfF2K~4L5-kiUBh1~1@tAv%p4wV3MK|WqXOu5iO<}a)={je3xtSS&Y&~BiHeAH zUj9vi#EE!5m5^dmCNbx8B(t59Y4FMk?YI=DtH`r5HN+Hi=1dh?M{!I^kH`bIBT?Pu z6U)M1DYJrtxgWNzHV5-O725z-cH@oF4qYEzFa^1ktDc*r$~OhM>zb=uNQH9Ys{W-@ z{i-y%!aa1ZDqpRt9L*@H5t&NDRi)Jx>*k`XTj#>mjW0pu`k^<&{a>F7-MhzEjVhUL zre3$W@KAfFvMmV9Sb9KkKyEs!5*1Kte$@f^Rf^!31EqzB?l5#V+nm(`83O!< z0m0#pqQaz>k|uRl!nlsa2th;F)@3)dx)`jz117HnV3-gCa7UJ)Y!b?+92OZ9zY)T^?CjCwWqlGE|AXtb7>@h)+CEakGp z_pt5ilH%Ws)o-g1ep{LP#oBK#^S!MM{C3OtqMI-I2R05F2_^xwpcM}cM2C}yx+X*- zP031{9v1HqORz(jU=T11g}@M2xoAVehz`;*7%E{DKW$Bq*iTL{G9>y&R7|WS0{G() zxL?IWi6ycm3GkF~KW36b#BSkD-lv49ss}|FzMd?fT1h`ld~P zzycSY?+4&hxFx$LpkgJ9!)(IdNxG>9dfIU8Ea(z=ZKkcTKI5>lH5eId6J9J63Wa#C z0yjaE3{5gmr$v?&Rzrl0VBDIfHc}?H$T>-1!Wd*1Kj|0VQBXj=fCG%B0=xbL*T+a{ zwoaL3W<_B}k9g`;z-7(QTbU%8B|oOEcaI>=h@wt6dj{G&_%o;8VY<&oK3vp#5Wf!4 z`&#Hr8Dtfc5E-vI%rL-~p$4_{n3PsQSF$ur%alARW~P<6O0#vQq84nsHbVuW@KNJL zAm~OzQH$zH6GN|?9L1dm`Uu98hH@~Ec`R&v4sZNm8AQ&ysF*PuErV`;dgQEo{ zYsXfBljVb*Vf90}gAU4cJT8$BF4Qdwz|^iL$9xF|Ts*Q;QQUy?!t2-o%ZZ#cG)Bk> z6Uh3P;k_dn#mp1YJ1voW?Cu^`4+>0)m~O?d4X2D#JrYeyxMrx7#MpT#-qs%-k*_|$ZcR34heSp!G+w zotCDit@j5y_s0=yf84m>{y0(rfj3ssA0_BZ08V%j8ZI0VGIZ^$A|J>QOf660Dh3Pb z3``;QomT3P8q`w`F9-5_vl%ZvKtfVEVC}5Y- zvR0$rhcEnw?Wf<(wMpz}vHpc2y2ef|GN^HPe0fbkfb|S7yysO+h}QdHaea_DDIxo3 zL|m$7am&n!F@|yUDZBGD)Ok%>)V^k8f^|DCed1$q5Le~1MMEeU`Vhiy7M!HZR;$Fw z468@lp?lj%Jd3M0gp3$En9t*opH3i*WjlDJYTSDDAp+1j$gew`7U&gFwlnH8ImGoJ=U$sp%lHlv{WuNspd%7~7b6 zsIlh(gCRR(j9Z2c?y!v)bgJlQJ}xM=!7qa^HQifRL=#U6X_y6r>s`ZIlspd8Wc;|y=VoAuQ)%U8{GwVVh5vMsi6T8> z@-~1m{W?R;Glv~*HyyPshvmF8jXSgg8lRX0xlIabby`T^wYhYpF`*VN#;qRjl0rtO z+LyDG6+gSJys(vt7FW7%+Lg7@}$dLDGU4wW{H(sqY9*G2dr+nLlDjPDg< zGgEZeB%8zrS>&FA3YP$71q2*wonYX`W$C`Gh-Emirhe#w{%lGu1m95vyb1btUk$~~@Rx8Ne(@i@QU-u`ggNMnHPd3ztv$tfXr1m;BI)UgewMocH(Sn9`q6nVg))X zgAQ_W)(*J@55@DiM^21$mVn6UaM&Np1e7En%!7=#Mkbh9Uiw{D&Ci7PLWm0#{d~^y zl~CFAO&IFsvnW8my|FABF_5)l9(Kgs zZF8h3Tu4#aN>N7vMXXP)l;~8T5rFUExX(sGA@)fLb7Y2<@Fj)wKGRP4Ccsem3`>!Z zaYrG>9rmCa+tUMzMub=fO2ViztE6Yx)|0d-6rHgaCf6O!dM$O$F)DP>nC{|y9>*6Y zO((vkhbDGbV|+lKRF;|RRK#SOBStB949Mq%gcRo;1`O$_*JWE18QZFc5?>g&0*oP(lIzHv~OSL>anC#MCY8 zfnp9zf#0J$Di)`t)DXQ0iih`#Tn-B7aQ{hlPEI}m?k>7cPbt@=z$q#2judr7oQLM> zoegJ4qXH+RO3a*{hSFMu(~BjXVl6LSDy>Eq2qu>*tz5MZHpR2aBwaA4U+-uQoR!x^ zTD=@GMZipy1LJ)8PgxdK&_T5lR!5A?p@@xv)*FjTD^H)W99PXPSaphJr0{$fVgYH1 z6UBfNxSJjd#1%_Mb-}pQoc7VPPn3|1o;#&@>UiU_Ld^02T^WI&0)vTeV1NE{3<|~Q zbJihsqOHb^7LbMlp3*6ktUUt76oL~^lW2>N9a@;;I*7-mWJPHeJThQY>Lj`%q%#n0OKtQT!BD2k&(k&=M5S+FSm zdWCQSXzHF7DOv<}e(&ftItqZtoC)kG3Yu}6#TaLP;1#*Zl}2~UOwRybvY`68eECAsuq zB?hGMNFT;A`qf-BQ#{Sgmg4J4X8ni`Sp+s3=*><`33IJ5e#p`&2VLqRD{N+rb9LHk zALlefp){Y33e_@ugfAbmVU-l(d^w6fOjg&M`qi4Wh12xBAmk|sFbq^iOW1FC+k!GH z^KH?@xhipqEG%tRx3CO_GMv^cEK>{1xeA2h4kvC;>E#PT8jn;HGqb2)90|2b zQ|oL(+lv((6(=30GyFgddMYt=n=*-}&p2;5A!cj~T6G$xlps6VjdpDcAixYRZ>g*< zyL!i(XKyUH`^*J=^k_OkX8wYyvo=oF$jG9DmNO%(8M2BKzH~zt>yxU7EEDysc*p`f zIHbhIXeO=H5{POKFDMU&P5U`)C8Nkv%-AmCSd5`**-~Os&P&sx0egIp)v~V!qn#K_ z#`DKQA&yyWYNGeSXN!SO#*HYWq$a6v=qrEid68o<&zLaoDO|C?ph3EVHQ}N z9+Z1hk|lMTA0t|L{OQFiqIHh0xzliw05z)BgKsY;thy8$_s}iGHaj0(#G5nJ!qiNC z%z)tmP!rNpVoo0|kjY?9kmewB$Y&*0G&U47d9w~J`e~-ZIsHWJN!*7)$ zF9Y>9DO*ha=1j1SQ%h;QT>G+6`(jasB{VVgMAdvhz&J7=kBAj;(KLLv90)5-veXC~ zo}>6S()xGLx*N@?Toqk%G}n0VnXkU6RdVHqfi8yOfPhjTuwhL zHGj)lk8luTqY3X+HSc&~-tqBz%mLX{T#;dHN`l9IK(%xh5zmP--*Lsh8LY&;Zfx$f z%!h@dyLW89IaN<*f56mGLm?;AO47m#=v4-VO>=22b^-_Y7xaFl9>EN~1=iG9y)#)g z8T#1T17<8hcS+`g?8YAfBd)X(KM+L0)Tk1}Yc~K6-4IRt%vjH9KnQuSCQrwlbI*zg zaQ-VKW(>2+sl-Sc?+8oZ6iPQ=7GXV2 zvFK(FH_!{RHIhpuS3kEcQ!rFHd3%f6`Q@xt1Pn52^OZhh(dn#q!lKu6n6E6Q>Mr>d zWXUYjvNa~lYVuKXPN2)^LZ<{Wb1j4K*@T`ozt+z7Iz|tvnmW-rTdyVRkI7%!p=&w+4K5S-`W2M~;n!aunj-fztii!!9amnH9OmzrR+%acKb9Fc zRbvvkbYrHg!WF5o5tMbcxc*v<9Hw6QvQcNX619+$4y6WE?!QeaN`l|>N{{QE(pO|~ z|BA1HqJCZ0ylgE$_EWyYbYzQC={Rv5(kG5O6-BFae9-`@HdQqjQgaX?op|R%_Ej3( zR5BJWK>O?=pnIeAid!bLhRPXBvgnC#vT>aq5#sSQMn8=uFBFCzi^XMC;CW92N2Qn3 z#Z{Avtq-iR66>smUs1^pk=FZ*UYN<37fpx>&^$Uh5Mnd9M2ampVkfEK!~xH8M(nu2 zc=fZK^-KKNYc+I2P@~z&N$I@b#@rzB>9UIl{ZmNYBu}uzzUqL5O95-I5?Dt$VElYM z+qHt@@{Ek@h-pD$kzESfNwKYZjcqOB$ZQ_3tBVy|`ldU-f(j23-L7rQM!t;F^;C2s z2zn+L*E<637re0bmp)iEuQy->=`PsaY+SN z=h3`V3pH#ls?M@}bukyk0ackaJttSnb1%_FIRI>+>)_z~v;vNTnR@~|YmE>?SD6uE zD2>SEd0H%kf(M4c%XAuECgv8~M>QhfV00&JeOH5jv)G!m7^7k+6yo>nTFPQiDzd0c zHjU9RnU9M?JXBm1ZAzx=PkDE(Fe7nkowTKxxmcVZs~M~`req!fVoB84d_YkK`4!_d zp10UKRG|&E1{_h(gXVB&sv3^~Qj`}7RygFNXZra$alE z@GttM1u2k2`N!@Uakr@@uNxN)z=!qNPBb6xX^t8lr&@X^nDg$FVC{4~LCvajnX}|_n z>&Z9hut`0?!%wcSDv3}i_;uaTQ)H(CAj?lauEvr9TX1jPO+Y`M#m%O{bCgH)o+c)U zY85L8+HR`e=JCUw>D69x=EhEc2Wp>vJDP<)UYuJ?dhRLIq}@I&$N&_N(oikBYWU5I zsY&KRC$fSE?!~6rx#x_7Hl`G!+Nu+BE6F&YUtLk{TlCro!xgMa>6g&auVq`yZG5ok zj#Ch|rKv=MVFSK2&oFrAysg4H{*pM17QM`mqZCF_F!%0|udFVwn`cFe8i(4g2=9dh z=Ws5K(=a1`hIb#(`6ZX8P*GK+26llyE*hG0=SLP%Da#r(NuMSeV4wYLG$o!o=2ir#Wm40pb7smo{D1#mHp@!6Qc3sIO<1QWIy_pWRixX z;D@gAV8G1A{9M%-`T>IKZ+>OEuiwL3#wu_~hltO?9>Cax7530OR_Op_-cL$l(KFVZ z?L%d%?_|nNo>r*$rZwm2?bjV3J5QYKr-2cbz>%3_31JG89+W#ZoQUJ*G%l;023Rqi z`zt9hXk6&fUloDkIoxvVZBkOPaJyjiyIl_}?|TFjt`JO#WnT!Uqe3tpMZuV-DsZXi zJE1evX}YM03U(BC15+(1C-mXAvJ2H1AdAfN7iIhceN5t|iw#MIis5`4?GbaTBj(?L zfG03mj?@ekTuJMEo}TW3my;ypm;x$K6ZMg&3c-|@NE2j6S;Z z^N+c%`nr69L+xGnc=`40^fe5I8G#4W=`$M%d1}rAUC+|_7=JK_Wr2Vv%uxQa8y!e1 z`zf%WIKwp?=q7%~L|fS~FB^a%(a*SJ``)2{x8e~lf=3b9j(8Noxhgz5ir`VCZcTU; z<5!Wi;`D9$G&L5YX*|EJ!_8HCc+KaF_3N9c3b81UDkdgFW^EH;>m7fD-zsZXMBSTE zGSfklN@P`XgjzUBRM}mpAtzU$C!3ibRHmd_4z{UbrS5|KZMmGYos|V3M@eIPojTcc zy=Q!)$TCnPsLP9m7$baXMakfC%CqPv6w+w6hpn*%H|2q)g_ID_riBvrq#B}mrBXc# zf7ya6i`lPb7`TlI4oeB8g8=JU$M!uMD|C<~d7<4x66CuG0+P(pi99f*LKph-K(MdK65vM%Pb|H|l8P|#?R?9sx3 zgSr+2ZdTC?6`m2V88tnM0hr+SNqE<(97)g4Rd9fRivD z%qr>ll_6|P;5^ps;yKk{koUPz-_XH(qI4cG|JHh_f+4ngvnMdrQ6kuJ}_r(qn=uP7iK-|`2 z$Ob=5AgdanjD!h?Rn1jQ6@?_stCRHef~u8|0zh1kYwC$!a@-yRu1iZ*Sv?$-@^k3?kc)F-TAG|=E5Mni zGlQ5);|Y&6IGk1K<%)F6_8dD0AT83Rd1;YeZccY@vke;wQ84Z%agF0*hk_Sw8|jiA z+?zpfIYH9cQo@AbwCi`l+Hpmg(uG(+T8ZUamdx~7!dUv2W;zxcSJy~MeNaSs#sm<^ zG{1AmaE0jlNOXl}@d_B52gJ76`pX(XN%^4Lg-Z+e%`*1W`E0 z6Kah^0=Yn|B(7k;(zCFQ?RjZj*2+(}#=%ZMxJ5=9VZ>G0(U)kx&}LP$scacq=Q>*_ zT+cc?MK>LWaQowN;AYC(G&_X`+8=JSZ*_7IpMn+3?Uvn{_I<9LX8^mO&u5z|Bd3`B z<*#?v`=+Uk3^vg%wRDN+QlRh98$~fU5QAp0Km0{CW_)z8qNz4rh#sHlI(!(VtVnhbshw+=;Q{ z$=PLQI4D5fpmErO9@D_HIGKsm=LIn#4Gxf$A@Ehec}fB|OJQIDTwrs2v`i&SThYan zIR~4XH*f7%=#lK0k+)rW@`TUQ2f19P7u;||5z zf^b#u0;?$G#T+R6ju(C3A?acJu3;c)55MRl1E@2>xL#fMi+1hi*DE9TF(#>4Z^gim_rU%2<72KMyDxOb)YOxQR7oD}lVhvu38 zfe%Fc$b%c^zmoWq55ym9{L}Z9gR*f&BRNF0xU^CGm+51cXRkIc-9mpqB;8iBrAM1L zTp*FOzOj<{_5sm8?V*i6?f%W)`Nv+hw_&400W$x8Uwvii%6@L1FQQ~$Vb!%FIvXybdDa~rmLZqho3)@r{# zyh;1ZFyGvEr$?KbXx1KT@93us$xw(?;~+m-Nyow0jE8W8Ihq%|dr3%z z`1O=YVMg@B?=#TSJ-G2Ppgk^ZYB>|`x`+A}$usgjAl5kXWy8OWweYa;WFU9sde82h zw%&7t_78*I4}e8J3-g{C3igcd-`sOE*#qw`FxP@^WtsH*P(ujYVT$HXzs!=JeUg>I znuB`62f3S`YoWuUeh3j0Fw^Al=*cZ7l~hWSg{eF^a(7{zK2(V25)^ zcos)H7y+JUoxm{>rfM%2wI@#vj+)*Xn69(*$Ry0rlO#V>!bV|SisQ6^Z>7ygkJ2Uw zwDDU%sDioXWZ~8%Vj<52v>p$Du+5(!I-mUe$dyV#Q>R#<-YWF7d6H=sGxcSei zTN>v7*DF5QuzH-{G3?iV`v10QkG-Qsd(Q)})V`2y*1BH#_c!2&PVh9_^t+3BsjXV( zCEkbcd(e}+ahqqOrfu9~C@FnYpp?0nZ1c3#QRi-GTuJfPvTcVo^(||)Z@lTC_89$l zuADZ$X3aX7o70VPBF@gWBX8d@pZl{nG_2>WFo(sE*8R?&>+qfB{$}lWkMztx_s*|+ z=C6Bq*0IvtAL+}lH2=FtKEARM+SU3$v2p&(@Bf=d^Lq706$#c;>gRK)z()Toj(S#pBI=tijW)?R$Eq_So9B^FLYh zu?G5DlMY{pZ|5Id`_47CH&AZ3Hn#cT{9_xh_2hq9tNpY&Wit!8sRIBXtbq20O>Zs$ zG(Wcab_%3vKDVXUV>1#F_Cd>S(X@|l|6ne2z_Yr+$zEs&cRr*S&1t80{qNdshxUuz zf24!@J?;6HecBuM-th3cJq@;(^KabS#NYgO|3z){{=a7={C58ZkN*0PwRM5J(F$p2 zTi?b%x5@^?{z7YRGg|7`K77Y1t?#CT3$#<(zRq{CroPxYX7uBR`S8(<$JW+--%Zyv z=C?jDf26x<#VQti)Nbv0mHznFEytnA1e!&&Ge~(JQny&j07{{kuo|O5%+S#qo_hwGD4rHUG-wZ4Bx8zfRrR zP?0It{?{ws%&PQV++NBizm+xh^ec~*HqP385B?MH;?|A17j5&bw^-?G8|n5tf4;0$9@wj`ZjQD^}9ez_g#f z@g}W*ZKu}%#F`!EbxsyY{I)dh>GyxlW-EyH@Sm*Gp88{-_PJ|r)4ulJOAy8CZ7239?x#}`w95{`{t+Ld*V-5cv|eZ+>+a~ z7789&<>_33AJ*g!toIzs{dcdY+xQvKR{U!7+ctWxc>>B#Hkiepcx;`A>GK+G_BS`@ z{_8r=K*6xvM8D(M`yr1}^4W56nx1amvM$d=!0>LMq zZuYD-F$pwW^v0jQ_In>_AcqfnlT!+5W#_i__mX&8!b2S~;Co#0df#%e*W-PQ+6;fa zsqZb%4ubjjdxkV`Lsvt{t3Ba436CeWdm6g6w>R`_&o|tmg&S{!LgyR%wa+y6YAaS8 z(}q?IYwv)6|6xVH7FyY-WmX>7KD{!ctyk_dz*ZQvvC8S3Fd=0xWvup4S2m}T#sFzmGo>}ZI!ou6@3Cr{lFpZ)i)oS*St-3 zX9FCQ@95q9tTH73m<(-`{roJ{6F7zr>CgbV8>{$%`JJgN857zBiimeyFFnob7$YmFrGIy z|Ky$T@@VT`{JlzG&j0$3|7@_qYu4_+drnK;yg`fI+YE4jb$pYSy|dSV{l^Uz;<~}n z-zndQ_T-%t%iAX!TXtT~9lCM&*n1|q)a`rkO&;yKca!-azi*YN&S&D>CjXTLitx}%~yD!QYhJ1V-PVwI!fq$mD?b?<%SRXAR0pWKjh zhbwoua)&E-xN?W9%V)TH|GJO9&K<659IkLsS-Is+?!Z*rz_ivg|MA;i?T$Vbjy~^i zSV{MfXuCTf)kpNlJpA3uZ~SxX*#7t0!PMK_!O9)1uBgH4k#+y^T6eIz>IW4I4-uk0xoT^-L)qk%!eJ;Xf8ZC#@n7~)P}{xwdn@q0_WxGj${v1msFgjeyrG#r zJpQ}Q>_HUvQKjVHpWTMzm0oxghqI=KJ#;q(Il!}9*u!Jj9AFRHr}nOH3s8Kt?DzfG z(I>WZl@Gl8x8W=E1R^%9@+xAMEerV?RFXJ;EM-?mf&No_+4%Y9FstoR~)Z zvGHlJ8f&j%U;f}n8?OW z!={P_s<01wH*o31fH_TWR__Wd(Hp>UH%dw@YHC~J6k>*@aSs1 z>Zwm>h7FRjXmEFlqMf#)Z*nSHFmq_C7e96t=fw-epVwDU@7-xym4A~yXFPKT-dPS9q!9SrlaJr++w45Y z=_qqvVerkr^eb%!xEXY_+&|p`C83GX*-D;B# z;|I=zcV9y+e{%bGczO@&zl>uutVL|+XW%4yw`l!b;w9~G4RE(G+<58oYA3y51V6`%0G21N>3nh>LZj<>#w_mnCd23|lI*O%%(OXY6YmIkt^J@sS z)vB)n=Yo}e^T;mt_Cq86e8e3&#vVR@>?SH=hYxGb$Gh3PsQzG;{?(lv*x0=XG~e&7 zr|~X6usnb2KqCtq?dN)NqKiFz?ZmD;439k5s=a=6qi)%9}!;^Fl#JJHQ2%h%vldQ3_aLq#7%e9MGrot#iQ%5k|CtDZ)H)D zZ;bD_{8Xe3ADmR=s#k>n{Jq^fi!q0u@~Dk>HJ{YqOevXR@qC8d(uyCwHi}gd#gSL1 z2fFi9B5!Hs)w)dfK6vKfKBL?%t+X3@@C1B+hj>%KQt%6B+U--sGo2CETHdLcRil8j zn)_eEJ4k!U7PE){@+F-sX`5Q}&W+kv66-3SQ>{SoJT$d>H6FUjes9zsN?y~bKYzsX z{0+gBPg`^Z_|T#MNSu*y#*q&7crC9EwX>JKHuLzT zve9Jrca@Vy{%T*vjP@H74LbYk)TdvaNAu=isGZkI7wz`B@d%&!w;pLRTB2gcW=~Vg_lTdmE1XpfW>bv*te?W)rY~t|`o}`CzN)BR~0eG@~ zlA#yqA?{`km0k!+&(xEw13TJ{wl2iwn3PsQNwTUYq&L_Hp=Z_Y+C%9*_Lsmo>u=s@ zH#yp2wyHgs4j!@=(uuX45}DVMufkT2SXxok*5N8z(LbL|i<2UjXbXjpR)EMs>kA9H z`YTJY0Y%YN``*m1wN_Y>k&PRiD!~Y6R(k$a%Q}j>*HW#?Ed1Tfjr;T;C`t;M5;G(& zCU8GEUa6oLeDvC8tvkElGN@-aTbtRhJ(AsN83R7>iVfB3NaP~VrmcJy^V_B=DdlN> z^5Su)N-$F0azAfx^nPyKUvvM70w=(?qogOa=Yh_x_@MW;ktTOUls!EB0C!1@EEf10 zE9vD6+UK*Iw60fj);#-MU`>1Z>>X#%H(%Mc&x%U4V99_ZR=|n-9`x#**romHgNL+l zy}f+r9D7Gw-bh`7qR4f z?$?{%XEa+%XnpTCqxODU4u|BS3(Wkp!O-*|l7@tET3-AY19<`lYOX!~7n`)shnwr$ zu{S>nI~`-~`S)`l^M=oc@}xNO_#ti%^QCuZ9@ib$C>R}% zD}i?AuP?IG_^OZI$cjJs@sMt>ovF5Ih?VM^2yD@!A6nzAp(c&Z7RVOBr5IM8Av^Mx zM%BuXkd+_Cf~94`4hy^z9Km%bFMM`aZJ{iGQ@F&i{=(;WXpjFjZ}44T;EQaIJb5rr zfcw9;kunmmh@g2PmZmxZKbbm#A}J|9e%39)ZC~ungSKJYCheD>YtmbOk@M&6)($gm z8V}1nnGe*U>Fa+pcC$@L>c*;_R*VW%N_+OxyS3mKHkA{LOTgpLeDUUb^LTPGr10^- z;#g}xEvZ>8*_K8czT&WZH?6*XVVfPwq8UwxH3 zGCRMv-w;mfYH%S;LMMx9W0B6+dJ3B7Lj5maJ798h>(_Ztoc%iQn}_v>a(dJM^ug)` z!jOaBZ@frHWs9bLiAwpPfLQl0X_XAV=&V*n@j z?0V1clAxS)eXsVeZ|u}Q@hqu@Wo71*#&D;8D^z42|H*H4?bUxc1^V@te%i4~+xu@&JB=#f{++8#i125FlVB4)-YqhJkZMS!A+qP}nwr#szwY6&7_Nwjn>+`(t9(#}R z{Yi4o%p`v@Mv^nvdCbmFE~_WRiM)s=ib?eWM$xT>owKTN4*aj*dA;f%KE^AagKP6U zg(rSNEzc>~&0#&A1yOs-GI4`oA=`%~KA)YQ?zi&%8_)Ns9$i3)t2IV3?b@*N3sPwe zE`1GOL(gn_6TRnkJ+6i;fbJaM5Z(36ek)&(GoAb#m!0Bk zRi-~LHR4X&3dvXe>dF>8EEsHH(;yDmH>zu{W*b3J>%eM3*O>5PEMZihKQgvvpyRQF<)pO zs*gL(>Vp^dNMKKBC*`G;eY8&#K}FN5kR3bi$O7M{G2KpE?*=MewA*c+tOZm&Y}#Gl zTkG6adt9klD5ppzqRw0@@`PDba-pm6u+h_)<# zr87_Cj%#8nOWmb0n(tw5Z)Q5_8>7)@O?32Sw${}D0-Ssu;h4)eWcb-$SC{Q@`H7jIH^W~UTvwCBA-b(XoNgG2x&ZPHuMHj;?F*4)1_e4!lX3VrB=PQK)?$l#9NSeNeCv_P95&7UWb){=5a*kIwy> z!yBp-Q-L*J!m47d=a}b-8rg0XN&0-Q7Qieo#dPF?>*oobNco;=P5yvkk+QK|FXSyK zWa~RLRfpp5bWiOvUALM4d7wpq-Xuu~oaP1ii7uyRkNDH+zd8YMQxuQPVscO-ixyEc z9XICj>7b`BJrPtO&AFAMTqkz)xAhq61`+TfuIe8BPM{T_VQW;x@?dK;L~&rIwlyt* zJ=vU;)ZsWZRjoV+VQbtsRo$G7%+mPTX=-YM+wkSEKyB-JG%j0bZAVfg+-1G zhy6J5y~CR^rCsk{rvtX#_2Yp2YFKb>-}7PXx(5Mtt!%roI!=m2Kckbag`EP;_+*suSCQ z+%|aYe|6nN0NcRy?vG~}_rIW_eY1Y9ltq4kncPHhmTGy|$aI&F%S zyw%Ogse}4Nj#A^JwkzU>U~n5gw0{aJj5)VP?^~Yle4L&|c5{n0=9)pd=e1eR^{=H0 zX8fsQ1A}_D-ps}gfx_ZWj9+%o?lE8zCPkJe9!cPw5^BCoCI+yYv6!ix?g-7LIh2HVuD7FIWztaI|MCi+s% zW2Ig>E4jB&aps)(!>We)Q6Y6#qi9mWPOc_}VFk_PLc0x)q#55=6){^PalW)(v23m9 zV9_<{=&yq8*lr48bW5a#af?(8RpMU98y|Fzu~)$xC%xOl?RSuH zJX5BX{i}l2CXB3G59%57rzv8x^6cLz1W6ml>g;X+D2y_wm}T?;N9~ z=9r}WRiy04thKH(QQ@XM9ciDBS%F@~#Ox+>)aQ1q+)8QOzSl!_CP?s8u{#R_4)L_t z>Pr)Y)vju+{3V_~(3lTXj_Rnc8mb6XR2b<~jZ`Z;ZmXBUl&|2duzqH=m0C9Y0CSL* zy5*_Q)l)y4tT}BRCCH6`Dk%wxEkPGlqzD-_82dwNlF!S6@G51TJIO?tZ|MFV%$pnTTai1 zMy=Pss&L{Bb|3<`;Y^VyRfbyaZR!!U$^J$il|@F8UDOa(XyMP~G)5Z!aw2N$A0dYd z{OL$RFLTj@QC8FNx*0PCcfS2ZeX~f{Ywu0krdNyjGX8#a2j6k>o0Tnii-D68U9?V{ zEY;<3Q#P~_bVxewtp>q~Gz~DG<8_-FS~MiI{1&gRB%K)pn@0BW(Z>3*X${S1B%n7B z$Je=M#`d8N(Sq&kIyhtdvIfV8%=R$}*8ktNHJZbJMcGhn-}Ai_v9h@&WPD4k6ruN+C zl!WN!I#`E_bP=kzbyJ1yOKSVF1lQZKw~|=gwx`DS@$Y~2qnpkD>~<)t ziq5&8fkrfd4eLylc+0#PJEq!=u3}w>F|YLRJxOpA7%v(xPy?N4eT@&NQ!Cm{|>eg^07gjh5T)yX8%`I z7Z-X(*rk8^zCZY{m zRA1en9BjwO!<&);PDZvSnT|%bwv#b!jBNiEH`BAQoqlxN$*Gw3_Wy{g;{T)kjcGq4 z@&O;&G)>tbqPOLMm*LOe;MMKY({9AJzb85p|j#C z(h7}(pedI!wsKh0B&uwVu&k(T76w$~DjNT{T>^g;H|z0216gXgg8wK}%@bhW>l@wK z6x&~5McKp7QK-_C$J=P6K&%IQOG1=u#c{n>MVwU)q=AK|X*R^B0kbm{8_uXGEIFQr zccYybHR-W@{t(VON4zX7hdW@R4Mbl?u~rJI44%G3Qu^6c4yraxP3b$V(C#>3n&MW3 zEnmfwuPT^qfn(zbdN%Fz1k7NO#+&;D6y1xcF;yx;L`{-{HX|XaN?M7Og~&{Wxck{e zASZE$!hImkTO7CUw&jA(!NVg)l44xCN3RhbZ~=AJz9FtBh;nEhNs(c}D8t0iRaKpd z6=|BByptwxC}^muz^t==?dLW1_(pCI;)w)}Ax2+ovzqfhgU&q_vVBkjbJYMj0=3ngjtDpr0+5!rm~_=zCnb%cVivE~*f`gv?ua&Ioypj8DTq zV;*xN_O<DA%vr;J{Gq4b7-w$pquF zYDcqW$n5$E@o_=!bk4S%^v><@0FLd@mfJ3LB30yNMsgtq6@|a%-4nmWxn3{f!{t#lGd8hQ#a+vQH;0v z5)UOYql?CZ>3_f~HtUnIQyqhMLreZ=Yf#ZveH>0o2hpH{Y1HpNgWHUS!d(M$q(^hyQ##|=? zk#@Yypx$qA+&W%50y8lKEdn7f$gBd%B=Jibd4MB4M*pYVIL&*7mkj@@ERg*b2kxN+c8MW z*1iHIudZuX@oN3rAaxlI9g$7@Ff?k@el7)vuA}y~DLEt7be>`Ok@62!1*SsmR7%t+ zgFM6Yk?SIsN&oJ6EaWt_#Sc6#p*{xCl+H5dS5bf*h&3fED|zzSc1t1dt&?M8vl?uY zT)Na5L0=OJ-oms`gos?JjwieN%#X;A4B$6SP(MwNM?~`7si&CpQCy`+Kz(EAZ&5jW z4W-*B4r>!afBeh?2{ zffHF(KMN(=ln=&^v=>6Or5Jz{X)6ey_jVOR^pI&QfMP>YV0-E)2q#kSEC_!KCUSK9 z{8OOutX~Dke#rYU5en%T<_GTQ1NBwu{gu`Ez5?e(mAh}dIvmH)PkBYm^|c?k0Nd(P z#MR(J-g5PKIcK#4SXP+;h07G~2A#FgW2Ubw9zAJx8DzH0 z3sR98Feqg~rSa+z!P-pM{6|(sWqOS20wIIkRw{WUd&q%Glh3!45nlK2 zM%5Yl_O)DXL{ar{L^+u>24cf@|5kS2WRrl|aGJOKcGWx$dyy`UzZ|!C1K%hNauDk# z`k6kd-r=$X@jf1>h7ND_c2vXzPG&EKXnCvq)1|m?d%#8)^i;Lpk(b&O+2jkPzc~0k z`)HO_WxQ-kV476|QHZYtm`c{EEb6utM`7VnB+0@Ipz$6ouamUo83c5j^2Yw+Y*xkK zRbQg+Lm{P2qP8z>Z=YD}EE}srUSJYnA~7~x zD8yoc*~Qn(Blzh&N7ad_j_iC)6oh$xCKb-ulw21w_LfI|9ChMLFlHr&xkZR8(|gc* zu{OXlQ!Ah>L91)X>>Hyr15HAgq+Aa{lQyQSk#KmUV`ltSVyp+|7aV_94 zWZwPx8mqol!~`5xF8xzJ|6vR1e>6Bpw(2@$%D{CKUc#My9tp8#wcO^m)DNf<^4Tl3 z3>1bs#MgR?ID)*$|5f3m9->`dL))t;)l5mqOO0$Wh(}{2QKqE&6@jX<0{qk`LCRP> zg)JHA`7p;XC4#YtVfKd=pAMnKY^T-8r+{kDt&&=zX{5Vga}BmhC(nOT@I^-;zq042 zjKNR^%c(NbjMmAO0W$J!bw8pWzfZ<29$+HmA%^j^OsSu+(cN=E(n=^_Bm3R8T3Z{Db5&W`O|Dv^SXU5 z4^OqTSzB(Z-)H-10lN%BSg747^FBvR#lRo-bhXcAyXlMGBQ!p~t*U&9|iODjQgz?SmUwkX3o3N1*^#+i{-un%k%G6J1`h zGq%GZG_59ROiPFR<`CriO|up@+X|FUD~TrMooG=0aE_qX5mbg>H*_sFv8t|_K} z9dkvGdYT#;^|J_X*;HhG9rd=>R{xMVVQuELuJ!Qle^+XXw}-JEw9TDY_KUPFp1+^&6c>tr+6lc?6R zhGcsV0qt9&9?L4hYPW57uajNXX5FS*YITviDyTJxgcLgTTK2X)H~gK@-us&sKwpNK zKROJ7ejgu%p~ttO_^GfbW(m-zd@1f!-WHeI&oRb;uP4u^2HsgeTy@k+HU#(0Bw1^F}{d>BrWM^Wn|34 z`OpaVTAo@|U#MZ5W6cb{TxAId6Vp*n^0#S~E~YM-{E!oeCTnnH|3kFJNx@4>;w2vz z`dIh@+TK_fM$p`aLpf#}-~J`Sg!KgABA;bJOQ6j=g=-;^n4-B$0m*!*jhP}yDn>{p zDN6HW2zXw4NlKHKNQ*}Q5bZd~hxQ1WY3o6A$piYwY3M)$EL5}yBrj@Tiqp^b-J8Si zF@dyXw z`;EiLC@LEb`y?h>RBYCUzx_Kd=J!KvTuk3DJvkK1w;NE@*1b-N!`h^x1oPzR=){16 zq##frcr1)dOg!vx;UHuEHaq(+Km8YW_0?NOCT=EC2*^-~;r!KA@%WaBDnkCo|37gS zCFg&LvyA3-Vc8d$xY(!I_!pR@k{pmRO_xd8>@eo*%Qt`djJ#_rL= zau2Y-j}y2YJ=vKe!B)*L{||6hs;tFNpJkpc)Hp-Vr%#yQkwLtWoY)8S1)-f9MEEg! z8~0GZD1mFF0KuE&lShbWgjgZ?lztHRw4mp9ZWMv&_eXf_v*-xK@bC!H;mfEv-;oCk zlc!}qJyJL39$c(2<-u@K0znh=vQQQzMPKvj)XOFp9&Y{zHU?f)bZl%M4mJknZ~m}6 zh^HR{u6(oJ^>%`RBr}7R@q=w})JMJ!B1xH?@a`wYU8-XZqz5AS)nklClt5D7BqLXY zF}tI;{jR%l8+{wF`I_hFDE(?z}?K(29 zaND8o-|`8wm_KdFi_dd=DB z9Chzb`@F0eqZR`Rud^%K8+@Nfnbg z4A7ZjR|$=VbDW+5ftCzCRg1RpfA1@Ytnn{V!~U)|5lC4kHjiZVQjl1bfKNfK%pMPNn1pV@FOo``*q`eMgxB?juXUx)&5A;v$2`(%ocAv9PIb%u3 zDV~rnd=Tr4cjfC#r3JAK34v-DFA#Wv)CUyMkLnEt|J3r##^<(Vym>vjiQm!C1BkcY z5ThAd5y<~2CHdl8k_mw4uQ1#ShMY!|iQh&;E%W`{`qc&k3yz zpBJ%1#xp&OMk&#FR3LFraNy{VurM3|E{AMq4-OsD;M2pRQJ=zlRKuvxG5{e@Jd-9{ za(TI#5FA@Hc-c$A?8R|c=40d$Or0%i|rNdVv4lVr@Q2!EkEDxbVXCyT$-AhDVdTyh0N#*6+mcOdvz@N-fZQvAEH8>lsB zQW}5197J*~jTnQ_N#~^_4{740CHcS+nlLS?WZ)(fht5WzB&iBA)={M#7ar~(E}S6hbT z2eT!QZA%kRa1gKUg=u+g{_YO2o8R|VpNnD0Jr~KU#|hVBLXIrWcZO(l#<}nZ3POmD z<;>I4XR(Zc^cMJ)ou2}ZVsWslgZu}S1)o;4aInC1u6DBVRb;X%WI%9YJsHV9t!}0X zy@LQMf%DIrI?bsGp|Co{3SuBjlreIQvH zY#YP>+%+W_)6)Nt%dachi{_3=#b9ixugiehj~uq`yrrr*qA+0Fp#Os0L^3Kurfinq zEm0lC=m&zdS2A3vPCqLG)iMG}hjn)H79t)T5z~AZ_0bvTAJ`~TfBcC?1s^&xZuBIF z^nwVDQfALUXmiIN(m-~@wdfpEgsj0|!qpd7J$A+VJGF1J2W2abH;eNY=ur$7Uy%f| z3I-OPKy(9t`hd733RdPp#~ecknK??3X@~JnngVsA?~F`_WH_1t5uBd{G=8CvFX={V z#5c0qfL;JJ0FZIR^tS|{A*;ABWl{WN{CO6F&>IE8bS$r-%xPUS72=_S4^uL^3pYx7 zhK640w}9}G|4sM5Ro4W@ayV|5khD)XM7GSp_QLF{ zc&Bvb5aHHk?&^FX>GG^KY1U;H?iMI8n-Yve2`Dkak7CA{9W4iKCX5J!2WbSwmx)(| zF;nI(V4vT=nQH!L{$+@nbw~jPpJbp|BAxnyn6nf~;eyEsEOY!%4mOEfxRVZ8X0c-J zzgcPg^k;vSD2IcdDa|WL?sP7k#pgJz!q}V+$ev(P)75+n*9zX312sU@%)J6^?7@74-Z)6d>=Qb!Tx^WLvA`>_<3MbpH5()SzV>Axv$XUHm zXZ^b>+KmX-DzXpp7)orv*03z+-HpK#j*N&TE2_Ibk|9=6qsgzw2o9hT570mScBW?Z zr*g_E&{&8pAShi7;sanx=wBed_Z-xIdilgp5v4(PehO}9m=M0a_=bfdJ2zPe0)ZCN z*z(r&^@6223_^V`j)_%Xk!yr#mrWJ|;lq*&Ywa~uNVoNoydqfRv$JPkpQi!A=7%es zF|?*=m4AN8ATv~D?$NHd3ux#&0{wE*vW7-CipK9fP4N0O;<9M=YYr~zq~LjSYf2yL zTi|o8%S2x>hwXKwPQtmhuq0aZY-7E_=W(7I*0 zKy#@5C8W74cmIibdgtx}e)I!B8)%-w+@t|A540|iU*A-g+gu3Cn=%3p4|J^NHGy^8lW%82Y^dd=ZTkEbRg^_ol!30cl zR*#UCr}YS51_DF5Dhsa&AzMZ%3QxHArD+}9qbn4v$^ejOQ3mMQDKWtmv_eZpQs30g zm+HJKbURqt0%uKe3443Qct!I*5=;or4_aV`*+$3ad9g2ROjtGN7zv5Mm$W2sKr321 z1jk5xWq`>X&u7$;TgWD*UV%Frf|aZQUlKG^O`kQ(dW`ueRxrf%Gixev-JG3xYcLGA zO2cNHt@>qv>32Uo#$|<~)`^xV`bHMTx>`yJ0j;G)x%1bBgqrCfdMRu*pt{y+|J&?Z zX1A!acI0;Ea0`ryU;R%4(AWgOK3Rq|8b3ibAv6NCgmhqdIQv*ve8QMCr=4Jax?SaR zOKpwMKbIPvCa-s^sLbWJ%SxNeZQtf^yA`{wbfN|s+vmYN+HWB|4j_U zpbuRSOzaS>f5e>0?Vk;4>1UJ%5;Et_ElBE6=gdF(;(n+MF4Wu$>ix znwrFgm&4r&u7(U_D;uP+i-%$x(lU#!N~a7}$-nwb&z5QwGgk8a#Z<-h=i*M8b!P(r zV`5Hj;@ciC(_sh=_)utD-9qcaHwoL#LjQEr)CUI0G?H#NQT6Wjn?AiQ7`y9b*1M@J zm|YueoCxkemB>Fg0F-I9XYsz)_z&va9`jzfCZa|TU(!!_b5gxqluIVqL$+s$wQPB( zmpb#y79dP--f6|lkzo~Z4jZe9-SZ8wu}vXq;`kHBvkQDLB}Wg7%%$ApjNMmg--9qCD#43k3NcX zEDhnOY1qX(x1@ho4RsjaX7OpPVrg+a>*c6wm>EGulk${MxEsI!uvKGq8GJX_6`Z{V z4yPP2hv($MS&*xpok3;#E^@tk$o`oD6$liK0Q?jXMFi`k36F1Wzu;BAv%?h?Y5 zt1OKFuAr6r@O2AwM*JM(wRkU9L)6)%r){W1^7QRxk@Q=lcVV6{bj(Yp4*(l@u3BCL zkMfgribY`;HiIkymsKKyuqE5k@gmj`bE`}7W(!51kE=_uola)NNL#K;s&yTG=sYjp z;WD<7U*~;Vd7Ou^AR6zMNYuAH8&;*vyE0EOU6`>>vSrYX>90y-ei&(f@Dbqe5g2;t z$ya7$)S17KDj7H+6zo8z&ix%()Z3-3sh^1Uxg)i=r6nclM3>@NUMH7nI*Z(W>EA@h zp|i;$(m|1cGhyKhDs7O-y$yVrV2W+gAufuZM*=SwL3dYzsh{`={|4%QN;}2B%@}-V zboZ(xN6{DnTiqX?Y@5W3_3e1EiFSrKqW1?Hh0}K_qa=|b3>4%Q;!Q3^5G8bRHc3+!@aiZYXQ?46Nx}Ye z#b{oVxZ5s&nOi+igwFL4e~5GHt}Gl7xhx%5o{e|fOAoAUZJX-LLp;EZbaAQvigtzy z*)PcQZg_^X-XcTgq6M=mI}G)Pq!5x#1h0`*Btok=mi=NVUIfp6tgbaQ2q)g;gu|<4 z)?)wl;+i<`lqzOAtG7axl5JtEGmYqVshf|T)7OeM+T%T6+`|~Vh}@Du6k?x{KdT%dGx5&ldE`MwV%wt1+Hjc%jQACO3Ha$#{Bz?-YO-U2Pp8B(%Z(D1yKW+zw463BMUCj5lx%T6 zaTeQ_&{bIfhyL$$A(1#vlo@BCeq+)aHlr|Z#wmHI=tj6>{Fq}S&)c>|_0|xxe{Q>L z;g;hPpZ>`h3vLXVwYbK8@7(k@@ixk8YGr0-@TMXs2#RH%uBy`Vm6eneEN@oV)1|*$ zX?DJEk3VjP=1Mox3dnCyBw&m}wbx$GwE=g-w-?5ldp$FJp zMF*oawBUyj#PMCRJ`kAn`p{@d8S$i}!~KXJ^Gc zaXM74iOp3v(JdpAqL9d5@;pyB-vvL5apf%rIDhLKSR?5>r|9$b2z%-=Gb@;R)~uA{ z*i1OA`Iya^_Iheq z!{LZCY#jv)i5vD)?!#`DPKclfE}{o!ya0`>mJv-lIc3SnoYO8WtFFG!aZ)JhLYnb3 z2o)kGgbMB0SYgZE>iElD7gp@8B9Q=iPSFPS>bEDrKy~;78RU!Ii#ZHx;4W^3ApyE( z!*IML=fvSb&`l(^CMc3nevk}43mNF+0~1v{l5nuefD*p3xP_+8ij@?FuY-r1b&>Mq z?m_3Xem2TlQ9&IdZe+pwnT{V@XD}&%iMhUW-N>zMN>fWr?`MLifA?{H(9r7 zq><$I02oKEk05YQJs7`fnH9n}dqY@9aOPOQ{m;NCJSE?Pyx*U;x1dcLbH%t6%v{T9 z04Jhc($Ij!fW=?(pbcqBy!sSXyXqRJ{k1$F2gcgGV0?@5hxw4V5m^%gM|lH$IPvD9 znG>t5Z{2*Jd&gYBrQJ!~Oj?t)8r~GGqp?&V4GBeU#Zc7SCDzciK>C*wAEn?X5bfP! zTYlXijeRlo4+Gat@Y4(BNa9u3XK> zAWlNqU#nEi$n}P`U>~7dR&^@J9vRa$&nk8-J(RLeb;G}#95q~FEvR`D^_D4a;H2%t zP126C=hTmd)|ul{CZ(oz?rb)PGy{0KHyDYD9r-)|6@io4#FidAavju1;ka9-=L9p= z|DA;(%d{6Rz1W#S0ueJNt^O^-VgFWLWH>(k_Ec0r67DbI$^(hx%9Fz3ppooYqdI+X zuM}O3emFri_7}t5_G^(Srb`pa4sH>5>-`R7gro`WQmM{+QuEd&DN1f7MxAQPade&f zJF}M7!)DalNtQ`V#Osi?uDRRgp>v^+EUN2bc@+E0n5a;>^ARpjgY^13s>$m68Tw#o zuB#V0?DbXa`y~guzl&seNp1Us-s-y>_N7SgZ3SjTIG*oS8=#YTlG|FTiA*mw()eyH%X^+kmXVCs2Il%)o)G% zN%OBjC$UJj^YW3?=6ZtnvLVhmrm$r+X@fv($pxRDnR@EEvNmEP&Z#Epd~!iMe6YZL zbdowuBAQ`Q~L zyF8mM=a#}8Q-}3vzxqP{!`r~4;FxKcIPFY(be2a8#bIM9{Qz@AFK5G)yc~8fNFQcgSB}{LN^bzu6>Pkl3wQ?ITk=;%el_JI^Y9{l7a5I zi|`Qmxy5N9XMx`~tI2uLiN9Jn2x^{6CJwBOBs?FmvDCBN(IC@E@KhT#i`_;1vs#zJ z)9^Yqpo<9I?ox$?Qd44(St27%kQ?c&zs$bI9U(KvowkdHDSjav10_qdwCTfDx?cxc zdXi_zr2plDKJ3Y!g8Sk>F{XSc)lRhDTHIjbAmUU1Q?FgKO~J1*BSVOOJvc}{&;m$z zd&>~p1Ye8zKw3tIn{=cpv72;4v1oKXG^h4u;9*O6IdBMallu81RR%9%3o3<7AmL@L z+wZVvUO}v-E~XPM{CbJA z#siYM(PzMdHoE#nR-nGX)t>lIu^#KgA>tYLqUqN&dEs>UhF(S;TJ)b_xi(A#<|Znd z8*EBWmtWL42~{r)!51hSSW?K(tkRFGK-0GF7i|86&mBg>!^NjzhU#p8AI?bDN`hC9 zwZ(gXgR4_<5nbND0`(qKaGT#xnJyaifDN{|qJ%>MDI9bg?6clvicSPE7l@I{4}Wl1 zo0&pG4~_B0LB$y)haacsYg#uNC3X%d05zA^t2*0b(QJi0Z*(-;9n|Y&e~|tXMgG?> zFFORK1S^lNlUSwog%})&xIaC;jGRAMfdJZAx!K~~ab)S!-ch0blXD~BaQQ2;#d(v1RGTA&1DW+T% zuZ05%_?P1MJ`(nQ-$;6yQ>Q!r%m9*lT8z`BS+$g15~J`U6{IrFc(Rn9&6F?c#UQR% zQTFsvel|YuaHR8$6U;%ixIHx^e7p zi>nK(bCYyrl!n8gxZ7`Hoe3+Oqm#(yvZyH8@LU8-);(WFoeGg985g;Fm9p-eYmO>e zfASicu_T(l5`URaH<^TG=U!&WIO@iIyvd>hpO3pC>5;iI-rPZHhhuU+CE2a%2g{Np zW-jNczr$qJB>VmMy;%%}i!B(tCOCZi#YHI-tWspm7MzC0T!u93%o8E3`>@=M&t^u@ zbF2@8YLY`3VnV&qe0bmQAaD27B?_LG?o#($YGvOZ-AxGMCTLTBc}>Z>q#Tlu zqsVWIUL_(UsQQ94?J)iwSD*8nNkEGf-LF20(e|^DJLIhMab0qmWiEc4E~}tEcaj$R zcN7`MK!Lal>zU}5hy6$~XrVXxFkL}KH zONzP!!@Q3=aOVGdL^H*DU78OEXq~D#^S<6KE%>(lVw!%l72K-e`J7@|klJ?6uGA$w zk+JVoIMOyH`*pKq;dQEFEw=KWtyh&`YD8q^lKIPR5unbSm2uqd131q7bjfK4ai!lb zTxRbg&x@t8dUQS6e4af0g)V01OxXHbf86aca12@#IuC_$1I4{R*#qA4k;R*mh46mz zFzds@&wA8j&NE@fJ`V*}B^(c8_<`+8rD^jkd|*mQtty82F{ziCgDs+`S8!V_ZJaDfnsb9Br z7TXsGZe#N^N)|i^)%1!LFUIfkXIEMQqUc*>wE1$IU=v^8wkc1fFQ{iFt-y6&$BY@< z&e+vKclaptkaj|IWZwQ{*WRB1^`t(ov#yPj&_!9!jyJ%mR5xxshsp>}_qXd=_M$By z(*-ixYztQrxcmOMz8KVmg11Y*jv}QK_S~;4Fny)=u+#5Na1~^4bmuoQeSMLrvyuSWTVjEFW z0Gn<^j0M*Teb-SD0Xw%NaQ9czyy07%7fGp-;;XI&Dpk1iSogd(r+uArz|OG+HMi5* z3NLiXRi`%{k0-r7iG1^ErJN*gIo{kkFC}dQIxM%U{nn=iE_uyCwkoa};pef7V!O`V zS^jsIET_IXxzp*ts*-GJp4~zU0r36n(uMCfJojZazIyY!Hw2^T6gF`&*}#sZv8S># zcs`29T+b4-9z=wJeSv{WqzxoxLEy(!s}i~*FBrwkBs#B~&^8OWp8#7`V58>K25eIF zK=m^gx0AE9+7!ux^PrW!5AQ1>23F1&4bqB1!-sMVK!*j9IS^}Im-ez#9urL?m$3VY zoqxv?3i?_S3z4mHwmc3oR{mO7LGVyH?7NBwl*8cX-Dmnlmzcr;jl~W@6omeJfV?07 zHsX#@(MAcLs?j)*RJ?Iplq=3&LwRaFgae23vf?rltY5#mcmySEJ#f7Bdm!)zpu&Bp zm?Eg7B%@dbF=Jd|kI6nj;f6ts#(gYN@_uwQybmBsbhwuvg8_9+`TUBo!Rxuutk}a% z=^S`8O%H7#@06U0a2v131&~7s!1431@JT?9sqruI#Xkc#5TKESo)VY?Q`41EL1}`=`PiLCiu4XEb(Yz!&xI!He2dbrV>&L87p~@ zykz1zp)ea#R*taH{VYMMr0jK8`Cd$ROz%D8GhZ&^R?K`QCTq_p-BM6L$Mf8eH88+8 z7T8D19R{{Jq>p>9iTCxB(SJ?ezdAEotE zk+aQO(tDXt@LRQpKDrJgfXX5^|5_O2p*{WIg`JZD{a!<^-totk>xgn~((5-u5@ zl8UA=dQmFuw*}=JAi1#Sp~tEOODI`&->6_gT3dXlOV;rq4X0z@(*n^~SJ-GpYPwN* z6fpnnBd+Oy6+$C)6PQG%?BhJ)!_Z(+kcn1lQQ)Z=@-Jy^1(#bkLsIV}MmZTRuT0L{ z620e8g1Ma~Ns76hlBu07Hg7B=bnvceFaFruVmj^E+YI^S{qVtT=|JT=^)sW&O><5U zE~r~UX(G+y(4lAi5^8ti`BBm4r)5?>bt`0M%Pw(pQ|(F4vbzjZBvYXnb4X)=!kLR< zief&RXo_O{IC_8jY(-2CxhUO6?)++AwWr7Z4>$3ME_xlf)a%cOJ?+@*$RZZyGM#S) zH>=#(oUONsHBxr5w$}sebA=%R$HPt|u2b`M_v;iiM)qFl{6)V$Jj&`|L!TP69k0wUVll6;x=ykND90uhdT$lK z^4Zj`HX6!|jmVU;2zFM)mH9uIzsYqnj@WNnh_>p?wjHyJwaj8vWR&bOJ$FF7 z{9`yw=7@w#0~(3Fs$`A%R&-9i`0f|~R_U0@aps;Zd%u5TQ(+NS?(QHmLQL4B|dCZMz;x zurT9`g!UK=CuTYU$NcziZeB{AeTW}+3|QRZt$q6;loyGOP=y23@FBns?k>;r7(mKK z>DM z<)ee2{qc#OZMQ|nHm6&0eB!>1C49xA51}ahi22&RuipN3py^P5fr`w#G-UHINMMBp zcjVjDT&W#H0_fm-(}pkS>NJ8292DbG@d;+gd9~yz#KFzQcu(Qs8YWhU9E~wlep7Y} zMKclmNXT?^}!hCmPjg9qq4R+E1Hs=|YX{0#vr)Mp6%H^+YB0R|#kami95UB{tAEr*Uw|!!M`ZMP5DIOTS4!aB8&jir=z# zU%A(A1A!xge&`HMCN#G&|0OQ zX7N3mI;7sgb&0vNWfT|lp&oEsbtI}IPGDX(Y=cKViTTE(I(j1G*22hUa_N!6m+Xmhd5y8vBEO!)1 z3)}Ju;b{qOhDYyAk1V^?cD8T;Xkjz3yXw&BImtdH@?JR~{(k_7KzF~b#9ux^1v`$o z!mfI`ZiHp8#-Gbapm5Yg5Eh0B6W1)w*zT3L1Y>G9@Ywb~FTWzpI&3`F!5A=5O8gDS zvQxi(62u&Q*Pec}a9$ViRyXwQ@il}(?xpZi%U@FNvS-$2#g81R1u%~wtVfoQjA*aT z&Y#W4k3-=~jJ~~si0Dg=2+Qy>uXnv%%MrjI>XJMdsM)7q)1_mEr)T^0hvuvlcNV4? z{w2`fCCQPH$C1ENjN8z#XgoA949t(ifWb;^s2Cjw6&B`myvX4X$@fIrq>jXy1E zbok|gprJ<8=CHpfWMR<8hb|??u1#yi2gW1WFQL4Eyag@>3|BSuE))rP;e9ZCsn87v z^sCT>D#IJFX))VD=E7^dH9N@VVU4c_WqK|Ar_=?`n0VA51YORL5*5IV4h@=GJbq`j)mX%kJ-tc*pa-?Z0#aWn;*XuP zf*T*E0T;wI7zh5ts7N0+`V!UytJ}-@Ki<&i%#H&_2h@14tG0NLZqpE# zWPBJcee&k0;^#myy+;A5#USd597Lso&AZCMiiAOZ^!N4Q)xuDQwSafi0hC4~0FI?a zahEw4t3X6z(iNfZBvOfmlmL;vLdfbhLGxn&WfIj!n7{(W8B$783Nr~>locSK1qleNAIJ|c59W>6L;VB2jB#1( znBel;-=PSCy>zL}mM?IySlC@#Q&Z!S*C8dl5A;^>M|QXSAS|z5HwTnSa^zg>qIPIY zj0*2#<*Ek1mDLyqE2k#HWJecoOPv~A{Ql+;urqhkrUjHtEoQ929D;e7v(ORxpkX_Zd|Fs!o&(0$|92eli!?s!@ z;<{CR>9HlouKmPy#a39zQpR9ky1N03>dXZuXlz9u=^%X%UFCp^pv1^k@(wiTn>NdV zC^{P$gWehurVrlN9u4mA2NBWhk?U$|YpUQ+9n{*2*Rmdr$ZbJoKsgNc*6rtSHig9- zUs#E45bZP|i^XN$xVAvl$jIa%Wuww&@ z@cUp;s^L%~fncAw`4lWrU>Ts14+LX~2g6igyq2*Q&;}yI$QJO<@E}**u@Z0=-62xz zivvwXt4P4qiv|_Dm<49iuk&ce5qk}kg(Ik1+ZtM1mFJGtaYu$-)-u5;&WI@3USqel7<389?6wb9ZfoA!+OoB|t+5#kv|~fNTDqD&FnKLqSfGXXysH7a z-O0v|GX}8npDhe~IxTzI)XFVex~Qy42AVO#5p4mE6B_T(C;nWfvDvHzX}erE2gnE=5rjd_UemBS$KaD>UEiz~Qhz$!i@G>>um5i@yO= z&9BB%e2OZ4VA4X*_?4Lv2mms2_K*2ivjf2>D(Kc%sAq41W-YIM>>u32f!%9XkoAA4Y#80aeCYr1L5Ug)byyh|=yaRt(UIVlIiz0M01sRA zvPMKp9=XCcDX2<|pX?@g%QsZij85uh+4${c3Ym^Lu>0`^@48+9&A>oKPXL1N_20a- zKU8lSqPPHFP^y(8e647Bh!28he4U`?9pH+nQ3tWP9t&zwewkiB{qJ%KE8hYO~6lA7VFIXa~qHi$>JitoDx!28gy>;EeEpTi@ zzDIA9yL0s_I5z9ZOjK7^0(A(*S)ai2LD|n+3CM0Js;(~&c)%_awT&N^W-M**42O7c z!cVJ&aA;sFPi2g9I~p>`bWp28npfp_E76FTxqJ16soUYbp@?ewwo@QR0FoRrU|=K; z3XPE(W?XOs!DY~l(G=r(aW(V{?GxGqzMTx$QQq2Aa6JLIh)uAUIGUK1g*%(FeJ!Y9 z+krmn76zc$*K9;ox^qyYRbgqb@_79H>&krH}21H5epidugRIcLlu(Q;s_ge>U5~xDoTu)K5gv5D|Tq* z3j5eRV%wbiP(gKz#3H~_6jXi5eLA%R01{~D!YRg*G&}0)uhBgJ>e6KGtAUts2W7I8=XST zXM|xVFv&xx!l8c(kFVgqd-ncNq{koPiip10v#q_ZPsC4LHFGJC$Vy06I76GL2|#`} z=HTEnZ>(b{U+Z1F+ZyE#^t8itf&vR<;ODE{=kvKl8nsR(1}o9ebErYP%qi?Y7zqaC z17YZm$AyR)VV-UtJJBEP?Zq8heZvJ;jeXJZPtdvDJ7AzX3HO_A`jnC$OCFPRw>B;$b* zu(DK`YN&?XQ-Rg3Mg|mqtFXT}28I!Q9garWra-pX@zs5syl0;~ZvAjCCky~Tn#+el zgWzn%a1y`1oq;GC_6K$Ud`!&0AM_<96k@$5SBp1CBmO`y;DwPN8@<&p%*dx7Y~d!{ z_TVZ4r}h?PV!(X>!3xaSFx#?;3<2NjLAdruA^`&oM2b&tL8iwm_b4o)0U$-7LA?Me z9Yt%9#lHYXHX(t5>Rl&?^ywj6@CU@!UvDJJOk`yEov}@(qnz2tCJp&mEd(%6c(<_rHlV9!KfP3z4gq=4>PO|Dl8~T z#|HZKaqsIe;#r4E7#{4=8`lTdrN=GFpk`506SOGC!iqW*s2>SeMUohb->iW#MB_LD zYuVHTgQilY2O@E$5IOVqV3^09I-M8`$=s^Fk%2+H?;fR)S!g|5xVSeLjRpN7_R;#4 z2S0cw&H+#ZmM)(^(M1Ad5KU9AcW zU{e)^S^7*|#X0=F@b(at;mf-|nM`8^n2m?uahO~@Tl{7sx}q;K6b^9BS_$vLLVMTB zW&Ex15bEy@=A13MHlz%DG?k7KE^>t6#lTP@oN zZ1${i)f4(bR6aOW2?-^Yg*e$@Sy#oTvK|*-pC43%dJ*IUFl~c1j^>zQn{mUPMaY2~ zBcRlwh(!h?z&n`f3tC^l*fnIFcVn>mX3=#{)k&M}pv{gr9{WU5bwpW|xCGg>9G{ZfyTl;U0B9`-;lT zCSal8k2|uess!+$0^1qsW1fYcNZ{~s(w*$rQDd1CfT_U>5#J*Yg;+GBA8iK9227Ae zpI|&7j1}0CUp>H&mvGgQGY6(J>TxYWFzw-8G=fK8jMz$S#c*1Rl3`uAGV4ejzQXW0 zw&$Wp{j|_jZH09ug+dv6>bGR=0B1sHZ%N7kgY=YVm_hlK|AO?zj=9Uezi3DA7 zq8*#0>YXsKZMv6r=MK*pY)2yHB+IE;Y&QFh{Zp%c%HKGXbeDV!r$ry1o7eORhtDpB z)3r%ENS9zc;>sKvKr8bw9%5mKnhLvi4lhra@;#+{Kiz?{Y6o6Z|IGT>g0XB5Q>8G;Aa+sg{G2DU{S0Fl4#c496YMo|;)ABH^Fts1b z+xGQRI|^B#Ifw+TKCJLwneUD_9vm1@0zqJH=m6)w3U&?;jSF4^2((Pls>MmGtC7vX z0uIA6#lYY=0WLnJpl5EQvmWA11Rw}KfP?8bK6w{%I14q){{8-7SZKE6PPW~xHVzNL z+0h9ttQ?BzYXW2hxL0ty=M#VXL8!c|PN$n5W(_0LJCCk-C!mR|IZ18C>Fya`Qttf)4| zZgo`+az`yRZ4EI?^dJcjrkvnInwUaU3t8qLWAkD$#dYnYZwM71eUZlNZemvsx6Ow4 zb561g*v{5yWN47T9^h|9oE(VB-AW9GsRWYQm?j!L%!F*|+oBtZ$;{CStW^(>Ph%dg zdYgw!fUFMshr`U{6>q0{<(|XB6{5Fflufj1<4ZG=8Q#yl9vFavp<1kt*g^}SI0l6I znj&GLTqG=s_(kP$8k={vJ)5Kp!IZLSG>yL;EIv2B0~fV;57{1J95pj=2TVPK9V9ty za~$DuU_O=lMx$lo_gFjFYn-QGctN+U+fvpmNA14MY}U6`Wie&3>3bEO3(o1)f$?!y zvDN=8nlMqoabO`nJGd54#E2L>b5qz0@$tmL8HeU1)y%dBY>GunnPBJEd@`)wa6wCn zini5BmW-%O#W5jjC~+|H^dNjcg1LYiW%Vq=V=CMVV6Zxe!s30m&RK#7F(q+9MU$l* z(WwE!88PO;K1;U#6A8=OL=r;MNutcMO_!bAsl<0n1mPRZMNFs#VIGqxnK#odcCro_ z4npe;$9WD@IJ7KvSj`j&a)b}IYz5X!nBkD0yCkWzX`I1FI zS$vuCcHKb8I^nv}BAmD53{b~E?$rl`IpS75%=-Z^m}i|mqiv7M??A|#+(%qB5E7v{ zI|tDVC8J|>AlQqXFaTVq2Q9uZk4e$(GqlfHSccw`+>VwR7=DVEA81pU8OMA%Aq>w) zG>cFTZcwT`Uxzx>i{U|-h=d6^vFX`26yt|;Cn8hRi<{`bPC8tD&Vy47a5XyG6GTR2 zi*~XZ*d|2lW#f0eVb`V%+wsiyL@x@%M44Xwl(DW%+hH*vY6p71*)Z12D{9u9V+{=F zQ7x7PDrQ8A5m6=ZZ3Ir^sYOOS?O>2I&ln0ZFUA-$H=f0*CN$uP*M(dXC?=$gt4GO#IrlBlgas zUkGNRPkPyUe!^LYYcq2Ly3NL!%3oy-3A6c;44Tv=~fR6gTR!Q-#<&`2=(-1Ij=T2F$R7r97d6IC_B; zfq?MCCM+ZcfcM$jw7U0%iXn7KM*qo7Uq%svbSy^*4i=Ij-HIALP{ME!a_^Lxs=zfA z7E|e(*csZ01=)!~H#2ygM8K(D^k;}(6xX7;Q6gv3zSkz0Z98>9~p3JbUOIFk2p^t7NJI7WukO1rW zkF&=<+eva9^ocH#=aA`FyNH`E=qB68?(8OWrv?6%@z8%H1M2>)8B8Pt@ybIg{fC?U zkp8|y%A)QHGJx=|qd6Cl1$3U5)X<}qB!ASe@&g1S5_teO`0V+L2BS(9TT1L;6U&Yy z^muj(0~I7ao#ZgvPB(YdgUHYVOjl=#K4NT#hiAy)ryX*Pjh)j>R_7XErM&C<~V#`{_!u(9xtzRkryO z9KW9aS(m%|GaX$;mebZ%jJp`^R>`gjR1S zPWsdia-rqzV(M-s^Y~PZUEfCTmgvQuWc4_-xZaVo1IVU<$1H{vH+^m=@x;F?J)bP1 zUpt?y=7f7Qxq=bygPCIwmyr4lJNcGp(f7MaXdJqw@4FaC>?Bbsedc0PI1x#X_0^F} zCQWv9|30#q(-pmOA8AU{#pLMXUh>;_C#MSvbTKgY4HwCm=zn#P!m)pq6D1=}C+|!; zd4T-xG}B3>RF2mg(u8yN5ze(U?o|ch{HTO1KT*P2J$)RNX~V*V6Sw2*K;LuZCQ(qv zHrJ4Y4*H+9WF@B&`s3x~{bWFi?x!y=g|2`g+|xlnJ{XJue0Ma#t6!`jSygDG>6BwS zX<7_Dhna9jy_Z*zU%+I2ZzXx8#;69GkY2!2(LA*gulBf1IAW_vk57NH9*D>`THFCc zupF5f8TlprB z>vRfAOAG`VvH1Q)3<8JMa^y{H!_x;^$ zLOz8^pwILZA2Rx4l4G7<2@l1TvGdoFwG;7ux-m#Ln#?=TgQ>_O0k*-e?@iMG+e$Qg zLlDZOV&3%IL2{nSZ|U;~$gKIP!m()0rO?284v^XOoO7Y>p#$(|_qoJ_zY6Jx&xJq8 zWNG+PvdLtW^lO)rQM%>;8O}98G?^9s#sMfiGel|$IzZ_Yt>{s> z&D%}x$Ot@;^|MRQ$c0TmGC7{cTm(J0w$I?qDy>w3J(z&Mb&?QGdIzX0Yc%1Za+hDCc)C`nzosZZxto>S9ute6K7(F6 zpqgx2n=<>Qc@osphAjmq-Caw%@{)z%AWx`oOx=Q+c*}mADxo;7ttG6VeQD-$7BUwK z%w;X@+yTJ6&_+5GbQ=$L3oRl!uK})Y7^9?pZ8?GRgiR+(^ zUO|?{EpGb26@Y$RrSy#}plw{0bnca;F}w<>-hI-J^tkM@_&S#ST9$*LWpQojrEDid zr-}Vw>gpy<6nNlmj%@nj2Efk;c9P0b<2;u&byt$+f+7k-TvD5KP@Zv532s$l?qK|x z!sZn1CSWD;+#)Z*T1~>SnO6W<+&00oZ=HEn&*@{?6j=6yW8YXzmOAJkHUaBtDJR=f za&QV9d@a3f85x)zcZ!GpX&D)rGHcI)QC)Ds1#)+DSND!)zCg|#PTxg~w?mV!Hv=>I zRxPPRo}cF!#SC@mi4o~Lc`%8;U-1W65>sS{;vz%qu~|!;Nsq$L*g!i&cu^NStQ(il zfhFDZ$MCfLfS(37Km#9{LxM$j0z zC1!z#4KcgCPhDSQTtbHzmhl^@#hIt1nI+>B2hx3;$r=hmaSknRB){MXi99G8yGD)F z%c)Ynu=#F_#1!-DV~`@jUZ9XrWLOSF6cz81!2!f2a_ANZwN)p-CIyS*1<5S)rZ}tI z5@6R4SuYS~cP)k4H8U)eD$m`^+R$&=8^kMp0(hxArh*NIgKEEzw$F1E(@VCJx%Asx zfhYVO|9G|mo$T5M>}Yb5J~v4!Y5MCRSxonx3x8|^y*l5L^iiC728yMZw31Z?$KrxqrIoB#VYcDMiC7X@5kfKfeIr_??T~nNmh9c1+_3w*z#`GUCbv z`3yRyyo{7Ku%GeTWPBobwm$eRaE9B7m4OvV_pKzw^n1&IJ^!i${ye{o45tz@t$G?H zTP_yX+#V#Zz2o0KbwbihY#(@ZObrku*P<+T(ozq=Zy z2EqCB$aa$>NBCY!NXWxiVPHf{UVlBx3G*|Qb&p%boYmVqJRA% zvVsYndDa_21PJe2PBxtcIW*sPhR{03zpo_cFtJpaaI1q^qJl=wfrV|zta;W12%^{r zR{^6*6l3M~xch_)56s$IO&K@asb`uLpJ%NmON6Y8WmK6dos_t&*a@6GsM1^4lb)GI zmTO=EG;0G{zSEMpTHL0rr+G&%!4wjfyh%)PBrI;1XNe%=l@OGTk+9;UWfjCt&s$5T z(JOb81x`J|?`44nbSdZ}>vEP4-wRE#8G0CnFll4y9vZcjaVS?^$BXequ z+`uf4tk=+zKrVw=#!RoOE^Ar74f^{{L_Q}G0FhxQS(0P}aC*sNVBnxpl+uokupX1- z1g7_Wm~2`OSYqO~FRCb3Icv&TCM~UUmafo~k_9>a=AM@`~5MCt21Y{DjkE zOTn3tloMzUr_jtlYh=`<@)|PN;X%{8jEUw^Za`U16o{T#YG`}X!lXGbt#9lH6LiQ~ zOV;E+xS;iq%TaV2W8A=Ry4g`hKT0%|Z6hIt}Sp9Qx}XR!78yEZ7DOl=s;5+y#@K`Ie{gz=+Wwoo?3g+#P znEAE&uxQbTiKokJ>c3X?*K6p%T=!ME@|y@y5^b1PZ6cMkY$?>K0S?$ERIF|nObp;^7Tv#^TvU383fd1i5 zl1tCIon+JZ-9|Q>0-XNWZKQ??Wtx3E3=zIM4a#cu|<@evrcOvvk7|~K0xMYGn0_DndY%)D3AU6jOX@DjmPF1Jl5sRb|D^J z&at1Dkk{XV+%}8v{iOMAn%|x(Rrc~v0fNs0=DH-FxhAgV7T)gnb68P zD@?XK17#!PSj0<4U)i1E?`Uj&LfguZE0sI{Z=R7ERj(z)(Tq+>8HO46MG6d=JPXdVjQ#D=?o4GMxrsSwx&-Chb>QXlcVL1Q4yJN z+$`8PPNQkYd}56GT^WSY@H>V(dyB0^WWO*n&A6w|xC>`k_=&cpvutuqyaKDWDZ{KL z{b@Hj?__gz3S9j+^wr%&&f)j0=$E{VwO&a4j=(RRlq<-iUxOJvWjve$4__p0Rbpcc zmXfR!VdnJQ2jS02(TKnNAk6D=Ys7QDPJC%5n`W}(Fj-pkb?E)l|0FqSp85{rsZTj? zI8mOuFn_5LeYZ=5hNih}n#-oSY?{laxh&(dk2`NXVJ=Jm^)TQj%~aD&HO*AhO!cj2 zsyTW!?wxr{`07t)Jazs=e0BRtV5#)^rDWw9#!XA*m_KxY-&xOw>y?N5gCT`oHGvaS z>>;a90=F&Y=QQOVc6BpdHuGEKlqpQfB?r{>|cwjtRrR{HKA%2X=a6r#*z9oLsOH0;4>sQTc&o#yxg9$+XGZ-rpHqf^74*?{(sp>! zq3z9Buicf=q&=OnU8|Ee!fbqMz0?RbzA0_i2-%|TAZ_%A8>C|Gt3W}y8>PjXGqa3d zxKZ+I7iJb}vCOUXuN$Q`Gi7&6TVw0ark1v?PFlA~YNUrYN$Y1+r+)!GPEkbAmwrKNY4$H+Etak#S!vdvX8mc_KMw2v zc+QRIoeiwNENk2tlDx(G5@Y{R5MU-}{f-`Z1#?0N%E(efJ}gelhqQcntK~yh;kX%5 zfUhs+g5k&#GGlx(Vigo0xDCeqs}IA>o*6=6d6p$r*CfRPW6&O30vNTb7H!8G%vuxk zA5g+_FQzw(^!Z>Ng20?V%Z|gz36o4_oYK1MNq#14-Vh)K$mmzn%Nu~80M|>j%=_{- zWQ&!%1Czb5v>Sd*|2v=v@!<~#sv}Xk2ly92*2fa5n8Jttq63Lc=au%^B8L#x(4z)~4e65*L#@oRZ zp!9dwlZDguWS^50Y;_Ctb3rf)1Vbc9V!7%~F(>f!-`4{_ExUm%DyU((PjDtWf`Doa zG>i=R=<_?Fz|}X98L0}$=aYp~6q1iDdv?#6CL}k;2}w&VCITYDG1*TZk;#5yP-dJU z&2!Y?CoFGlB(oQchPvRj65wAOBjEu1M0;dXP=db#hr@n$BOX5J(UZK)hh$Pr*sssQ zuNkaKQ()&-=$+byHvUK|x2ruezmB?*GgSEqD=XM59z0%Z{d|Op_*Em;LO$z|e62E6 ziQhrT(t-#IIPjnq3>8`%5h;&29u|{)UJUex&!;Q~>cpbyviL`DUqWgY<1agK=BTTx z%xbgrYAow8t?nS+YT5EH?sjASHE){#rEM32$OH9dNl6L-ty;}Y)M^Y^%a)N6`(TWvna>$0V|n~n)-50)zf>eGpijS=F`uEyuAf;^ju~SY6~p`Be|R;cB&puEs7|jZ!YO$ZPSIoXyG&5an`=of%UKO|dq~Ah{)SJZcK<&M zS2ChVxYdOBnEYasBO^{aFHb7aE&_e=kFRDdOw@`mfDgF3p6L@7p4zh>d0G;pHp9JE+{KemtS3I zl7^gGtuHOLwr}A`iQ4{Rk4{4g+X&`desm>SXsj?is%zUXIAUAIahW1l%(Q-_zl4_P zZTlRHX2g|awnVnQ@OQ2u3talsNb=c76%%Za#p|p!Eu%>eWIUi?n0V*J7eFpuSZt=N zO!yA)<>uJGv$4%i(mbobRmL}ZYUiLgYQ zYP!CX=z%Iy#_5-dvRhY^1@o;yby|h(BdbZfP+%|*BHlt!Kx@~KX}pCsYxK7EtRV}` zm33$hS+d0nI9A_-hc))<=`5{Zc^2pOvVU+;2?uxzLw>dc%=R059Qkx!Jz3;7ZVa}} zD-?3`g68P4v}fVCB|4Up>Q-wB#39RoYb|D=#B>khYq1g;m`-3hQ?ycxEmmqg&48im z;|K+76{LimbU_29$EV@rR_p>}y(Ty|^$!UW2KBByv~){&$6)Rju1ea3&fZd|(?$z< zajqyfP6AI+B6$u^{Fpk8r~WlQlc)aPp3IXi2Hh5(CD35f^88GWf;YF4k}N^;-fd*z zMvsNW2CS%O^^Gi_W)VA*=(l?u^O+9RnX(oApC#32{HNq;KheXmC=_4T7-_;Fa) z-V7u!Z0KM5Kjy&5F&7bghssT^{uJ-jXirpa^nVrtG$FG+rpSR*x^hxYS)U9K%3SV2 zv5x82=aLFBF|s$m`6uDNJ)YIK2G`hTnAZ}V;QLKTAIT>SC;48o+Q4g9)Ja1D7!sS|$gV>rW}!WnxZNdQ5T1bm)(ydaGW@wjp9p zZPG>)8yv@VMSuNAvXnWdXyy~d;%=fFo*;{uS80y*U?p~-{cKwa(~FSV9!VTX92>Hi zVwkbHqzdix)^j~6jdxNNafA>O?Fn%&&#Z`XpRpDyARa-UuZHw&a zMCTiQ^9fSma55#59=ZV*AiiLlo-2h0g8!^uH(hoiPv(<>X7y}qSGpr6&o)rqGl!j3 z37iV+!o=L5ABr3hB?^i$WyR% zCUB$Chn@nHgl%j+{}id_8(U>hlT~ppEZYAxDP;aCI`c*N^Rva|4ywICT=dyZWS-qQ zMIU?`8cE@OqOU&<-5h-e7W73ILNW9!(VAxf(#d*{=%Hr-TEjO)Kl2Rm3iJcf?>|F& zrsS!iyZ!|2IbS2wscSoo>d2p9kP~=d=w*L~l0Wzp{F;hmh35X5tenVCLW6%M^?YCL zGk=Chwy*Z9Ka&Bzf!6XDP`Fb#59kN~0vLGfy#w@|XJK~G_NP71!Z^^Fr*}LH0NO2g z`kiOtkGUE5{IdW)+TS$)ucVGy)bwA+V9>t-+i)C98VlvqA6-M{(d+&S2B{S)_{tEPnRxiEqIUp0yGBTUad=5zG(&u2(e|Qa5TP^w1`N%xCg_#N0M{4)jhxGj0D9yY;Qt$c zBNwIA&{>VdJ;&&u0r=0pgbVm3mC%@;FaPzymr45> ztzXj1UIB7CVQrE={tECtR2=ECSAb{?O_0{TO17SSHIDxHRnWwytd8-S{L|%*9D4D~ zFweV=kpd6Ts^W2BO4N61%tr>?%xYmbq6b0*YS zXx3}M6;S3R)mZ4CUjwGc+H<^4ssfM99&5klDYBZx?YyOheOlP3g?(Dsr-gl5*uS%d zJ^jN!VS3JVIsVw}ueZ-Kf^N`nLbE{-r^R|&tf$3#TCAtVy1`e|Vm&R^&l<7*{yE>7 ztXOwt_u8UhPe{NoaPN@U%kGLOZj>ldk2^jdl@BQ~AT_NCq&0!GCXm(y(wab86G&?U zjFL~1qkhgEt&`LQ@(cL6C2>OLB&h`p>~T2OE`0RcIhpRXCXm(y(we|=XaZ&KaSj9| zM4y+G@TI56pvNytdfsXn3L|m0T+)g}T9G)T6^UdDLl!#+&`IBg$^z&K#XRVb9j^wQ zdGVAnJBTKtmVv}dQKbNFVo@1Cf-Lv>Ln@RsnJqTSD#fW9PV=}iQ#fW?6%IquSmN*@ zR_Eu~<0nziSV#|p$meRsDogcVJouWHM0Fo(IXz7chj~an;v03p-XSt30!T# zQ)H2;Sd3OxRpCQ(I2JuDj*|Bch50$RScD;1to3SDQB`@kNTX520R+MKjPMF@?)MJ*{y?A(Zzox-rR!IWFEu8;CxnB^>qz~ zf-${Cuk7-=ymD2oE#w)B)0t0$XadzNkN#Id<^od(YvX*6cfVc^E5iZ=cULSL!8>Gh z){L>K`axSBuByYzj>I|R&to&~lKw|QX2H~S$pQyIUUzotZVT%A0O84xt{%_PSdkKi zF8wn|ytkKrM?21U)t5G-QJi3*Bq$IN_nZ`ta zT#`9TTT3&$nVLaAS(>?;sSNb#QuvTcZqpGtv+XRBwseV{Nlw1Br9UmpEY8;TmwI}& zoLTaA7n$^*uFUyq@t78mY4P|@5s!4foH>X7{8d=(Zy&Mv^PGQdHpOCrCDoV6?{y}~ z$h3G&i^sHhG-l)!iN}N#K5>%L^&$-I9Vr)AC7@<%5)qY*V#f)~LnB#|o+pBSz5}=$ zqpTk<20}h@>GtpENM4RTDS}nlIV}@_f({j@-(2okGB*HTnSR~WC>B$B9Kh>$&#cxh*@cInii+LfwVYH5U0qhD<>x>>8FsZ zPf04$=T~O#4cwV?MdPU!UhTGMH~pUx^=9m_dM!DjZRvRRty_KADB{>E($jw@d=SFW z_8~14PrXo_r&kC5))JQcqLDEDO&t)hfzq^iOpC{~cub2&9f&hqJU%e{YZlwCFp0Z# zD*n=3L)6t9zb0?}U9VxuMFp2`5xMPR}QAp&jh$B}@0kkja#Y>wsKjW+{SsbnA{ zC_N=Ree4-h?n%h5pFFd^HL-rSIqzv9niisGkPuxt;6H?ce<3C8)}30$()CnYUmLos zr;@tbN&bwJBYPKG@_?J!y)C)F-E$LPgMjwUi_7$_^EAO2YfK4Q4>HVFVi%zjPy*uZ@lO#^*ecb@Ur{v5fX*tRgd1&34 z>rY4=?#PNo{k;bo>5{*|3lxoY3AcRm6321X=UZ&H{=c1>m1zl?mXK))DW@gm87(1y znRojZi-dgS7a6n8axux+%4rvcE;ADXMnUgX6}fXL4E9sM5>aE zZ^7vR1GIM_;M)=m2i*H3Jt`PpJC3-5D&KH+)yuUb9$$M{aWf#23s-lp(@NatwceGZ ztS66g#EZA;mG@!4?Aso*uf0Au618WoC}vr2Vo-R^pB~ta!`f&qumhQze#w>*>?Tu@ep)uI2VBxJ;n%DIK_`xvDN1wk}IWiIt4E|%u>b$Hx){FYX`xV|6 zJ#>uZma@BNqdE{+%r-Pu2n81@N)V+Q@k&di05wA&@ERHl{6c+{ko$}>!^*Su1@alm6u=jya{- zuD*eo%bD#8M(}UQ-xECKi$wQVAFQh$*dL+)w@F&4eK%{N6joxIW16ge@2=IPDd-Pr znFqHVZTZL+hxX<@n~(nP?sGG=%8xe?WUkuc&lG7l9GH{qab~kiw&fs32sMTxs-oSy zW`TC@XYSHge4@f^=QE$!<~aK1J-?TuYZ_a6^gW-w$)O#4=sE4m zS()1Iqj}nbFT7zb;XZoB7hho|9Cg~xql>jGe?MKj;mgmPWxn&3zr*K?wd!x(arCSA zHDwrIjy8>5f;BHbn)$Wmjv^zW)-If*_HYY8#*(;cn;v|xtxN5SFVbaztd5x-M>9gQx`ArS+Y_IMNf^$!;0MN56k1DZP<1j+jcUsZQC{`HYc`iCzDK^ zOl;h-ZQIrz+w$K!cwyQ9c0aW_KW^n9n= zIHIiD0cavju8P4sLyXKRzAjU`M7%;evpsA;>!(-Hpsom9LjDj!eR>bkwy7e`OF0u# zum-1Y0d19ag7UQ-{8ti%AlMlt^Se0t3_I?=tk=(>Ya11Xw^d$&J&ptdPqX$&K=uGd zpBb)=RbS1335t?e^aOUIu1mfSLfpPc_lpiKGf1-T<0pposmIrca-I0^HAUp}^Gy5- zE}KKdm?+ztB@%7<8_Kf&LBe#?eAV%5JkjpG-~ZK-he{#+_1Hbye)d(oxI+wxvCMt} zeDbsl8NM7~yDZ~PYo11kFv(2+W67qdg_0*cB_a)QU2CXa5!c&ncG&R4cz*mU$p%gt?^qG^NwUOwfV-0=t3>$63-~lA6E$ z73Ej=vCRT`T-IQmKGpQ^!@MHv`4a1ze?Gq~+%4wkppw1RvrX0kHzF}c&e7c(%3S+=;;zT62^ftN1(AN8fny>wOe!i?G+ChU`wW|8Um z%+1N!?D(1;jg_g}DM9mW_x^$v%=nambVWNxW>93qn#-6QYmtq$4&*Y;{kA!KN^!Bv zWAaMS*fvUtfu}a&9VZ>)^CgZvyRODHA1Zx5B(1dMuH&5T4hlJs*#n*ey33ws?~Y2l z+w3Bv=F~dUEp=_s=QhiCvKuRk-FH@MDn8$0D#gRPnOXhnA&9l~C#6H}5V~r}Q0weF zDQx_{rk|Do9{yV}Du0^S$E8|yR$`kCDQPKF0QFK_>l06s@dvd7@PAA4ay)v*2i zjg%V`F!)IFlf~$4hw2XzYm!av+uJxwAzEeicGK}4Tw4(cQ@w>gflN@1svc>L`ad(t^x494UT8)(Ivd`5ueloNJwg20;Y!NsDv^gg*kP=M>2jfUUu?_HPM3R9 zwMO$-5eWwK?V<>gE<5fF4@KMSK_i^2zKuzbpr4T27$#zqlIE}*cjgClLEjRFA&TYW&vmkSFq#F+6o_>>-SJoTL)OGE z#|*0~1s>8JD|4#_y#7h(B{r0OB%xVAx{6~x2pVfGk5JK?n75>_HGBo@JCu`Y#@nu~^AY)|U85P>;G{@8 zt%Jaq6(U-Pu~h%m+wwZInP0z>X>F{0%98TwOYcD-XyyW3Ll9Rq-)AoYlmbk53aJf! z9!-Cl1B@DSHfzscKaKh+S;v=;G^=jAFwuL(5H&nMKQjk!&!j8udO<&+;5A3 z?ql?A`L38?CC!hw5xPz5=n01XtANj)Cr&{2dN&}XE8zW#O0UXgd)~dT9N6>uY;POc zw)j!-lNdhk7WI7}Tg`T;UqYWNKd2^UQwwF8B@0Z{D3X6KqoWf}l0`>V7LfXc_o1KM zhx|pRdr9yBijjKZNUZ&GI)CMuy@uk|2$&VKovy8fs@Z`u3XA?TL$P0EMdS3Rf&RkO zW?2&Xw{R1Y`2t26*p6go%g^OWo7~hTi{?XNtH?_dv+=&?A8}I7-vep)WI2QBA&Q}?p1+ida$#F3dw2w(P&qcz@~xYAeHx<8qrh24TlNhL}H>mAHQzEVS%cO5^OK`M{8R;u`DI*8UeI*pxI;hQjE zSjXH6Ifzujyb#Zo*hZt+dwpicw3k`Xeodmv+^`lC&})uLa-Xq;{$16k(q(q(D!As-OrJ`jEmK9sa-gHlqKjLz&z9#n;oqtJng={tbA zprCN>M8WFwj}Ct41|Jfs%&!k#-1WxTc^rz|Qm5D{=(&6i z%2O)7yJUv!lG%)AqxI7V4W12KX4LT_>Q+eYhW)UTY$gc5P!(=@g1B0k$&w3+t%z*Q ztMuQ;q*n6eX(SHOS$FC-td9~iq?=6@6j*$kCimMYg*kWtrw%v{rKHzEJh|>wo-BX{ zU4tAq4>kc+!VdO67!oBx%?Djb>OjF!=O@1eX9{2FEa-#6EpRmwlM16P5T_@N5yJb3 zmW`vO-2)GUt_nHT?LssAqXj1C*{uo&pXJmmgaH#c{0oum8#68Y4+-Ujsh zqh<3;wWx_2bXJ3^B%?rlv-DMF;pX5dtegJ1D>3(`cM^1ZuqS_vDjXIO?%W%$YwZ>x z{q`=`Gc4D$^wW7n*R@#+(nDwIt_^h6>+>el^JRfw4tfhvewBy>x?VZx0v?ck6dGrP z1DOtYF{#9ZIIm-ZM$aao?@rWtZmlHn$nw7)Xo_9+GtGY8Qe=YQsD+fP?8TJ9enh?t ztI>1T4*B`ko&05IrvhJ#f z+6ZeFv+9W^@x!6%93?8t)CsN@u;7#KMtp|3qu-_kYV!~2?s2m+Gz4Pro`41ZnqQjw z2~q|6BxI6kasdto(voK+A_iF?w{4+QU9H`08MZQ6YdztfjnQZ+wa{i7EWEdD4wW-3 zK)85KbixOVaE!mmLq0|{{ICBGK+{1}X{K~ONO`c!^J^R|4k18BVj6`=u7 zoxLWlo){yJj=_4j3mx2#q@V}=)HEU*x&PCigZmSyH29zQTlV-Pw#}3Ug5C`O+Ze%t z?sUz!n&|*iokY@VGmQEyYnC--QPn$?TRbAf>PcG5Fof0 zcQs82P=Kqx3DlfNgsV849*-sbBkC?S5Ht&=kyaY#Ys9TxDaJsz^Wr!`0r);K(Mc0Z zo@RtrmGS+adB8d0%&SvZ*jnecjDLs4X}#Kjw6yd(f@+&D6kVY?0l{r`8Ew{778uu7 zbvbRHKep(|U@1)dZUA0P~Z=v0Kr)-%OC149-FkZHPO4j?A6G`How`NcGH^ zraRVqwYaWp$uJHmFcV1E>GGg=na~OO=|S>R9H@r8_i~>&F6{(v<{t|XASVj5(y0Bw z)T(2GRiHUAWJgo-_ppjb{MntY2Ep@m;5x^(Z7I&GCP>1TBd@v z?PnT=bO-kiQk$^rly!plRI9;woEmzc={f5vJXaHBTuqzmL%Tm#`wq|_XiI+w>CRrF z;cQAc#gvVO@Xx>5c9BKa=w9j(>$Nnq>Nla2G@w*R`)k{;NNF~^>U8<6YavtE^Kc3S z*Cs)R_rMb(?s??@He4RX9Tal5VuPHy8}(#ZUN{{8y!eTByr>wn%3d1JS5?d=MTD(! zshz$#wXP)8Y0qGAztX7`>(zivIsL;UHsZI<`ftrj(#dFp?D*I0u>hvCOqrApitzB5 z9S}lGp@&I~j+q8uw{EZ4YR;QyI=wbD-WW=ttvu5=E;)lN5RvASy*0_Fck114o3^7FE2+g4uv> z{Qy=h(Y?`;@(gd!Tc0e!vc#XCE{n3YbQG#WozcRG+OLh$(nUc=O();5YH%Hhw!p4x z=YTN*St^C=)S5YTi6tPYFNc%If=A3=TXSjJ)-x6qIFo797JE`bhDf4Hs9;6tmcCWuk_c}A7aP@7c%xZ$W&y=(v8twVPX z-2>S|C61YyTB`V0SJHf*a4>o}bGF}#Hm<3OgiGF&p$R1aRHX{#SNhw*np zd?q8>e*#&{b%Bv2)k2@&Y-8#dL0Ejl<|F66JT8?j@@J0*6|mw$qENNA?MKAc*;V{= zWMD&O**Qadk9bZK@|v~rOIA1 zU=I>gF7v9U{voD9*Q+_CyX+!nKqqG`^zCmIs7-v8G!Ct+!Bh)1GW0Hg zhAFTAGOc}-{_)p{d*RLehwFU%08Fu!W!0krcrMr0r;W$M;$3M+{#{W}4Y*s;;@I}L^lL$jZfZbO zT8>Z*-ADcR>89z!;acC7Fukse=*GTHv;uKT`rPy5xQlaoxmc|La?ZZ#b@FYYe74S` zBLg!RNx!?-zwT|B5m2#E0AEJ~1S}ND@xQlK-B%XCR}*WA-7ae{di(Oa&U*k;HF99x z)R_J`Ls<+Ru@z`6*P1fWDVfqGYy3gXv1=k8)phr=nh4JFtHRzw(%x}UQc6T zS02RA;>B+2tn8rb#&l>^T@VVNdTitB>gc`Bvf4gP&lUrk6X;uXPj+u7jssPkbT>wnJ^ z1^9?qu+_v}1fJh@l*;ORlmMKU&YPoB^(Sh$#tMRhEaj!Zo%3c?Xn{ z5Xjmd#ud0NUjT*uHg66UmLs-t*0-+iAgg=4OiynLKe%k)!I^_s#}Scxh2?b%T&e@S zNYtAh0zd?}%)&4}yd5rMc3|~fu;`o=V=nPNM%K0bxE&F}R!IIYb~Bw3bv@jdk`n@$ zncu*Rg#HJ4vPJ*wfnV<-L36}7pZ|k^<=8LGtsJ-agk;MhNNvlUxJOweOn$Ny>aH=1UXkh;#_gb-Es#J8GV#}Y( z^$?56t@v#HD9fYjsA&s6vuXvh+205V{U3x}n!m?n}cM~->VJa=g^=lTCZX~rLFvA6JTKl&O9OT$P7@_!?(R-#z@h$~bRaCP3a-Bws!RIc)vj#=B& zQLh3ZimmXZ$FuY}$#_9Em*r2d@;guP0b`?MZv0>H-mSDi?EkG7F3Q?-O$Pk>wLw;GCe4sA>;lP}E9~aW z-+9}~;zy}ZpYSX1eA@trsW8ed>hYARR~3f7yf+z+zTC2n;xTTyH_-bFPq|0yy@P66 z$g+j?@2#yFCUD86z|%-YKp$%qoqYvt>QV|{cCo9!-nH&j-AfZs(d$cttO+>&)lp(#4 zNMQvr)wh__KD&y#pfLnWg(9pcxvwfCjA-|K5hI?<{!4Wa7 z%7n!r@odKMY&cZ-u9^WIKWS}8tjntigT~?1HPO=^w;TU91OujpLm=@kysG-D5C!&@ zg8Jbwmes22i1?qWW{ASvg7nr9Qf;qWkN1nMDkVX{G%(95gf$>5Xq7dTDl6K{5G7aN zF6hMcrYoks53}hgDyWYa zW9O>CEeQ8Oyiv?D1^L51Ot2LhYB!t<>3)?kK}Y{kMhG&2!4S*G$#oxcjQWe?tBCWD z^6ljW?5xx5Y%<2cUGnaAfFZ~VLEMxCFOO!<%I{kHCHbP#L@7H7Vl#8RQiF_5MYYjd ztg>}lD|Zc(K8OSX!k7dGT;zovwm%?V(A^?!e;$-jvA01jc(BH zJcjpsCCGWEME{@%_`f>~RG+#ccb&i1{DKZ)$(7i~Tzn?Vr)O%O;Ig8WNyMhr!#~V{ zF5k)BWKWJHEMQTn(y^A+gWNs&f1Zq=#91x6j=E{^BBlVbdfix}F^3k}sfBU9(^wd^=xtf#=j6`zE#fA{+pJDoDlzlpR43;S zz*#x5Xt%ks+2i#|Oj|4}N}+~}6=LK;GZIR0 zmREYTlzMT=we{cPdwUJFnmVt1{T|#Vqi$(2I$gZi@E1J1`$#42S9{sc?_zO^{NOF=dXGW9YIB|>&S$lNM{vIQ z4?qQ&|Nd8xA!?ZBYX=zlitCY-pR3Qbiv8(Hq_U8voNs6qc^o{8G5C;iXU5n zUG`%mU|*b|Yff(3MXXYzR@+brl`~H9)F?+0qw=*XS?$r6cNyasO3iP0hX$f=T$P(ROlIS-ihXoboxG?hpM(>6iu6S1B`q-6apRX)jggXo(IMt z9t#RwG$CmWC1A-2eyX8*w7{VTgG|VPR@J@;bX^@eIMcoy|n z-1=vpp~1vto|?~4dF2-AboeRR{^9b+_gfKqY)&ZA&Ao3x>}YseT&^Xsr`#a$&d6$B zOa<^M`B}fh=lM9tBW~0Z3p|%6xgY~9PsDcorI@t>Y>&_X`Mn+Q6kT3y-PP{6IDGe< zjyc#CjPr5GgZAOT;f{B-xs-z+y)s&iYQBS_iH)dvdPjcTDi36To zGaeVGTLR2zKD^F7w(m1F4c+UFXuBO2| z<9Qx^kcsX4seLpV{auxG626K&l$HAOB^!IJ{66#DNjp?Z{o>K;69gFAcOKm9@?s;%;R2pSe_Ybp&Fn@t5~>X^B;Xh{8LE5d>`qGJ>uI+hTpE#k^a^ z=}tPJ6G_QpEKL(pf+687twA?eWA4d;65GBp5Qn-N%t-S5hsdvL z`5pL|7~U!B7(>JljWCh*IfWgC>U>(gS8&O&kac#{!YYjl^8t1Bq1h5#`;tZ0c~S7c zbm+6W4#NMII{o=b;9fB2;ecG6RBwH-NN)EUBy^7I1_OQ}7z#Jch^pcYwl@tnv=$n* z$}Y4<#w5%DeuJTLYtCgTF%Fg8z~pgFQurchU|<6-aSqP83Y<%4L@K2j0_>y-g|rdD z`F98QgJ{dhiUd3(Re?MK`}#a^pozB}cYKw;Ky;~Y0}ln9m!&WP-^KuxaZQV{Vl5Uf zB(9UCKqi}%Iztl*l^lHVB(1Q(Q7RH5vrb$TTyb2SB@goljyS;&WKc>l4+w~Z>|>Xp zEzInN2@8t2*ga#`<`5B<+doESxeYp~pmB3y1DU_o9~;zCXZQH~#uDJ8R{`WF@`}&$ z?TP6nUAZAtgO)zeCfX6dO(@n}2u2}HMKvwsS*U7I>R1Wt>g}_(LKzfSLw-DiD=s|1 zs9OlgWGK#oH<(K7Zw=1#A# zlK`CUrR3=GJ3d{e&Z36Hc-=N3xPNkTuKqh&18M1=>ZJOMmhBQn%Pn8rop0f%Kj~>x z7{)2p7sIR;InoNh?x}6IKGJV?9=!0eiZJ3>8Dk~0Zix3yF~7)tEnDCd1@2U=SBo4b zi|4jj5}T6r6RiNb;z3Y z(-tXN`*L!%U`f;ZR6|&hzLYz0UgQ#IBG*w=+bySYyZctg=y;Z=s?w&rzUXsMxvDpE zx7lNky5h&2yTlCkVV%(Vp}2!I+NO%EZysM|mf9&!W$D7f1(P=!vU*9a$LLZXSz^d| z$)f$PBGkJWJ5QzITz4wPI#+hYpvxeBjYiT8r>{OYQ$Ki1t{^yQSLI6m40%TerPb+W z7jed;1DDA!-uJIu{IYP*BhuRlavJR`H_!N z^%j?7!=SgbYSI_7@0;I5+@RbWc*pC3^p=^a85#xs1syvtcTjRTL#!3Gqt2aKqu50b zfp=Ak{Cr>w*knKaEcSzIaGbE=F(Pdlgxppu0Wv&Vcfds_$8kQ0 zC&y@IFGNi($h?t;#PDk9E5P4B!<^s~c#h%ejCSuem$KBbJW;6$((Cojm4hpg`Nn(MBep4MBJXBn(9delto>a=>edzjd1{SrAx_g$KZIZNB9 zaB@SCN^0LdCjl1xEzj|Di#fkCHUi6-mEZjKOf-C*9m#Vb+i_@49XamAa;gO*kwVU< zfdVRmZcT!*foEX#OHHKZ=;v??SE8>V{a#Zb64S&mxn@(Vr*|zQIF08cA~Z@VOMQmS z2O%`2U4h{LS{2S@X|v9CQ3x5+#ecaRne^4RSes|asgYO2BQ=$?SeIeSV&*X(Xj8|W zu{Vmhx`LiAD&YtXEomvYjR4yd5(v=mycrBtYk+bSO~R&8n1_FRmA+C@VB}r?AfPM( z$3V8As3Tyt%S}~>q82;+@8neiq2A=@3R}fLb<$mfjfLoazcy}r% z2GK?Qnp-A$tMBK$d;xZiFA4KWOdO1^7C%wz=WOw99lcam%eLtEU4L>4r~9qfT$p`O z4aYTaDA~aNj!WH--2bA-vyk)(vMAC1qp&KOx+xW9tP}ERg_@t+6^ug2X+qeUW@h>_ z;>}&V_?u@K^qD}(%d`4~TPo%jiRmminEQT}swwE-S+>MRFQSP8WJ3G?WhuHXfIRF4F!6XWtrRW9j~V zy15J@=u2FT3~B0Ny>%@O5_EcwlM2Er*C0IkB(I~ey162)!+oJs%8Iww0kc&vT$BuTOV^f2 zl*H_Ai=JnFG*7c8WaqO_0DS(U^(DV70zaqd5r2FA^`YTu3$)qMaj^Fd@SLFSIkVk* z`*P$e{?!uy>BWr-7#VrHcpuQJdC25mw*2DvRmoV{zBg)JpzW{aXtG7)QqyGDJz>80 zmXy=`<;~o={RV^{K-LLE4&}NGR23VdQJ^_)l+~;*gKKHb!K-gamDlch6ZRBCIKjo2 z2R;(R{EC9BpsE(yz|?gq5MbYLb6YCE8Cvm_DtCxH#*r%QF=eGksdSxe|5W$N8miC>ncqD@nsdAe*VhA+N6(AsizoYW4^2_hI+=ayAV`i@S6O8O+& zW6HpLLkeh3O!gWJBGp4HV@!TrpMq-kVEPAkUxG><>$lYPK+@t_*=0e@0xQ`s$qwnHUuw<@Px!A+x#@F#w%$|ajHh(a}JnrtOK{j|WQSRGQJ`1oF@I@HMt+#+Hu zp^9P+uUlK2(Hd8POD?@%6C~ppq|`bogL#w|GIk)&_9?T5MS;cIM?4AI_;6;#5A}az8fNbuj?;P zpU~<9hht{dQ5C}8Yn3$2BeEXlawY96k+16gu^!aDUxeGs;vN zlZHD_-XOJ{ks20Bd8!noIg9E(J7gp#O#w+&Pg=h&&Vgn1I_kQdQpfEoX*-(8$g4>V zcUsxet#s9gs*nu~Q?e?b3r;(!nRUcDyueVfRMaW##rb+W7MBoCpG{-v#vqXVU2;6Tru*FTxHn_LRtd%h(i`O&-~9 zpKxq4Q#!)nCRPv2peTXlya#iEn%0%C0n&a6jbJnl%eM(pIT6-?(Xbu^iVUgy;^Xx? zfchgwbK*t2l@2gRQGL}aCQWC(6$c8UecvHS^yQV6_M*+*7Ar#*xboU?&k)!$@OI6x zcYn+$NbscxwZ?l>?l|5uY=I3GH=*(M@-uXELzlh!Fk)alj7V?j{6qSMkAZMmf*3I% zJ}^wjqw3RkeP!D4@%CnBy_t;R*+m!YmR|>J(Mi@=)m`snNHRN0*A5FDjJT%*vc)rw zfVb@Mk!5`b*OH4dg3vzcA*dm615X@WfMYPx0`>17FV{JFhCN2N4+TtuJFs!@1Q z;NW5m9`Or;3AarXM06$rBr^j-m`*9^V8jCs!Pe+cuW-D^B_gzEusSq{PF4D=#VpI# z?kZ-Wr8N~8$#{zdX{sno<;eqr{kKJ9doEd%@f4F?;=-OG4K~f5dkWJj>i16>R0QU7 zRguaEYOu2!S3+mXW7mCc^Jtwoh7!=3GGFj8-tfJGSOtzE?Kw7IXoMY^#1$totLde> zr0M}Uys1NtuE5F+?b?kP*d}UJ2_rE5DNQzAHZyLbCK}7AQR>bt5(le))wEB~eaMR& zNMij@w;&zX=K51vNSD@=WetmQO$xv{Ahc9!lGwXc!V?lQ_08+eO#wdiJM>$cAJ@PH zXz}&zURDHjZHK>l+t+N+SI{16@w1T-zW_Hcf9v(==?_noYr>#EPQD`i9yb=|yCnky z;ACXu1;*x%r#C?&fzXHu&qM@-1UND@A<*wg1ZTwjp8B$&IOBa{MdLwz1$`>ioZi$D zmv=TzdgC?a1nad3-*@OE8~QvW65$YZWzMb%aeJd=Z6IGh(nk11NI}2H6PyxiA`#;X z`dXO@2TlL@`_-4!4c-+Z2L5T?3%afWm#C5d8U0(#yH^GJwGgd;i_L_{X_6c>vWPlQXTT*K#DmS-i%%Ite!w9`B45bCiz z3xj$!Iw}mej(b^r3<{@gZ^q@n?O|q?c*^DJ=xXHoGP*a{CkCCuyek#NA85^_eu+H* zFAD#TFv!d9%hoU9J*)gTwP*#o_ulv~gGx2FH4E4x5I-$OBt>{q#ltc!1bl@Mr_*8A zXa@v~J2WsJDIS5`_y$UK5;_lSdewH7xp8DOF(17>jTC?lgLhN zk3^12sI@U`Nx3Yo*e|lZkKgoIzt018q0ihe5v<77Kcr9L0DF&wwDX5~EpV&grwL5# zV@8*CPafcRpr$ssjCp16UTF0s*S!>#Yse-a7y~DZTQ-0gk8LxJr{GAgwL0|I70Uv_ zo_tbAv)#Lx499~!>Gq7ok74RdG^dgJfe)Cn!C!+e$ikrdPCSgkf)99oiuL?F^J-NP zSn+4xF3MSo@~9epFY?HT0MX#_zkONITm!f4rMYOLge-72YuU;-*#{kQ8$2jpc}@K3UXh(50%P^(oFOKS6F~!Z3 zyI3Lg-UM4{!Kt1nWt=keRw>>~?62Dg&On3)?5GTjp+g3B@pXJx-NKy? zElQ+t%ev`&FXaIwc3A=(^FZ`TGPYWdxbsH$#jG<_U7`FAPs$3C5(Q~6^Jiu5>Try(My{T!y}^1 z<@*?HVHS_A4oFX!(FtT7&OjKOPID?s-i}Emdb2c@%t=5QFA(aw!NVmZj&1FCVVD;g zq%B#SYv&Btt~H5;d)qhQjD1y2&wBMYiEove-sqEWprFypPqv=*&5=miBj zL*%#M7vS7~Wg3LG#4j*r+sp|FMZ=;w4Pzy9j1LbAkgIS~U;H3W{$4X?qit7N@)YAI zkHOtdq48`s-;cG^h4z$iEJM*6#$xFa zL>#Y##Gp}d@fovpN1AiSbS>Cby%WoqcH~{tNMR+$EJ;S1f>U#IrUSBI6Hq&xqt#U* z(DNO^;2~cU&hs@%;lbM`Mh^B27N)FMc}BbA!>{f#Tn(pc)@=5Y%Gw2V!%V1xxAtI| znxKU-<52cSJpptIRA2B#Hscg`q%Jfd`?8%_%i%}iPC1l}IEA~P0#&NnwO7-KC~E9X zt0SpX*hL_T@Q)noDgV~oLh5}7T<{Qh_#im?E&7k_BCf}x1FXk@Z5Apnpk%8fxPr@& zI$D2`ty&TLk+#=J2_O+|CpeJE4)GqiZGI+#93p9D@XD8__DjHzGgSnq$Pb6YJz^i@1~T*|By?1Za(w9g1tKR$rP9kpR4^|A#{v*a zRF@9WN43fNII3{eoYkv80pz!^cc{c#Lset#7XBD;NK7ZX<>+3Qqy_1`%OQWfog;cW zjpsYv05r{lBgc{p_9Kt%dP%J~ne{L*<(^$^_P3;OT#@7IV6=?P-&A&A{GF~d!BJ5s zv^Fb)obuX)7C;4qL~VCx`Y{-myomGIXt4eky-}uFD-Izv?kjuw1L_6l0@2YJ#h5Xz zFvXvUq0oV?jhvOovM4-L{<;1HmeKwQcaTTA8ID8GggsHad30Tms=<*oEr#M8)mSl* z++3E9fP6WF!%Xh)xBvd219RgIm7)#7iSVp`idB(H>Owg#WJxqxEk4cNc(&}STSpS4 ze2$lz1s2QrM4A-`QGjj{dZf!>I_fxw%b&Nz;DdY%Xc4nt1j$p51nYC-mnp|AP6$ab zcZTaE_492)_77)F#?Kezal4K14YyVL_$Y7u9PdXk;q>Ev|7ec=HE(^UcBE@1*J;-) zX%-z(cUxrHRGw$=_7T%_hTltT77hz+lsIcs*!5Nho)&-Yvf$;LN!zr>Iwl3nxD7Iu z;o5bSWuEqAf4F8%owU|n<4Nmn=Qc#NgP-@P9N66uirI_!*VB2HaOZ8z#~NVp2M?Pd z4m!so#FX?~-~JMtE_?;gPIDY-OP1YAkCQDRx6g89AsO(kKeOl<1 zj7e&ql3<7r>rw&fb~J9+mRF1k@*IXHfVDy``ZLP?_{Hp`2If)N-(&W<#eFI(t=DNK z*PS6o&IEeL!mD`_3J|B^tD~qjR(9D2sk7}tt+9^0BQ>&H0c18A=SSmqD;GF;d!|Eu z2-xY^gP=s&`BL6eUhtS@U1gA^6OL19n!lfnmSA+?D8X3lGb<8=wg{+0>GXM2n>2pM zC?lsRIN7v%P92hC;UC{MnJ~WCD>4UD<$~s02eYEjHrn#~*bwPzSr)T5;MrItFB zWou4bH4!k+?0`1Xl&}}AvDvQiS2KQ3Sr>wl^_tM-)X?0d)^dv~J3ycW;GV)MT|I4FCtqK|k%WBMNG}xHs`h`?9s&u(aW~9ldg+Tu^?p z;odo1tlY#M_a@~SKgp3~0DIppi1X_${3D{o+6BzImfWm|$uXG$vnj3^k z@`*Ys=UEa6xLPz{Ss@Fm(lPm6XF1L-BPbq=GF8i1nI`F2>=+%NnN}+0_ySe>&fm9B zNW&W@O8l{eUb^ha7no+n#F6ar(6`k0;o3veCHf-psHcyijCK;a$t&2ZZnuG{REs}q zGj4WEF|3mH+^d6l^dfNaJ_Ve8`>7OpAu4k~9#?$yz9Cl3vZBvB)`Wkn-a-|8fw)Y&^Fq&^^ zw2q<;c_=&8$MoN-zNwqShaanq{7nM}`8bi0+glIZo49}GsONRAXfJwzCJfr8n5&@j z)q0ZNyRdi!Hla?a0MXFf{H$sI&@6+09KbWu!j?vX6}okvYE5%;AC(ErT4K*x5?^A3 za+xM87Fde<#j0GNii1mgEt=L)ZN6ZqBE! zD8nXbcoETbDleeC!-;URP+0@B*pvTv+qw8|=ODUTFSH#(XK zX(V@Pz92s7L_Ohq;gcHSk1c*&8Rro zB-XP;(sG`u-h|5^Mi;)dV}XHjlUT#q^~O7Bs*vT6pZ?Vw3Pr|XP#cP1yyd@V+3{=T zd$Tr9s}e)gAOwdHZVC>6R=v)@+FN)-=*h1C^v<#_T3%Wk2#cY2q$WGkB21>FB2?CD=AuPFfu(U)bCQDXzoiKV%mL zwg19#)$eq1pTi1B$ZQv7@T*g!&7u~I$zxR4#iJk7hBON#eWV7r%il0>-#*D3Uc`~A zJyeefd03js`|6C~q09VZ`SpFmMp^Z;n*HHI_!W+{34LtE)GwmQEHT!l=N@ig8}H3g zSSyDrB5**e_6-&sg;`vb3=VD<|F}p8&zQ*V92DSxZK$!JP)+Gl4;#0=Koh;Q$~XEE zH&<^pg5m>Fo8%fSOL{!Uz(R~1&{vk(ey^7%L$ae`L3JaWLN1{!<`DIu`=CF? zF=TORne)6AJOT*H_+dBo<5;|z{`iE@9hJeNH{L$b)|k=C9>6(m14q%+leSB3ryl|~ zNv7T8JC9Ejl+tE8&#|u!yJ7@Xaq0~X!5627rV}ZpJf0c&jsT#Dykr`A=oGl}s`)&x zo^2#Kc!>Asp_Y&u>XUAeY{`a9MhdWa?ht>5Np_2>^Y@Es+L5{pJ1hqFrs}k=B0tIS z5}&9bJT}r$1hlO`Rs&^MRtUFhYA@LLNu>jh<0Ae0zw4@B`i=ynm}z}ZJB#ormp>rn zAVbBrAXs@}O}@7%$E+QdEJ8Pzl%bI4Q6Hc}4sC#ujA{ulJD(aQ#C%xSU;amm&(EsG zn+Mciye)4=N%151yJ%K^+4D>&@C8cnCQ5W-#vQJGASWQh+Lj@W=Rfikwn<2f=8>KlgGwoNiZ`Wz++FFswu1wO(ONCru@ z`${rr)1=uVJe79xHxL)Ji!>IzI3eN?(_L;0L4<6fmpgJY_&%k=k?RPX)dW@aygJ;L zwrzegoGe82EkD%XV71M)CjHP>7$+(i85AWRK9Ur|1R5?jvJwgtt0^F0{BT=9T&dKV zjUT#SHI~)I9j>Lax(1(xGsRWRm!_xeuN0$j$J%_4_SRX(tL=y`V@2jMUGUNp#|SZE z!HTeuKp{l6t91qW3V)U z-O^}9Zxy{_q(Rgc^}C~;<&2Y8$EbEnj-oULO^nJwd`EjoW^6Kx&C{OBvh?OoHwjttW!7#c$<%c80W z4ObZkEMYXK@ynbddG`^b4cI|GFJ`4||Fk*j{na#0F0@Z>|29}6mw_H3ofh18#t8JZ ze|d5FY`d9%#t>deJWoR^Q^+bK`>AxThtXnS9o|T!<-X_3&U`8tVwdv4hMF@5TR;}(az2;l{gCj34Yw_Bb_JsVl#e{KX=I{iDnTu9hgi4^f# z$dTTh0Zjf6=TDV`^8mzDe00;K;80)%U8*hdxU%cD>FfbFW zbT)d>rl$km==SnjTKd#%FS+{lPWXrse>YoR|9ZW(J$hRXnINmYxVyHGx$EK@=LBw# z^jB67D1}}(O#gFe9cjM>?sdYiSNn${PqzpXZLjM-TM%vA!Myk7La#m#HP$-#{j0<) zdK3nlU#+Gw>%Dk)Irn=%Y7J~@0$2K%N^8Ki0D4*hRGV96*p2pjM-rej(_#KRl-67C zOE*w-Pa!vL6QS5F0c+pOnfiY|e@f-A;OWmea38wWbX3ha4?|AC=t%-6h2}0ay>$`dl2mEd-A|ZL#d`dHPQR<)SCQ zt8IJm4E_%QRzRu0Z~d=F!tb{Jvn6st)DH8V9ziW2=vCGqd=EM>^=SBC<_~`({KA%J zfWF^qec#Kx^tFJ#eK&d+Xt@8dzX(%#1jb>d6m zOXv6hXZVQ=IIVuw_T@W}R2#$RNqKC5%dFndhmXt`J{NvLNFw4nvJ$l(|5-TI26B|B z+72WtSpWXH@am0x!vJ3`lMZBy^Vrt!{VcrgBKOHfm+$Kyn2W6qkA#oZjZVv)b>Y{- zxzig43x;7+>s-w0{Caq^_0sQ#ueAQ{XW>h&dmjm}u>QR*60y#IEWFGb`yXg*`(xot zTVX2Q@K|_YNdtGZ)!O)-@P>GQ!gHR(y}7yH8hkSRp>yQjyVj-O2_IN!$TR;FUbn&C zlF=`sW=k3W548RCtdGC-2P+~QX^5?lt%zLoTQQc~Ti5n`k2>_9m`hqy-wJopKwE#d zG7>+7p|nD)A{!PnXrFC+Z7^ty8Z^sT9a;Mnj8Ls@lY4tvXUe^$NZG33CbRk8ABSJj z)_gP{Z2Rx2=jUi{vOe=~;jyQ6;9l8cJ@Lcv>JTk8Tfh8a_;U7f{)!)k?`g5-)?}{nZNlz!ui(44CW8Q|2)kGa}QU~P8P?e*&BmVe zib`Ie)J(-tjiT5yt|&au1zk5w`=U_qI$M6Nd)5N27t1;C3!g9TS+|=%8C`t)Sk&1M zShu5ZLN%2!+_OL7I+MYd+2l1my9daN6AiZYa3eyp>G@)})3^s#BT(BBl=YXt3||tp zA6lRJC2+;}TO(J@5B)Oy@;2*7Es-_&{bFm?|Aa56Hy<2~{C=A}-*R7w(vlm$ENi@| z6fx_%si;aBFV+^+&6f2k+|E{g@6qZz5f)EM$QIO64M+Qcx1`!6;UZ3{uWi z;sq5z#gnwnE{99-V!NN zW&C(idsP}bgtyIutv0g9E?f`;3)6=gp^W@jjfk_3iQhO4ud#0hlQP2s&2b#}dsdu#9TDZboOD z$%$0y{(T9&whb?_N~Ze~nPNWAdT-xU&S{xR@5i-pM0hrtK4fT#&1KC5j0Is2;yrYH zNQt9h>gae!&8(6E!(Cjc6S6JoYZeP)%x;9Q{#Ze)yO_3ZxXXNKar0C?mWnP{&i8V<0=ksiqRHNfwFa_}Jp)%4&FeTE2`N#$U*g z{bDL)nJ`J=F)45Ab?UQpIuyyrXhVQXjsS~gpJ@H_=qj3gOdutM=&|lqBA2&}TAxrN zTXemNj1z;3S_G-F)8jywis1+tRl6H<>;#ujjDW&USMq_6cPf8oQOz{@GR ze;|c&0mcUf1Tu~fkD~Y@b~H=sG_tA>OM3Vb;aH!&JhEf8m&M?nwepHcYJ=j>J^22n zDoPDU}p{R9m6R2y6s8(@PqhZCfqu{pkh1B z(L}Xm>J_cWUm3|lTUb&aN)vK;WU?DsXBUR8NDuA?Qv^(q_Pv@}&##bsS8N zGMD?RvTvlngL3L(EwthcOg)EpJ!DkFp(vk@2L}5F4vq{cIUNsc#I|pZ?bm1E8`wgK z77WHXC=inYz?&%Ww$I+fgKU14wQ0P(#3W-0Pbfo)7)U|XOooPvv^R&sZnjues--MH z#;lT{ybjMZ(~3q4+MA(F<0geiW9$}De)2_OC$mkg32@3bPJk{c`JPx5W^e`N3c@+o zQKm!vsdPGhTsc-!LI2>#SnMc2na6HV1k&gg1z)rFF_wc@mO;PNGSa71W#`bHF2>sltQdx1^3Af8X$($EaAy;in04Ka{QDO$ztBn zG~EgZh1dlj&>&7D7EK*4~@Nj5_c*7P9*a+f>*q}d_V|H@^ zZ@l4D0#|OUWCMT=7t4KQIVHrvRGGND@7T`H&d#osf`7W{PZ#^v#lP*KKi%wMH+$I4 z9`2-vU7h?-H~T~Hy4k~S_OQEi$8l;^1%WRbbr)w4cXWZoLY0%C>;xnv5K;MlR=Vb5 zFMEEB-;~KR{i8nsZ{m1~a~@c{(u0XUv7lXuZarp~Su;(S@G0%w9;{{yF?bg3J|TYgO!=ODy17D~j+#bPC%QsQN`q-LvS zHJe^9PN%x0~P~dLnj3HB&zkz2yCiU5s_i7;ZcA288E9>j{DUXKP+Cd z+w*?Tw>>mXVS+H!F`dd0(UicoVPi7ktLf}m(yq^Yk@P{L{ytJK{mNPa%!dWQxSq_p zhk@;HbQhho*@kP(y`r_M(FgMq6i4Dj97R(<_w~$pkJ7~<<1W>SSrnAaL8tPZ&^Vo| zA{WBO7qB~HCr}v)+OihY!il8Y)8lp(7kNomCgMm(khbaD%pMY#bj_1p9YEUC0sh26 zBEtMgDZ<$lz)q*94xO@NCapHQaj&0Kl-TVy+(`@4zJlM8P?iB;4P#KtM_H%w- zAdwwQQ_>@;3N6L++1yk2l!SukDTwTxJ}y1>vVwguUM?bYu|R|vS&%2;z3-UqAfM6; zJr#5B&K`3beraImto-X`^M^YkA8E0^eOJq>`FD3lwASpp_bs#F;REwO=!ht;H+}!= zd1JwwKih;m5~gvo*D($-pu;!w`@16lwUk zU|E-@Bb(Y$Xj^^hNSb|mNjkD^JxU27(2;dXKj2tdUxU|(@aN`V*%kTymh86ogb|Z< zR&!*;@z8dT(ds|FFWjkGIAa6#CSeI7{ExRNOlZyEtB#7}}piGB@iEH@i5Q z>o=qiXB@1_aiY|b(o@E?GK(*k@fxyQ?$puXdcfd%z~Fko;CjH|dcfz^^?;Q!W^-`e z5ct$wwnuvg!PmveXjx@T*VVGd6E_0FXyWptWa7uOMNOO|OS0l3A6TQ}cD}H9JjtuD zj8lzU;2Ei$3ht~-J{KLjvo>{#dWXv3UExIs4H{x8mUv-tnxIi(k>pi$+({VdUtY=! zD^-zgRlh2BSv-^3tSlbDgfez{?0&QIQpz(i4D66v!x}(;WJPwvpk67eeYkEkf*FMN zDm%Iv)7Z}yarwIEx<99g=bCmG)TB>-X;%R!*R=hZ-A>JCPxp1Mv+2i9cxbqD2K4LucSPlsHYS6x|4c><)0spWHNz7a(;>Nlcb^p5XDu@5$B z%2r-52{tuu?oCX&&sfkEbNQl=~#hb?hEG=Qs=4yi@iH^pu{yj_2!I%3x0ODhPS(U`##JrYr}gG)oFGlb|W2$ z-GL55-Lp>DsSBQl;v#05P+M#j7ma4OeQHZpqf&;UHb+FEe#{ePO4#f z^f&0rap`__IajQf=0?9bC2Qw|lF#}3T~I>};r%01$%ZG(sSNw-Ek;{)q~x&TAOx#K zx#qEs_sSu5OPjQx1qeWdN%3Qzcur4CV_v!r zdM=+uteZnbhz4`WeNbtt?wAtc!txy3=%-jIergH6(ivHoD62<6P}v8EX4isEIhTTY zC#O6$=UC!eCUok~WBJ_ob?sh$Ay+T!jkpoX&**GE$v2^ESIMhAHLm$WG%bG z1F$xEIx&9Vm@~ZK9vA$F)lN1xXLAgq?(|>o$pM|G#A|Zj5gR6l@b)c7F?Xtxx^jLu z8aZ;7o*n|veE>w)EaiwWDIwvMltQmgzB=8f+AxGE#zU-!X)wCDwwJUthg#3d;(+-= z0?J81#uYWrV<{~KB`&C|vX$qASYqmi5o_u(K6ZLel0IBqI&&Fcr}2J^l*dk^SFC+WzBxS;mm|3lK=0`3#v#uL z!*8_GDhm5vcNHWm#fs;Mxy%OSob1629l{^6lbcRC7vQ*$e=|7Avrbe^&fI&puysJ4 zWrUj`C8-VOT%{!R>dc|1*ypmZxTwG0!gnSj&PbAGH^oTSC%;-udcrehvK0d|+}*}% zBN0Hvl3D_Sxkm+z52kCSDTG<$W8?2$|d)2k-nkJHDoni z?xBx&=*gMvFoxmFc;qJ9UG=y<9?PLw&fEI7oEv#;@Lnt8^eReOa~UBev(`ph%Ij<2 z@G1goB3B)nIwoZ>>gskm*l}L6-?Wp-YBOr4lApzr$aAKWF9ORa#)}nns+fW7azYt! za;}nb$6fbw%vBP{_%OH0Ios(53-a~&LmTiw!@No+ewD9g@K)?@Tyd^`1ezHoUdUY% zWO_Tu(@)}WIV%xmB$9GcdPe@Kvcsy3kC+uE?03Yjngmhnjz*A=jE74MmOk#voir$H zQ@EXHyHdo>$K`R_OqRpFT`Yky+uNn`ghO%3#eg=ecwrL}WJsMMYZd*5gb+n{+~G{d zJ$vi=nXFU!g8E&Zo^fT)JM-GB@>SanAb2@L9zYJkM>w3F6u$mb*&Vm`XX&o428i34 zdR@YSN4$k_klX>*QFir!FiAbFUA13s&6VQPQ+B_*Y^-i_I%cRH33M|7x4XQFsHuPK z&TllZ887LE%}ctM!|Z(VgXor%>c;(#JbPD)M@cb0gy%!j{vC32nU~G<0(RFbn@zB9lHczN5DgL;6m4??xag<+vA*U0#*K(jBtwcc^5gjNFa@@>=hBbzCDmc>w~rD6oKx>D<|*VmTG|WLI3P_)^W_aJT!fbM{&8AkY_MZBuK>Nd?pcti;_tv z9c8D853;0|7>#dWsJL(Blc$L3gv~|sjBpL?jD~b(NTw79(1Av|KpOzt=K)4(Bu$Yt z)bpHY40WJ87wrha&#%sLUy1H*y5B3TSQB`Q&?2N=r%MMkS!8Gg-r<~jyI#KhC%Tk? zy--F>DT=5L5oXEvOZoKpng;sVWO+O2j4j?awT)|B6C7r7{#P8Em9#cr$6cB|D<#~u z;fS4t4Io`MWmV?KPw|D+BwsWZ zZ{=&+a4!-JtyWehiqmXY+gKUd2ov4vSxr?k=%ZJPbeb`(9I~%v%U3g#dLFOd@!A>` zz(%U=Oxk*wiz|DT1U(tACvm$%mYmd&K+!fK6&0lzJWaH)8RsV6L^Zoy`k-k{=wJm=p z6$>r5KHV4DZ2jBKZL2gcL(K^~b7p9GvW6vhr<;I!NS@*)V|2Y3H+EyrRux=R!xabF zm_h;NvaaUu9E==2mm{;`l@f~W%jaJ<7&#)|y|cv{!I$rkSYvx5uVN)ED6y{{L-^LY zFO00Ue)rtSa%<*yBEP%avAXLFSibh?Iye8; z1Cgs@9M3!3{$~kzT3ut2-A;qn^jKuQ2lfZTm&^U|#wcj+SUW^{-VxF& zs{;_)&g>rdb+z?wI4!?3H{7~=G_u3`=xAg+wz1Os4R#7pTEATGN%~0S3hPBjA}f$g zw;YMgwD2LgzxBH>!ZbPm6q-M}JMu3r_CV|m$DOSr4fX*f=U*}qc}Lrsj@Sd4$mMk- zV(rL8))4)zLz&1$b%eHV&qP)`bhX};iEMBvXniaL#5gmu{J7;^{$yDfo}U_s{K;=) zpMTNv?ZZv_{6wqu*ssIOthZhtss0xB{@&I%A3D?Cr=%I}*#*hvp}kmU%^rv(pUo8c zpO(AMm?GAR@kr{~-P4iwbI`XFUfsNYEb{44_EoLlAFA*CsHgK6)bC}mKt=ceRuST3 z?N1(LglNZTt(DsydCNuYjuiVx-g9jIdUs@Xhy28Mi@B@Ht$QM?PkO7=?S}RisM}KR z)2MszxVM0_`MbM8iMs9HF1#=rM!$@7S z7k(A?M%K@dTpRgH==s7y4<3u$70Ujm^}8MpvNE>;a+@b3VXJ));I(HGuzA3Kmb0II z`nE{Hx@t1g{R|WP$yV#o2+-~i4n_Xny5(?W-~3w-M?TQ{+!%qcwf$h|85@BoS`@#H z;qo4H>kBW8teSu43nQ;+J3FKG{+8v^V!oyPPGt23^*a}=|9vp>`RBx-ex|i$Wd84N zj@;SeH@Kf~{{)|2_7Nq&b4lzxlJ&%;?blmh-W};&?D)qV`HEby*81LUkpqk1hq(3T zJ&}u+O9y(ad-p^J8*_>E1|y<8hd5ysZMCpHKKBZ+9Hh1rO14C;!OH->3y(oZ1@pv~ z^Jp@9ea|3sUC=WBp<|KhQ0~7&aylycAe?=$jlwS1L#dHsW>Tw|hqdwuWfMsl+Vlav zfC+3cG?&06JD6sL?(k-ND2w?lE73y-%;_`6W$86xc; znv<|StQ+I~T3($+H0c9dS?I5p>D;Y9!sGekn3^A|RGnU zeknxpRA$7nAvGqCUrndq5}~pif7CwTTaHY&Sf4OqlK;?*{*n|Af^t&>lYzE3je|*ldW#%D-({F3of6)^g;1xlg^L zW#Qa&&v5cNS9T_!W4hzT?W!q0mFNmc{-si!)C~MwH1T(-iL#`RFsn=_S2U)Ma*pRo zJ2qhoV9GjvE)f%)QU*JbZfaUJog8FYT=7(HhM$h1p^pB3ezRgMnnT}$rodLfKD{6M z$_`H81T!c_4A$v)Lz5*`dJnXcZpHwPk71OWrbcDSl zqsmOmPB%KGn|dWNo1`Q3nwptV44m$>V&YeFmxyy>M!r=i#js>kOM1@q z8J6EiTtOKq6Em23u*B;)3rz6LRaZITkVvYoQ2LKajgbyIPLvX<<`OeD2XeG=LIaeU zEhb2KJ)bRWELV%la7nTc(`q>@b?R zDwl{?4Q-}G`FP3dRW^;{pwwX&Pbo9bmRUp3_rPc9Dj#{1<>=$6nY6X2h3%O>Z{n z?2_q4+^^^;?T24fNp-y0w0F%De$tJO4m(HPjI@2k*V6zM^+9A#ZeyRCd{Nu7g<++b2IiH7@%+1X}|_Z7ih$2{0)qcP~H4-+_z9R@Zu z8qHCte^XN_ujMH{^6A#6GjB_)>{pDyG{qC;*%I5)bI7X2Y1fG@pSn=QpJN#W%woR~ z2rRP@*W-xyn&75Y&YWKU+#@ky6GaKtVIC~5o!;_zQ{Ee?sHe?3M=+Lpx|LZZ_RI-+ zbF)Tn&}J!$-=rBz7_gXz_!&o!GI3g?J@$>v3}jPnk%P8?WMtdhn>57II5brfO$;Ic za2T&y@l#whpN1*3sJYOT;>8x4Rra>ACio1oi!Yk>Xh13>Y0Q?CNkWq5!dP{%+wWShWc9&B@OrAhS#^per6X(Z!W8j(RG0|Yu< zJVBuA<3^L(2PPJ2!43NrbQ-#@*o+(??weKa$Jq55)E}l;OcMYNC#%G`U_53fJZ#p~ z9o)=J&8EYbYf^d8(0wZVQlMz~nXQYq{ru&yxqy;3wZ6PsH5*EN-@c!YK{`Sqkh4N5 zU;p8Ba6&P77V%;;@vPbJg{C8e169&m6T6DEzq5KHp=2+|^zM}tT~-DF!LR&{0v4Cp7$A6 zUcWBLmJ|DMd61@2r)XKGp-t_M6rN3(!ihRtFx`Q|vx%t?NM{u$pL=Hv6aLXxT-so( zGi+(tkeKUV^f4aC{?lE4{0cL?Dymd2mb7wy zR$;YWeP;;P_fgIWT(Q#>iTpQ57#i#t_5@FDW#`P4&Q**2ZE`2$ao)!)%=xl+@Mp>FbR2L_auW0W=dT{9Qq2W;(U!I4~ z$v;VqWe+t%Acez*x=<3Y@ozd&Pf8Cv@EZP1!E)WX`NGb3hn!&^o*eHlRy;GXB5v)` zK=$!lBIBjWaazxh)5PP0#6CS+E9gBvFypk)dK;`Yt;MrIr_2 zuPVI%a;VoiAqr(EQRZl|L>nuhBAQ45nR1%o*Ae_*oQy_Rf^tsRE9C~g&-wL!>*;r2 zG_*(xlqzKp1$ea5+j|Zf>hR8s<7=XuoIIXR8thKOO0mQ*I;|Rb>1%$<)d}Yci*X&V ztwY#$#{}gKsaw81((RmthG1!I!PA>8nS)}a_@hH(w{bCG_o+#TjKv~jF!97pTI{xA za5x7XEM`Gb&q!D;h6VV=!xfF~+>+RLhJCV=U-(Qis_yVA-taSlx78v?P>y7W@6%px z<1c6EgL~?*wr%#?msgERe{vyx#^|+=)S`OQ1o7HedN>JB|-$8#2$03lC&KRK`>NUh6c1S3Se{cblXMDUXleHicsGcf3XplO0&_* z6stz%2yPye4MU?^7^6Gs@lGoHB2Y=J&d^0wm^FqEnhhs0gS z0@6ABK%1fJWCS;U4QaT=WM#Q8@iG8=BIAxGktrLXZ`)>DKHTs!q^#eB*a_~tV%=OW zDO*Vd!j?I78!V?2UGd9qk8MaE+)}a8p%NJksETrl85~~Rt4-IugFS6Ou?3UeSRFCJ ziNOktQZ{2IB^}`<_X(C;J`Yd!+XWXQxnzHc3C48^r8O1zQHb=P6v8lwxLctr9+KdK zk@n27Er+Sq^N>=5?ZU!mAiC%Ms=7Ugj>d6@CyGMDr~ z>sbtygZ^IOLP-b_Mvd0d#L(qkn~o+-4p?T6ywsp?i&B#;%bMpZ178O5kdoiTVuu=i z#GRs%w%(Zs9=q`HB39IsGOao;4S51`4XKN0i2%?ZY&Rty^x$@GYz6y{zW~k>YEp(_UUkk^1^5*F9{!2x0o&*_h1Ka8 zeC)FIJUf3e==C-A3cv0eCn~=Q+g1gXjEkB7U2>UuZsv+namuOqty0O+fs#|aQ=6_z|PTA z)){9;5dTYg@@`?5Oj4~L7XC<&l)$Jw&H9TrdAWfS{Im529vZ_NQyY;r>q}Pt6g-E; z5Zrgw#D@j4QW(pff6|n@6>YGzvjBrMViEhfPj9^a5m(1FSoCuGB@0%zL}lYas>Bb$ zsNqEbp7|o?gBeGS|CwvZYYv}b;~;MUY6?$WOvn)&5>9M-m&(O470oQ3xRB+PW_On6 z=oAxLS4^7GnJ5l~YGZa^nW2?wjmssp)<~P6UD`;iH*}pH1I!5{QR#e^^NH=z3bNIa zY|aIQdBhv-DIxj8NG7|86JXM&>)Vk^__sHQD_A0oif`@HUcl=IG{faZv3rn(?S%>8 zF-%YbU4h5cCe$)JYsZ|0SuXMgBs}LbYYTYpH0i=&qLr9Eb;2NnYDyQjfFRCrFSM4nF<@A7V=2xcX)}Ou z3pYOM6vzM1-kU(jm0gE{hwOzPuw_fu(u-QsXGtWh$U+eS*=#n*ZV3cHvLs>=3TSp4 z#B>)>AHZ)`)vvB!1rkCd9XattV|$#%v44&wJ4&J?mM0l!CgXu@If=5_nn~=5ld&^) zGRfpP@p61*ALmRaGftw+-QMz-DiqkH7N>a*$@>4l^}hS=_U^lvhSZmLnhj|2{f&0e zaAkke|1Xo#Ml*2kjQ>4D_LAWtKtX{&jNxS5(2p=d_9gO)GH?*aqD2EF6x*Odk_*wY z34O5gaXMDv2^l$tW_A^ABIYCn_c!hI8WNNeOA>jgvIZzSOZNd_AB>C*vlb(RmN(D_ zas`x_Y%alH$UE9qwF`o~MeZ?^A8vYD-N!;gHl)!Q;ZSEU&t;sw#K-B2N-!PJ2^LRN zO+Gi3E7Ih*1HXoen%mtLuk)5C^*}%h)_tLWsA*#4^ICv*k4A$uAri4Ewf1IEQfxYY zqEy75G!Hbnyd;<$-Rf<$x*bC+gh&X<;En~&>HZ!_Xlv+$R#FW4)&7S|gB>pc&%*DT z5@nnJ7 zZ;z(mk4>x=OuMl!cwWzMl8GG$q2vP*a^#d6G{*@v zp}3s%VnH`mWCtT0P?Z#%N{Xe@VgNSN3$-*xuc3{q2fy+v?oI1a(ZL}zzvry)6G$rb zV*!y~`YlToi#xLUEW$6IJHjDxWr|XXhsU{|$*rRkXl@e-4&a3fSVR4&<}1h2A)Y9a8ft=Vbs&|UW? z#Z5=Qg*$$|4zx#AsLClI28|sF{ZBx}tpIi@J2_Z;2B2M1m8R-J$RDXJs4@)}foxi+ z3QK*YEL93CkOK;n(;dJ%As?^#wUUN`U+BMSL zXV|xU9bMXG=Thtg&YOi2ILgdY50;m8y|@An9a{{tBm^{uLE+9*oNpPo*O{$!cm8@R5%h1a6xrt#z zM!l5b7quksE-1w7J|-c^v-2uyh>nGfgA=7fiu;?JQT$#~Obn+=v7j$4JTFDtq# zZpC5a+6o#t^iWb@n1cb6fGt*HwVU7A6KWPZI8m*=oF?lW{~ z2r=hKR`~oqv7$7BZA)6l0Oc4_34d#~J8X5^Bs;_QLN0`K`8F^qlu(mlDKTz|g81EG ziKhe2FHy#jSol{ctq+{?qXiWgPqmzx(*1xG*uB$PtCXLV%bJ%*cO=pJZSU$-ey?UM zB!4Q0Ytu?BYuZ(rTQghM*`S)qtjY(pzhS4A_mwcYVP$$&@ZJ^ar$SjdI0af#wzLMk zq3I?wv`J-T!w_0+e+`)#rexo&ipHC!OG7d3i1ryWxau|vik zt}t2mM@Bfz;_Xd(JK?VqXQT(8X@7z!#zA6p>NxBbDETzNxHGWXnG9vE6(05~mfgi& zxaFh|uYy_b`XrhFWR&=lAzy=dz<$F&&zxbwf9T5bH%e{w_#eVx0RQ5x&jHUDlYXm6g~ z9zWaI46@#xT?+$>*NB!a6L)r_-VL|%K-?C)%_b(X?zpErFrBcv&XG$!lo4oG(a{H$ z_sF$_YoPx{8->lypjszq47Z~mKj!U(6C{G>aeLK*b$CPDi%vOS>v~=G-$)i&StVJ3 zO4Yoz?q(TJQRtV@nnKZbuBqMjc5KB4J1=otp)h!Ui7!^Lv{_*b;-z*M8Ty_IQpt0* z_?SRxm}WEDPdJ zN#z_^jUkAZJdxg(KyBy(S<7=%MYNwb3zw3TslXfFDrTaWtf?{rTUVo$VW2`J)4db4 zZ`XrrEo9rsrq@KDWDq0PFpg;x_DKybDSq3-cPL%ZnD`_T)3M`($(qsdU>;=705oa@ z986HnEM(X2nuiuvuet8aAw9W6dhM-hD|FX)*6Wl%4?kS#q6=l%T}Pk>?GQtkRwZ06a;#1iur&cvS&|8ndAB>Z*Rr;J{xR9Q5A6gG;R{ zZp3gj$LNBnA=T+tAR<8NiUfF4;Uk{n-FQAVC&;wnQ^((z=|bS+@Xf*iPu< zu_0*ZW2}WR(wW6Eh-WRB8iZhilzff{?HhLO|altO0SOsRPY%n((jYskz_gmgsNM7QK>awax&Fx;|Q+pZ$2DPj+3Q6!>L zFpf~cng_CqCV94~;k)&b^NS1YbT$zY7y1L?qD3O~x1yZCKt8{@UM((Q;&e&HMewySozXor{B6!{mV^Q32Hj4p+fhqN zZLelOnb7)Ppkw8f^xD_vPHhCoFBO`3=VoJqjm~NXvT}4rZqy-wzy1L>@t*)=z zMJ zpI3wIHw2ymlL^&zd{@TrZfD4AA_~O?Y8Hvy1D4E4-PAYw;*r2QJd}b&X8iy`F{sKu8j#h+g@*UUFcDAwhL z`lbzZsR(soVaDgA`~IJ5>WhU<|e^ z-$b{hXHy(v)AeATGFVm2dI6>4X80Bxq&b+vYs_F0h4Jltd(k6|ReLZ|lX*!|+R#g9 z^qN>&(sXoi3xkjub(^=F!JQ`XN`M*ggxAm+jv=UQ%E%emhKK&eRZtCqx8#gQ3spmP zv^6}8DhSyT=ruG1g{24@V&r|9+*r(ec56{z<;XyPZPT+!^Z=Snxw#QoI`qd`6BgxH z%&xEC=9$Q8y(jm|@X#VItjj5qb)o>PAT4|`Xn=r%*HE#Fj5W3s?J7L>cpaHR&pJG# zSe+O+8HKZ9YTK1{(G+Z10J6XP>OBDx4^3bs95EBqTH{cscXust72UDDqPuJ0l6XUl zV!x7A#8+}GW3da^WIfQ3yx8JGF5QkK@&+OraiJV%$C4cl3y44kX&B@`AH4w4TUjf( zNCfd>PFlhm7G--qsMomxycpMQqYs^}A)~L5nl>sRAR)_Hz%Z%Ss8W!jqomJJ6|FI? z_|2M+2c)5P0b{{lCSoQWml^rIRCc;tee?tzEeueKZqa<%nqgD4;Vix#;)@QttUIr6 z=@;$U(mZ^;$b`8RU>W$@Z>WJshwWN2MWE{@GdP)M7H)4Qm1nZbm!2=2XI2xlJEe)Y z#Er4cXVacJow+ zs^TtO@6d@7ELR(eFM89o@$_39-SFPlI^P9W)|(*|WkQb0pyeNy;W_mQedp6!#4%g$ z7E>PQaYs+f4f-x*4^I(Tb|PYTHE8EymZ;@T2Y8JoQwZbHkQ6|7%&5Q3fWnb(dc@k6 zTQ%YV@JADa4^?ZmrJ&;Brp}}goz5QoAqOiCwF%T|g5+rBI=jxoL}$G;T?M!U7b{KC zrY*GmIXXwsPF7dZ;fy^My3IOXm{lf3+?GrU&oYg4 zx4i21PD#WESZr-9miFNl8!%#0uzV)gCZ83OuS~AG3yR*TJqj8WJBc$wonX=-_Hfd! zu-&57Y0>H-esJpwI+2WH`Bvb}uaot`mAS!&0!p|^SB5$2muohzxCO>^F9gwKv&L&+ z0XR$8vILu=61l{@u^9lFRLG!(ZtY(uO(BW{%b5#0Y)sl6&TMo~F0D^1P&RxrVV5Xl z7Rw>RF~s8|iF$I7V`JXSmM9&@kh_qHfy0@?b=F`FZi;Mj+~B5JAjZLg7O4OFa3_6) zVS9OKb&`vt;H!+(8-BYXV8u*iWadI)G-S>zp-DJ&OVi`JioX`oKVaQT5>-{Gh#Abp zBaW(L`#3$=AiVnK^p+*1)LX3&3_y!Y^Gz?`i+1QP%@NJ5gk(`;dl)G$en&a(k$f{U zru|5lwBQ)Cgl&2q8N|pKHbe+*Mx$zz<&M0{+aV`N%yajVmt0;;MV2a08raRMs3NkFEhdv?CNbn%UFg}M0w^wZ`q<{RF}-8O z?^7E}lW1#L(v-zyz-2 z?jvmvQ(mi#@O-yQl@}T} zqM?cs!F4aYqsH8;DccBtJu_ytz}qn00-o+jxp#C+id3GHf7QKHK%R-ZEF){+WHd&owaw-(-{*iGky=kjD@wi&DO!Q z2s2ua`|It)w!&i5voMPYr^HKJ+p(lmUiJJSLzglzlq@2XMX3`fP6r>DF>$zetCYc# zMQW>Q+m`wsIHZm5ZPP-+4zGM-d)VRkzTvG{Vv#Z|gDJZrxrbm0=%(y1Hl0BtgE9+VdA3z1GVQDB+7yWB z8LLd}_1sh7>uvPWxImj%;aCqd)j)PC9hi(fY{*`PiRy#eAXdfRR;$BW74Owx!k(bY z)G?^BVIal9HY;Qr|9V?z`vdh}EwzJN0{f`kD3c{kavADdQ`c>lZ=v|1d@NobwA9KRIT(N#zraw&~yV2x`qP%;?%Ha@ui6+7*fu8O+c~xF)(i&&HwYVFRwFuc> zjy;WZ37t9Z?#XV}I-)d6W!oSkZ1{?Pl1~kNAV(FHb|has$Cn0Di*7VTYB}gR`=TgT z*KNT>&|!wc2}?UJu2aaqDK_^YHBa1J_@tE9QvBYsd{C6@U_#kX>h}XUSK1DhdQ~|E zHmm>E=|d=F$)ZY!vkFvoyN5LjXfqM1v%IN_?zzGMimpUGISk*iZ+KX2zd~D4QCN zx3*VE!t8h&W=OB8*VpVDzyi%?YDJs2mLv6S(<14hbb|xA$=;sDo)UG;yY&1fhy6Ny)r1+2DkzC;DL&- zr5W@h!gTos!ySq>_CR<0_@M3wpGe%DwFW9a-Uv5yd(;qrl;7@LvGL)cdXZ|2|Y)12`U)7Ot0oL$+y!; zaSNA%1$dQ@DO2he7avF|P)XH9NWVm{*@tJ7z0c3&v+SGLN!U=D!BeN!2^sGoF}G_M zhXe~f;QT-}m}m`_({9k(Pv#uApIcMUt4xO=C`f`5o*wc(dCu6eM&B_*zcl!O6S_^3 z?x0Udf+mw%HXy^WZw2+`775juIutE27My_!XJ6E`>!df}ik95(Z4X+l>+K~XO6pV5 z;IEQfZQT}++)xptFiS{RD=dg5v>~h6LflP>^hQ$ml2yp0wIJQ{sE!^Q|7n1Z7Id zqD4%hPSOiD0~~Bv;LdEz0!Vuqc5J(xg!mVjfsQA8YC@AZp`N7q6!qx?=S_t2)4l1+ z-f-4!n>Rma6B;EZ!zlAUJ5wxb3(7F7@RG|{E(Q)|@{u7aL_J~Q>jUFh>L%RPBi;zXdO2;Fsn$by(lhKo>I zATLJ@sfyiWb=?jyvyQ)x;k-DEPc=r2Op*%Y0be?_PrWn|%JKcZyVM^Fu7o)?5XBcH z@I(ji6ZqkRrZ@3T&bu5>dsPv+YauQ09avheUit#>I;AM6ngzAJ#MC~mc3Zcz9@yJW zuCy}S8P0UOj5$qC#1Js43MBY(rt*p|CYmRAx$U5JNm5{SP5 zx+sEQN~s!6@6KY(v6K@zz#mOaDW{OD3eqbp5+KV%{~)C`a&Lv0_@Z*V^-e5uCeNyD4HzreE}xOoS#H_EUB>l^&MR^ zSc65ujB;qT6#q04Etwd#?J#n>8d_MYlx>dFVPaGUPIe+^f#MBk=-q6!eLLan!WZEg zj(Er4-1Z^ndbsO8Lrgtm&P5E}<6G5`y|URm^5e`SIvpMEj1~r#81MR`|BvPpLkR(6 zRM*J#4a@Qi!#(D8dPQI`vtUt#Celn)Fh}R{Pz|a^{A$&p{UzHoRPca-=x*izgM8U7 zS|Bxg>Fw|@)%XzgoRj6y)#8^V2QgFIco9#=IM5xy4C!G58cj9_3+m%#~iT$I5%L0o(|kS}QNcSzQ75K?SW683w(VmVZ!NN1gLQ^c$U z3E=bVo`fc;0@}o|pjpjwv+m!%?-;#)DvWo%lQ&0h}MV=X!B&* z9vxCatiP0f}o6>Lh7T5h^pSYpb0CW(m|W!lPiulBSFF-G^YsTGykp%8~r9}fvG zv{9~jr{Y&AFpMqR>a7Af#m zOrxVYy@1rZW`fTusQ=2ut7m{T(Fxj6;(`@Vois`{SatcVsnRQ9qNlpI(ZL8P>O57d zvMEybq?}z&!Cr3fjI{i9+6gdjaX0KS#!ko3MSVd8ziE^-I^o)@@vJy`bqtWa3XZuK zw97pef!zl}bsgI%^zpp6!()g9Le-a>4QYUzKH1lQKh}!8V-;6V%9yl)HL6MA`6C}; zaLR1qT5jH&rE*`4A8Xcx&1)u)$2-1k5yReLsMtp@U+#KM?WGK!Z#ILq?gvuY2T{2oIn0bCg+z)krz8!k2qQ(NZc{#^ z{aPzxY={N>pNiZv3axnJ9^VoQb?!&6vl6b-S`4$eMpjNBay9p| zi_O9>l{ta~RISujwP+Tq1d&4&xC}q(+?U)kJ+fWGzL!){8y^40yq*a@Tsh_g0`E0s zwAGcFgW(72c9xZVOOj^U_o$?nct3XH_oreB8RIL+w%<%g6yd3ypU`ZX_Gah;0wyzO zq2)NG7MRqWL#nlsWa2r)?Q(;J(0jwRcYOChIkNxVUp}^;bPpNMTP@#v=?(f1#5+#+_VPulIBXg+{M!7C75c$@S1lkg$?y#KZ6 zgYR_Sv+umydB>5+{ebht{%79fG~Qc#6@U=|FiuDR`qZPj{a^g@v5N|NrKk$)l;Z-gl{Y?blzAy1#Yosr`); z&gUPBzIy$kN4}jraN{k!SNrssCXP!J(SQ9*$DY_fUvPfOsr}s1U-<t>;Dd&2oc(ck^eV^2hX;W6jY z{oi=PdGV1WXR!Q4^!f*!3VqxE?GHG=lm=|nIPaY82l?oy&O7fL1i;aMIPbjIhU8}- z`P|>X7f9|swEygQ5WVZSj=gXHA3f^4|KaFQ{?4(t?+<;8^ZBF0 z#(#GIZ@$g>#L-)p*BPl}7*8I#g7!{B6^YYVWjMB_o!W*enJ}9zlaYQ_)%AFb8KY85w;Ufp&<>ezbWG6o4d{6Yq3FmwtWQ_n>e=Azd z19iGoa2`EkjH%IwPdoYjz0=P39jpD$vETXI-!Lc|{r&}5^j@eGwVrWG_l6+RFFoTt zhS>1&#~XHLP>W|rpMAHpL%8xT7;qzYd^KBbMZfwU=ln3q`0$i(L?3$08F?pBZSxX+ zS)%{=jPw2@h3H>A=H!nwqGOLcFWhf*dMs;z`Jff8|GQ%!jDGM5nD1Zzfb$f$4!HK! zg~ke58CKabvCRHXL-5vY0g44D7#aJ_R_S=4j{WK5&TB^=YnWq+gRnRHr_aE!W^2I&9qBTgZjDmlmAXk;jBv}Qffp||R${hs6cRbz$S zW&@ou6h1c8*N?-4=v}jx-X+4d((zcj#?DwCz!p}tuD2Sq+(v)t7%-dlv(Dw?0cV@t zi^Y53@vy5^H1oT#KOY%$9zIh0R}X*nzo-rWLlf{(@9pS=6VAK7k@hkT=%Id_H~M!I z&H`_^=*A`Iv9H1Iihk}A0PW}m05iFfqJMu0I=OQhfS?gD`X`rRQ7jyb9{tka85GAp z^>AKWx)FJLB_#koKKkIlJoXr3War_B;Bo&ae(l(I9vJ{PBf!m5L%Nq}=3&5rcm3OA z4z?0OD~0`;e|zlFw^O4ZJL>%Y5mR^{3V-L(G+wtJvKsuzu=5nPb!*u9Q}+qqf8$#$ zu=K+H4}A;t8q@Or;O>KW#F-d^`=LwDm2a+{@t==<&)*$p%F=!+7Qt z{rGPlJ9oCjjzfv)&uGofi~xNf_RG%>AD2$YVx37K89F1||GD3aa}d z84c}jbxu7sCg^m%UiBLo{}-x_rw0NZS`bkKfq7y8?S5mCVbHPnA;+Q)!PO}xfm+&w zdS_uh0=kjWKqnKwS`Q82+3^f3ThmYouynm#aVzszmu^lj&baVok+qtF1@|ESKd3ceVtU%2iejs$4d&!-7aba<$ zQgP=O-SX_hjWVCZVoUQy>Q|~^ zgQliCf7P9xS)95KkCRu*H_A&d(QvMom*%j$tI*%1yD+)9RGwPCF}dh2EH5t1S7uz8 z9JVxFu1wvSEYHqNmtYLguRHU?%-oV&xjuR0Mq;}2H|J&+aRRZqUYUWBPF}e&gMF#l zPL~&Frj~G8=GPPe5e9jq=vEeHrpowZ=EWJ9)a2qzMQOG&^YLXU1Rve$$=S(kGZkzx ze*kn~g{GDlXJ&EW0FTP@mC90iX?bbJy*58TO)y8t-tyE;KodGQqDrw=}c3xV*4bo}Vkgg5L!2z(^;d>a<#3pjJ3%0M`8COV}>L zgO;M`-n>2o?-voa1hq+oMFpTYwPY8AE&-TJ@yWV#GuLjEug%O&&0v9fZ0KgWGE;!X zD_5{UnR~uD3EeK!+;PQVZ2YrK&{Mcvq@{JsSKZ0!7s@z(DG&HiDGTlp_@=H4^h*@) zaG|<>ySm9KTgf{G{%y4Cp5AtJ?f~0~2zS`>)-~-D@~wy%{@LnuS`%l_Vq;je6tp+x ztN6uWyfO-&719M?)p%nwaA$+&W-xult+jphjp4?{lbeFyH*3{8y0A$qQ#m1_MD}vG zA2a$2p=J_5O_hdQ)+C3AVSX4HDL*`vTW{~QI>FgS?dhC(YD4Sz=rw`#V(4O~f3a6v z-d%bo=R5qh(ZDpmIX}RE1A5i=Hc%ju5xBUrF;aBg=zgb1g9Dj`Ke)!+gg`1)>8LjCuq?~ z*#eCSrWuW9Jv7S_r!!6gZg+S{hLbP2`Ixnv{g5O8Y5(=8WUdE#&H0iCORWdDvh7#t zZABm zoJz+b?9F=3H6BYYW!;6@H0fSJJviD-E<~nY)1o}(2SZ=o<%e~zhg$$+z}xsjjZXWG{zntT}3h???jDO zbYrOLwW0YPB(WP^%2cT!DhSsOizX3-EV14)cdAYD4_0pXw0>Nz1XxbsmQ_SqS>t=C z5LRV-)`L=cHi-O4wrDjZgiFxf+*0%5+fmdM;VBfxxS0sRIOHf%oI-=-NUFqRGxr?I zDX3p`EPS`okz(XXI+`kqxS`6Rt;+&}z(QaEec5PR!5x{G8Kco&uA<+--71dG=D7sO z*_{gU6&16=d}epA&^@h+6x1fjx2ty;;TNlS%-NdM!#~P{w0g&K*$fM+$R2h>-KRhV z)Xwh3bRbktZEj)WD#NzgO$l-ZFxgUh{up`$_dsZrO&1I)D7iP036XqYp)N<M~5hM1-o~ers1HD+$O%azy~Mm*ZltlMo{t2%XW?e4Z13{L-9vhdj`+CXPw+xX-c& zFl>5Yi#}dI0ODJfunibA9?5yiWAC71BU$K+eEL2ZQL zlhEB#rV3aZeXeHK%G0v!+CK?}pQWUn8@(ytP>I zJieEp8RWDO7VcCE+8jps^K1`b(<)7qh6|gUXaK`k-xrZ9{yLQirLy2zlzQz^ZRxFQ zBmG*A1CQ@1u$TFY1Q1jZW=Kaa(zOR`cD#0EoLDBaKMS%w%ai@R?{ZhsoOV z^ytXypg@S!p5$Pl(y$KY4ZDGmxV`>Ps(d%(q{FyEG49Yn2lw@$ffrEGA(U5zk&F#0 zLSm)`^waLjs<;meE#RHaOQ#BP0iM$SF0I` z^>Wbx_$(8YR@HA47U~G=HFvsz&E?6rVU~Pf8!AHKY?0lS3kB_^>vwENf|@u2;9KoM zKo8%tGIW&A0Zfd*76Kvx?KX+She*s~=*Wf?jeywB$9$7Z`ZoR!HuQ`EmlOuH zB;!(Au_IBC_Cd8%RV^h)fu8$1W|BpKr6(H6a>(+arWd5jwSqA8F@+nD49(|Icv3$l zC?Z9GLKHLRySleswSq*^Xb;do&wlW1Y;u}sA*c;@5zy9lF#7?`dS#U!cx4cI2P6qe zFvV7egaHr*MqnOZ-L%N+v{7i0(9@Q$S3luX%3^Ac8N0Rgu&{utUYpEV!kO#!cR;@-=dN>mJl9IiR?-{3#k?156J>m6Qwa-nXm5Sh5IVyoOi`8;Zg|5 zl3w6)Xb)9&AcWESln-Tk1v3e}(4j92!4OK*qz19u$Zj;RaFdv4sNG?HjVs;+MV zccOg*az&_Kpi8ujkIa2?R-=Ubu)7w5fJw9%CdaB)U=P1w>+5&Hmc zRl+>ITS>(b{7MX7_?EgJ8g?7*$~k6bL!3(vUad^54iA~0pt&&$)ESnp%gemprepSn zJjTOuEbLHq-_=OMd>DHmCrL2@~Tm+kLOc)A4n4vs&pF^64mS-Xp#4fjWR}# z#N8lFO7DJ#e|$&SR1o36=B|v53;2=$!|H)P)&OFW^i__$5RrN({?$+z0MJ0Fr?QbhL7Q zl|)%VoR!g4eED?zfl-3fseh8U7)vPqw&`~n6WYQwvgsIxLk!aO5Fq&jYwdj7HGMR9fLU9OxIDk z!c=s_rwGSnTuU1An%%}4hNnXlES|82EJ=8+0HmGer71S;Vn!J@C}M*ln>*N8k1e8+ z!V86zE|wE?Ytmt1=0@QeWp1;jXK zRvqPwP`ylu88kzm%zo~S*b-t=SMGf6;ze)l>9q@^8|N=x@Xn84JU=#GTYolJP|7PT zjY*s)qC!FSxN9zjS|Zjfu`W*B%@tlLN)1e~rlt}TUbE$-m`s#8BJ3h#I4IrB;1Qd* z6v&{3l3N3iyXPN8-9QZ^7D0izan*g*x~X3G+L;5f8bdvwd$Vtb%gAIHF?b=2;vh12 zpveN=NR9M#?}08Gi?2P@(`Kx(2I=O!3@d&wf~0Bq$P(oR6tM9TNIbqcl{=;1j6bbk z#ZyWs17@ZKZjIi>kw{=40R#0cf;erj?uNC&vIN;Y6d~qDV;Y-)QT2-ka4*B7z(k2L zauP%y=xNNOo8G}RE^CXMwS9rQQriH{crIt-^(F2_iO=!yO^x+du@R({*G#me_VY$d zkOAP*0-n+3({ULJHd3KeCp8=r0Qn#)pg|EgptMz#N4r@&gc9l3EHN~tF=mZj4=7Jv z7O_LbbXztRH1!A7`c&&m)3dgmt@6n(HJ?{#2oo>@&5dL1H-pi}=`V4^gycF_x{nEcq~%NNdJxG*`a_L~EZs2<$8KLg_atO1RTxtA}y7tR#~Y~~1<4;prr zsI6XGhcx8+p+8th3DlRVqRUWISJ>B?=A2M$5Gl|Xhg}id+Ebh-R&w3R<_;gYv6mBV z7QlEmf5d&A@hJ9o6LF{-YJayoZ667_InWxtJ35N~@2Cs=>*7q}hsLugR3eXvw7AE4 z2D@07W$L|>Zfy)&yQ;Qi{`iLr`V0Em&x3YS_ka>_N{9L@BE|A@d0M}C8eYs!KdqiG z;xLy(udQ}MNguNbKnFc(^EPMh#*fVT)-CK8x?yZ|VP{r%kFg7Ldd2giVVT39&m7NMtNi^OLdb6n3+M1jS!)J_16WzdI2%a9b#3k;7dk!>FkYX+rD!j6R4H`= zNoZqmY(cH096zdV<(YBqqt)$dWgWO*hqpVmM3ikSsDpHEedpPr|KNJS!h|^Gp^-~- z*qD!MRs0Vq*flX_IotFR5j$4uziLO0e)*h59mjZBz#QIcYahlAl4)BbG;^oeLVD&h z;JBXz?2`}=Eqpv*ztY{<@Y)ss6Bzgmd67gZ!vKae?KUO)J#7pk7+j0<<*Z{2!+hbA z8&lI`+0sjS5jxrAZ$)2VWv^X`g*mn>dUu&iFJQrgDuz}?Ibkz3PIIsh%Wx3JYkPLL ziE*mRi9lcWC{P29nWiYtI#7mBcuGp=#V!i1k%NBiG+I@wr#&*!8HmJ33O2nF`;K!( zi45o=XZ0ld7itvLo!3fA5GDqVZAoEre9>}mRa`~99TS=;-Z(h`F%zR$p6p4f=Am4I zyITB9`{`CU^t2hl z7_?(9Sh`K}s@96~cXs)+iHRTTzTjiD`q9$2= zs1vdZh3sq73QN{N8o-s11i&AK#iR&=bSjNjLwR#l0^DRL>+7>5V|X!BunBA<&zn$h#xAEL)fM5?k^X3{BRxg z{EXX9j8<)QT;YyzXNZd}-8Ldh-etiaM``7XGis97WkeMaz-UPy34`qZ*e!Crc%!b7 zvx)=~L$%uppk;RMQg|@p&I!BaQ4!8j0|br@46R@HFg7L2sU2_Aa@*3dQn$HSD^?sG zT38PNfAKhrJG%m`CfNyIrihOrbjJ{0qX!QVmyeq?hinMVQLInyamI)!BVcO-X{F4k z*i%;=nPW{WBQW0KZ^Jr4o95_jSYK2n zw%=-*3q1?5D=D19f!Pg8@2mwX#Mu!eskw*aH#MI_Op9~DfjHkb>v3@w25rG7$?&>e zLTe3&_9tCLm7YbmqaGGIZA^eulQf!qtlLIrh;K{iq6W-zDadaZ63tX-vrc55?&b`; zs)9--|H$ATw+KN~PAEgFU>D+s>bM&&#p57&cn4fzf8lnV_n7khPzV-$}&M%Gj?3L-9j3Bhq&Fn5#S+m;$;6(jnKwKvTqw z`-GuBoYr@^4ElZTaZb=|8`Sab5_+3cq9Pyz_0Cos@BXE6Gz%^9HX9lqvGQgR&}T+c zY!k7xNH^Ya6ynNwoXXh|)=%p7*xjbJ$rns52@O9ursGwF2ZrtO##0#2Cw+EvDO_ju zLL;CtH7)T?6`mnJ*w$SgYTk2C>&gXJQcU&tMamJ?CR_UG-4mnZcLD1WD9J5CBO~_{ zk06i#V_zlZ@}$m#?(aSNSrAG|Ff|rFV3$g#Wcc7+T+!h9x|YC^zhX8+3y@byYQnoq z_O&#s&Up{HzzqzevSPnyp^PfRkcNlo5+eVJZ8E)#x~^@J2iczgD61hbWqCub&VxcW zLk0v=CWmJIW`&If{9M+eCgp0v&dB?idceWSttp(FjV`OF4KxbzDzhLR-gPlDLTT|P zJ;(%Nc0qmgsxU2XHSFX0CO#rwLE|Y1a}_n2Z`b%<07!Uv#J2L5sCwb>hC^ zp??61-01m5ZH0mz)&QY-7}D8X;Szi`iDS{^-e`D?Pf%uMB3!j18LwMOLf~U~W^7_r zf*A{IRmtm!Go4yLHNhdIO}l4cPPXC46b^e7))pGdqGA{k#;^`~jcmHU+%$?Vs;ros z2DLK&rJ^v{4uve^?xK&!#r%2!^UM%b7@Xgk&Ye- zWAcg68Vh;{klPvc%jm%A3&T#))$k|`A21lfY9f_ZGH%hBEhMP4>V8L%ps4T}{pGkQ zX1pAW#jqww>c!_$E2-6|QWgT_%tFhGQIK&%?5)huTtO|iU0m^kRAHW}DNFOVO5Imv z!O!=K7`)pBYIqSsr82=M zqe+=Fs1vi!xo42X8tKNQEz`7?$L8(i$+yyGVjyYfa)pD&z-Og;1h&Aa#8G6WB<&0~ zG7SO=V-IvZ1v4Wb4=L6up2BgyZ01-{)9#tj+9VFsV^JGMF&D`!MZ>aWtX&;j|7DAX zYZkjg^%2Ocmn>#&;c;%d3!9k3M4;*P6v9W>g5SAQy@4l9^;jT8VJ=~kcr{6ICAIg8u`YEwJT;^&NYNfsNxW?-L^p2UN%IyK#i#}E z>|U5^>q~Of#Y@MjjQ6q_w(xXIKGADMtTu7{YkgEidnveqcJ#dA4+X1njYc*WWg}5P z3_1h?^~W9>*FkHbmLOxqvXx01rQHKBP8tDu*REBJbyXa;C_<4$T&4hYFyASNW?$r{ z<5IGgt!-Hv*MP^8C~ZXQv=qHJT-*HJ&mZ}pKkEGWlMkcOZU4WoIquPsvvNsa+fT$0 zo%Eh1Yj^Z^&w27ma%J3zd3%aa^!`8GaK7|Rt@Ou!3_JQ0kL=%FaK_(dbr=2lA9Y5k zmFSm#)Ok|M`(HXl`Ja38eA1Xb9e8X|qR87S01fX4Wxn74{!cnzeX91Kj(q7a9oc{7 z??3uOkL=%BaLx_CXgp!aL&y#@V=ij-34ucXeFzc>MYB;2x6oxPYP{sUKl0eyWc*Fx-Z9xDkDI#c>~@($V{GIWzn3Uv+-?NVI;-`QrZYE6!&hJ_tI|3xC!* zkF(uB`YjfW_GkX6bM496pE>f2@%cx8;mj)&9ZJFMswy5AEYmM(_Qkb1i!1lg_!Lu1n*LV4ROfpZlcqvFIzGbS_0FzsosY zD%z*%8RsW%?1Vk~Z@@>XGQ%zt=gt|93y-j2?ZL zwy2YJosH`Im%rEf@^|!t=6^i;g&+AwfoAkmf6gfpjH0jnIp>)HCLCS=^Uk|)g70~B zf9+2?A3Ykm|N7CV_J8FEoL_s`2!7F-Uw-t-N64lVO?}20{Z^alMSu05KI#r>=_&fj zUp{s``g{NPv3Eq@^}{fczxKnVYlbmlY8@cwsy#(CpN2Ke9cqt0&aA3gkkzG?7(&%@s?uA=PU z3G^3M;xCr)mwf|1>*~9?mLGkW=d3yEIr=y76n%8VdFC-)Bz{9Y`pgDECcfAaEcWqt zuUY03K86_^FGT-g!=;uG@yxZVI^p(#!r{7xXdsyjz_V6$Lu&i_hE1i%2`9~faiuMpHJ%=jtC9tA?20tMkXx0(z_ zVMit5I2~_c*Mr8cpLyha{!DM|I`dE|5tx*MSA-3qVxX!A6$02NB57u!oH+RZJ^Ux{Hx4>S z9|l%C6aDB-r~Vc;J~(WQ9{CC9J>Sf@_tl4gH+l>A{s7@#1i1Ix`@jCDonLAFFGH5A{|j%RXtO2e)ArX`SVBKejRPV97TX~D@2nwom&RQ-*LU#tnJu= z@S`IWu=*EXa^C*#bfkM|e1GL7XZFaErRej2*7@)|<){J2nmTRxjYs+V1nrok(}n0i zuQ(sDHqBG$9cgD0>Tr|_>MnYE)hV8!>n-Sbt~3V@d%ulg^=ouPGc380x9Xgtd4Jz3 zEZ9%1Iwzh~F8=A@*wL>#59gzo|10OEV^_L)$OwmNqM%lr(O*R(aA?BtdykyqxHLLYmYbKuq%aj3 zs}TKS0Lob*aIQS^MkO7*h2tvp3f+<&w}npk#OIpARrs8fNC$+$QWRIk$566Og%{7s zVXNH0=y-QI^7=3b2%$*4)J;K>pCAtD+Y!Avov;Pju;yGjdGS-{@0!oKu;le*TVA)TN%d>s)?czYrLU(ONtEFb$cP=GE@YyfQnU#oLOfZC^`s&WacG%0^o{P?D>OJyD-yUyZcAItM;) zQG|BN4MRgVw*iHznan~0;#B-8BRVjlBjR86Jb^uaC*loAkK6&OOW0{q-zmFbP zGGO-HBNQ|&dgzOQzrcG>d>eBV74|E7{}%zp?>EzpzUPb1`!acJ^f$ifOfq|n9{Cv{ zyT|~ek)MIlA-{{R|BQ3xEspgy*6W9V`z?<3Uk=B5G9y}hg~`+Yknea$-XTvI8kM7< zME`OF0QcEfVLjp9{x81jeA~lumiO|JM~MDJpK3WL&boPte-aPYPHSP}wF8|59#{Y= z__J+i=^ciKNwm%AJ6>}xJf>M>JYHt>>T6DE|F6I1eBr2Jw$bpH;Me!yKf`|;f8jsF zf5&;_Eh_jH6+B38A9{-l{ue|AqtE=T^W=S^chOgW);Zgch(#a$IRMC86zeUDbss6# z#_#|0qh}>ybKPHSqrH|>$xEz+si3vf_BXdWZhpPsj*pIwj=(<{{`6WGaCAFx=X|f> z?EsIyyvc7q(v&x)rq_91+L^?>+t?1JpQUgpCQl*S9@{>sd=&ba6IGD~G3d4>b(I8< z#lS?M0FlatiTgNv{V<2*v@qE3_AY0$GWF@bJy|u2sC4ND~ZI-m@tw~y$V#IO_7Dh z(*yCFHbm4wV4k(EsQNv|BEukU_>f~!NoQj*GNe7IcUA{iYJgsf@jXHVc&#Jb)6n68 zu9qurW&Y~Y&B?_X7k)1+&c9Heo|$&9yaXR-+^PA6mln&{t}nUQ=Wk5UELPmfxoLPi zx3pNkvb;18FLIL=sF}kLgl=;$xic>=EY4Ia?);)#o?W<6hW4O?#mTv)@=T@ZmglB! zEKir`t`%KqgA!EVD9@IcpxDxUk@}Tt*r2KD&R=zBXBMZf!{g+Y@{RJ+OEjFT<)u07 z?ke;*=`KtzE|sU2Z%i(_3(JcO^OYGFCWkFemn%~@Cd;!k(yez=uj%aEHJ*bzPuO8-6pO7>6TSbh$J<+^VkMu5R+JpqD!!Dhv;E z@?keWJd~r*e6VxRGJ(k1uQ1pky`URz_^V!B^Y2oA&h7EDjm?0P!NP}<3!l2p^{rO5 zhIIVwCTLsU`faR(kKJ}1f68q%{D}jBKIkWqi`;NQB1J602O$6Xj(b|ll$Pk;!4f|$ z{D#ufom)+;wN*9yVoviHcaiH~^?P|;IwqnG{+^CWRGPa>%B&#CYAzNZ@ zl)zo*#<3ybh?~erHgq(9$^F%`i=Vo6cXafW2tDidKu6|NeT#AL4h*Z@#5ji(KTD;q zv}0+6m|8V?4?<@kI`ecvC)K(EoU87o@@jDtIWCgVC=7^#GuTe%i!Qi%x)v9Ewc8^=5!HtNXs#;YkB(T>=@TUjFRV6VZO+1|@SYo8 zQ~v}fjc;t1%4!_>WRNV0d(?`xg105rK;+7#)n2P#dz7DJ!W6cf>=fb^t!uY(>9%WK z$_IR*W4w6OAPP;Z)&Mt%2^zKTo}S{M^!f}pSbH_K1~f3iDz$)64uf^F8~$1>V^%&M z1RrbToJ*4-#{I*%RKPpJIlped#Zo}IJ+C$MS{GP5jl^tQ9Cx|nHI_`w9vm5tHWp2L z$ePRpi8WN=aIb74vJ+cRNRS=+jzbOUcDFrn81OFNwA{^Yc_0AgCfppTFd(Y$;nmyR zt-E6vkQi8h$Elz^#6D6*^*{~i#*wT;+jKizfo3;Xz2l))M&TKPDrO~mx-|MUtkBrA z7ccDb2*wiKpU0-~_sQhA)Q^kyhn#x`bq>{)ydI-g&(R;4;`xujKcnOPaUK7ECeb)e zM+dA5-P4r2sh zt_pyI&;Gve%^A#)ATA^7A~Yqzl*o`6m4sr@V#qeo#qd%#GS!x)Kv--WIdvU_aUw>V zY~Y$JTMW5Cq0qV=jxgUKA!{z^Nd5u|d5vEzF9}1p(dXq(Fmi`eW~gwYB_=3P`9NyI zdpAx4UIqdX+vkeJjE=pW*pBInxt&0hq|x!0Wm}%Jx9CograM?w{jS1q3@)>$+c~G& zc{Z`#FIE+y$Zj%D$FR{NhwCwIpXavQ$(Bd0mM@MaNldaE+7LK*1FWajpvRLmNzM1nYbr(hj$f~p zq`wO<_gOBTYB4uDHh%8>(-)q(_-u8}g2FRYJN7Y+Y_uY(#>JO=1DenxRd6h$pq*%H z{OOC{g#yo9_Lk?)Rou(ZJ@3v|tevB#{H(onNygR(51M{mk8ZLb*eJ~jVEP)6wcI)| zab4{SRjaPyzw5O=O&DjZ-5i>Haug54G&HT|@U%T#b=Cwngq;DDBtMl+YU7eR{U{>no;8ZcvH_lPH)*)i7C z_?vAC^J|?O&uB3Dcc4jAMlsdaGgtfJGAH{|Wv`mDy~VIe;YZK?uBlXz(Fj?4YG@sX)wj#W*SmcHCz?C^t5C3>pI?D{IoKIaf=RaI&!IhPOFB2WGRJwU?0!=}e-sN%a@vJ!yiWL&`; z9XASIfCuiDekZb7Qn*FAEv82YV*TsWO7;F@+X7v>?Wo+?$@;AV&-v zHRS9_JW)1l9&h0yxVH!HQ7SQz)Y6*6@ z@;$-yD=;=>G1k%~Q4mqXvKC|?p~NVW*r^eo{wAI|GXN6QD2D$G4^+dNX{sdWx-p~0 z044>gnKE}A-r5msDP`>#)Yu^a^1}?q?c;%Yti!|1Sz4xCnkLOU9@ujBI=vA3LQN+K z+&U&7V^3F=lam?>1CzE>W$??U+p;iYmoJ|irN-I0 z&k)nTE=C|^|6jLLsU&)h|@51LCVa}7N6IpLUf zB7Pl@i>(9jMA31pC~3?wj?G$hE}k%^a=?l9Noydx_w_j2YI%J35A0!f637P~_@)-+ zYj?1Hn0?gyY`g!2Umk422}hRL@w+wU%%NO3zvg#9*Ebz&eH`fYb8dc&7}FSM|3O0P zW0H^210b!aug@$8D(&45I!096PjkhKqbWoK;FHx9LjjO0m@+Vxm367FeL*>F9Xw{{ z;9R~`wsGZwk0wYMJ@dQIVE)Ix2+DoJt+ljLf4PP2^<%o zGRdm$-frxe5L&hARz`8vqY*)*PL=?eY$MhP)H`e=SFpOYVV$7in?u$f&8(dvi<~r! zX6Oa3om;A+`(|ti@an)3NE@fEry)HiHuCTFnyc|X*cO`Z;?qWa(AH$u`c7vTbTNNh zHNRJMb1@Z}yiT;gXSdN(Ntr{-@k1EAr;h0*uch6|WYL`}x>t(sbkV&EyGvt{!8qkJ zF}bdOsF6=9Hae+hIjQX~b|)`r%RDq}8|lv(J@$~GD%^i~_ZsEcXl#_d#xXV;8%L@q zS~@}*GP;DNc;9GFVaUs`-BUZKitef4l%?EnD={M30hY?;jC+dbvpoA9Ew7c27sOq^#AT*;pUVg{}>}=z7(r zL>nRwJRy`0O-7wInXm9*mJB2q|3?f>ekb(m8>}T$V5L)>Bqj7Z9W*hOGLH`@_3`1} z-aQ-{3fvxqcmlfdNa9>W$s?qK)#jUJ)Lkt7YdUrSq;xfZvl+C#s~o7w=xW{u<_T5_ zLCaJ~x&FU`AezXH*7RTsEDoscrN)uiZhWjGJ8a^>lG9xpLo- z!%D2*10Umn%bh!84gE}F;Ih^yE#d-Q6HUQ0Kz@zCD149Q`padg9fef%*Ln}7sFpm$ zj5_**7PV%rtmairVs23!NtCsPH@Ga!?8RSm)#eTr2ECU@tX~*wDAvb_-V=wd-&<;9 zGw2{vOylcq`Fvp7xMFvjGb9yo{h=SzVJ_!~q*PTq7$~g5Y7*s3>rgsWlpqWP^5cq9 zTpQC$F}zg-FH_*Z*$(h(b`=e-B^d@L2;n>0b<7-yCjVNgml|yPy3$97roMz%H-qMg zcbAXK>%i5w$8*Uri4G6+5L1tz%&p<>5qm~vxd=wFx(qSunyeEN74nk zuVleP&=7$rUVZaBd>+Zif|7;|XJlpD=Kpqc@IPK{2(7t<+IkYx-NG1%K}u7EGzsBY zKb(v+M|z~XwXpki(S6oB=cbRDWPD7w9CKn|Qa(P`dzfc(mIXS21cf-lbIjF>md`PU ziIT`;*jTX)R|7&TuC-GG_JfG3dxvT;Q!%%s_*GOP@>O!2MH}&z3L^o#0wlod;vXeU?8Vt7o=nqCB+TuDq4qqglb>lVdsm~ zO`AhGU!*$I$NYRdtmICvuLo_u#Leyvcv>ZKAdL#VMR&aqInr~b#4z?)GX>d9ExjOWv!Q2F_o$j_i zhUvkLIRWz_yJ9|{rH__!L!?yyEVgqAsEdfM5l|lZWXu-naKD#vWMoTs<^|oWJ;4D0|`w|QR39-#{9jE>gcLo z_wJ63U!}W%L-FL@|?zr@E=-lCUA21a}XlyT|m+_)|ZZ8{7)odWeT21ye zTWtx{XMueAux5JHFuJgRgHSov-j!+%7Qr;x0}MEAy1yV&)NS0&y*tva#`?lu@K!<5 zot;b> zXp7q1s~#P{FJjo5U69*VbpFAp&YB1HBHVh5(TKAmUSx#4(57K-FmC^iw`hoVx+n3P z2kMVBB)Ps?e{EIU@HwtEq{$LWt=LSa)OtS%mw1LYM`T~%K7n?W{s&NsVfUb;BGQX( z5qqEwU~RmTdoAeD4!U&;eEERrp?~ye)fW3e^pJF!ruDc!nn4tafGFx0CrH5Z2c$`OcIRr%@Bpf$n#~|g zc8~XyHuZFO=%&Q=;KF{YJOJ6_cL1iHdUp-XsaSn_CngY&dp}#V%{rxzY}9drdKrBx>;A zjg5FOQ)+T<2ZO0LIpn9g{$c%{41%B~eUlWm0ka9WFq4o@Sc3FnlI~7ZBXEqYDP;zKq#8x_KJ`5 zHjQtB-JZNI9(hi2&x7`9PQzD_g1X9)Gi|27Y`mMe$H~3*^ni4Yir1mt?_pXS(J{#3 zmEJG1lkju4Hb~@ZS6>{UatU^i_8@BKW_(|eXsHm4* z*apr@xT*`PfQnpN{7!Y4MHrkGm|C4SLmrmf0vw++THtYWFXwb6U~;`HrRy9Rqy*)T z1vQWZr0H0I4q}w}ZS)fS4{#rc|IeIZ7$Ej+Bev_Y2ID9tF$_8nq>%1yK<3d>W4; zeGv0L0qy2N9x4EvR~;1!84X&awQcaaj)L^wL1z^=w}QH-=rV4a{Mjy0iBZ4COT;Q(c*nAST_Sm zy7!A_keF)^Nq;si=U>YZ@(+x{mnnZHV&^H@Cq4RI`OI=H3I_4f?=l!BdWeX7eNXYe z#`l*#c)$gw*&dQ&66^|EJs^>g3Ze8~Kl(9{xR?!sEcr8QV%IX6u$Sb(LC^|`*ujv- z`rre8?uifS*~7FC0>IcoVgF=kJ&tf`NaI;+a`0%FP&l$UxTz-BX?Io*%zw#J0ob^^XWR znBcsPqKw)W=d%MHs_m_(7`x&ov&_c$Z-hx^3rQ5lJ;AIVkR#euI|#!OLOc_NJAVCb z9gCnOgF7yMbT}4g;k041F2-RNG4UkUm@H=fTrp_)y#y~mQcZ}@@@ z)}FN%5+FX^cfORoCRSdZPxY(^}8wXiMbppWd;h+B3YEy6vnhmDIDls{GcVxtdv^OzFo`(%^9540n^Bu zKD&k`E2drYpcO8vdye@E#s@oib#d6Us!w8t!;K-1ozlQ;4}ZBnjl`kQqn$qWXLn|^ z>f`I)(~l2+cI@C`56zAra&FqW(C*2#+^u32xn>@U?8wog@>84Lxk8?{;u}COkkYtB zVDWL9kBQ+sSqy@8jBSk{=q7{yfKTSzELX~&6Q+#A0}L1sYPk3l7%#`4rihdrGKPMF z>_{ljuUO1N`GMa`6d6^5-coa1R+q$bu9U=bDra2_xV*Q#cq1R`JZ`7E?Rp7bAwauY zrofjASU4Z{ISYfA1zQR23ZK`3>{{@lvx7ET;>#u1Eq6F}9^Uijl$?G$?2tZGbT={B zP8EY-z8uPcYT32g*x~q27uV5YY~OLdqp5lmRqbRJlJXr6&jp{>F~U zm&z&<;)j-4Y9Q2%cqrAVuJpNw>QrJ$a`2UAk-|FCoPt!4mD5416@)Om({9bjQ-2Uq zjuSF;?gTfhJ0!yx2c($1!j4CfW|qK8DDhhU|Md1EzmDIF>QnyQ_#rC* zIqp^A;-S0fQKL^Es@MxQ14^6zAPa z!KY`_wd^sD4PK{vFO_18madl(wKO(8y^$^&)*>pfA+dIo_(f~Ud%IeP&Takw?0pG% zTUV9vCp&ihUN^cV4e9oxHmQ`z@|L8jTeo#=B~k0xsbx1UZKi#ao@^0WPt}v`xWN;K z8P=gNCBPk)VJk!F0K-<$u#|34S{SyWz!X~6G8Fh3pfC)>Ff;!-=id7^Nw%CgO;XbD zYy9-yz2~0oo_p?gPH#tt5lwXz>UA*8CJ$ZADd$5L0Xl%!A1-8mlp2>tEx#q_ip*n! zpe5v&Q@tjJWMSDMMC@XId%j+RTX)Ft2vb~H%~C|S9N{aMy=#b^>*TaoC++ez%DRfg zvF#eFI_=UPS+2U6tH5{-NadQK#;akKeZXj4eg5_mrQ&{`5x15GOv`+^-U>Afd&>+b z77Z4vEC?9&Zohp^M8NQBgu4-6Nk5=ERbA!qVzFPQdxaqE?Wk#2YGCov3t{1Qc+j;) zaZFU1uR?Y4g&0iN*~R){gS~^Q$Q8zVb)1|yPNllI$U?Z2vERv)YiH<WoW(y0J{K6MBE!i^JvP{tWQ@w_2wm2 zZt>KxWX>&mw;6IOP*C~Kg{p~CH7hUFX4VO`(bE-n!x+yV4hF8;hmHd8T;hB9Fo9v; z$clydg@ItFbIZ@Q$F(>)dMX|!32s>Rfk?dVy)~yJR0YzQKdOU$U~CO3G zncMr@Dql7>!%WthVOE3LKQ|AA`Ks4<{+!Z{Oo|0W-eT1po2T%?8Hr$wZy{)_cvo}6 z!pGWV?HQG;X1!YO5qiODUdO>Ho~%`v!|=7jgJV-zdN&A)N-xINXf$g3^nNd|+i|bO zGcP3}Q$TWb0ldJS0}_5DtBjlDPSk*^ZGfRfY}Dc7R5q8(^52(f<}^UcnKPCXHYu;? zP5#-ckC5ZBv~TY2>e;mE(#@A#icSl-EYTq|rRPFn|JqV*v=;(m>l%+R$d~u*jb;(p z&l5xsezphzD$Bps; z#h%5WVppn(Ozp4L=e1_hc#d!EIU z5}XUsd8ACztzMtA;qIn;q7#OMo#udbu?dDT^~9kFc_zX+5)qxxU0=k^L7uY3!zQEw zyYwtSIUM09PF$76xe?bJI(M4_Q#_Fg1qY$H%u|6?!_KE6s3$)m4ER(l%ZB(=|E#VJ zw)R0=2M@z;j`JWS0}9P^gjb~Sm>>8Mr4p6E{Z*>7dvKC!oMj$!PO~7(7Yd_Pb@)X_ z19b__iTl~*JmUGL`USgPb?RNJ7;(%)BbZiMlf__qgo2=p2$R~Ru}>=+l%+Rc;z@bw zlvNF)MU@@KK8N0{b1%;QJ-9KwWsA|ZDY>~bvvJF2V`KN0ja}X8)TN#)2HA9!Tk(+V z{>Lp1!nwr<35&bH%!fe@iN>v(F+FdoOO3|L?Q<8KvlX=D>PJZ9e)ruZ5~r6VrD!(o;%+HQR3CZuEa=6Or5XE5 zMLkujI+|~aV!No6BO)##O@{H3&_JHxK3gT78*w~HFr}v^abR`Mau)2$xZK{g8MMqS z(_Md!k3urKk!+kh2Od=T?EuejWifpOCEC@~*}0_)ocv4im+dfa?u=-i`!XBx-z}R- z_MQ8%E-@)2==8MQNiEBNMax)N7F}eUx}Hp?Qt7l|(9f<~ zZR$FgillS&~z;<$#^xq(!jtX6^4O=R5Ha#!!UD>o7(dj6t zdu@P)1t1OZUg3o%x=L+`vLAV%)*N4l%^BCddY(T@3IxA}c~6cea=@Sv&V5xSZ#pTr z>Xo5<41P#9SpXqQIjBOs$*{I=orW)Y2CER&4tsAJyD5dDeQWU=6BVaNssc}V*Vdeo zpTzs{5lZJJZKpU1?Y5d#j5cQMSkvxc=iB8W>aI@EC<`sBC0)~yIJ_<^!lWI$gg5lg ziRo4aAWIE0Rwjh-Du04DRmM`!po}$K4j51W`v$vK3 zeaq7HDO5W>m(xrN6n?3FI6Td%qK01xlH~BXCCCaJfG5^pi09R_B6y6;+n~qMZw$R_ic%Vkg;#?B;DViuJL!6!B4ZPwYLZ1E|qN-P5SRUvB^yBhAXmB3g z_Zv7saH5I}oNh0f31dJSOBokAPRu=Htf@^LeVVH%~v53 z9ubB|-^k_(nr#%db_vRU<&D;i6`f|gs(EQQGY>Co8&9Wu;jK@SwByiv2R6BP%11Sq zGhYix$>(ubje5TCb!1l0q43nsJHm0b&{?C5!(UIiBWhW%=24dIP}tHReIc;U7jX_s zulG8k^Y|+Wcc-0{>hNY+vGd=uRVAu_r*kRs39NePQa@d)>`9egzELv(YPyO%whzwD7twNKqs|(V{|mg zn|@?YO?thd0B#Y{oLz%go;1F<{-nA;c#FM~bV%5};K(8Of}j>%f6I}v2niD}ZDuhZ z1Ne6N)Fe>7*Pfnk#W!Q_yO5L^dw_Cd$0FJ`S5#?Ik*yL0v2W6nX@^5eZ9TehXlk}P zs=?voqHVArJj_A(I|zSc@HZBm_l7_5dBGcb$>^wI86~vy#ZV0wFBu(n{Iq$N5vjGg zg&VBT28^gw#RGRJ0&xx*SGFl$5e7vG8u(-^z=^46l@n8qaw2`fJ>PDsOnkZRtzWz1IcavB(BnG~9rw zY`#+2QoGSG9o?oQUG-0Y(b+H-yIxt@Ld88u?f$RF7K78nO_gh|R4%NAjkTikFV`!d zmw>;~^uJ$es@(Fq*3Y)Eiymvc^58?Q=d({fvi$7I-#*s1>tf*L)BoMJ`efF2s&7zvW}63;6=6}tE?|Go@|()`J>^PiK>5a5$gZHm?o25P zdn&1X3>i1lx@teJk8q=VndU6qY8CcEFDEn zPvAFSI80nuwX(hc)wa5_f3h-heK)O~Q8{2JzhCC2?Pq~+Jn$^jW&|qV>r*-cjZ=8X z>Fhh#E9Y0XjVsN~he7Nw1FyaBIZW&W%cxmao>r8~(|eWwdS3cJ0zdk6U5a0@vU2|a zYx}~f&q2Ch(e#o}9ud07RteR$1}>rYApEmla!@ zn!y2Of3th}SuGe1Wk37vH`_L~$w=9(_gigOR-X7)+sZS2EZd^6xdYI#o@!CfZ#pX6 z)7ZNYDBBxi+{>FAXV-h0K6=j)V3*3Kmn*M+E-~t^rhEL1YH#U4FR=3Z$J#DG!6}vjW1(2pQ?l^uQ*lN-h50lO>b(PX&-L->W7{KOk=>bKQ5MMw>2Fq&wls8 z6Fl3aEMElADor2%KpmdF{js*L=NQkP98f-XYUR%o%3XoO=G-rue*F(F&TVDGdh6Nj zMUS%r>*kDa!K7eWxnVJ1kaT%^u&V3?4K5{@d2u?>;{%s ze|NreD%<|!wl}V*0;N^e>8Nb|x3>2L&ah96@Zjt<%3b|*+bf&cw|>@k4r{y{p zG<$XF*A8PU0Q8sq=buMFjRv}bJC8+_uh3KFgYAmeT%~yT2H1PMl?!WV-@5`t%I`NT zUvGZ4^{}(4^3e(9_9m}3exiwpyF0J+t*mh>3BR?NN}LK^XDV0I!+TBTheXKh3QB+j zcuP_FIX%3_Ql{AdSwJBE`gTeAM&+YrW&g6(H-)ldn+K1lrY7}buXbtYP2pR@tp7`` zkxwzy0^N3o9c(Y4po$oq-?}{%j(;2YzCgl$-vsrl+wFW(^!17y^ zGuTTmfv4i7N>3dCSrMR|eeF^JaIEz~_Tq!e$|dS??7Ih*)$YFaRNJfG`|S3uuQjvf zPqnqEWAY49i2dXD+rD`i9gf}edXU1g(!YGz9K+p-o%%-Q{DnIW7F*f2M15q>@}2hK zv8aZp>-dSS;RL@dn{b6^kGk(z#`$)ftu++F$k@zg;!1c$?N5XCKkd639QXEX6l3|b z-DP(xbRuh5&ztOjOl9bR{nK+sRc74A6CooRJhJLKhU5F_B{9_584ml-Pl4nRf_8;C zn2N{!#OpSEf4Qb-4nFgRRp-#r*0gi9HEkblO;?!PO=W{q&LHtLHlW``#yude^XOWcV$~nd45w*^^F0pexCF5u4@K|U^Cbc->e+) zbX;b>MLEaYLtk-qDeXEIERb-{tGZr#&ICg(c_J7d`FY@j|M7(t>~Ab(ucxyQb;wi2 zuAF5laZ0wQJLDX`=Z8?kY_zOAzgt#?JEGI0>pMqs! zA9)+lazso8yZr6S)pa^Kd)wQU4(hq=>u*=O=jn@?m%bx_cjYHcurfQ%{De8URZADM z)0lbHENa^^NIxaxF$=TB?8IbA3#GzZcV|~;JN(lPwYHa`M@^gBaMqYIW})8Y6a39p zdGRKiH%eCsIQ_YtMsO?)&TkYkceeO6YNWGx{wGX`5YzYtO7mDU|7H_WG2?8=^E@#eU z=?0XDR>-d;Oc|wKfmc`5hZ^1L5IE5-`zat8$SLXK0=%9yr}2|yS>7yVQ(y{8lUWNP z!hbn{hhW^z@UDrT_?@099o*0?*g}W#BrvM%B10;`*p7HYON?wA+uc7J)8Kj6=*V^P!Pua- z^#=GD(*{O%-7p&8zGF<=F)}n58%=2a!-Md4cx*Jjb$o0DUIhCSP&0@hNZp2S&|=r` z8jU3q+Q_ID-??ij4)CCX(f;AFcq|do;==<&|M$F$**F>NTmGd>2z#zrF4 zuBe6potoOnHf?8YbYKVk?B5z6ijUnu=xmFR4P$fLpuK)=SO4f(d|-U2e^lEwKDuip z5z~M;gftjW3=H+hcg6;zfCIFv#jcADk7?X4 zEx;X+(7^a;Y$qZP{78&%O^n6I#>ZmX_K}f6;&~!AdR=@VmbeVz4UHs-apQ?t1lk$v zr{)0)a4m5eK5rdQ#EF0L;j!50==iR&_{eY=1il;C1DN(h)j=uVkzt}4m^Ctb1Hwgq zkSHSB?j13BKZ?91uJt1?62QHIF?TU&5|}yWB~}}bZ6Atnj|~sRu)qic+8s~C!XUhO z0t>`>%e(ub*>R#BB?h?h$2f6M>T-lctHrlz{e#!V5r0u0^dS)!xx? z+N)0(Xq;6wJ5?}?B}_3BOciGfC9`8Hy(tL4j69ei=%5{w#y?C8 zVoG2$C6V$o*n6qT{?EO18oW814hmrAd5$T&celkV*-L7I|SymPt9UJ;isz z*h|-u;J@|qY<%rxYRFcSUp32Wu#5CPp7wsq;7k5}*x|IQ3SJqHEsjbI`le%Tl9mz~~pOgGabYN%Qd>wzYKb?#Yghc5L zS};m91z`^7|3G>HUtISYv9k!sVZ;QP6q1dhHsURQ{EG=v<;(q0s~34O$3I3>(IGq; zPR~=gaa=6t`K@rHv<-Zk9B5E6gr6f?M*K!VVVjnW=m~_Cy9m{C@Ci$VqGWPH^1jhP z(LfbX(H~4_1+)-Q$4#*vm%JCDA3LzoQ|Q6uJ49ZQ>;G{{ASe`d+wP8!(9XNu^k1D7c`7&wy1OD$70r$nAF zQ%i~a!v@{b5!t%oy^*)d;wmv-1-6~il!-UMkkwW>l`bd7Mp3qeleT=AJYul6NG-zKsH?1bG#=Hw6ifp-CMK?=I3==i}5 z^vWpL;ZSgDmK40SuN1Vw*=X8t@-`eQjU%ZcZvh5(7~tz`GiEWDUNavMeuv7_pX!#) zOqHU$fJ(eOy%uI~bazEa`KCOEUImK&OPLJyKmd7EghSf!Ai);7luuoiG&anAVFOIdh^z7MTxB z+Q{GxN|f|7nu`F~h0}6jBW2mcms~9~FPM-QnJ{T|@tIjpv6D)gzV@NXkJ^KTu)|Z_ zXLFo6@t*vnJ`G%3$`CG#qvz8neI2?lT^+0xZuhzY3v$kIA>g?Va(WJZ4OXkc@ zW+=u0VITQB%h8$Y5dh;zWQ0kgd*x{4T*fqOVcflpSK9YtPwWOxiMN|*d>ZT1n$9qi{^MLkSHNeh!HP$%$LxqAz$Q`^)^U)pPL8#cCB{e-=3+`r-8Nn_s42@80fS-?gG zdz8%Jq8!S_S-_0&`+~yp3r7>s=R?7E*CN(YGmgW?z7pC4VIK4NlbWC|Oj972?ZX}Q z5^#=6@U+(m2-VOwvc<9?Cq2TTXer$?$ZY1p8sZTmxnsk(xb$f~o70nAeLQe=1|ye?WpyF zUIbC$6YXSSRgRZlLVVoIFT!A_>_um4c-+F?BC+{IwzdVaR5d8b8AA556{+Jj5RJ7=)@mN)b5z_f@Xe7>YZLr=CO&v@x2TCPML z;)57(++NusJu$dZiUQjJ@|2;I66q9-OxJRzS)lmo7)YI_!@7ml0nOqp?gj!`*evqN z9`o{A5>#z3zQgY#XdQtv^dg57q9PHYaS_xMa>8vX)|p#lpRYDf^6RZ-1JLS~y%_p0 zut|1Ry9?XJvm!_&Rg1BvsO`!zT?U?e6no;!L`*vqtJc7g^lUI|oY#<;j>NCV_JUb5GdZgB0SO(4po zYZm#2vef!aHlMX7afe?~ZU$QzA_T+sNP&j6%BTY!YluxmI@xBTWxX)LK$~rvMUWCQ z&{B!q=DDVAb{l31G~=91$51HTP?PN_mZ5ubErlM>MRT!LWqsVnnEI}58IgV0lDgW~ z4)@&6iEOIzZX)&G+e>WyC);Cb#;xV-w4O7_ul2hL68r!`b}#z-8_76>sjrzDN=n5z ze>}69^+dC4=fO8jQx&-qKWa>w(?&cEDu_Pu0_!l2pDT=fExaVis%aMQ1N-fWZ4O?% zN{uO0ecu4zlKR~o(Hw7t?}!R`{kdGo&bDH29YqlEoU@mKa9kTkgJvq8_HI#C?@qaS zXLAlistUVadlRE^=J}j6uQTS=$VR*`1G|ckyIpg(dbuqDkuO4d)i4Dp4cWFWXZRY8 zr^Am!vxS0MU?QF8X5$)&|@VmeKwPlJB)y+)Wj zjpW7YB{`Bf6L7o)g|O@ie<7D8*C&}XQ+q|gU2uj7G8$z=2MN$e(F#vnLX&XNSOa(L z(PHvled!_t66lo*qQyso3D|UR+PpXEEGUp;sfq1NVP9}X0J|a|4?%fokT5-Tp=Snj zJKP5(hts#z5UrzhZZ3xSv=&HmHaT5N>1Y%QFj>Z=Ahvkc7J5+%G(x!u1k~4}f#P#Z zYQUcAU>>Wz?sfU7BhWrx)-F1p&+)=s_`X$knp)&bau2Z{vADGFF@5_z+rLrX>mB`y zqZVPT=sK+&VVRLzOb)eMdvSl&-*@McZjC`}A=%cG4zL4{lh>08I>QTtOXbG%_Jf-LDNR{w(%e5gqtCwg9FI=8E z1U;xLRaLmY3k#Mg_YA6sDp$!O^oJ>Mc5V5(kI~c@vp7{l39IUh8{tWbFGk!h9Ojj} zt6UB2>kEGY?49EaLJy9%61e%1Dme$74qX}CeCpE(W<7=2Zj|t>6!1U+Ejz0;O02vR7}SGMe8jhh!()-vo9A8%lu|@`|XLiYc*0(8d}GzI+L9G`-=1IDLUJTt`&l89=$ji zENOXww-Y72T$3fg21vZ*vYBTGsCon4C2zpo7P)=kZH?cL^~JWWsu3NeXt$Cpa&6PC zD&FPFgix89J#aDl(wJ6Msl+@>O9WNmXHP6hDwHA_{?3JuPA4afByScsl-G}kEa6p~ z0}^sFI&Nde!G-;@poK)2rd@xtjVS^aOpts&f?FWzKWgur9;U zlLhs+o!QMBYjptrxzFhZ`~>Pk3XEq^tMI~?Ix57Zv9F!ZP#ZG(Y&|TY3L-g`-sHB} z{$UJCiFRG5Xsep%dl39^ZJp+v>d>ll3b#g+PDwd%@*T}w*_y-^f&8o{k0r}aEXQxR zmV10zzWyB1@QkWON{?WYdTQ@P5w}yF%}iQd<|}=CGnA%`4z0(_#%mq#MJ(ygZ<_gO zttvH?7Mrg^y3aewWeo7*xQWK2;&|D+vtIAzP4eT3H0N^Fvp>^;bJ0QY`Nq!P&OIWP z4ZW1a^OJvJ+X&RaR35>X_=t1qYkUTUzmB4w*z9nBkt?>g-LO|=`MN`$d8t@;ko%7w zou79}#z&#dD8^YLy8-ffKjnz2(KM1myCYC-ZQ9j!=$Zp+oM=LY;0fN6U!ry-F}?c#aN+4|s~k$heJ}!l&T~!uM#RJVoofZdcM} zv%LAb-1bc)zyLyZk100($Ve+1Cr!2e4++9WV2nCw9LE2B*BG-QH+8{$P!22oNxb)x z(qR^!qy4*VzP(U1CyKbkNxbKofxrRwY*f%PCm9jiDlI#wrTKYpeu|ll1lE%Yn&7*% zIYQuIjQG?C#gVRd4!EW^HkshWctKz)Dd}MFxpV_A1_9#Q?diH}s*H?StD_>kdAYTU z7y&^h?^U9G|MKFT>hl}SqD5yjgT#B>P{g$mTU^xbxLhpn;xoAwV!}WTdbY2*o0u<8 zC22womPrdln&7=XSWz8aA4R!mre2>d@X+f-pI%luz zsT?<`u8S!!C{i4zTIYTnox|2Pz(RfHsU6$6;%F&TBi9~s>snVaeso5hAp~?AuiW%G zU|nWTTyEMRGalr_;@%gzxxFqY)D|>v+&iLguwiSLYfgRJ-ira7)HdzZi;#{*qfxJA zr~H50@YGj?dw0%AF9xM4VFqdLMKEe0WeghQ~diTZmO7&-H#ypTs#AjwCc&oo9hU-mTnU>w1REVOqHU+b<&SO^OLIPjIc_`WI|#(&R#}ySnfR3lcjx@NKexeo5kk^Nyi8| zXLxDI_gpoQ{n*pX7crH?y7p|&Kb6z8{*tsMUK_;^;PP#F?KY!m@+p1w)jQ}rv5{>{ zK40Q@2I?6re)(bXb0x9v*5F)89?;aKNk+GU%dVWsZ~^3aS9Trh@Q5FMie&vMmF@0G z#ji3sz6lm^2Doh}5BDiGrDjCWBb1CdT8(35o@QIVo@r0Ovf=tYg8DNa!o`L-IogX} z)CkrJ9cmUMcM{jU1hj?w>zvzZp4VS?YH4nN*{=(HO+tDzeDzcs4$o35T1fX=EEq<< z2%Gm=%(_dQ+dZd#)`}CA1jMT&+^k@*!5XW)jw9G75a4h4vwx4NCL-I6QfktTNuB0h zX9IaS6uI5$_xzkgi1RF%MzsCGe9+y-ocErbJ@ta}=sP;r-=4{!x;e&nA@d8f|61xN zO|ETa@!&r0mf8C(QOSGUk@H3p*`M!qQ&3Mxwb-6OAmyA_1)#6G_IFYgJAR^$JoqM4 zUaWo@76rFJ!#HhXWOy*9G_MegqePNXnlX$#(ZeU-)qXq9s|74MwYH)%xJfj@KSilw zqD{^Pyr-pbV2}sm6k*gXr!GI>X=7oxgSpg0q8t^dp>v9@+D^T?8kcnxE$`Pa#py2| zHS@^OF~Klh@Jye)!tk01VK?TS0b`WR6kQ}N7GY|A;dGF?t$U+1{kFg_-x8>N=uTzw z!sqRD(SawRE9*b6tT=;>KCWD?@YyP85_|9C%Keo;JgIam>>H0LD^In*(6$RZ@Ev6n zd)>E{5tV;Hq}gx2tz62kd0aV(ee^p@a83akJ z!4bUtlw~-eSAOv!CDuZZ3?5(1KJ+PN8T;#hQZB4K@hRoQfeJj{e(JME3)}EpWmOg4 zrvw7A%I2q)11F`w9eCMWmk9r2%juebr-8lZF{P*Sm48+WCm#jke!X5r^=rN5|w9usyw8m{}}koMbrG+la?XDl{KGL{na!tY z%ek6;ipLuaqAvgLg2(27#$NMrCCqNWR|(08!LbKEs+?8%_s=Qo1IIUm zzgm;Q3>f?Z_WO%lPpy3LZsjL|23XB5{=IVU36=s&-@ELcOTp5wGzWBc-#yCe4eo=m zJmQ!81}&d2@~~K1C`iAv%DOg>N{}AbJ*510v2whFU{vmZLUTr_M1V>E(e| z?wqmzd008;48PRp!j&zbSN`&NmHVrfRZhtLIVX4R;8}mGp6OcY4CaG)u3`aYczD^D zj&)^tu<2}hjmQ-xs#k08Vz+-nxs6?PAMj!c)P;e%{BA{!SP5NoEb*Xn*9k?MPmzAN z>|66H5?i&u`K-zp?^eF((WY}x^=92;kH1g3_*qph_L(;I>?5E_EUc(2js?ZJMP;9U zplv1l{5O@;+4gTKr|=!Is=TfCvcGfRAY9r1E#g=6U zcVKD#K4a{C)|$^Vg;3`O z3O-&NN^6c4g<3s`>(sx0jqNkY3c!!Ic7LxQqYZt17?_xXW|`*BGq#;8=Kv6tYgVZ# zE6!t_qr6SIweI1l29&$iAg7`cY?F9Pr?w7v)SBP1i|mp<=Q~F&v5B8%SjSjTyEVUV zIdc@=N%Nnq@5|2ICA5Iu?UjPr)2Yq@U@On5R@zs|$N4Msdf?a}I}kP%D(iSCsVX)evin2=a@3QmS-8C}F&AK;9ghnXSyKRYXr4Gzyp*XmaJ zODaA?W;iuo;2!G*2j!l^lb^T0GB1qf24Pg#ymhSK0%-^w%U^uQw_etILQ*zo$AZJh zqmn zyS-HJU+ELq9(I6QjOGgHj5{TFU7v_!CAdmsxM0UdL2uNU=jYa#c4yxLWkDmSvrtTsI`P9^VFiK_Sv-e@6S)C`-2>~=_U)(h< zt@@$GA#cZUWVYp;39kqfTH)3F>V>d7I`9s23|zKY)#A;Syf3WA=|kyNU757=;(XlK z6U_tL^Tq4&LolhUQCfODI)~m?vEjok@u$|~&z(oCzXA%pNX@)AO^j5{f=BG=0hlb$ z$iC+=L9)wPe6Bg##7(OUq&+D$7yj;YU+ZJ{E7OFEU#?|ue6UuQH=;E@%^r{6&3rd= zsGV=2PnJ&~uzu@X1QTzJDu|gU;vw5nSFdgHh-_&8<07{;o9Al_fSRNteL-K8<>TlH9$8JlL>GJ9p%XExL_22H@bI6i)U(dAXJMz1q zW862#kJkVKzFBxVrvS5V+>Q@(rvQXA$k}3qGbpQDMyJ5VmuFFVu36M*Ie9m&bKbM( zz$D>$m~v?adtAb*Rj+V<`xX>FY3~5x?G@G4yO=S4SxTOfFa(DK-Vs`@ZI)?;KY)~W z2Pt6x+7YVvuBaZD_~j$N<6GZ$R!D(_lUbYbg>q7&csJyPm!|5;4(vnX zeU906S!k>M1?6{c;MD$XtO|sYhoMi^=n29Llu{XW@2w3 zqcHCYO{8XZ=;0PYNn6ZKMR;iYuj3e1i2kUX*8K8%S-kEP>;V4`$LbEQR0ouEr$Uh6 zEPSKRNII#YykkqeLB=k{8!ze-p1~Y(7t%2Wkaz17Hvj&XKL~a2 z9MH9d^`5uEG^G(IGm0PpPyknH|-OfSVY$ghs~h%w;q^pmgJ(0M8Zr0H&ug7J7tB4KaNqMn)$ zqOaU{_?;ez>}$CLjfmDO`(YBSRy3eufI@nTy$0ERwJe{=)B-Ky!m2K7gfj`aGu`c_ zyc)S=qNSfibuvoWkUQuO-qZTAE%-F!5iEtF#yxE>C7NnX9Vz|LZhZbA4P*Du<(Kx02ap zLZow?@+G6_m)YDXUodS{_Aq1S3b((I28g+{Uc1=d8hwPK|4e>f4o z2z8c><%ovR^+fbtObF%(Z28lG|G`8Q5k`I%rO;swQo~8+xS%8|$}zO-|14h0%-b2E z_7kZ&XrNpsXL9)8r+5#Ogp?A=4FHNt9&K+^2o)Tqb{!qqbzPZteg(oU-YdN z);++zA}zp4fwovtcH7Lwmsr?1kx>+lU%SF?ynGxu+dKjsV2u8s(52V|h=sQOoaS}s zu2DlM&^E>@5!V~+Xi#o5J?7sx>U_ze=C`|kdAGeUH&3CEO#h1$5tq8Y_pV@#AJ^^#h>5ASEybBB53ynBPzlRB;A*d`e%zrY%m)r zk?B_UKZm>?*{dIM)HXhb)p9`6-$OKjN*7~GTbx6ks5kt~wLK2$12zWCZ2s!aOq+8| zC{{h&Tv=UR40<(Cn)Q+P_KP6RjbF0oFe}Nsk+2SVmKytJ*g~|0hbS?fA0_gU#?e28 z<0V9&));do*wNv^M(5=8$EKx1v0A}WdU2N%t7T9s--{KcMdEwL+HU^|!R!uwCqs}m zCAAjo$_~%)frme($jhM1A)5l^d*^WV0bRJKP&+8dY8xuHPT7nzT#_6AQbHi4RV|3Q z8?s|vx?6R%I4pd}GrLjDt36SddtLXY z+0)T=c_`{(3$=V~p2Ry_+RmYA#>D#U;_7UH7sw0b)b)^}a33uiRhdpcFy*(gmV2}w z;BjQIweRa;z!evsqbn;_66l+mZC!);N0HHK?w793m1lyqxn(sBs{aaSz<$GE0d@Dv za4npbVjQu*ab<@a%NqwrT{9dgYOIT?hl>~(PDMf6#!j}GD>p$sCO=yvIi^2aN50X< zyKuoo&at~#L+u<&ecbceC+NC7lgjGlY&trF=i#Ep6P@NU!@rCxnL=Wn#$sjv*EE@5 z7foY%$?tTVZ6{iy)iE*r(+OU)i5^T4@2VDvTO?%~$# z1NGF*RVnYTSxE~cfWe#boh?nK(~%z(Q2D-`fPWR9P#nX0Nj#@R0ZXO=YT zEnZfp1Y#Q*9qiFIto`FeoJXDIDTxP$NpKt(fuza%4E6Xyhk%*r2=AGZ^X0ZSOdBo! zi|$evPli8~Kmd31NNh;Gve*ULHYFuIDicvPltah1EyU-oDc`$I$*#`T0R zJM@MpcY$xs#*0LL*9 z&DB~iI=x^E4_Bf{svA%C$R-^1SBFOu0fVJ=4KLnZ9K=0fb_j$*M&L?(&^=gWy;-U^ zgacZFlDX*Efuyc(-&YCc>ICdpY4&e=ho9%jQMQA)O|7jIY8}P(r%qFgx|2tLLr_Cl z41w$Omu#u9Y#eFcyTo%Gg_x9<_sVn?Pa`9K_eQmxoJpLpEf`fw?jCWaPR@*TT!fRW z*OL)xVR&mlo_|i$0f7}!XT^ilG@P~zoOV|mt$$>uhg9ZP8p}|v$C71~Jy;UX&Mt!U zL-;F1lg7grV_u8np;3GKKR}C_xJZKCyY4`F4|7?!K~Q6doKkuxemr5h5j71$Dd~8D zJfd6trna*l@(TDc9ec-S6)($&|)`n)jL{& zdHM>0XmTFy@F|seQO8|Nf7t4BfPwR8F5Z7OFu%&JiKjxR+S!?>U3Re0uja}Y{3Q)V z*^ogK%spr+jN7#?m=`Tb#_5rQM7^#T_c%Y50XL|0mN4@?5-UT!`Z(^QZW zn?rhiFZMEXSQwWY%N;vnzjan$6z4d{opoETY_eza(a8Tb7};j0tIXlO1&}|McP| z-cz3CS9%%GzmqXpKa;R*wDH7oy|Ml^&BkTQbMpNX=)*%%zUt2u1>mLz7mpLb0o%`W zPp+YdYn@2}JFN|tUN-hy-uOjhYM0%u=X>0*y}}cA(g+PvSK@0s2H8mN!H8O@TllomrV5O<6UyXkv9AR%38dPGWLo*8az zEuQY+;S%tnWdc+1%#?Q8x$L;Ln^x)%ek#{AWckf2D_Savs?H|onf@=Vf;=ls#>>AL?Q1q z4(jX4^0Fw@Uo_TSHmEofkD)KyY*dC;)V5?uP<8y{p3D_#mH^wXDgr=4WLB1GMy@gu zx2!Gk1l8KtGA9{*!-Z!sk2p%(ll{j^e5mU%@nqu@f8U(hEm%xp^m*+s{5g_zhUm=x zm9?3829$(nj5@;A!Z@7Z&)b$*n|-cu{57NFu^cMLS3|olTx_;V0M1lgs(?R%1qK=!k4Gh>sVWOl>cx$*kSc5Kx?4rDEQ=dH}5I3 zVXtTKY~?v#>>y?6HA~oZw0v9W9tQ|u0`ywi9fktmmXC`8?Y`eH4?_8O@7`zI6{o$= z2NmLSQeyyhWHncy~bEbCw2lmnc3WS2y;DTE^e;_wO$x z953(Opu~oHkC=3G{)eHG>+)?kOx!swfM;5l%4HY#O*6Sgs&Ky`*UJKV1p-En!fLq` zJA|gG3V2{jB{twKgnm%=Gc81k!rV9 zl%cN*nAT}YEZ%=I^Z0(CI8XNSN~GwGjO(Lu{%Nq^RV@33*>xGm%hDx zc$xMbcb`7t$=qauEHk)feMUzgH@pWwc3{IaJV%ySte)2Zv_!J^01FITTSnTN+-?PL zcl)~W-|LNm@y3XqBAvC&ir!6O!&#CYAXsyr0hTv8u3NcX+mE0{qf;J5YnLM-5PD_V zeP0(z|GdiZpd0fa*`1U>Y74<$6!l@Nirk93_DP$x$F>7wZxFv5cfon3Z8MdQ<#^5mDe&3@?M~2g_u+mo5sm7u>&DV*i=i{yuz`?6ztMc$ z2D{*N`?XN?xqbu`UhB5v&n}wCe#&U?;IC+FCl+AaY&|HU`|F?KG0BJcfaz-UtLa&bQ5Zv9@_UagoX zxbP8jF3@q&Qgu;>+;p9a>T!5&r!r1i*qV!`x7L>|9-dOmd2*&v0uV#j7ZZEETxTo|s)@ID|vb9m~{Sde{G zIleU|d5Ao#=(_OHiK^W`IV&<#*&a0hlzQwanrU%VCoj_V3O^pAde@P@JER*5^@o{*|yHnc@37nl{Zd4q|T@u{xWFT#7VL z&SriacqQaSLAEIrQZ#v{%oSz4%#di@?9`mrevwv9qBOtRcLNo*)>nt*`GGV$_CVsF z64}o#O#%v=6sat9G}D+(Ia$d}I@P|jL`|0}XGW~uD-dVg+t_>EEByM}?UXt#{ zHb8n3fa!v>rrJzVA-JwLDdHa>-JO3rtG4tm_Xs3@{nMCN@K&q~zpJ^A2{78-}JHfjfrB$R)}>NZPv$?-9j9qR-s-LTpntaQ1SU*F`{C-8fh zcvQpY2&M9Sl(e@&ikrT%PYP=IfKcE&F)%P94#gqwn5`@AY2#*D_RATDnj2B`3JW8l z^Qf{!G^l`~bC}4he~6@#-WWnoG94N{)3B_Kp=4> z^$#gLflVdU$=IJxcxraN{-lRWM&!&+0Cp0c2npjn)3V7odKW^l(?SL1m6Qu{NdHIV zGMx_Q2aja9&NHs%LnYJk4u2~&Bt)l6NI*tv6ocWMF+;N2{8>xK>5QiBZ-)NFQGQzpTlWh}uZt6fOD95oGj7tN2VLUA2Rba|J?MWg=hLzxp1Kvqe$$sYK z8vo*ZXd#Ph#MM!;a&B#K7r6SJEDbSA@T$$CPY}jTZ?aw+y*knJD)q!0~`e=_9v4S%*-syQti ziMsNGJdz!^Y??A;ahgWwdbES*7($|M>0{|xpUk&swRR%3b^H`>LZ>+wUQ_OK-T4C5>mrLz0QHK>#q z$_rI}f}oC_^|o;f8XpTHv;h$gY!MIS2oH?GV?ED=uF^0aV2G}71Cr-XnsSbQ&;q?H zF9cN7T$asDo_Fi&fu6b}A-!W)+3v)Q@k#swYEO7Hw4P@T^~X2rtI9b^{2{|**>9B> z8gR6#jnTxK{>ysrO=(ktkQ_r>E4} z0gz`-(|{778vcpe8(&hpCC3jKHoc-No+OW>iUs9{_)vTPk|OirEh>!H7m)gq6p>y~ z{9hb?w-dN!@f=o(`oH@<^xx^(4)YjtGn)Bhr_Adz33ohA@;=21VhbjQSCue6o^=h} zj{9hoS`=n&H5$!&^Z7fd;0F^;F=r-?DNzzUkP!*NxJ&63%nAHlmr+_PkAy+I;9-g1 z*|9(-=(Qo-W_D8q_ZZG53v@S|7G%^awzXYD^c=M(A19Wz{ql>e2LbajETx;zUuf)Sg4Z;Y)op0i4Q+u(D4KCTdFjABZe`JoS!p&g}QZ)a)^X5Zw-?9 zX2D}y`P0Y1uAh-1hrsF74Q%|m9=J44kTtFgH(rp7x0)Co9aAKGHs4A`%EI%5yT#1l zErFx5^kjtUr=Ms}46bePJ#%NqkW^kkac0hlQdGXNvLC2Drxz-Aqi5?YR+Bw~;!?6u-zLr`JIZI<&2`uOg)a3O zf)%Z3k1z=$Rgv9m0*d# z%yu54-t_05Dw8F8a}RT@D>YppKM6e>E6spc06p~-BFG=!u2D9R<<^z8r5B$$0Ls{l zhPO+cZ)XM1Ao5^F};QjeG#8;SWnMrvDs2M)|+UlvE;nngoSxHIn+4Ucy*bc!5_)3di*J!xUq)R`XKKE;AevP9Gi$xTlQ;?{;?(CIouF9 zQQp#*Ms_cW9?ObEg<^y3$O~DE7p{n#L=%9^jzq4)VgOEfEsh!yfv z5;d-kT9!)kuucRO0|Mx+=LbV&*6Hj0OPdvE&d@fOnd{&PZ_MIHs;2>d!wdJt6u+yo z7+2wJ7v}~q*dVimXDxxyRNt@1ngB?TtCMXch3i_izooif&g(t++pWbK0WkpWExx|4 z5Bqb9rzxv7mwLT@!OvedDRaZ!SeEO9Uo*>m6V+|`?!2t7ebXg1<^<4zEA9X`y&heA z6GvXp#iYq!7q_$-H3oih%?8ca4?b(jE9YOktTD=Qv;7#sYJ>;KAJTKw#)eESY zW?LRN*KzC%GXRI4M?FS3A|hNA;!sFS#l=BfGidb7G1#{~%Xshj}I zRDSPxmOhT0%0@ga7D|d64}4vQG^+5(KCbQa9F7KyI_^ja`v^9(zU@_i%I{jWA!pzI z`UgV{iUSa{UVIi_zG*!ffUNK_Y6S z=1cR69Pg(~mryfB@MUA7Q@_vJh!OsI3pwuz@8)yk=;U*wcdvk6Z4KHiPqSyDi3F-$ zILvE;Nb@ewF$e*{4-P}-9&y)-$J9*_3UD3srWA-E%-jqSKR+glDasBKvrBrqe@^z9 zr&IsZjuhpotxx8VhSWt9fixDz!?1@-uZNQdr(nn-JH3lYJ9subsUEi`&X{x5eEn-8 zy5lJw@`i#OXr2TMG4J0;j>;W|dvXXC3W_7nroy8Kt%7b|7mNm0oIe~kA;vk4mf89www53YF`%*fOT#P1DPTk6h&7_FFWEAz&X8s@<9b)NkjdzqX38ay0xjP25c@-drt9UJZQ z&bI=;k8>X!Ek-Y@lrkTT=1kvSXiQ|&JB$o8RH6JPj;R(+)Orb2+{^rV811~phx#(9 zbk^TaSO!4$K2H3>IC2m)*Sz}+^1@SO(}^vttMgT-Vx?dc^pYz>x?b?he)UW_X=g4h z44%Iz+i~IWHZJ*_$M*0~uLT*rsEL7J<}iVW@;S?pz-IX*WjaPz%d!Y3KgEv}6i zaAU6ea%SWby5-%e{y`XegjK#2lK?DM86S|`v++>4*5t;7S>@7epYsKEE`&o)_4%1# zdD5t9o{5?c1#-3}0`lQhcx|;P$%$F&HfzxpJb!Kbb}?Gn-RgCyLH2H@3cCXI1q&(- z*?eVlY84d76WDfNP8`2qPNQ6mxLn4pa}}(resWCXe?fg@!=2;yA>he@m~l*X);mA- ziC!HnUwwEhmXI@Lbi;&mPWeU~%hZQ88^=xWavNCb^NzSr!4L5o^|Jl!6IPDyO{I3S zacDN4A=h)Sl82jT$%Ns*b?<&roQe3`^K%*>0#?2fwtW_`j)PpAGgDJ;Yk5TX4-nC%aCGHYN2$++>iC7k;`(tC9dq#jm& zY4km~EtA`*P~z1Yd))Ui76E+EyDj(k%V5g2@gGfUuq$P_JQvtlx;Y*T1}jBKdTAar z|I9OXA;L@X6U=6PY^U>J9IE8|bmpkheip-3dYjNvO}=tfo)dD4zKkEQ=(Y#iYrkZ& zRVZu_Oj)tRhSb~$VTyNU6-3{_ROU1)V&~1+y=-n5)w1e`9P0mAC>(_dJ+i!{<1i%6 zQ?d8LUVyu;YGc0?&(-It8>0fUZt9DzDKq5L2J_=+4o&l*s|80y^LBZtXu{6j9BfUK7v$+h);#X5nat?{NYnm4C!s7=U`o z3I#k|%eq;&W>s%2+H{kxVa6V-K-h4N&@NmWcZn*K7zbD4Nq`F9lTnT8vY{ugPE8Vx z(UD<`j_aO(>R`zCLWW7~MNl|&ygvwDY9YPj8jla@{>}A`*;nf5S_)GUyS6-)E;0XgO&t zQzpd(FUEUGWs#wqPurkCcwX#OON8LjxwxVT{TC%lD`3@->bIEb!-nn$Ib(mZyV(`` zGqu$Xq|6vn=px*06ZN$$32Zs{zpH_FWOyLUi)c@<^)BLkJNbkamEwWBug}p{#h9D? zDfL4D(S(`aj14EJKx;e=?#hE3?N0&@elW$a^IRf@AEe|TTCxdTdhmi}pl8#2_$raM zgBVP4q-eFgEg1$Ze=<9-^qS#n(Ra*mijYM#_u!n;)D}hu!dn$UZ@Gbp&-DB%$Qm5K z&-Bt2klp+MSp(RXxO!vc=crJ6{+>?2|)V94YUFh zL!}AJR@+*~uf%rSTgR_Iy+41G;;f%^iNAf1$%f|83t=cN*NHlGsAQ{C?`c&$Pm1a-HhfApvQeQzVIM;&dc94I z;estatt;oN{N5GA)CN&qV*egy?rchj8{(@he$KJ&`5WUo6^Rj3~D4x>Q&_EaefP{st@k zlhz&b+4Q?~(gdNoPF<*w6KV=JlFgT`oAAnRoj-C)o5Pd%V)})k`F!H}_9`6+X4H70Qf5Kp7uS>b41p4}ul3puC_1TPC z!vmhLtVc2+Waaz#{vfOW7G561W{;h5*W1A`$&0S7ofJWo{w;g*RjoUh6?k#OAsRe0 zyZH8miyoPb#Dewg3=`VF70u+)2LI=k@oMTXc`gW`FB(Vs1dc%4&d-tLn#&NkTIumD zZ%l8Rcvw&Q0|Oi`=_t5oYL%{S%Od1ok-FU@5R^fWBypJ!cibyfe8N~2Ym80+P`%GL z;y)KKviwNop90kc{}KgD8n~S85BRZ(5VTo-v05FAI|tX+fmi3%12N>+4)-&q+$wzA z=9eST+hr&I(~E4#b#_zXAO1hDf%T(xY3%HYmJ`HjCFt6JS&TFt7O+12XKp>zkHyM{ zvkmWcg>u3hKSUX4o(2+V-PkYNB5~BXFFqH>>kp+)ahJ-+VRy9N;&==)LE>&p<(Oy6 zal?*%Dmm}QXhy~B1pBMU>^aDd5?VY!rRR|!)biv_zyK0|N@-Zm#SipqsTBZwMW5yE z@Y>1%KjQSNQ^Raj-b2aEWst?Ro>#Tw1v$LG;s7;0aC(iFI;c=AGlQSJy%Y8DmHT={ zy5Z%jdcS#f1Pol2+zZ4L2-9=(n=)Z~XVd117^^6D_(Qp(EAF{uf{RqbPM0x2TS&@= z5qcF9XEsu60SG-MrCz9yQ)PDC;v%hmG+URfdNB*-5MPiLa4?ImSof zY3>h_4)WRSmo@RW#LC?(le1TkF7a4B*k*ryIx}R{wD^HRQYB>AVJyz$a;@GQg$+%RyP=lkzFF+dZbPicy;oxt-FRGEBhQk!1;7x)~Wqa z8tgLc;Gymk5;=?e=%1S3(W#QwWpK|t4cI&JT03NgIxW~ zj37=meExv}B4ud!y8&R0msfc8lw6z0y8-;Ug8c`cJ-_%E`?+t-9TgfpviwPjo{3-h zYKN;%WZbZ_H$l*6Vb@gF&?6)bn1~vNTrvD4jqUH!4po3 zhlpe1t@9oz)mK1VU}8D-oRYILNgaI#p!P900QjOE{KA~WH}~@;P%q)EaAwxKSE=b1^GC`5^cg;t_0^I zg-jMhvPG?fm=|KSIk6FP_1cKH|88I>xR9gGU*Apeu+cda*G+3;mtxVO1G_Onb%i}4 zQ@rnU^MJV<@lu&mOm5G`gRO9ThuFiaULt+wSP#upN6^B7=HrTvM(swn?*UV9*m(%07CnTw1Qm0{aM)3c-HA zO+QoMXkstO2xCKtjgO5D>#9DeGA!p^gB&DZ&a))g-pN=34n+a$!4q!aR6_AvbyJ|8 zUI0zzVe?-$U>npFaPuRV$%o|I57z9#-fEQ!_aiQZCw`g_8}8en_z8#n7VfHJkdQKb z)hSr8!h<2i2kf2$PolNtiH_&2C%+_`Xpqne%>W=E{Qvj|DDt6>KDJ? zjsT7*iPZBOQILdMiG;d-1%+udAbSYzr~l4ha7z%lp1K=SQ>rjz0A{(5+PL%qB)@Ztk6r?RSPd28SnNXPcKs^Q!%=9z0%=knH! ze*JFi+Owv-!V?myOhJRWZbtcWtK#_zc-{5hU8UOqZOs)W0B-XN{+EbwpyC3Kh5Tsu zPpn%eqpcg^OAq#en*W+*VE3&zED58VY;C6*TZVWKUQrV{mt4P zt@y;131l#sJWp(Pe5#x;925Zmx;;yry4cms!ULnixbjfvgKVwe__3BJKv(frKsxh| zR%z;&?v@Zo>0M4pr9+n?2tt~7*fu|Nr`>E)K71ni82iDmx&3Sgw4*Qzs^UF!{T|+g z{&;)m6m)albp)PK`o?_m9TwTM1#L!-j(T1(bX*fa^@5(-5p)A@&Vgs!-RBLiyF}BO zPD}$Ck+V1i%9osW_2&UMT8NsP8m2e5z2fTE)l&pgS+xfx*Ys}g+tNE)-;1K(r7V)$ zn6_VAn?W>{*Lw2{(HDa~fWJC-MV_#fA--g7=UsiDqifzl&m&kRKG8!f-FBC>SO*_w zA&7SbW=La=JYKDc-y=7>@dej39cG9LsMaqhS%1SuUxBdORv~MgG{ao4{Xp2kgU)BP zE`{#9=dI{Jgp%2vCH4(pP{6OigXZqvD5Cvw942i=UC*8iMcq{eU+i%a|;5%Hu1>jNej||BpeRJDcau+gDGOn7K{sStW7DthsdiF^&pF zv%{G;12XNK$}{x&2W#^3D##`)Y(iG$M-aFE(Uu!QJVaF`texolr#%8m(fk?iZWQ{x zoM;gVw~|QwoVxyd3iX;6HO`i1PQM5DxNij;1ipB(H#vgAl9J-$oLLXEqLqx9niS^5 z{UVM}hQ*FB<^1klKOo*ZQD!CIFSAJXoW+!LVrI>zGk2x>e%9^=k^J|hiV1pRGYCU5 z?=btHYy?Uyv4z%C}3-Cxe z>J)gJ_o`Y`v=2^)78~jt-jaeSHPhpXo0OGOg--=ZcI9`yjtiqjAZP)qQZAaEMDlCS zm8gxA3liIU?+3aanSLons%SCA5V^x!IgC;ThLJ2R-x}j$xg&GZE?LC1h?j8q9XzPK z2Yji@+;uA|2cnK%Od@W=qZY}X3^|p7zu6^<5x|BBIh zYEhVnEQ#k>GS#)^A}f&%n~a!t#4;R?P8+siGjG4aneFV2up)d0dt@ObF(PN$2J>u` zFpo3o3E0KfSG#By;HD&o6-?z?Png{7tPmc&T%#!Qnw%?dD^LP)3cM?b?zyOTc?Ukb zOt-{>thq92de9#m6TWaCVPe#ffAoray~U8Vv1{2lk1Ap4m6C%@qC1a~^{2$VEBAe3r zS$4aLj)LX?wu6qKx04Y7NQJs9)#)o}gP$pI@x+?hT&=W)y7rNjKYT@;O*G|)8e^JM zg}N9u60AG!w8PN{$K>dX`myw4rKQl{XG^#+^L8jaQaFtIH5LFgM5*prI`4Uo?OKV8 z_r24*eqB$&7Gd2}&g5}AzyjMG(9i@__f(2qR-xobPgi>#JRV$stYoKgwmEZmZzf^; zIlq0PzYqvyw`q=AkHIyu)uyMQwLea=)4Hy5|dyK1v9?algCmjvkE1pcBYtdsNzUw0&Xmd0ra@NyNK$*C3HC zZv)iHAEdrwo_k>}pC@B51tb;ZeRgmAO#GGaUQlnI2>BGb)V5#tfZbz+2no{yimlyU zZ+3)3xktQ0kscY{4{5vtw>Qg%Cucwk1a1tsh2*Zy*ta_1*X^=#terq1!NEy8BEKe; zQoZUki^L26!1ec2LD2Eb^7n)JE>WLT;CIJ)ok)@|zI)}(OKAPi8p=iA`s3aJaNAKu zilU?J!mk{!N~S5&&jF(#QWvKU%GZI@XLJNbqvGLKcQF_T=jz0RV_)0pFGRRj!582Z z`dyc27H;6sN5V7u)BQ4m=SCLf_gnHXEb8d?XBhwUHL~>Q{J#VAOqh$gbRQW_i86QG zX-!L!$v_uqLt6v8PWe8~R(__=S{jx*4eQ%~pU`9EQ>5a)@wumb=5z2xnEjaN{pzrn zw_M-;@|G8P^)dfYvo&`ZhJqn<^W>y^eL_Tw?oNvRzUTcax9|4rFyHM$_^d&B5OhDr zgcAAwTuJgQG)b$u9$c@-?B;%pK>U;6FaO<_9kQ)r)`E#CHq*iI584{73UX>uU2?;B z`*YjA1VOSn9T8!2$E$Im5H(|$eJP5&sk-oG4p;)~jLxKF-XJU7(+eqy#>2&z>hSG8 zuB%(FAhRbS^dfct*uHlEkS%ca2T)U%#$EPoc1UAQj`-D{Vi8vs#qe1KQW*{7JMz~g z%YPlpn27e8zLOn&W%%>m1U0_T)r8Hfy<6P#Z%{yidkoq0U!%w4LGKCgv_a3^NvIzi z_}@oXO0+`ILoQKXI10B}kaL2o@0X`;RU^@12=6gpmkHhqtZvZo6b7|u=Ynx zr_^9ND+@7lXj{|WUD!mvlwU7PVST8cv;}>Ua%j?T4{^rZy?vf88OJ2T_;kNBkhfeh zWx=%so8>i@4lwhy?kb>QUA3AY*C}AGJ0rM)4jd2rz*~pqJHqTvY+YJGyeT3d`>lq;P9Se@rl4bZdzV{xa zLAT2LIMvs3z9!@lde`Q<=Hg{M-x2tJR{*zCy!K*Tt{K*Fx5qz9T72(z8Lxaw?Tr>h z4!$f6zEjuHnCo8LD!Mmpp3V_ZU|qQ`KCm`d``fSfZSCcKkEZlGGwv#h#eLrzJhx<^ zsLS|O-S(`m8_DDeK@CHxGCnrq`a}eq$r1T=ZXk_R?)K(`Vz#EHD8JX|g$i6-TSgCN z`}X@?ncOeUck3qPJ_~re?KuzGSP!nwfe%ybMTBklzB@WN%vZX4+ZC=Sx}PzwUk$D| zx>DkT4T`Rta}4|+xn^YcT2pN9&-1m=Egf3d*yljuuK3HfMd`1TV+q3l0y{v&zwSeU zftzdzSd}>aQL3thW}O*rJY)Orv@3<2HGc1B zc4Y#Ar=ER>B~%nQP(N->YwQHpXK4nM?n%QgaU!SZFHf?+ET-JJP@U#dAgm0=dqx%YFu2mf~X{oAb{3TWfx6Joe7^C>=-yOIpOV zHkA2;zEtr}&R?!j-W-@kWqce5S?zY)u&d2p&9An)QJdUrmoTvkO!&}TyWMMb!$Y{R z>S}kbSv9+ckGL8Qts#zsbI6T=)Z5?JvXXd<;wjn=}IT(#@|&L5yMl7 zYnCDz49Ggs_f6vycRpTmV(VGg+}FPBX}%Mafkp3$B2U&FcZU9qN2ye*IQk7;H=U)O ztvPJbs&)2m&+TSz+wNf2e7pxt`Q?B^yKu+l2=e)(EKN53&|26<*I1k?`M2U1n1r6Z zc=6o)+yyuMp3;{xew+LuFewSPN8d=zC#>$js3E5gWz_RdJ6TwqwO%g@$Y>xy&Ek#x zNN5`A%G6aHYsw_W!z33MmgdjSU#8zQ(}h;|=n=TF0-yFN@K!=h>B@5_valSkOk&WM zkFn+93KREkfCvAoA$7iB z_H?;nvRfbPHyOC4u^VB>v+hQb*91BeWS~bXcls(O&J+J?`}cFsteofKeT@rx?zvg- znEZZYmM6y@u9)Um%O)4z;%eBS+E+-Y>R7)EDO;ybQzTG(!Dg4rTR4C=~hV2+#Z${(eS| zTPfUstenD`Wlm6fW%KHZ6I*5PfHy76y^Os7Tocc_&KLMmr4fyi{K+ZO}3@G6_tPWZ=(6Z|#DWp|o$`np|h zaE#AxyE;NRIeis~s7I@zfy&zG4X2g+9p`rSUBYS42K^b^T?oRV^+xyc%K8Ks2{8(}hE%C`-i-LY9Lk=$rm6F3g@V>hZPQWR6;|&-f zJ%wqEG)lLd;&wcgZ4Enfpj4WE?m6>~$!X$=2ChPRqSP?~vNCu@@Y6xyS+C@N9xg~g z3TLj;ev7l@^R%XCu4Zo0izmNf{?wAUaC-j2(!!Yq;j!jg-bE6M7BI{@Y=oG@GH9c$ z-|9NJ($`xkZ(nD!^Ki*XG{ReAiNW2N1T6{)ry?qCX+C9Ttk8_5Gyr;JKU3z>OFT;d zTg}%es1}8^L-Z4Sq^?;>-6H%+K$DsIldq{p<>|BtX0X-?GEshkkv61XkAH#SQB!UsP>NnK4I&`@I6MO*@!gW5YH+6?nZj4o{jc`ZD?;PLjM7n~AqG~sg5;01 zu%P&jPI&7$9{#RK+f;JplK|G~!^aG_tc`}ImK8552~An&*kO#+yD~KsX6e-Yg_q9H zU!Gf>sF1kIcMfuyph4>mzGW~g=>MUd67qXJktcl0pr`84RLe&skGU# zhm*Q;C6MCO(W&XF!_!Ys9r?)AGgDJVPPv!Pse8ST;TS&B)YI-*{o?sqN^#u`KOWR^ z0eT!rRhW4-kk=$FwZm?v6tX-o2auUzZyBI^H#^HcJe9j(7wBbKH03hGtCYE13y91M zOBa}r%D&D41}p1_^WK?Z@)jQtV!y?BwrrhAxVIeEC&So`URo}v4y=0&vMa$PYCwpM z))aH3p?QLjMc={d5OwKCXp2|QJo>pv2V_zO-l}i2GqYqewKR``rL3ah!?-{00aaN> zd0-iTjemTc1%dIo?3<71o2l%ZXZ6iT$Fr}>`s!fz%^`WSjE8jGOZ_#I`fE1z*Yolh z@f0DcPPzdanreQtxkcIfwDbhAbQ$oNGUyE1WxVC5XX)s47MkW!7Mk`&>DVM{1t>|} zR|-=z>Mg-Eohp@==IS!%yvzQ^hlv|X%c;E<=SWifui69&`%E9JA3W6rL8sy^0aHf| z??QYkT5FRrnzKJ!1)@xSbmUC0*_6jtsVJG^_`d2QcL_tV+@eY}f8!MFZ@}^bSwcmD z4g#{VJ(&fN0hjsGRuI%F@yIe=3vIQ*lkHQ@+f{Fg)wW@`;s`b%mo@8ZAd+=s?q5n$ z$`T(^3R2`Qpgq)YNd|rz99U!N%R)8{M{~jcPGjzW2P%+`i!@t}B;pMXA(+v@Z zMPI%gb-S?N4YXt$Z8FKAT}_XVLx|A;g>Mib=$2DnJSD(WGSv;Zv|=^8@C;_@)5-+n zv$tBy4 zLHDH=%()Z$O?+O`Z?a-Q(`*ko6}{HA7MlOX>4zQBa6Wlj*fYd@Y#=wnMZn1OijAR^ z;2NM^gZXtc#6tD6oEwNdB}sTt_J|!@@IFxS0w@^yz=&G~3^lJhUJf!%D?bORt5ors zzBw_*Gxt*Hzm9K32g<|^_&D*KfW@7izc7D!?wpu{c!`(b=hEECbMxkD9C2?})2Foh zgtOvJDLjubN18}d$e_9X;2%++ESgeQn8cf}XZYW&dc%-Dz5HQ;^uu5kT2xaE0Jd;2 zk>BG7p2TdC249DgW3x)^w-(0aOqNfRMQ)OP(S1`g(Tzd+wc1sXxkS((L%0sfyU{OZX?COee-5VF#uAZC1`W_KwIw z<1;uel9(zsFNGjvrI48_p!l5SYI|PCl60vkzO43N+I#tLHbvp0M#)%-F(bi9lrbt% z*ST9sgHV1Df0nK}$PCRjmXPUyNAkQ8gFzzDr8OnGLmq2^!vI%_j*3DkZtv*b& z)6X8ZV4s<#qoad-kmY2A>XfrQ%L3rewzH!KJ3awDe$m>20U;Xo

iil4w5&R`Ag0^g6g1tMs`L-T%2bL$XSD$okH0i&M52$ z4rDC}1BNha@qt5F#rdFFu(^5g9K@?Qx3l5726nfOeFKKLxNv%4=RVJ%0b__AeBd~0 zCm%Eg5Fc{ZK{uUt7#&Hchqf0St7uWE^;Y5kNT=PZHv=PRlIPHCJxUvnmm!~OKgL5= zRo%!y>b8S3DbsbESn@HH3TmcuM<>`bqJ5tHKb@-pFjUWI0H%ki0I=Tkq7)y`ssp6> zogFZH4QI&O%ueXqAV+%DtTKmy38aBD3^`kpN|j{Uq0$QYgZSgk?ji-wg*67hbf-dL zH7;1slrJ@ej4)?g^$WtYR+{BbMBYTso{;b0pYXh7m3y=7#O)HsvQg)mW?De@_O6Ef zJm-#rk2QRbQgfeHcc;^iPKwrx%jz!Og^3y*rW9kfdlQ+)Y%RsVE(atOWSChx?aU|)W>i%TE5+*a z+3pOa2S8Gx*WAL%VvV`AfK+7etQmqihGCA|K~#qo5Up%*v>ICMXZk!NP;Rj{XbNpy z^D%N`bVLGWROKgnq&_;5GPvP}!}q9j_EQv6f)3{a8J@*8AdV`c!H)w1znu*pHkrgm z$bqO@bdas3$}(`3-^kQT#^Uh~K@@#gc0TSgbuV_>opk@ydm=zEuXEwGU?UU&r<7^8 zIfH(MT>mUG-x;*usC<}F=QG;mtPhs6)gGI{?999PSi0jtBZLlI-kd!tj${#mx-_;jkqx(b2ygnA+j8!#roI{P|#g4Nc6#y77@N3TY6OdENcZ6ayicIz#w5T zZ=ud-@5~0jNml=;7E~uSUxIUBFtx(=X9d1S z^ReS>zxF;L)7dt&SJL&NP%GhZH>VfrL3X~&xidFY&)Yl}N>WR(B1(2PM~`ebpMEvg z&>7jeY&Vq~S&%x!$Wlx-lH{p~7fp+@)C{+MP(RF8o-)bs2M$>BNbmXORJrOHAX4T& zTGw*=4!2y+jN^-gYd6CI5L8)|p%ad!P?!soN0}h3I{bXMquixAK1l3q$`LB*HHNxt zp(*G`jfbz?Ey>RN=u9%lj%|T}hHQ&6@>~1a9@d0blIi#>We36XYQq`5!l?RjkXt<_ z!RYuJnQ1Iv>MCTMm^9}Rd(3kvu(6nl{So_NvZG~m7fq*3@?)0Nus7aSC|a=hOw1BM z*s65`!0CE*AlH~oslyk!S9`K%| zI4Br5hjnuLY{xvMm9YajPsf+bMJH$KS!irW=?!zYb2`tQm)S55&y3Y2M<{=acQHhN zfbC=b7OWomMvwI!nLF~W9qT)?b7FHRnwI(+!h{HgPE zlTSTekzRA&awiN>?YRsovfV%OSzm#ULZJ z_QwkvOkU5iLF~+RurER~BkH^H5n(It0^qSwE4N_teT6+aebP2+7zsLXu=gi(dgvR9 zxY4U&$=*hwIZRS%Fvvwz157B8Fuf?v{@WW<$j)X!& z!(D%mK21i}>0_{4$2Ibn(U^JFH5sKz#v}sGC9k7n-l)5f%@6$CDevoYoQeh$IiD$K z+`%viwzUQby$WA&fZqcxq{WXjgV)>hG7$`H6{PYcF^91BW)H?h1bw$~I;ru)TT%2zgJ~Drr z9_6iN!qJFlM#}2+VMHgUFK4Vc15XoVc7caFZ3DN;HQ z3UHyz6}8GyOXKb&c#in=Sj;t;x>Gm_b8csNun{HmBO~zQntOG@X39~zw6t*X!rVD* zens{DSMkF$nU`4hg3de6Zp(PlJ2Fh zN3t}T>qs*;@InP7Lc<7`WD7E(i7v$lY;%GLO}rP#hmt{cnxbTB1JhBBni0;PfY5Bq zMG9UN2$&E8q@gj;?WhCv;W*++$T@L)cx*TfWM>qWu6fg{v}_zW*99u30(6Pe;OXl@ zfv;vLtWZQ8L0np<(JEfCSkB(5wiPp}!b&g)5b#eMd2r1XNLg@Qd_+XgLcyK-Ab1$oN283l0na)GS!bm_7&KS;DI(eENS@<~s0=C| zz;$YXQb6oYLp)KaxRgoisA=QG(1JysrDFWQ-Tliywd>};nJsk2_vt*74+n*!`RnF) z1cjG&-?f0b0+Zhj3*B88lcm=RPr*NbzIex@qkRq*q|rp)GTF7T`@x$(wORP$-aV{8NE*GugUPRd zGkoc;Zz;TTAN2u|S!La%@ok0oCqMozg(s8WhxhcIJCtTnCs}-Wsll2by&U1Eh zO2|Ee*M(v7Guhp%$iqlWl;hH}1SY|!(tA;3bOdvOwSgxJ;u*e;DoWDPfz`*v-tt+c znPSIBVTAJRV|3t15l!DH1{S3?kzkAWk~o4x<@C#4BQdB`Scg3qM@Q!J7bmIW$lc#$BM)j#AcOdx zvz<%N4kmV=LCrA(U1L+O0MCsP6W6`s@uK{`0Z;L-tMLC&%fU~z$0h#KY50)$hHN3G zjrVY-B}5#_jZLh=po!ajV9J=`Ej54g!kN(#xaei~YzlgjnwoxVrHAWG4ahg3{p`kS zh+vKZC;|CaO1zd$Qy5ny{)3qQCWSpV`)8iwZA~H*FNL3o zWdse9wX*p6eX@k8TPoQCac zqF!_;L`L|s0TVSXQ8|K5A1PbK8wXZryfQj6-e^XC_o>6<6|BQhEmwr8BG61?4ohar z?7#r$&ZPQRP>%hP%+RpA)$@KE@1OB9oo$p0EqnoHgv>$`3>_pA+H2vb>g>4_V{kfi z#ienIeS&$8qh1sLMW$|?m%YL;i8quz4IP6_U~yFV+qg5?Kon%3-|b9ze@| zr;uBa7Kjji0&fz8kd^UPMLE5$DpYd|$nNwF2|Gv*nR+$Zd!~}TXee&Zh8vrUWC5kD z*jtNW&sSI}Pv5EJolm}Bs9p~ud6N{=Sg!!Xy;Vdvg(TA9%~2c11~Nc5j)MlYm1?Ge zJ%nrLjbi%I4cdP5fVTf44+qWl*A3qD)a@z$`Rz_r@7078YGoE=^V6lITR>{NKD!d) zm@=?!MXgDcDtMIR5_ZYh(gGHNiMkz)(a@PiYCPN+!l3@i<3UqE+9`#q7$QHi7GFfN z6dr>lZQN$v1c2v4gOdZvXjxrKc1kj5I9?sw3N}4EbKU|8DWn82*NFIMF+g{Xck>)y zx5zz^IQoWnwiET*@b5)ZO~8-Kz;<;xh7~_@PA_Pkf#`bH;B+BAioY9hiE(c^hK@aA zfU2C>0MK>+q}I%Vjc_2a<|C7j^F=ERX$Bh=>pfTNb*S{ z;?E<8snz?<X7Dj~YzfDk<+O>BA)8sN zCdAAzJ}6*Ct*y1F7fXn;(x+a_@=50EE%)satUKxkj&5pnL@vbiyirSm-(1oErwp=_!QW zJ_=ga>&fL>z3~r@rY((vpehC? zo2Xsvgp?CthW4iwz}2K_0*H1|JcO$v#tjo4u~+YLkVzO*egVAoOmXUe1>16Ym)hR&V)On8Fmarjp;Ag3}eajr}4HlfO9dBinktg{jdp07s;T9 zQUk_ia}w+{V0avo=KrYVX`1fYT+d`B+E>3qw)#Jzu zsYT#~>_m#04;PQ~F@h_i2zMd=wHjlwQx$Le=^KV`3~2@MNq7tYdmUa+Z8mPu z8KHZ);yEm-5!hFddqXXtbb+hpq42TbaB9U9Cs4LL319JwWfn!<_p@1{ zmRgztQ!mYGJ)E?{3mP=SO~cB#Y@)MHm*E*daRSvFORK@4)?pumm*ya-DkBL1$TU!7 zmUh)7n;OoIsq&blRAgAVZ2HG_CNerw?{)N82nBV75?VXaIV#ZUT-U%-pxH>|XatuV zVC13)KLz~YT!_s`_Imuv)p2jRgT4jGWOc6Uo%D}ep!#Ws#=JoehXPCG&e(~wi*b)v3nB%DDr z3S;@I_*5bF7Zhil%Q<-f!;TTDa^QIV2E#F6C_3U7Lh-sl@d{~Y76X)guqy3Uq%|V0 z>$BWbkT;_+9&p_*Da_p#Xst7vcoG)aHbQiZ6U?bVjFrrQcWdTs9#O@t$ZdpYvu5F8 zORzI>xC|epO)RH{ZomL6tQqoMjv^e73@ApH`dZkvrNofmXgY@6^f_T%!l}*(=4n4w zRQdHf!p(X^kYS~R3A~l-z~qWDQmzLC2Fzud5oQ>OBQ*zDDwp;N`=;Ism#HLj*2UD| z#1W(+Xt-YjKha_byg~?5G96`7C!XCa#)?cumr@zl$Gmpz2o>3fu(cjxp*YRnYrh(k zCRO45R&Xn>oy)g*CskQ1)%IMTp^sTmZeW@2cusUR>s|LIyhD7c-#AYE48IYyw3_DJWX@w zb5wcLkHeY>2q+n2a;#NrnmaiND=ietNWMwQ@4&9*twIl_5}Y;)S)^(69R(njqar^y znmuln9}6)x2FCO@Az~lG-+<1@mXhC(D(X?nS?Q6iM0#eF22lq`2a+_*t$-?L zP_s@8Py#}e5fVa{zv}43AycATjM<}Z(Pgr;7H#$AmFQ3xwx)%@!zi~Na|dr0TatP5 zE&NZM`Ur_MNxl#YbQtKxlw?~Zx=w7(@q`^`^o13VjjQ0C?dH9t-@H=7+aBbQh@yJ%MYm`NeiM7!`X+cBN8oTq@whlTe>r#dn90Gg#O z6s<&j8dso$@TGWigLkoiXyhJySL6++bE?x7{OhXb2{&wBrg_D=akS@k8t0IGBMET? z=bRBTsEhFGiI``x2l|#%=-hAd(_EwZo+-vVTVAS)BhMK~+lV7j2FYFY#?`)!*F{&0 zbx&D&98CXx2mszq&NjE~dj&>zlQqwI`nQcCXVh8M>^R$i+G7y?x_1(aF= zQh#*LQteRRO@z9ln4BFbe>~@ZMJe4`E}Q`l3=s>*GSxb@RH&@+;TBAvYzL9V3=I`%htU5!)?r8;wgdbwdG~o=)(yk~Ds9 zk}m2E&6TqOqpds%^mEmZFA~?liIhEex|H0RO~A$zK^cD=Qmkhu`N_=0@R1Re) zVaGPJ(5hfsBeu1kN<8P1Tyd<(Tt-?;I+hJ2LImW-d9th`C*wWfKHBpKA; zhM)`!WVl95Uq$(|SR_j=vLfy@s%3LYAVw=ooHu*gpi*HQM;pAV;Lb!!Z@3UA7BdSq znq-M)XR75^9H0_LWHQZ8k`CnV|51Y$n zh@;Sd?AS#n#;TXmgf^RIRI#O`N(h=U#LL?Hx-w}X$FvwoP*@8o3~zoN{^81YsJBE> zYr}8ZxiHBlDatCJ#m|~jzEYWsv^pON{}Rz1hBq!BUt`RFruI~9vXE+O^{w{6+yIni zMRRfq&J<~##oPomJ8OCh_^xbA>)w`N}$w{GPeN{S(l0R5npI?RrZI;#{ep`BSw z&>BLfxYeH`L^6sHQV1O&wjEn%$$_g5oslG0qWjMGlXrXcd&kQNna$1U(T&JSVe)(^ z`0^Yb(dx{bmMQ9*4C{d6xC5IN4SFC@Yt6*e;wArBTs5~Hd@7v)hY?{^0HI3XVL-t9 zLcQ7tu8GVQO*BHV=H9ydnMifi$lmJOpB%pU{)J|i>10830VS&!m4hsvIZGqZRX7F2 z)~IZP<(ZTf#p|$7e_=MwN`|TQZ17mtZ{8!bjsmMO-B^p~NLI$gfjr4JQx9WSO?JJK zzaE9C*&}bqsKubj0d@+iFmOIxa{+rJXF9kVq<1Zyh>z)$U9h`=)2u%h+N$(Xta{jUsQlGvrdD|Tos79IrK+Z`R1`nFz_j-gmRl?r3=!*6BG!|UGa81 zBexqScH_Gl;UN2G`2`VFa>^y-fdy_#6CyI2Sx0%m=~3$s?;LvoWzF$=!Y0VNBL}P= zu-{C|VRzK2h+|DbCN*5~gGJ4zmhnSQ$EcY06Q(_yA3K3~Q4;|(PEHuL9ozKjCbJaf zl_GfB3u7dYgEaZ22y@n1g7Kc4m1{6ny~2_rIYPVy%wWak4C&;J_J1jz0a3oR5MKzJ z@GX#z-=@z3AL)El8LVQz7dbIjWDN~lYN{yaji{+Ea+YyRQ_dSZU9Rfw_yRKbw*U}i zrM86#$^o}9CbDEXW2OoQ<#NK3O>e@wHH8M^SLu?A!`+^oj;fR6-eF}kxeFcclobn(#VoRVXzA4}c*eTk`k+|0I zJA=9I^)F^d%sW_dvFPw4`JoEp#)3*B^O;z`V?Q)&h3wQ4Bm0>j<~}?m26d zb#<%iP>@<0k13wiDev{%kkec#PcVaP>4;@@(hEXzAlyL5NHk%WW3a;C#zh=@JyQ>U_^zQKoh1IfA01Cqt2$u=DnI&{krCVjc ziJjpJ7JavfqR0>j*)23nHHtlh6E?@Xw``D$oj(M-Z2YY{_mab1pSUzcJQB%Wq@=!( zsBI5W1}akk5l?9x3^645fDz=OY%8w->K&jAn;PABACp?{X*buMOqd z9Vex2_L}_?WS`k_GS^E3`$fwrOE?=o7?t6k?6pvW=@VKi&Lwx-_X3^&w%-bCSop7l zMlY00i&oXgJ;gA)?yE;`%my;!nc>&q7->|Xb*8~y4RN8dwn|_oePC z(CC%bl)BLg@wW=WhS;df1h`V43jzQy_NvutI**|0Ia5YKk7)y%k*FyB5 zC|-GDSOM%>^RES^w9kWebr7!!a+XjB3A~%P*6*UgeWtg;v6ed6}vx0Nk*`<(ou9RY=oqCw1R40%d z#3@N`!sjOSvC+$?IS0-*c;jtx|2q}6)`M0^9FBU1#q=fCk=)v$_8OYKSq$#*b|V!i zrST_G7xf+FQ-Bf>`4+i(ShZBU;G*6?xo3!HTH5f!h0x$xvA=L6JQa8Zo_JYmXjZ*=5U2e}2n2cT6J zwmC?SOLx=nw6> z`F(%4&^(g-;F-M-C$FB|dsnjmbA|VE+Rf_Oy?c|X&lT>ObJa|P?8mO!sLynq{NI1N z=dtA1ap=aU_T4+?8h?}VFYJ5hX8H4lM@H^E?yV=k{C)c#Nj~?bJ%yz8n}z4@rZldq z2~58DB^c)ieyebI^84`ezSK+jX!5a7?R$6f(cdl;|YfgxU6E#%NLVBFCo!^6Nvitt?+WnF&a6!2#ccyE9h{p>cTkIIi@8aS3) zUjad23M>#PI7emF30xxQ_$cP3Q(0H{bo-5N$H!VBG75KE_nedo~BZL>*67iQL}g+f1-3Y;zZIrSevBExl= zT=CMGYs6sp^G*-)_=zMC3o%0y;0Ugmd^NrkNkHo|fpRw32undpq5=tgl!WpT$nZK% zpO<6;u_CbvTNitqr;y|hF4~-55x{7kIenETonNM6cF4WcxAbV>D>@uUk2r6|4-{W& z5f<}Kke4#kUrj}gnI?R)u!R%clHZg|hEiKxu``2a(?(CE0c7;@oe1t1zbo<0oLL$oU^H)jxCT%ymkj0v9 zL{AF{1(c=)C}$Y;Vs$>JL_+oyRr>SMiy&;Cqx8bz1oa@Ub;4y6jPG~Q1*c23iLySZ zHi5n4e2OAmil;Eq3&@;Fmt$wpfb;~H)e$6qnlan4>@nMzgkZNAT#r9V)w#sK(Xncam0 zH;hQVYPJvs)l3S0j)YC0Fhl3~cC#pKZ?wL%&HL4MT(l)6p@}35Td2s^tkRUjsIH!X zi1}gNJu&1or6kbHQcpD8PzaRX76j~3RT@+s=&=%_Zds z)YNxN>eg(^uinsbv%wfleq+w*CJ=7;1kU_pZY*j}Fuo~xlAf;pn)UGgu%sd*>@uMw znf-AlH0c$QSYlKq`!d20AtRGd!*xw*<5M1%o|0%72qq>}OY39fqIieHl@@!h8IQrh zo9Lf=*;78*;ro?mMNVZ#z0fVz6}^LAz!pXLRpd*>%mon;=f|z6%AM=InAtM2B@Wm# zMn>;iuw`yiDV{}#AlQ@yYbBG1kPbN3GY=^XWjR$uCA)vlr|kxQD8M{Q8s5p^&nes~ z`P#hn8+w)xaQm^_fw%(+1gmg+)famai1$GiCSA5W;XsD(72XM&0o56&raRiE1ui&l zR?)XnEv-pz1!fyXW4aL;qNMC@w4J?>Z1za?*%LMh#7LTC{ygli(LTASB(({-y>qt# z>AEQ|nj!77H}<~6{E9{6C;O^e)CHKOtc!2?xc8*k(+7?StCyAM?F;T(IprFhH>V*z z4N&UdgnRjV&Lx$pJkwWAr5-di(!Z=>A{|!D(zS}kUDK8v7dV}2NxkiPNXN&3O$D87 z0bc0h=#wcrgLI#r0d-xVQG4BdZ$OQ26j-6f8*g~+v~P+4_CPMqTz63{YQVQ7Qk)rs zDj7OaU3`dYyfTPk4n&sQ?9`&gTn9@r?0Sp*mN^#^A1c0b-Kgzx?VZR;!&t>>(63Tw zz3gxx6olbkna`u(1lVF*kF#B>9SXF4!ULF{DeL|5Fd)sL{}vO4PBDHJF_3 z8f+70-eCm6C(ZC@3-wGGWhT$%nM90=V24IBXd<31c9mHU0nq3YR_$;z0x6fw4&STh z?p!5%shEYu3L`1lz2)AD3Pi$nAq*&)ZycdaDal_06v{Y=&u~8MQ_gVZ01@sRY=ZcU z%C%7`FV8cbOA8|Hr3XA$psH653b1Nd(GY!(d9X6z zKmLVZ6shrIuVaV>hOWnf)PjrPSQ8Rrdci}ItWkm@ka-MS*J6+{$5D{(N^MXI{0i&! zrcv!M@L2Xltqi8}Q1AyFt4of@Q@UzcG%BwSL0+ zt*(xjQ&J`ZUe5!xc$vryNH(ZG!nm_7j(y4Ci}-njT@Fm4j1A;WjWm~TF3Qt~8MMi< zpsg7c*f%Toct`q?b;AxZ@C4~JOK_J_n2N+IA{m4cF19)LvB4?>K34d(6KMqCjJebv z(UE|KH#0F2c^Grho5ov&EW8S#x;KCE3{xa%dJuz0T~}>Fb+k03(A|E4f=08GNbgup zy?rn}4mAW!hn3U#>M3%=?t2*hF?aYCAXN&wwiLna$zH`W;YFUt3_;IjJwW_ zRM$@V+s5ogrWCQ#y>*w^y?UF3AcqoUNCClddtyM&dIbKw)18ev&;yPqsmh(t1grox zK~o|oOfsXiiV_wskODxFTN8<%dpntdkpSb@y_Lv#UpcppGH-HqDDogMi5t5d)FXz2 z_|kOXLD2#tk3ba1%iFxOg`7=*R@7#iZqFwETD%sv7cr3?vg&P-0Mr@T*%@M7$|jNt zdY(k!l7BuorTYf?^K2U~*vpNW!sfL)XTyW)Rk^N++t)i(BMiI^zj+PwjKa0I?rPi9 zy7d6Co!9{-gGjHP>MAONTE&)A<Fg%LC;i2_$r%Al?b!$(c+25#=FDC?;H zJe0>(triD12`oh;Xh(x&PBG|;5!i_%Bo%zDJyLU5UB0AA+^jarCMeNh?*V*VmF`RK zL4kwV?NP7*06IX$zs5*7Rjd@g(rK=h3V$`Zo?y;cP6aM{vg8Sf^9-MsI>9PU>`T?b zjUjtd5ociBSv&!4djf8Zrf_Rr=rX4b#zpnkSZByj`goVgY2*ityqM-=*rM#ncO;2u z33M8;G=62gY%^AoqQP(CKU;&SsN6|8bP@d)jPc1KV*nG9OmbM~Mm0~E)qv2O z7#z+9IWn>xYsRP%G1CZd=38}wOZIBvX`BQJ70CqfsG>2XX)sM)<;t%}WF^98E4I|E7cEVj1r_#%yKvnZO zI$IkZG(Qg=7R|D>dd@o{T4Z@J>m4zAWO$U)72_>NdsT{at}&Bn1asi5Yc?DnR@~mj zs|wTI;MmxXlL;}_<1_d2lZA44X#YadK|~b2q$WJ>t>8|;25J2r^%qQmtZKiABU9R= zva`#lS^G?fU2C-Kgr2kW5hB8pov+cTe0e)UFfw_Fs;qqE(jhdr8S-POx}%_BM3)c3 zF;C|LDy1lakx^??YT>Jb-){waYqKZ0nT-wZBb6epsL-7U6bh6~Ih5n&i$el8flQD( zL-Ec0@hpZBpXBEtm`QqLI3?_l1mSpU7EXxGh}{_6Z>FUmx6b0uMmZQ^*2nkonhyk? z?0;^W5|9I-8qY2#^0)E>bgA3HnyNRN@&;IHJDj?9x+Riq1tFK?ggOS-4F< zr!+7!RZ&v9JcB%X3z-HPu{3`DR=EZhQoqhNeAU^yx zt@lUUkK#ef8vf-?c{H7&U|@DDH*}xQU)!m3EZQV4(>&7Uk@{$bWRa3h?4qR~$kUUv zUd9qxEE-C_4Zp*H%rZPFBD#j#zs{dr%Ls*Q>y`ky)D9+E>Z-_>Nt|GTH^XqH(Nk)q z+nKZ&-q#F~=Bsr!@3`n`@Wk(qob zIAmY^C4YslTuJ2M#PA}s0Uy24Tce4kIgXJA)%In#A?76{%&rPUBKjiwOWTp?noTE^ zihkA19_e^m_MTU`4RY`{BiOb#%nTPDm{AL$(w`w2-SN|1OS3RK=ex~2(BvJ5ff zFKy4e_mL&0cpp;y*_I}md8mYeYg56K)AKUBw~Uf4)>`%3$452i1IKTuHjltU>bRIW z8etC%%a=zN_|~I?-p89DKJu{cya$OpH*QbdaqozM)SesdMBrgATa!jvHrqV9EjD{8 zm(A|WB=2(Ah8U?8oC-(iq*O+6 zE-(bB@UMBdU;YJeZ$J9pB3|6==+p`{Q+5Ole&;yjXs=xzwd_e&qmp}p&WM}EP#Hs2 z|7fv>F*F%lYn;M|G3;S`F+|1~Du`?=emJ-JZHgYkW7nLu9EZP@%Z4@0*hLwR+)Wkc zW=-0b#l&&4T=B5nR+avQT9pA=yBwC;s77=Z-SLVy-r%LMNl?=%@X5kB1lq#x_~^($ zx#QNBDjw%UmU+ z5YDlaBD&+DH>yOrlW+60nPeiIsE4vGXtWIn31X1*yoPPC`mc_PAasj}CHYm$cw`Lh zQ(8vuMwXO4ys0(F3C_-M!2T~^nVM-`?NhaW*q}w9*a&mVVwEIYjB`5d924yzij9gK zo{3jybgSXw$0x^8wk*|vUml<0RQTQrZ~WQu@;10gY(0NWad?OL84ROTIKNw=RWs?G z*YJV4Zqzt>q_nfW9x@e#L(ZMXmnq z49hXD631-3yo_?Q>fw-E6iA6?d_2dsF4hA|h2^3+kY4)*mj zUHVkJLp;AsCt=`Iy>1LhH|4k?^uw7AY%ZKrfyYA~2V796dZ{Pty2lay)eqA@|Nk%s zuU9Yi;?x&4|@Y3adTODnhfPp+zd+@niztf?Fq+bEibT(bY!she(1 z5#v;G*IefNz(WH(0WAM8AQ`uv_4Zo#8533-DBRin(QH$*t{p zq7`U*^SwD$`9XRBJLq9fvpldT)yt_GWuIYtwq*z+_wE$4?mP>M~cp+xye>4>-t zpgxL#j!{#Id+^bZj`QEs{C98M4a=RJ=A+)jVtyHzpH%5eg!?OpXO3P4I87fd4@uae zBZ?z>3$tjqj30`i8*0cwqUoY0njX~MY&EuQhNRa4X`+S|xQvb8XvewAmfs1SI`Uo2 zn2Fc-*{FhCnB%3aOM8i@Au!c5V4+&loN*PkDst5`v2>+$X()VBDLmDI=;BRuc)Gd! z5tBaD`G~ufhf`Zwl%3?)lhfv@1wX+a>zKlR!`*0F_A9x2F#^<-M~t=96BbS;0Sz!> zRAL2Mm=lLrAtAXE?SbGmj?bpB8F@<+3WtF2zL0Jpm>tK1vjfYMb>j4i7{*sRSCxLu zTHNJ7it-z1i8r2m%i%lB##Oxx7`GTS8{(eN@no4`0!H~b{5YwEsT*tSurnZghpU`W zI{Fr+FEB%Mz$rRMU~hOc-9McUR#L?G>JCSdtImRzh*q53zWsVg?r`w%1bzIar8DP! zv@~vz8XMguQMGtwYNm6woC{Wp;AF`;iq@X@yi*y55}opJLn#vML9iYZWo+I3pI`e+Hdq9E6}vIg#3wzQnaMCJrapi(8YzHr89V zLSKRZJw!jp`GX_NS2nJC2EWY=Mm7XBsrPca@%TrV#|JlVWE(ezG;U=Zw}v$CWE*#e zH11{_cZW3YN#hO)x_kt2v*b?GBWDlYa~culf?E6^=zty7=9G=Ex)3k+0R2`lGcw&e zrZ@aCo%<;Y5)5iW17Hk?2r!ADzUAZ8>Pe*ilmf7NnN9+E0iOaQY8*F^Ta^S*Z9fEl zQH;S=dGE{{z=MAfu9L}tKMSxF)38jj-}wW-A_+CTSeJYpxxl6|*>~&&X$@5i3UA;t z8~_iS8(--oR`j97ITcg%-d-zonMg{TYWg_hX%TYH$C9_02b^0xwXk5@X9zpB7o4j( zM|#6}N1uv<4poS7^PDj`BYlf=jCXhwxFmgN&`F6=OtpmC-x#fbY2-UTv+L$x{a=ND zHM&nZ&zqnBQsJRH9+O-%9|~Lbv~S|2Zs+Dbe_42C7o`e4#F<$*E6b<^oaJ_cixZ}k z{J@tB&+fW-^EbX+xNju+{quX@wd>X7|GabTnVZ#pW6|z?WI#FYh2Oh-?}H;o9!owu zHuelhW-w77_>q2X7`K*CyZlZE4q&gObNARclw5m8CMZr^!m4xidZ%>r|Gj(cH+J2d za!j~>{;}szOIu7hn71g_gTXzY`<85N z-u1+LZ0rNc58OX?>@FJa<{#fbc68UM&D@$CesC;Ke(u4skGKyXefQXR-$jl?$xps} z?D_0sl0Sa;*e~4uWW4Tl`RqeuQ+KDF;FCul9;@CfiEPP{z4Y;N^22-gJ$N&EcC63Ng0+MaupKY7>KJq(1?kBoin{aGizxX-VzoP6#AbpG*wvG<;&^{IV(lRb}) zRrd1!c9Zb?_Z5@xE{#2zeCMNM^T}^KI`%~Jm%Cu}fBwSW(d53z#x6bntN>&e6a%bxe${CCB%@4WLa+PCD@ z@v*0p&m0(gZ&LmbdrBWT@3(WTne+w4xN>se_}J+^Rnz}mQo3XByY8bdXw4Vvd-CLe z*z?{!JX#X%-uv!kq%_uY`aP9Y%3}{D-~FXM58wQQ(%5@;5$N}c?Y5ju|Ms2-lGeq& zdmrZMNQNnEQSJZ2rzgg~&H2KE$W61-PV-F->e&No$l3yv0 z-JRSRAA5K5{Ig?Y$!n8i`;)sXWBX_xyU|>TUw9z7^yhn?Pkv$&=K4})Z2z5bXp+B} z9J{g?exPY6`Q5+R6DI$362`fEa_qovw9Qe2QT)YLu;h0y?VZ3eK6DpZ!07#M{CV@k z)vK( zRn&t9ok8Q;;br&4t&MXdVRm%$pPMFqo3W(Q4wdXfb#S2dyS?yG!~g{5W+Uvd`w0Gr zs(%F7LjCGQ>P7$P7-_&`F!UErb968Oz|BR8`Y?k1DF7Um9KYf!m9Dy9L@nq%CYhoH zlr`!Akic}cn3mlO=v@rNo67PyL*|T-H|KiT?NXs=E$m}bpN=#-L2xdF9mW4d9oyk- zRYQT?#6B3U2K_y^TYQ|YwK3OEr(^>N4odHEQnplb9c}yHp+h#SnCl-ItRO$hDZeni zHsyQfl>D%!?poUpaSNXU?1sbbcecoUjYpn9b|^Y739#&nP;-h(FY{j}FWQA*L(iVk zgH!e%%``^D2Tyctb%N%+h%(9!QtH^3Wp6@wh}gMA$greqWX&r*a5y^XaHP!Evd=#khf^;&3vXl^}8 z+S}KAunO;4DO_Uns0B6IA0S@q1Od2^>Y7Wff$7^MkE}0gX~j|jP*$jyP3IE&B+x3< z7xo3T>}~|=fvYL9q!8=#==DJExLQYo`LR04G-S$y`>eB2N8OgYOIO1B)l{GwyyNtZ zsYG^gJ#NN12W|X$H)B$yLQ$WTBjRnYv;(gjT?qIxphj==Ux+~VN$)D#gD)PzztxlXiUpuyeb*OeLWB5HHmD9fU}TCt!}3Vo*6Y`WWna~pIv zoTsyNoDsW3x#$cFC;TN$JPfBUs6&&KCCbbj3$sX3BK<6HR5w~cTZmd?wf+RtPGeW0 zQa^nadBkXjPsqR`+ebr|Hf0R5JsqVi0ih&xJ9-4(o;X2a^RUXz1Jk%}*5QS)s&5KY zwjn2dZVE3DoA67{7g|Hl#Q}lDtsf0L8(v(iJZw@V>68_QUzKUKQYmJUKrU(~8!j<2 zGb&_VpJQ=`5@3zxQA=A$%%FpK&U7}kgH2KtQ_RFg0Qpd?@k8_9va$-{ZHi;|v zPKz(C`B+|uDpd(6(kXq&ZP2a`vkEOV+-z5UB{f1LyeU(=Od&6nGj59uqjs4r`&~md z^7gYIprtUj&JApiN|PaQG)_mIJ25@@ zlKZ}l=0Kat*x93sW*g%Luq{zoHh)x7Xb2u^T7M@osBD(!p_2<0nbDgOdzR*Gil*jP z#pyvAg2~fVvetW2bF$ZxDy$p$6`aI!9CemiJ>cw0wVbz+C)|B>F+<#M^ZBs=Ll#wv zmkAd0TyAwQnWSWu#go%=>?P+&=B9O0RSH`p8UUxVkYuTJt3{a9)C>Yjo0xXdbuwJS zK@6laWyLwN3QH{d;dkiF+FCxE8iJcr?&Rhc84Fo~Ahn&BrPwN0ZDedg6x8(*MIaC& zJE!cdlzuXq?X&6pQm0!2F9O$>C|xuKX>d+bdfb=O4hzijMHoh<(L;TlFmlccFem%B z`bPV)7q#1wr0_TMW}y15cmw(3s5Q>Xb1}uOT5xRa9-Imcokm+vpb>m#{S+ue`zFfr z!Rq;8QUun&18l$#*PTo^soaf@NTJlwMcXX!B*Mu>Wj^?C8$LV!;TDyb3`#2Y+!p$= zM~)CQIu=}nRukz3HnnX3DH(#L4y>}lmM+3#RwIK0l6n=+Rx_CFt|B}Uzqr^f<@Xb@ zid28qb5ZSDsjRgI?DLmeO@3pU$;+H_-y;hn*Ty7ZAUBBm7uqF&`#RM|!rI9-^+UDT zMH%h*?y@pv>aKNCv*cW>SwS?cOHJi+7Tp3S0azY0$7n|B5T{7Xr<$? zc@=Jl0qR^66i?G?Z_USaD}EjQxmeN>?DCy5K&TH^#`WGjA0?qxI*0s(SOke_`xr_wFTNTx{I@_Df@bF#1TwWaN;k zOo_gwO ztsJK*9+4ik>P%GQUYiv3EzZRhN6jAXnPmBD1>NfDP^zW?16z-R80f9Zc?r{7Zu%dm z0-}E0)h}K4>9!(wGOoQ&x$Mbr3ZB&)y(T->NK_1_fJVvX1=UDbtj~i#RBzv!_?iM-S1d;fktt9w!z!N~$ZnSsK7jRm2pP z8e9#d!C-?nxcv$usTyl2cTDLlcz{gJLeb|4m~i=YAW6H$!&KS)(triX0k&l*105=r zKFD9;l*Jr+#6F$r#nhm%`EHb8KR#R2eCw9P?t^n;*rmMzUH^)-N z7OG2p_5}9y2z7ttywdesxE=Hp2jW`}-~&^;eEHQESbKfBV~tp?_{Clj6VZE}^D)6A zB>!`yHlIa5YM|RpTEL=Eq5g$48)<<^Y=U)*3 z*qJZAvc!+<)aT$o0*amK;^hxBRGu15??4*TSwwIorTBL`%!Tjunxr>W-i|N@5^NR}?Pn%7q zXLA?6(M!((-kgtDsvV>|)b27x67*^qK&Vz3F03N&xIQy8QO?}BA6|5wGk(}aa$x32 z?=UZo>1F52@1pL4Q&dprOz$oS4KiMtxjZc=Y)QzxDR(U#r*reIiXDgx0<~g3S&kid z!HhfbKh#YjCSf?~4x7GMCt11T&9&smg;<|-=!Z51M$4rFW{MQNIy&;|i3S9W>G=->fD@ZJ%z1(;zq(Q$@uVo>6E^I){{tw7Al16@b2ogjlT|iPJCY3a346=5DB_MU(wuwKjnJVVs>7!9-)G3 z63KfJKahSP)eeF3Yvsq|X!+pH?qKScChDJGr0?0ypflwFT&Aa>iwTO%ieZ7UPCYK` zRVlX)FtS@*QyK3(wUB0FYk}d5SFttSiMXyT_8HRN4}g3SjE=}1U{^!O*u}M_Zqp*) zQ*hoc*PB6W1@1X+K~`pdfJ#GKE}+`%vJ1c7niP#ncv%# zvzNM+xDn7(>)KPN5jRvse(0CY%v>u-F5g zP8GhEUh=DaN2TYJnN7QAf`l%{rfy@-OlYjzo(Wve!=`b5c>s##OyvB@+n>eR;j>t| zg;|`v{aNJfN)}5l!`GVwPTl2%J%K@aENto0b-YLe-^J~!IhrICE#ui$vM9{ zh+gGQ>XqA`6wroYpt%t5d=?iLZ+jNVnGTxbU`?je6&8l z9BmGM3%nah^v*pJG~ixbb^gYTj`schW*eC=^Y?l9w`=?7tR7Zy+p9;Oe%LN7ZEAoS z1x`k&lfc!HsF*hy81VMD0z`-Yt>`;4A@W{Z=GeT8OUv!63N?G?lJ`jOnv-~M)zJT{c#P>U*;!KE zlKFy6uke=%0>mL^XEC4(K3J}pqFqMQuQMYJx#``23yf4%7*dWkqk6Gqf1#4`#K&SG z7Ak4vRQsYD=>iW=E4;8m@x0$=cghy;8`dT@{2K6ZB#JS|hU(W&=hd}qrZYufsuYuUqmot*Y~N9MDyQT5lQVeaw(E#IklX9*&U&3q_uAPc z&-YLA^3FbYIo<1(o%MPp)$79Ij(Xt@>hyw}Y-R_&=)!Zl!4%cFXE zbWT0a>UFQ%0a}FQq|UVkYkn(gp`$y7hjG0Is*-}HEe;$#4u6o>2gPQ$G%UNyG0HK< zi506w!Y0g+jCgFaNS#|Yg|$4t zUJupGM2J8Z7PDP(&VFGj>UH+@sP~<7^d4fXQin{_A%hFu z_nn{}_+nb3v~F>)fyNN@`w!H;OlpCXo(ql+s_iJ_oY=!s;dub!4@4 zPLZa357HM?KFTDuRJ3P~C^aM>|D7F3*tr@-1YTfar?=xvCJ zmPa7JhA@^Hnnkg~k-Zxzr;VZ!w1_(5m6ZZGr5bRsf+mmtEgOD^P0T>%ngP-MHGT`b z%AXbAk2XCf@*wVI6ar#$cVwu4KFzmxLO%7!lo>@J(vs?V%I34d6JVCa?s0%Y=b{Kh z2%T!mPAz3a8TCXKiL~^g{`NNoa7uo7y}zWz!i4N#s@-C zFl>vtW0EC}=NYEQYa6O^$R;Z{If0bK*RlkDn{`O01d5L4s72)lXtb+%fzS;|E5l|r zyO2}75TpgRRAd~j33gNdeL!&-QOh-UG?+lcj07(PpSz|mDo}$OpB%}BP6UI!#Wwx^RH-60Y=SBw)9;db^(5|xMZ*%$QQtg{?Ps-0dcg%Z(5VJ-#(A;==SpC%I zu_-#AQ=3Po=%B0H$WE}H6QZP+<1WTJ_{4l%Q@5F8X+ID55VN0ZqHl)F7|Qj$!>r~M z%`q%1x|pz3&nOk!e0vgRG<~!piiL_&5FGnTODGJ&fTKcyt;8B%$S!WJMLl4f#Dl_N zQk^-VzgKQWpIhTvv%C?Enp=LPL6P9_Qd|Uc3!=ECNrd(^*0rO)8<1i7q+gfVBKX)^ zw|a(rL>i?i#)Q~Gr&IBYEi4`dg2fC_Z7fF6GO|1ATK2C4!ZfN9i!_7<8(Ix%gxDWS z)072yW1WCYQ0>p~oK7}OKy9p7&j#$CYXOq+vh2?avl0Pz2|Vaj<7eEjO#grEy$zIH z*;yEPG&5GKd%BFrGh-VJ>!&tSS4q`1-918#TWT4NG@5C9MiOet<3$$o>#A4XZ&Y1X zQ?IIjENjVPY-4QfoDlnkvso56Spr^mPxd5ihh!JWgJB8AKsW>v3^Cp$Cua|k4ZArI zIM`>u-~034tLkn^V|#ymjz?YZ-FNSI@BQv~zyI$fHxzn1pQpDY*iXsMk!L{9oC%() zxbKe7*|!xX8AyKT3!!>)-h=AIeS>QL#89v(SmdPtdVb`bo*XhKQ=HP@RGX$$@5|<1 z3J4as(Bcw3B@2<=VJ?a(7(?#k&UM-zdYuj<#a=zkoV&4mxem?#4qa}jD1yt=E;=?| zHhABJ49FalAi%0!wO}W<&~k*XQt04{-1;C+)=*f$C?XD}WuBj_o;Xqh*Vr6(wx|$N z{y^=Wo>(U?Lrucf$}Ve8>*6V|7ZkG`LgFeId@|xEP2ByI@OUx^`DVKE)j}}G;sgsP zH61`?@iXWQgQ^BPNyp98dp@dC)4-QN4a0_*XmmVU&EQTpY{8Q}>DEge@{5d==Z;@Q z!W|`e4)dXd!iw$rV(w0dHlWL12U$?|cjpejU^26xtq9A)gZ~t6eWooFLvRC-X1n-KjaxpWMsT{$ISCG%!*_IQKA^dHx0Oks5=~cgR zJig(K>7cYn5+QQW-mNMMJGf0RzQ-e+f#ez6{w=T3Cd-&8XRZFh5d69 zc=npLv#PCedTrLo%k_9LwP+NFCb@;XqHB>ZCM4ZoybolVYQzIyI~S zcX{-vtsN`7e!EzAfx|9c-Z)Wa$@$C~kjblo{s0Nw{&>p#U8x8SF7FXMdzTf%cQON? ziK)g7ldRYdxRlZ`2Y|CtK;f5ZG0Oyq)14&|j3{@etWMF&19l(svWcRqno@F`mOcEH zfRFeU-#c6UavUY#l`H5EME3O&q-Z`*im1l15Gk^(l0?woj4|}S)8=faP2daE03bfo z<8tJ~RTRTBZP;$a2I7!xRdL(qPFvA%BMq6;m@$m#qfj}@^G!e{1;g@0%o~grW`%A> zd@7^AlQ>0rR1`ZXYV9?0?$P14XtQ7;&ImT9AFoHJV3!&lftXEz8Wzk!uOx#5?pW|@ z#$(+uzBJ1jS_aI>y8Eo`-7xRzwzIgS-cp{p2KZBqH5RLedN@e*8kHX6k^=}`)gT3h zQ1@&)LY+UN-de`x4F;LTgG@Sm=0^%{%JR`QXX>Z28%1H%MZ1Lq#v{IF7G7#} ztdnb78{sA2iLh_s?nN^UgdjFyeipHZ@i88yLiR3@2z}y^xjq_eHfT#q zLU17t4yA3=*^qgVDhk~sXQ;}L4fcYGt<{z=?hT&RFs}^!rg$?$5%C4@7mCtzRvUmX zXdNZ=AAc4sIH_@@)Auh1H?N#ktD*meZeFhadAGeqgKWF2=iGKaB4yj2&A=ddnr-&o zSB&S=WjKH#m8N2znv#b%n9)W}xIu~qUdorVXd%z}7omncX(x&n@_>F!&`wA=pWO^3 zui7DqIjfn)x6({;U)m7lWUtdZ#r?{L z4eJ#c1#Yp&?%K(yuG+~SyJ0jK(GxW&=q%615qDsD0xd{}4pgXFx{;CkeR{|mbB7#y z$rlYR%aKKA$BE;qCKx3*+F)82!jm!A<&Mh@s% zrIIdXvhdD?SG<+=a&>gF{a9 zJ)Sf>Q>TCXkb21u$I`fnlY4%_UiJK@DRF{G`w=4R78 zqj=(l6P}Xcr%pQ_OO;dfxsxDrIH^%BMNYwW9>W!|(wwVnpshB%A$iBWr#)o~e|dOg zG+wO7n3)L_>l6BBKbV)(KIM?k!eZUDGKiK3=q$b11)Ln3=7I4LcN8S;qyP%i*^vv{ zZlHLGT?_`H`X~?>m-A3OgU?3~pFIY}5a_|k0pVz|8o%~X`Zo{k%)NK=N8f5n$fTW* zP2NiX!^bASec}}A*tkl>xBT$r_or{eN)w;^iOI*(&;Rh`o6~>yR|ms~RTXzFZtrwH zIQb6_q`&f)2VeiNV}?rq>JyVclK%S-PaY~u`l+mOC+BNoYg(k&esHpXkdMdCul?ZU zR}Q3K`n7|P9L`wywPP~ylYwie_R-1t1ACs;&;9V^98DY=eWJ_wte{*#}cd_(&APfosR(!MP>sZ0%OchQPNzb4q6r#~NNgRTGj$$9_x z$rI-HA^hF#_bTb3PfZ@C*&qMZ~+Wgt`nM7f8v$;fJU;j*D z2+>PP$EH1Uazd$_5@#XO9Hjsj6_=Fq2SJ!{%2|_+2~&)nI642FHIq6C2bl26erUB1 z9pZ_VFo{l{C@lTa!$3ufQl3hn1NxT>PvW0ad5iw+H=oiBOfPWGWiJsgfo&!Q^Vra+ zPi+lUf-;)BS#>uw(+Oru)m)yE0vbJykdxzB$%_BxG0oxxT>ZE{f4%|O9rFKhL*m}x{^%;<(12sY$ex3dN54GZr?q2zXy{iY0? z1j!1&HA%Us1`T#k?%RYEF_)1T(gAz?oA3F24{2+nmq=^Ol~SZ48y8JXY(8eK#b(p4 zI(v%0uQ5(|HQP)Lwcy(E3l}b&Hvzw7r=#Eqsz6l?9xEBDL9|tmx>OUD@>)t^3~o%G zLBJ6aCeLVwa1E_9Yk=CU;z8s@0a>7^HdO_pg$zz|y|XU%Mscs!+45)b)zjN%tL^jY zgzBnObYX1rYI=QB1e3-l`>)n$N|>^gQ`@3(6FvRePf-&8lZUsic`NFpYd^5`@hV01 za0E4of*=O;A`S7ujx?<&W_Y5BB_?JM3sd(&fCR8EVeiov(hjU*f?y@)Q(0wuj=Q_8 ztpuq!J=%0`V?O*8#}*k2*2v1XEH{M!{$u69$F}708iJobLfB{hW{zp5XzE z709?vdBG!_FN?q=u}3~EZ}`SiqhQl~wIqB|w&bI{OjIT4_8qRD1COKHx^`8V58qV) zWs(d>H7=wKe5Wl-A%HFM{h^iVb)KkO47=SH1`0|OE{(J<5yzcD-&U#c`tqk*mE?@o zAm(oP_zhcu6;m7Fg?-N!bx)Wu->reg%eN?VC?BQT0xMad_Pd~%^>_G^Ug-3myZXZO zBi9rgJd@PJZlrOfMGGoD?G1VE|I%3?b>S+zErByHs+P=YP8(u8#Zzl<&0d{3fz#FC z3=@~5*o9LG6>bPD+Lm}V&J%3WUS$j9dj_+!Pu8paZ^Zx3pQP*0Nu)v4Lhq9#Y|^6R z1>4XeXv0o(S+X;f(v;{IY(N0~dB4-cfOgDa3~VlPFwsh|((7y{2qg!=t##UzSQh3H z_8Qb7_7LG>AoMs@AdTJ_lB2dH? zi7VKicFL2VasEDPqtLm>(?Kjwa4jJ-I7_uSc4shiA->ZxJbOD4nNC)T91unec-O^T`U`|&BE@eJ( z2iEm!glj5^S{sohkYLW4uUcYo3WN~^&yhUJMYO|MW3RO(D|BS;Yh|t))Ip4y zVt)!PwZ!EVl{=*=#9U9orEh}l?k9G!z4DjHoYm`tb+Vr}>P}Ng3l#vV3>(V> zIa4>8M#a(`ZefGSBkofut>nt|!8b4I`evLY&3UrxY#F7OY94Xqt;`fwz#9>Rxg3OC zk&Bj6ZHc}kZp8iVn%%Q=AT)(&Fo?{(yds-dz>~o&c@vKM=l`}wHW0{nv;%kU;?&Ra zJx)-M9~yvaAQKp{#ckEu73+>E6y92+{bnlbNSbLwCM9k(ksWl&3B&O}Q$o7b?}R5$ zlm!;@gcuRZQ{2b3c(+bStF=on7od}i+DA2*UY)K6Gjr9zgqEPWwXpY0)J0SiKYWF! z=mR&D$w|lzrZyQJ&co5_GWPxPGGzg;F|T0W5NP8yQ|eHv7Koo=yJQwad3w zFNeUFAI1b9LYYv}5Vr?5paomfSp1&r8y~JFL{A##b<}ecTjjW>$ zF3I$1-lHYUp_%Sr3p`kcRBo6_>xuF{x-*^Mv=_pz*)f-#7wi%=W#{>KM%&r#1AytB zb$PHyzleo01mKQCJg^cxU%f>q(ojfKKPxvu#xe>I+7QO#U98T*2?5v%Arq?NYs>JT zazf@R;qPxb{QZVa9%VxfhVQr8v|G7lk-$_rGke`f;yP~ax{aQ{{iU9bs9Mk!KJAcHjrSWxJ@=0CMJPLj^4zc}TflxBWZm2GS1v(@DFUOyb*xMf;NEGG zQHB||(jnxD(ekPP7>dpm)G}4#Q`P(#sSPFD;gou@SPhFX1drJ8-*gOIP24e~33 ze_o>OdiZaZpAPTpc{uJ)SG?Z}NU~8|1$rJM5tP4Q8UYry<$grk4cxu}j*+)UFjT;i zOUI%m>e_SEA*aeJ$e<`VN#UI6@^T9PJRP7_x^`vIj+UcV(~yVRt@+vDG*C9g&=tbs z_q=D?{+JS-*LW;JqD4$rRvVV#UJLYL1m2OoIZ)j47}+=f|!(TM#pG2gS9NM+||Kc4E0K%FPDf6)OHJ1(IpvDgN^4b!VdS8xQ>U`JM0i*~uSy{e*hYY*f+@ zJ$&em>EpjJ`MUJv1CvM6^Piav4qQs3&rH4}{kJcSJ(_;$S0>-E^V^@9eBFWc_b!f2 zr2qYA$6lL$>8l41JuGq@%692De|GX(dT4p<9ck&6$v31w`q|0x@ujxNL+O|Q>R^*z zyxvMnTt~H1N&n#TSS|ggS0=ypArzF-nO7#K)B2^c*FWxvGO8V_Or(GBxv_6f|La#K zgLM6su{Z7f(JPae4y4VGANrkzxi{Mhtn6I9t(ErQSHIKWz=KM!jS<%;O>FAoMd$y`>Cs`GJfRroG}d!ZLa&<uGUEFdwt)4; z)`8nBImMhZqM}4zQ1lAg-ptaFjV1R#;k)ad7S%cA2y56K^?MNRn>53n z?o2D%h*}Jp+o6F5+$RVO;EG1)f&xiivi2w@;B|vN^ndE zzzdq?0!*zfPb>7Wwh5PogFv@8@9=ZN5Rr|BposL~U;zdVVqIy4hn|*kPlAw%kiWp5as z;B2rE|DfjxG654c`L|nnHoUhspM0>igz9_~%((Btht}<*?(`!ywjw;=@ zUz9g+Gq0NT!6@^ZmTG@@@aY8&^J3e%7H%fW+QrJs4ZW5I?Id2sONs-_fZU*;q2@pv zieWNyo6Qd_h$@NKD_9tvx$M(9M^ssodyY7 z&1fApJCe8=7hF=rQ?9Yff~Ys>I8ldW5RjVDxtU=ZVukhk?1E102Cvga%#v$I$u!r- z3p5Y;7L5A#+A?_iK!$KW2K+u3@55VlC`WwEapQM7}YXW4fX zGp#fSJz^!|_67z+tcDy{G-$T~zpzKDxxNy?h7w)o^)1Fre{df&ll)x`qx6Gg17PK_ z`4aFs)gYwLGqj-0BWpM>t8IlJSjJa^m)Pt&_W%N&+n`WafeV4)0^oCNF#&7}GfhEG{Hz-<;W>4_IW9s8DN{Q6M zS$zHs-+Q0kF{jorq;%0SlWFX4te0gZ8ft~J_M3$Q?IK(bMQMB#JihRBiSZws%TG;0 zcSh*Db=cwEsY-B&j!eFBh=ceEG&{zL&4?FNK-*}8hoAdBp7;((aM`OqbG!$%142rTHKAd z!0l_W+=)Gksh}YFpaU!i4frxIEI0IosZMaAfmkz(!K)=D)Or1e4kIQ+8Dt&nnD2dv zThaCt>|8y15T6>Eh=JXPV)y)^y`tOrRU+Qj{tjo~8Rl}Yvl6bLA0o2x5{1CkNC*IB zku8s(_4nAv0YOw&nMDk2Dx7B7YjdQXs1u5a$T-kbgwN_Agl_s##F99=M8W~H<}X7U zRR@D%7Q_ze@EqzuB0&*x6uVsHdn2jPkr55K@en_ts8Y$0@beLSp>}%2JSRai5Z)IA z7A&4ZU+6*zKtraV2lX!aLiK-r z0TUmYIV#!ZWJI}}i&_5*2zixjK5hD1B)b@IhfQ#4=Fr=Q6x>3tRiiwD7wz?d4?Ub^ zM2QU{YEJ7O(?Lo6Z?m^LpPgb>EJq0?I>_GYxK+U1BVtpGhmXBg%m%WK;bU4IOK750 z73u@lub9gsC{ubZ4X5hYYZa4=1{Id8U1Q7q)%8h;c9U-6~|>oz)dPu(P=?f5|pU|9mbr93~4HeO7A{U6v|j zjE=M=5|=sp94$4<`#Lg97#9&Yx9!TSuG}gPH`wZ#lRH@K$T8y;pANG@bsxl72%8B$ z`dZRqlc#eKWqlT1lI+nM5NUdmoQ0YG8txb(>spVJ@Syg94zpGcps!au@U{=z$%R$8 z;C$G&T0FudQpp=kW`9)s+@PyUSePaq(>1nPkZ0{2vapyOl`8iQB92ClHeyWeN%pa% zmebBH%-xtkM%$bkwx21>&G^6upi!YGqV<|^6k+I}%9lRtv1?ag^T|Dtv38+YPkYq) zq%tw#$u`c-VFXo5D`*&mivNKg5qULAe$_X&WS_7WHdeD(#1@V`JHVo^3GjsK0^mu$ z)&)c(gSRNu#8X%ksCOnBKXKqkPVRj1Hzuz>JSGOno$vhOz3DVpm_ z>GB^=UL!ML`al2SQ+lDAmg6ZC;DX~mS9lXCdb7i&E!iT+ z&8Wa1$LRpkGQue;RoA-%I=^DO(>ciiM?kp0NEqcSIgV)^ka!}cL(3!O0q5vQiRiQA zp$)N(L9_KWAU{Z$VzV0J*p9WTXeiV}W2}+~u!zbDhW7G>(YBlwEZaCb`g4qLFX#?d zT3i7IVIl3ct`9;i;mYs@n@o{wlIbSKu(2gmGBA@gO6_@JwMT-QyF5#U&$yA=(6m|A z?1pqmG#Kbz5_#9kZdbU_ec+Qqv@5nFl_F~s$DS}2Wz zfk0=gY-yFWig0)}*jNfvvNRF)RtF?PtC$-4wQaf6GBitqTCL`ZPe5St`Sn?3!KU;8 zGbV93jJ&Ru#Z_ox9003brku(64ti8J2F>z{&vKme$joXGMfV1!4HuqZf|y)Fn*h5( zgx7+ciqh-hHgkNYzK{-?XgYI38(It8T|+6T%S5gE3a2&eAFH=8cjahb;><@@4SQTfq_Iy3 zR|5Lt8Tz}7jT5?>o9U0G}Oa3H2nXll|jUS)%4e;5%+@gG5o=W z%BB7*xzCaC&X#7vb-)%q?YEgYpbgg`20e12j_PX~GJ$WXwApq1?+w$`vyW+bgh3o< zBe5n)hto(1nE~2;ye&~6PQ;sNT43xNP7T<2{AWbBn{Z99iU&Rli{x>$>kx3g%Q3mg zOH#&$u%V4!Z3(1zn!9&Icu{3RD?Z|1=g;tlf{twjAN)OPLsw;`?j9Yk*w*R>_o*tWAcsk25sa0#>x>+TTYxzB1PWi_7rFWir+`iH0(_m z?MhVNsHk1L%1kn8Gl4y7Q)Uv9D6p9o$0>_J)PkXURLoj+734`pa)V||p;F6cFtpm5 z!I*e+){%xL)xuuFUXLe%Rmq6u;t34jZCDNVpTX@G63v@lp=YdISy;^5bm1kD(3kZy z0gfLI{|;VO98yVlf)GBf>3j@~a_o6lfHkMD&yVM!H*u z3{Sb3>2y)m{ja!_AH~lo{^$w9Nf2c2y5n+|k1^dbEh$*5k!#D3bFI(TZ@En!zJmS! zJysHs08jZc@tQMwWYC31%9}?ymYfPS)O(tVLw!p$=X#t7yU+c^R)(V_W?`E{g%HQ> z;RYzHZZAyz4NKq9-dI8;nFBiRVCHw0cYA!g=!)x-ROv_#BmrM!^NTrafLms;(~B1w z(L^AE{}?@bJ?_c{`C`OT?8uIiCc~v!W|hzah)LjjLS()5t~#sjMWOh+a@uLe&XH_x z>RF4Rk=WGczk(^}f!;V;2nR8Z}S%W+u(7e{hp5kmy8ortPD8eNQ5IT;wA z3%0SN0E8F920Mu%fu*-+7BvW2AI;31l6R-gJD;s|Y|d9i7t9HONy0(Y#gHA^bF#*g zU{XvzkovsZ)Ppz(OD`&UDORcWQNyBDhRd?*)Oik;1k;&O5DUZE6oF9%%LdJ#ie9u_ zu?Vfa-xKvZNYj9k%_o6SH>isBsvIUhK-YP?q`1alaZAB0kgHEg;6gR<#?N>S<2yt> z8o_KgDe+lmwOUglbB>vVn=t3okOZECbM5Q3h?g)rpDc`0A4< ztS;0gcWnnA(Q3~498aN2&L}x{QCq&e-_h@3G_HbmpGPCUq=z=95S=^7*BJ=rx|nz* z=rB$!HkMWLCJp#0*m9l!y`tW`(+673h#WlEugB zeq~;b;#p-yL64r_-Xo+G(PXNHWg%t|&-btnDARDJB%YFiWEIg`Q&;6Hs2#Rp7Jy2P zq(XdCCyD#YdGl=g=!{J+NuBm8lgGA1jdUapJG!T-ngn}cyc$Zxso%1~BLa5DW06Xf zZuZdIsAugh@Qjo*ELBPt8w$QyCz+EpnKqN~YNye`Kny+j2IGMI)*3DpMs2YT@MhOu zuvBGJ<1a*OZ$F$tEG~~nV=7dLph+FY- zoUJ-BF~o4kkz<0}h#(*!)l-@dc${>@etnI7lr5gyN(_6!6b`p`kcH+%xUzRd;hGvF zaRs~mx}!?s0AYD`(oqu6UthcGr!-gDPtu+b@@*1l{b4sF`c{u;bl$UH`9 z_^|_`foV8UfLu&RpWuVZ`P}9Royx+0e7~_qN zBcGnpv7MsNS&L@DezO_RO=!=@!{JdKcgIlJHIsNH=|=Uq8Jij+#&vDNdPIr7-&8xn zn}8uV{-&sWq5jbOYlYn`dn<9D^60reX*|yPDCug5xa4vVFgZYo^()v25jC3#5XRW* z3#JO=Jj1f*@`0y})Yez+0V^gN!@e#)qb@l?L!9bE+~ZBn_rg?Wm>h9~&oW*&sn~-F zlgav?z$p6K8N$OnU2dAAjl3YAAlbzQw6|JMhRi6yYaJCC<2KG3=69!n_kAvGuMWC+ zX@p7AsmH|r_N7{maR#+c0@nGEY^rc&BISHtJxx#YW7*MiXOqTMy~@T zdf4T_z`6VE?`CE*>TBdjG{oTtOHbZXHCJY(G8Jsa7)sC)hoA z?VSIM$=8-1$>|VxZXYb&DmA@6kc7Gg6fA8_qlj(1Ldh*bNFzQb2 z4W)NJ)chAef8dG#ha}``uJ?f88`ZC!^V30?D-d$ z&R>0wy2H#m?)~HF&S>hpaOTC0!o-LDhT&71e-CT<}O^xRqj(!Bx6Bb0-j2k?f)GgQ!byxjs@gI|6=OHfdOetGJ*D zwQKPispv+0b(q6PWBD;(F^a)r@DRjD(9SQ@-lD%qaDo3UH!BqKJHh@gtEm1Xj6zXg zQrHoqIncVu#*fR*K%!P@?TjLU=&N|~_)|iWTdYznpd$w_MJicLEmtUvlml#8yUNS- z-uH4rrs-)t6vo$c!({u#_3*mm6mO9f_r(0XvZ`{>5rDRyH(8A^IFjI69of*4*v}jq z4%+tg7{Wp2^OAsKQq1|(C2&_QQ#(eM>)FnJ7fio^o_Ll+mJBX=5a0XZ*0810j_z%- z-m2>)lXoZNPTv9BE&#jRb)5*8w$S_-9lSIVqhAQEH)vCG#p{$?_S)48FN9k}tR}{R zji3*Zosh5~I0W@Ib_8*Z8og+cge$EmSEe!>?Ij-)hd$_GC=aH}*a+iR?(?N)uuicA zJx)A>UM?&^A^@sEhbQY4eaX8hFym+DXA2aTzU7j=WrfMDepts-DMDLjtS zgWF_r%C3Gjn46u&is5&(3QxCt0rQG3I>Y1!v3au*u@|Qo24f&8`w`PT_?# zt!t9bz|M1bCPgY0#?u_BL6?)w$xoG1y9iH(60Mdsb-{V5$Je50JESdk6uR8J+66V1 zm%?tDpw*&=SgPLCZE!pZxRHrYmlZ&y?>epp0@iRI!|o5S*Cu9pFn?YajYPJ;U08^0 zr`V$E{5`B&;u}`n1nx$^xMI%F^vtw#6u8s%xIIYp{qg*JE<;1F=IZ8&@lEADNCH8Oo?BSe9`Htt528{1(?0Xp-BeWRQbf^kJVLCgkWmkkC-z? z)`C6{tpA)8SC@5BX3&<&_E86b(E85nli)Odr z{c^w2!K@%=MJYmp`B0&xXG7H6-2*`_FYTWA^avwukk!69TkQR}ajH4`o=A%3l^*2#EHeXS` zgLV|Ngq}E=1700c=2No!M!L#j)pOps&-Clw_oIlCeIxCTtl~WpK9}z8f!^KiqK>9~ z_qeVO;Vf8T_`mm=KHZO<*^NSd zqwJGR_#SB$bg(~ab@xlWFM4&itL)IN!nN5u+5Ehei!+=~>u|2d=C~CCnui;GMwj_{_+^>i<`Wk)eUlwRJ>T`ndjl$Zq z)j(>k`4#SNn^>0(r!*{9J2WLvF~hlAR!8vA-gR{%$mX`2b;|Htc$#l6Au# z{2HvAQgKx-{8g1}sgLIlk23X>|LSZs6*rd-&W#XudK1oT;RSz_3fRz9S! z7x|-8{Ofce9%Iw9(-_8;T*t>ZsGOPn2~VfrHqGrNSA3g7?cl%1=4ONAL`0?a4D>^B z3JJGiH|2a4N7YS;{~70X%&Bv;MY>(RglCbi6lu?#%4lz&u6R%7++{rTHY#qoTwy0! z_*cRPT58Lvcj4_qtj^AZ0vO8EM;HqF`>_2RzqK#Q(|iuFpFK|9siC*~9K)73OC5G` zntu?rlk<#GvC|vVKI2slW<@p4A65!hrMce6YH_fmjJDqD45HlnXmN3DW)y+_X&QZj zz(PG7{QoBQ7lrNeM#a;dcWdrO$S_WH3w(Oc3d-nO8yTzgbX`qvS#2+T#40@r7pBjU z&a|oWClUqi;6hOU)1dv z=V;IPaU;96PH%Iw!@KJgfAZAuFSdpZa&q`5*X$?PxZJA)`MY=TZ(#b{AA-(qojl>- zC|5s18D%Zn3L8;9UJuz_6Yi2`yoJ7Y;+;CX74S_CH+2=wnI=I?mEsblIC9*=#NvIE zkdpM`Wbw}8y zxV8_oF3v-4;lE;sLHA2Z!M;QeqjlopOj7th?ZgH}2!yRpJ37T_PpPcL3995Bx8wBz zMiP(PL0|z-cn@?e=YHmwx*q%jDI6>2a9Q`dhl9)>+CIhI(gTbap$Ig0h5y9R4v=1k)yJOj2scaU3unKMe$$7w_CjWIGZbf8Knk(3;nN*Z{ z9eHn`$-I5Wd)v%*?Y&(sVvtt7CeLQxJ}YnUY0c==HTkdmwq~@+L)XlEn_DyQZEnrH zx5aDbHOZ}+yuI5sJ4bO+e4p0!@4H;L2*G~_|I@_(T)_X(l(InAnJkEC;nI;@8|dKP zXE!(hl${>@c-7}e1MW6KX>@Nh6k%z@i0b#_q8UZg3HFx>=L+aKzD(q$_LgKOo;c{d zm3_B0gq@|A?{;3koO${3Jsksfc-aWFg67awY(!n)X-8lV3di^{)|=m;+VkdTV_KC$ z*>!as8jMeOet|O*|Mh8EW-g+K4xtzfL21r6OfsA}IAhY^cv5;@WOVBaV^>rb^Z1-jW7NX%Xm_S}U6mVVRUDNIDK)i@du0gL=kc_daS%K$ z<_rW+lM#4&FKof(4y$mrUYO${S5TK_C>~c>!`TZ4#GrQjJ-a5PvK>~u(TOVcDw}1W zy%2V@k1qFn*+*3MF8lCW8*4_$MCm22(jZtA&~yn#uOcl_M)8)#FIT6vyKahmEYeO@ zrYqUruml#K`Puvl*D#Yp0!kdSlolRT9L_m2nx|AN`0lVHp(-v(Fby<%8Z8zaxsjRV zY^8=TadC-`e*xdWs9Wk?pC`VfSdQ&0RP= z_F(h@sUk%!(#~dP%iVV^ne=E}K|x*~hxgm=a=v2@oLnMJRA_@L-p+fiKh>Z^z1GU6 znKk0r=nsj&=o-$>8<7+e7`G>k0i{zgjs_D7&#Vk=z$SCz=`yuy3z=+F3T`zzh%Po3L6f;MigQuJHLPaYpa2xIAYKa8y(KmptMmCOGl~M(1r}E z>B-v9?yz;uo>vER6#BQ1oMpiry~AR_wm>riGqDobiAdcY>_Rj;Qh6xRIM4C*eX3W>3;?u!>fSz|J9%&4J9~In-#h!j-|uPF2JW(n zB6W}**$NT6b@kMJ?8{lud+*Fy-FxrMS!(I5x&Kap{kl&eF=aBH3C-IBNQS{mviz3x z%o4h#N+h@!bWD_VWdDX{Uex-jiCbTjTtJ4@fskG&o{m?SiHI)v)O55Eg_P6?HV$pA zJ&W-)*(2hA3+KrHR1Vf&zQrx|KhA72cQRtD{r-qFn+}nw(iE^*3V>^mpKyd5a}Vgh znei-3oE3}AC7}Nf{W2%8GRfWr%BP&M3U7=(L+V@+b?3I&GrW9K{9V%1ygdZ@4|8%I=C0M_s`Pvq4w@fAra@E|)5r zq0qGdge2H<_EdmwU>miIgLPg=be$7NudfTXs2~QHQ)VzEEeLbpxD1{G#K-z5=w&lC zRWOJ-dl#js)(CVOhOySeu^Pm8gIvY9l)H8u2S>ycb2$oTi`I)DFZ#8NG7EJ#7?sns z*laHJ+S|vGN*T`m?ld=Hg}!$gT;Tg&OE1aW*4OwIO#u(sfs>m@3djT3*3ot*3nZs;#Plpuxn83v=<=n^AMk;qzpuxbnv4?t$eE8_3U0W|iZDA4xiXBppx$oGdLg&I>rJ?K zVzNKBrqJBx+)lEHU+0Udh~2oW`{31NHq;2TV0Z#X7N(3{*8EbSClWm*GeWhrYVX?v zRIgEv*KW{?Hlh}PiiZU0OSHZcQ7A>3^NzJToo=Fc6W+tKl!26N0oFbvvRmlhXO8$b zz6Ziyum(q`_2zPRCfqN3$%*m$ff3s7)jaD)3P6LH%m&1yN zrRa!@L3mvo-KbHvGHg&VPJDdMj&po&RIo}WX5R^J_f~~d;{%{r!vmn>)@bk5QSo9! zi^FE5rbnuQ#HJ(6K-2EDXQ1;9G*0s86S+GPMmR;&#?VrF5u2OSE);!?d<78Z=_6uN zjj3*yoFu$PxrGmw9@ z7d=XlKl^$w9L^;e%3l#SXJ(3pOCO-pT`p2Q18O5))7Vz4RPY1FGzS;9m`_Fx8N-K5i7L7Ca)=p*>* zv@b{UULwpk9GRvFEs)UT)iz1Ul(bU!^1}8=adR6 z%RQCd%(X?!#?*hoySemnn@Sx{U>PUj05P4py2$_@dqFtkM1%@kaH_0~B*XkkJd`}y<8%I6 z>@IQY;VNcv^WKOifIQ1}0fNy5L4RrJy799D^xhC3j|JmBg8Sj|AA8xHqU(0NFds(j zyTwS%{BW%Hj+!YfnK)p(dk^Sayv=$2+_GUcU2?tUyr-=g(D;kj{D+@Eu+w^T>671fNGFxP?ro)$6JquR?j}9((AcBt zKm6^3kEEM#E4_`XJrP9BFf8KhzG!6f}^Kz*I{|qjd%FyAD zT`v8T1Mu_al~OoHlFp^(&aYf4-9E%Q=byh`I`SZ(Q2OH+#@>{E>8l419d<3R^iS42 zmxd3FT|VqtS(n;*D{K1YzdG1V|HpTi9vdSiShA9eNXAcLukHC zKlPr{Q;(A&GiwM;|MbAvW8ZepMqgx%mvi$^rSEx9>08ooy-}JPlZR>gp3;%Dd872E zH_DU3Zqr+r#wH&3&4}^`Lm7Vj&|~S`J4%nHfBT)K@$}fG(pdVI?=9VY@P)9u^Iv># z>45`>;IE~21BU#8o28GYUpX*#DE-WHW2N-OJ4&xJUp)$o|KfW~r+0qly`_&HNdNrL z4?dn=S}DEpb%#Zlp1`iea30d$O6ept{+X517t+SlfGQuVmyYdxzFzvk1Culks;yul z)AeTQ2chAgHA{by{^>hmE}y(vdLNH}@^=r7y;c-RBFU!z)mrJ3u*G5eg}-&^ThibB z%Y(1s?r+AWUi#tRJ@|V3Ydw9}OQlPIFhBKD>DvyZcm8PdTOJTJ+d0@O-5zJirqWhi zI=J)cLFpF|tK!Yl7n^_o;x~F)e=Sa=>HSS!;{@29xE1%eO@?wx07I%`3esI^VU_Wf z&Q<`|0hcJ%PF^0w^;;8el>nr+SPcMh3jYCiY0aq?031lBY5)sZ2^9`NCu9*9UI@3S zoM3P)CYhLGeer-z(U4RRC7Ghsuhn4cs*`-hrjwyMFE)=mRjs8DrzF#B@GPg&8OymLjp-@PqZ7!^b%@^TA4$w3e-`jEm`Wgc2-Dz zNcv}+S|*9#7g4%r{%ehN9OF7v83zcCQHG`~A@b_fD$XS@5iJZh6o(5lYX?s9q(FyH z9lbd~)FsV7RrL`k4bieVy=4KZXj5F9rq~Y}HFepj1jhozkQ!{a^gx#mH6n6)bPlh` zIrg;$JeX;Enk97>sbnX1^2FUw?Bt2;#4sa5;l#KgY{A6#Hw_1Rx=e~thk{BK_O-Aj zhA9Jko1N+$(D`1<0UmQ5TTQ8>K%RUOwqqukJAL}(e8BLClgcvT66@;L!!3-`Mz(7e z3kf)dm-M_aK>`T@3-(cvH}=IZYZFuy#Orx6_>Nf`?p+e3B2#Z?yVhf4Yf5<~1xfX1 zi5lfw&mYpN)WXAxYb%^&nd^;o`q2WCPO7O+H5#P&b#{JDV{gFRX;Kbx9c>G}gbQt9 z@rJ<)5NO#9_6zHKoM1J`ZA`f^O2_6dCY)N&)@Cz>w)+*|3Th^Ay^dwe*J~c(sJh!B zT4k1=w1!%z4U5r_*nwe`=Nit;$wHj-jmw^hSut>L7f(%vWk+3@ohfJWa z>^3ffXRf(m-H}HE?b5f30lJ_s_O;x-FFBdR`a0)2D-SQwCd^$9!fK8vS9TdmT$%Si zlun?UBa=giT2d$3QR%GaPL_S*HLAN^c8(lr_tD)RHqY&7Xg{Nu68$jt0n~1N?X|0G z@vh51*w^}Bi+A0C!M=9jTDt-et~+ z4)T~1Kj4JXTAdi~1iEOKU0M%~*0XmBbWm1;U*vA5y*j3fThTV&N^{sssReg{uAOBe z5u}vZ&`WK;pfTIloz`5EZjO{7_z5dK+zOZ)VZ;it_1bdOS6@mSE$fEStruT7m-{_k zwhg^ucY)5Smsbc9>0SzNYIk|Nj+cx&KvY<4z1rbmdG$dnhTOP*?Rm?SEKt;ifvRe@ z*#5OgMA+-nd22UfKNI7r0{hB+Ze;c|8L}!QRyxaaZY}JMUKW(OY295=R;P3 z-Z`saJ7TXWJL2rt+-wv6mzhKE+)FgN?Wi(@PqLn|3q>2Nd|}p=_FZ}~va?BweQAg7 ztNOA!9PR$L*L1M^{^qOA_=PZC+cydK=Q{0Xyeh0ZR&y1ZB=M@dX|3vzlp7-4d!LF} zZ!{8#`Yos|RHSjJp;&@O*Q)pNay@KCTGa^zc++W&Nw$g_hGbE1N2?*%rlse=;-gR# zcDt>Z!&98}v#da1*en=cf?5QijdgTZJt%lk5o|SPl!nKZCV7RkW3!T~(^Tn{R{$n` z$>j73J#e~7G-z~Yq`7?W%V6VIe0eB0{<~QGA_z<^JyxB#qQ3EDwH1NKRk#%4G-PC0 z1-xoYB0ATT#8eP8qfjkd>ZVW0>70qWaA~P7qewEL*BFj1?Wh#d^&1%}&yfQ)9ADN? zaFPEZ)LxDHSF)Le?e`k2gvhP+m-%DO1y>J_@q>zXg^C#40SlUS{;`;=E=&!9RF(CQ zW!g@R&3Ba={Joq;7{{Qx3-+iZgcE_&=}ts4+76wIj)B#G)}5n8f}eS?2(W2OmZ{Af zbiwkDwYlsnN(-(^ezV;l?*rKXjTe55iW_TY@U$(E>?=OMbc~<{f1q85Z>N zz&@JUj=3ln(_#X)YG-1}Vc3_Mke=T`(3+Gf4Wg|OS=I&kjgQ7@7q7wrz0_#DfSKgs z<)!A;HO$A}500t1<|@)ZY|ol%x`DR5YG(9uoTBauy4tEp13`rCBlE1zK6(`Xev-&0 zx46UqNM(BHjjS~_nhFNuVmakge${&JxzE}8%kZk=c6Em_RXWgp^;`<-d_kIfpq#4> zhSZ!JIk%ZU366RfEz?{8waGlKUfFaUc+nw*L*s9;W?S} z%$!--z-cz02k=CG4|m7yMA^!I7+$jab(y-1=@+;Gl%0VNhTC2pS;nie{Y%5jN)=C>Qq;WW16jRO6 z@xpep2{J_01>Bm!viB7B)`*gNFJ4hwp3qK7X2WGmw4k8<8mZ9gt4~0-s=?Ms0^YOB@)=xc2Udid`lrTx?bm_sLQyGLjh92e~ZY9IXt)bPG(@*rqA7JPGmVHUE4+Va)^ujNEdHtmubg)(FhW=&cmxkz{bLY|H z)iu1f(4b9nAD-(Yaz!Z1a-=a;4a}%7u|w+c?WeuTkvTsFs#|Es2}$Y~?Uify-jJ2Z z=UQ=@7t^Cp_Z*6ef_6cE0UflGn~!%aHTE!QxL|*b$$o8(mt>=DlJtg18hLf9> z#}K$#f4t$^^<5PU{Nq3>;*uFI$;S3rfzGA68VZDv*>8)XbNWUIMZfLg+L5OVy3_N>B%>yYu{gb zOFHwP;OC!Q9(&V)>L*_wd-gyz{l2dpyfI;YBGVt=E`3}2+uvXME^;hQzwHC1bNpBQ zfzmVl*Ukq@EBx2g50q}uU#}svXZrF7OUKiH_yeUkn1@f!^TTT&dUz~-?FUQWL~jnV zIWB$q1EnB+{)44Aad+zPZU`AF$V`j;Or{iF0(KRsD`3nFTPVa>RD{^k!tkF*)+YMH*}W3U7_f2j1j^u$L> zkETEUw$dRS>NQJlKRIhyfh7#aC~wrxHX1#4e>aA&^zeT=_;^}+Wo$hCrynW(V}dfs zLy5WsaS?^C(x3Su#+lcrU;3fa-{npE#7AMz;Mv3JS3iDe?9n6#Q9u2UA1!r;kKkG? z(vN%$)*PFTo2KcBA1gh&^IIP)z2V`99U&|Ix$~2cJ%qe}dNwV+F@5@Pmk#ZG$KNVd z575J%?H?^&e~s~)-ud#6l|FLdc;-sWIuN-OGW{FvvB$=dt0Y4CsfWfMdkD!|`Wru9 z`u3f%pD1+>G=J;+cK1>JIyJoJu`sQq0HT`IU}ONf{6N zv)_D*Tum|6#)Z zuETz)=>aoKM3M3QeJSavR=po>^;yu8GH;}MXKjKqVN{5wlU)P$D8ANS4|~ZPCZfgQ ztR%Yt&0c3c-~!HrgzGPJ4S3ozK#vt-L{N2y#-OUGdQkgQNW~-{FA=O_6Aun#nB;ttv zZJgMqXVybt2aP@!9*@6>sG-;GRM_wLrsz3Rw!lt-R9vQ?E369kI)bI76hUwtI9JdV zOXb`hJ{h;YjbC2tw7mxe+W7Sw^e;Vmw$~YS6I6>UbgTH}3}MQY3zKN3fjlx`w{f(E zUoX6z!6a3SExeU@*vgW@#{eAXP%-sBwK#|}m z07Dl=eFhR=(3(AA7mWx;9NI%z?p1@M{Jw(79lbn=VLXz;LH0_p0uAE^?QmfBR`Kih z6tZT5V|S_q*Ob2u&;ZMIL1TU^2rwSd<4!=ojkRuEv5)bYG4eKVZxxZx+f*G=o8dlb zGu<<7BmXEO-=31y$M(F|(o*pe9egGAkI8l1s}UYk>Hs7Vl&EOE)4;OxSbVlIVbTQ& z{+eAfByKZwsR-Pki5S~y2&#k1hYlO^9zfrktXt29_SOyiYZ!*U5o4Ybz9gx17{S{Q zSCvjZEy;!~1y%xUsH@QXDn=I6Ni*Cc(**-TcH%CE>~m^e8~_=BOot)8hT8^iha^TH z1oaFLdof-l(9L>?PPQ)HNBod7!bHv(e0r)Au;Z+U-Q2~2_^KbzU@&{@K@ z9j^=kV>Z`1&@YWen2x8ybnYRz?nMs4hzF?Vcf^~i9Z{>t?7BGyXrn}{uZ2LbF;NmS zKoadhyijaMvnXvCamw%S&xSswtSUGK>=^r*s+n%CTKwcM*28U9{}vuN`yo%DC)vtb zAt=G92#Y_5LN;x;WdPzaSeY?2I=6$~!gE4C-y{oS*R zeKtQQs-tW$bn47ho?F0cQJXn)6jv!rh=eAy^anlN>js&z%u(~f=ax7L#GNRnJV1QD z0F`S>!slsezZ7caQ2HQ2*`*3X&orjqU(Dw^IpCS3wvTiGW1zS0b zos7p5DOdp@Tj|!wyXH=ig1VYRQ)pGiM>J%a8s-tCv7NvbQv`#y>btp;`BHNvZl=yHyTW@ zrc=X4>`60GV0;vK;Hj&DhqvmA*0zA~8kiGcIV7b9z6>wfvBV=S(~Iv8n0>vwOJHPO z0! zgy*XG<(x?vMi1xd;k-V)W0&WcJItP)?$AU>(>U_7WiH`wor_GZs15Kek$C^(UkY(T_O3Y~Z4P=D)mt%pri2YtLa$p{tlzl>;wi@IN3AA)h$%lQd2u6ZVqC6! z{y2gcKUWTlZu`q2XMPLmEP1e?pKM$g2@s}ayGqtDuP*B}L-sr&Sa2hwaGf=q;*#QZ z=@jPX^{qJ6D?_lV^69Z<{O1|&;2VUBnFQIEKy8?K9|BuZiLjC`8AS3fs?awu>xbn; z64n>XWun}m6N(-12hSS40$oYuwMm;T38amlnHW^~9vM{8bF?BXp{0I72BvbS7q7-` zLP9)&&Pn8Ah_Qxf^rCgRVYNU!5Fxl?61XuzrVuX^<79#+RqeNe&XW2=v$oxwHvT8p zm~PCa7>S25I*z+$tl8DjEl0Y*=r}QP)RvO-SX{ciRq>xbPqW6yUQCWQxY~IhSE#&Y zb4y8!nYjtlwT+Kk*fIOros9Y)^HN~)Qs4X`iuM9rA9%Q)F?8*U?Wm{6QR41t~k;YM^`-}o6x(2ZuD_Amd*IenA;1YaVi z74|1D$rj9~Rv$44c8HC@{;w!R4%+}zFsuz<|C}fcFY|$b&&z29klL8gaHDn(h@ns~kZWl^^TDy8EoYIQ zoz{v%++;C0VU8=vlf_Z5Fk@h*tJHybIB8yl?sgeIV`mn?d~#2K2O6MA4-n8cy3kc* zvR9(|fEXL%2Ruq>CTZQ{3$D$!xi?Sc2$3DqamEs|I0dg{6!v>J!;IjdTk;JRVG)A?BRa#Pm2f z0JfQ`_`tLiSsLJ?_;2SkN>-_GQI?uK7(N7X+p!%GQH4(7jRlPt+3*nVK#Oj{9vJU9 z{BC!g4&__FN&`2{b|x)HEotPY%$*QaT9$Gq8-mM%eT)N5_JdM(W|za3i`34HpXBZv zS}7JX)j;IehVcwiQ9_$rIyqEphIiSqa(O2e*8BNRhxL$VCy2rk=V+~p1`+S3D!5vdds%S<=&`K4wvk%}>M9Qw^oqB0)%svWTL)dzYy&}d*~etVUvgW1oT#JAU@=|GpufLg z%r&s5uJ%LiuHU+GN}lW17D_YJIEOE=fJckunj#EQJT%GXarWK($scF$BaLfLi~>(W zo9P2I3UCSpwn2K%9F%1rb$PfIxwE7vFQI_kTUm@Y{^15-@`Kxy@k9eYok&JVZc?uX zH%HYOkSYmTHQiEj4IQ>5L%+_y>1IbK}OX%%X4^7FsQZ7L!;Z3@)q$lLu^rp$xm|d0rL|qgt(2@ux2AkK31W zL|%7w!zM|O^1$oVQ!%>nd2};87q!rb(T1NkCEF|7$M*^)lsQS(vH_;~v1<^6rmsiGJI+H@~qk9_^^_DB*e%Ru`F8wu&`tyq0 zODaequnx+sl+E4Si`Pj_;-k=BxvsuSas^fLGWttynnBc&I`v|m1$~-Tup4EClT+E? zrx3=WX_ZF-DkyuGunk~=_-Wes!LG41NKt9ae?$X?GLty=iBbBhe{NN3x; z7(6O^OQ2&$=(@nRDQCL|+xy~Qp-#VQ=a?0ctFlNEW9+ZFZ_`CpHGN^2S?cvV{@0T^ zWP3pXQhipHzN~5Qb{uiEvi*qIi=f@M%`w5`9V)P%{k6A z?@0&PJ-(YSem8G|_k*LZZ`Eypra8xv5%>qGLz?sYU>+abk>l=5ufb;6x|IYCyv@ZW zrO=ZbzuXMTfwaqFE-@sOFURy4P&Tq?eUvMN%FOq8$aeLfF!*>ghl_daEAa2h%55Gh zTCbmR=SY1`btkuUT5L%|jrI^dNM6&?EmU&sqT=Z8rrpTMt#>9|sntkjcO`8W3!Baf z)ehc7F0(cNTuW^n(u-y-DHC!p_1kl$IW}<=MKJ zHz57qe}C{$iQSB}eAYksZ0XI%G9E>~`w+5h@6+TBY3Y^HpQZoHE2T$XL+&$a`5%`a zPf!11>E!sSV1r#t(yd=CT}mH%W$cmH`u-_92R>K&;DK*q+G4yR((*qqJ(~XAUnuY`s=@3 zn%Q~ee=WWH!F0SjIhlR^bH7^p-3Nk&^xa=5y=9CQg&XM;zjN>{JHP$;(&B-GJZSpJ z7fOfUaM!ttefeEMGU;bw4SDoKG zpZ{m2pM215(EsP9pK^a6{+-fu?g!o9DRmxr@Kn&JL@Q%U?24KGpZ}ut{psohWA8{m z@-IurCa_WqiG%Ydu_JLY{a2UAj;BX{uT-7n+I1}SrT^@!2j7tPf3LJU zL8bFZ080;i?9iiW`_kCh!^GdqDjobHAO<2q`oq6pdMz#WLnuR~^)Hs*qVP?9tMf@t z_DR3;*|9g-&&T8i_VA{Iu#DPCP|%4dm1H`4*m=40OTS-g97vZw@$e%%Xa7~{PY&1u zhl_t$dfU#&{;>1_zfR%x(VbuWa_LVVZ2s}TJ&?(`F*o}SRuxWjLNwR=6NL#kIMYU^ zjN4si+~^J3(KRGsSYb&r;2Jk)5@$N-SkA#70zVPF27Q{i<(@h#FHwxMhDyWN%h=vH zA|zoyPMX`ifVTV-iFHAX98Ffp0O{o+$9_m5KG0}8%+|`L?>^@$BQ+E9eDYZfWAVsC zodA$%Q;8<c4a%h*&4m4#aHb!xOIH%>6(+Z+do!;1U1QiK>BBiBYpc)xEi;X%6|ct>0E~C4 zCWkgqdlMDb0cR?%`=&PpDJWlKY+>{!kMjyUf}0JfX)^e@y#WI@g2sRhHaKDn#NG>u z`~h=W*1xaV<;AU{F63f;=F){AY@(pd4{THx2Ek%YQ|yWMv?o&fO0?aPr1Z2ASmc?q z1W<8iOkZz@E7QD45Yjq)RZnwWp?)j|aKwtUFmlByFtK}Tz?gLbG+dnRE=DYD^dqyUU^k;~F1l+M2|k%FO4 zbg z62oKY)j0FV7AGiSHtZy6`c1ZIKyTh8b^tCy>=&tCxtr(TW*S`6a^@Vz&+*OTk`;4M zEoI?IB02R}DbkCJV-_GFG@{|~*g?m9)-*E~b)cCt%vr+wKP239dz;3j7uBP917k9I5G|MJg@o}{+#E=VtB0*HAKnC2XySBC%1U7Zs`TF`Uk7}; znaJ4cka6F+wA$Ib86TGUjx`&`<&y(XrR6L(uNNiMViB6Q4(q)(!d^oUBd!gLzjgFy zk!&h_sU}f3?AZX=M4ZM=OIx4BC4O}(7QrW;`r&XW_waeeHP#dD5^JAs3(L^3tQ8UC zK!|79&h+5q!$q_sLJjDEY~$wIwn*o+d|^*=d7%PgKi8dM--)!?7&}B84cak7wZoaIm_)QzHBS41`CL_T9`rgk(#N-MN$hifnZwC+V4#jRUmBDy=H z^nk5V`5Ikm2K-6xOH$)f^2-7G7bhJ+o*u}yVINg;I1O|sbieS-lF$h72=(%cITX5u znj&6xI0k?^u*QjG>d+9c73P@9BbI9?l9)=h%X%2Hn@Dv{qq*g-?Z%K)PY#F-Bx{jS zyF&PeBTEUsuueIZF;mWXyS0=&1LFnuE7f)=Nn{d0$whE{{)RO$L%*RFCK3X2bYJL? z_%uC_s##w8C#Vpp)xH2oyf-Y#$C6IwRN#DgdNCm7?!-9#BgiFlJdf=Nyry0J-9wkr#A7Su0wxa;)njsO3bh7!G zjftzgG;sS`WDPtuVRSu%P&qhi>-FFqktlfeRuC3m40|K> zdNsRdCUKS%^yRKZ!OX;;%6`Wq%cnf4MJZK$Cs#*Aw{5tp((I8OB^Y6Cuo~f?jvLOb zQ}EcNi;+*HP_jK@9C4D-^O}406d%lPFW$i8#*TsQxNfX$SYSzPHsq24GpveMkH(dR zbo3%9&&*XaCq=$@F_g~*?aoc>`CGIxj?+Zpk{d?~)T^?;MlG@x1pO^Q!UdeDHKx!) zNN>cTg*^8%P!%{b*V-CB4h>ufOd%{lr_eBv80SyP6=WC_zN$kuG{urGHrWOqU`tcb zdQ0U(SGZn;!e&8fm3nekkpH;t%)e*~qfoNYek9m9FtNyZe#)*f(`Ggp)Z8v6T+c&~ z8rVZc;K+HKnaMirdeE6Y^{E-}mSNIvLxVecB1s>M!5_QO$gqMAToR2KRM6Xg%p=9d z5lQwU;VR-lkLb;*Nr(j{uOZK82&sap@fOuA&~BC?A#+hpJ&W9MTApm=#nT8DHNE6W z7%bH3OJV}rBe?0{cuE*#pK6OFwZ6X+un1X>UVBk)SPPGv6XF=K_&{A{Lo%(neqHW) zMM@P<|%lH{WM&A64@0b3z@@X2mxSd*^DKe zx#Xwrc=mbpLXdSZ9IO!peAZqa1r&5g6yO0Y7?$0?P8Tvv;)QUF^S?g9C7qR#qMYQG zBkxK=R-Yjk7TXGzBt+nDV0(}yPH}f% z^JQ8TuIW49;BV|hWGW@c7VS=U2R+s|;?5uuaftVXw-q_^*i-^hTH8avT3(Qffd;AV zN-*TCB9*P_(wz~GX$4t=nk>NeS#lK@Og^=%?5$+*P)3r0J&bTllp(=1*vsIH;l`w<* z2~Jz?cp2jLW?fk0s@2AI4e?+OJhmj z7qaMu&Suff%N5*A6UmEY*C8X2VGa%6E@WaU@Izth^&CjOi_x+-$bBLb_cF{S7dKT} zaGMu%A?V!^=4A+I1=E`FMLrZn4&K={T*F>OEJn&V6Q8N-8;eOccGL zOWmL+UCz9cr-E>!6E{fV#K?^7RF~-GhWyNk8LEHHp<>KsY-lWla9CjDB~;*xu8iF- zTMdI_h*7PEGYj4oR-7&3JD;4vSm!(K={|dQap@RmW)vRR3VW-OIA$h1Mm_A7nGuzs z_zK*`bF=d&9P(VmtqOh+?Goez&H{5Qi0;sE@{WsKB8lm@S0YumC7D$;-<8oga<(sa zCo9Hl^Z^n0g^c7@B)WN&)NMd|5F-S5qunkb$fQ58NUt&WnJ^O(6h$tY8W>4YC(NlF zvM}YjZn}RteM&|I^djOkx{4LjIc6a1Q7W=@#sO3fBD__O(i7fXFm66n>WEENr2Ccq zvrWkTw>`>nFuU9RJxYC2hC#GArnwvmgEDF>xg+kVVMAkS?3C~h5*Y6WncQH+|C_tF zkC7|O?!&;@-Qjd=rn#%#l~%iv^rm)6R*}_3HfNSQ+Z@iQ*=)|Vmh7h4&6!4q{7D;smf|13@{k6DNNJfej^)5hVOChGYY>tst@DIBQ31c>_ZZ z1Pca&IDqwGA@_Ga?#Fwtx|_2rd6B_xv-`bwzs^1P-1B`X-^Yn}N>0$bsM^f8Hf#EP zU6XeXbzhD6vLboegDlzP&k5N^{Qk%V6V((`)^>8@7H9P;0A9PTb4HRNAGSqVPoyv4 zwf!V4&Exr*Au`Nf8Q!xUo`N63FFXi`%01@gUk??%zP`r^zS2U3E_2k- z4N&MA`j8?PHD+bRno{Xo9XR~5-2-;%+;_Po_jul*M}DOqb1%egO5<*wgU#2bBOb)% z%d^F9c$kqV$?Imy9P4(3ruNOJ$4dBBSYCnTVe%bOEsIM61rAYLM1L{vTYYzG7bVA` z65;)1s#c||(|DPuaqgVoQ}JB6Bg1p#qXLeiv<1%T*Fm(rB~7{?v++n^$z@FnU`GEA z#wP^p%f1eA+A59%t_I9AL`d*C3K!Y8g7PB8EdST@6i(rO6&iTueW2RS94EX`U{C3^vbY7l6>oQN7)MhS&zGE_>cE3{*(gNcU-nv`_Ii zoyj;Ssf%Mq4YwaE^fgn)`OD`QOOxO?3;rA48h$Z4-;B<0o|gnHMhIc-tqt$hsHQ;u zW%q1+zeb7wy+_GPtzqwe)~4IrrjpX}s5=<-R(aI;c6rq9?b4|E#&j3x0Ful~=!f^(!@~<*BHW z_l5WVwXd2l9wv|D@T=g9cxn4ad%1HnS=qT|zNTEX!GGrKi}N+8PKRmMDZFW!7lswd z`iZZgMIPgofkw|6(tQJaQ}77_FrsaKQ94R=P(Ud$-wvj2Z}_6E4t;wEt4>`K@#*k# z16C_MY1^Ib{^PIHag!`tX8S<~60~ER1od~_2yO=03cmoJE=9gjD#pZZLPBYM#r$ep z`@5}QXa3i(`Coe&pdUX5l7AgP?)%LauKMjt`(8FKf-bGG61`$`Y)uiCa9!k>g{u_f zgVC^p;&IRQU>BN{vrh1kStwUI2(-|9ZBDB@hTKcTw-}ZfX1j$pg+o>IqEMi`u?LfC z?JqF{UWH2=<5yZaQP1skv?1Eu24`vWIT}uFRV27@Mx*?SP_9Y`=GkLBV=eLPuSa#$ z(|pv2I^hlb$1GP?d6~`rRbbLgWl&%^j*ZvjU6#Ze1uPW#5qQ_5K{n3+TFDV=wz}

%bco9#bJ)|C=Xk4!=-YJCFcd&SDlhmE8J~(xk)Y~aULZw&#{UKyi&mc zg0Bw$bqI%f1jyrr>!wPfA1>`fOiWWydQg+)S1V%ce_rhGqv!70@)L1^g0l!veh)oN z$LkWFE3p>R5tjpxoOPSTCIj0Exed6GV^YvG;=!ZN2tJ;)`=Z)+xy-16%1(jau3s55 zhYLe9QuG)yc;fHzOw2qD-7v!)%m9YvkS<{Bo267!xPmh)(puPq-k3FrE07mywQtkc z*5ws*wE7Kg=Ad>;tq#Rt5V;O~vkO?)8ZLAN_mnZn5Hq!|8m`Q2GJm@I_{Of>3bJ|!}0nZxEbT}4|M*ug2UsJqpikyfucW=Qwa9CKn;5ZlgG z7b{5S;|TCFB3#rAWQO(!;wy@^w_4w;|zt}pBU$?$Kcb!>VqBVHU=EN77);#*U-yc_Ji71+H zUbF9>1+>L;hiH(k`?@!WYNS2N&2BxXTvU2(n$mm2JBmjBkICjp}?4x)RCf) z64>WEyW5AtPuew7`SQJvBsbu|m{-~PQp4*Y7Nq=+ab!q0Ejn*FrPLe)bqq+ctiu;7 za@53hj##d()E-OOBxWp~o5FDnWUWc4)!H|Y(e5Gq5Ve`mmxPbJ-#}qlP*xw{UqcJ< zDJjjNT#_3(WKx<3DC>V_piokpL$c)#jT|Zod1T1vEdQfaicsSnBeN1A2A9?$Q)FSq zW*E@ISo!s&Jf_?FvddK!UmPHD#q8?O%_p@4QyhV~z$~4N!cR}YF8`{&FhgsDWSR;Z& z>kX$_YM$_-cUhA%OadY-cs}XAn)oONAZnxCjs|SnLaK|U5&9pcHwb+V*V((*`$s#k z_l}W#dWVZ0pKwc5FP4Dzr&}@qBf+Ke8QSeHv3@e$9U%8lm|H3rq`6gsWGR^DO}rVU zKq1aR`xT-6It)-SQLVCeh&+U>e^URPDiUV;W#FqGkd%fQ<`iFAD?z1z5NrcS_1)Uh_N)Efjic@3qJ9`t zEB!i|gGBfcp=h|g8t)ES`i3UhrOjNWKsT4o9g@u>H$|FDCS>!eeUWBVDW#Hh+(&$Q zShe57L)DYm`yc1w5S{n^P)m2z%-DhVlU#|gqnaf;N^CqqCrU}{HL;S_@{$;Tuq>5C z%1MgIn#0K`ENhT048g0km(gZP)a&cWih(jt^Q2imuA|1o-|FY?2_)eV_OD5JD;72Z z;V&=$T|6K7zBr7|l1sebJV${B4e$~=1*`GlY4=NV{P0l4vau}7{KHY;N@$u#k+gyy zg;s(43pq4p@&!4gODHA;0_GHjG34L}-TGXkU7$m1=l#o0!!7fJTZ#v5WGc92esD`W zdoXjmyO1KE+|sLmZtWbj_900=xuuPt{|T?~*DY!Ns3yJ>3m3n7m+$YQ5k|~Wb=&Hq z${O-AQL&LZB_vDN_CUmnflhiMBMhQjP|mBA{A0LD08t{XRz-OpdDhD;RW!(E+`)?t zX?BAe;7qxnSZWj~AW&u|>_JdwwNxBrR>~-?QPRwG+BW#^D`lgZD$6Swz~xoDF#Syd z@Cj|0ib-S5fP=NYlmwk(G|6p&msgEbKN~#9gMqTK$YM8z={jl}?A0$XZKd>x zqE6AHeo_x#L{BC0p7vD{_%rvGyH%0A9X$WKK|9gb-jb9;RH?>h5(C`pox;fx4VB3^ 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�j=7wafYDmV!OpC@r3=wKUAW(t8 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≈~kow)X6tN#6+ORfU#{6M8@EUUnksRHl*H}CF( z0Dkh{a`CJa~@htIA2;?jGBg~FmrHCa}N%Uc~j@J*0_MA-iHn>kL|_^te#3!G#1E$>AIssGh) zwVLcNek&LAs>284E#LNb%ypz-Jn?OBC=>0^tp422%TBc08TqWOWzoJIMf)q?@wTSo zb;~okK&xj;kp90s(<;mV{h3UbTTT;S>fCJdWIVv zfBO&j97z6p`_nx|`*FvLo~+f875NVdqyE#1o}#b(){36Z?anKU=~X=~MCq%t7phJj zi{ImZE#w#ebmjYQzhVqa!(HB552$7ON86ykhtRnL}G(A?&~_=BsQ zbQkyc#h+c(Q*=&SugN5Pj>FR8lX;=m^U&h=UQ?+te{oGP|2H#a|rM7*7`t`z-c z5noIZ57zW#P*AMt+0piVw)p4QR0`%_ugPS&%_(c~t!uLal?SQCkF2e%_DA!#Dvm>o z|6py8U&tq~ycWvNae!GoaBYsBTF)qppS-qbZ>CiL*!4eeejX@QJC{+ZY|Bb@Axic2 z>v|e8))Q~O9t5!E7`6Xv)%%|hHhiH7rBV!+#ceKed&9aC>i(5=l{WQD>oS`<*CBB6 z_Vrn*s&n4rlj}>d=3Cd7!r9NS&%@c??mYZWEcUr>c&&WiS^Nv#c@WU%NVE7$-DS}8 zwN;}3w`qbvYueg6>S?j*k^~L8iDq5^4qf#56Ut0J68*{Boa-2`!*t5Cmw6fn{`P;WG z%i5BG?@AebZpxa!DbL&_rc!OnOl7-c*y8tX%5hJ{No(<6H-2qBOfBAYbJ=A6;WcmF zx-7<*Jcg_k?<-r3Uvo=tG84q{!CQI`r+gS)m z^?S=QHeWwcDSMZfjD5V;b5FsbeWzAwR(EdB&1&0I+~TRt`BZDXIZxUoKm2O`L%Xxr z;(yDlZ#iBq?(5C`M*9=g;)&iel=|!IeyD$0J1%?eXlHyYwdUE;j;FWe5y7{%hsLvk8I5_Tf0-r;?;L&Rm3~* z&X+hOdUxdRTp?SJ7K`7Izt#5iu=wNk_gfDLi?6;XpO0=i11#Q?|JMGPulUKlOvOoF z@%el5oNx;2?kOSAq{xnYOGReyEfq;}1s`zF%6r1&&)i#S-_~wx#kjk-H5YyLw$i-) zuWhT3UHcQI;_qxrG8R>bM#b#Dyuv5%D=p>vllw}fCp~`VzEUD@`2NbCJavB_bXFXX z6#wS^DPAofffRo^e<|L$z30Y4`Cxk{0+q)W#nan!s(*8PCZ_RMw)Yen-qV*aDyujg zC_dEJ%J(10->5j^C;qj*eAvI$R~n25c9d$G*-=u`-`$a|rHilMS$gedJM;W&`y*%K zpWa#aFK=G+?ki_a?XrKFFYv1LJ4@?dzK`-b->o>8%L!Z(-H+g&;&SozBp2Aq^Jd~< zl7-E4ogx#zi&Pqqr%6ePo*^Zp^kUjmt3I$L{y|z<-><+M?ay6_ze@9*K*iB2@%=0h zz}ugm5|8JFS`J8wKfqeO#%EYhamDU!elyugsiS^gD(Uxs^jrPNAGN%hwD}#s)t+q+ zDvQ1q#Cl5D)3*VmzZVR^>oxoDHx!QDz*wKz8EFGCpYhMaaq zW#{+DD}QS__3-==w03^4QUDhwXm(egr~dI>xmo+{u9AV-KfChtw=N6w^In+S8O%x{uNLON-kayqQkb?c zhiUDP1&Lph7mAss(*X-VhP8{e9U3IggvtuSXon}{U zP(XF50`1wE{@@N&nK+$k!mN-pJJiffZ*AI)?d?s%x|vhP%=XqC&dJ(w1-r?^EYkhrCMvtDYsWCA#v$uCb zoE<$W9M5`dqZ%rnoPs)QwPG39k>nvfcBjVFl8;+KT-W+!>2Y#MNq#uVAu&3UO3G1j z((KupJWNlYffuXl7@yQK0hCTe3K`?X116Jukwd&yhNz5oCB$OeszKxKkDpX3l3p`AuM3kK^x8qd({N6|V4-Jp>4+yT4RP{XaDB#L~_mAlT_FwT*$tkf(LA&1|jmd0nyNZvwB zq37vAaHA98l9LSnz1tQ*nKn#ece1jP&?ut5K}<92j>4xFA>p};^A1z{4v9VR#v?MXU5 z&_CRNY~d6!>VqnWVIVnDI0z}yp--i|Vl@CN5kN&6N@{|T1r!lu5NJAa$CfL~gqcHj zjt{-$AsDrxh129C?yf|XQD8ucsJqz^fe;C)L$GWhEdnDQSdJ+C%z^U2_yQrKH4X@j zT{TVnhmQO>cWo3#0g1R)^CNAMHBbA7 zBWog#P^3b_xM03z0YMgV9P&B&Rgm;0VHiv9#A3vqukE`7*bR7Cr-9NK5wSVNYw5Hw z08%3qMaD9tG&r_M%EYID!BtYWak%@B92p)t(ci(2C%1EFgg941B7v>%E*g}W2Gl1Y zKkjIM%{i_{6v>{a5i@^x(aCkq)l3JpR%|8!2SfwkVBwU~-8b$4SwN=0gDsOR1STsP zw1Tyy8JAaBNGmoBd~QN)kqjmB!RMjSUH4^Gpx{XxNH}oh(9t8uhmMU59Xod9*aAE) zF;*%KsudFAu6_X_Ad-jfQm4=e1OQbBMg|NS9|;&jqe4cN0-q+aZ}W>W;BvQS#8~|YusJP39wPO(ei;~!-p526yJtg2$@Sj(Y> z&?033MEE>nK1K>)1j8XB;1B0+GD9*8YcY`SF6$7x`|tvH4>tA%1B3upO2DT>i@A+l zSerQVWdKbO9~=ZgBf>cgoGxnt2(nd{5>2ijMJBW!$u_ffigSvsGG9bCBq6lOz~m|& zVhylfx(o3lP3O~Ude!B^8r1^K26zGKhk&$v-{;_!z@GTX=du+9Ry3Ne+geDo&>R7P z08m{3!lDs(S7Tsz8oL0)9|oP8otkpjkmWlD-PQ05X&rnFaign45dqK*B<8?j1PD0r zeX3hyxXRY+>($)(2n%T*2LR0@%#{ul0t@0!Oh;CP%3?qUxYcHso7ZN{%r1!A#ND5W zeRn+$05XhB2sR7sI!E9_0^TNO9XvAd&>_IE39w%DYy$P&ofjPJR6s+*RTTJ`Kui|} z+}-EVYDvmWa075rNd<5f1_wTPXNZw(D0~G73_>#-DvBs;<1b1)S#&fQY7{|82(Fey zmN5XXA|e6;MR!XrSlbRfIca8-VPA-7Sm8W|R1s$!C@_FrlpqW&o~DZ6R`c50WU?%I zq3r@-07nJh5bOYzhB9}sJ7tFZ5GT-%CU*XVUTicVf`vYa8Z_yyjbStpNDJS<0|oxP z!|M1YrOCCCMVrX#5vNRCTLU%C>B18jhSwuN>UIYHO z2;&OrNN5{6bnrw|Tz%l+vEwI39vphqjn|1zICI>sSkBYXCxQE*Fc70+MI(j{qrwj& z7pYPqIKjqHcPW#?Rwx75n>$R*si71?aT2sfSnY^h8uI**MPT1eKqXjr4bCTwBqkw- z;WnyW0=a^`;|C8Ng&}{qfB2!HC7_eJn_B~Ei6uJX0k}s3krroIbKy|oyy;vj0y)Sd zSS}TSMFZO)2{;Z5QmQ~Tp=4(Q>v%ks#)Bt@4lMzh?*3}7z?Z5(BS7#xbTK%1bAKKV1t6K!Cd-8waqFf1lFzYz>&izGV8n8>Y~6w=>S44 z76l@(67)G_h9-ADO4G(2l&N$0Xz?k-2q~c%cuHvyr34_n05J?9;AV`@X$+gZ)e;CD z4>ed9?Cx5YL;=H)RS=X5Ff|xObB*cJFpCJ}uE_#aEi5wzkiHLo&cL{G4dA~`em@~7 z)y^ennZ&}l5IeN)4o)mE*2Rqyh!V8Y>j?pml*jgTCV@jt%u6S~5c; z5NIu>8bB#_Q$d0v>5|u=$s82CO=>=CWF)!Bqhml-qDVxTF%kyudQuXiDD<_(OaiP6 z0D`hM8K%6!`DJ*@EozQ@H$w_N$38M{VFcp7)e(|zNDe03v17}?s9q|O(dCzfE^BLv7B zfdQi-(V9TOCVby_LT>{TY1wAxD(}4=J2P`?VcmyVm@tUQ4FQ7>takdY0GR0z#LKTp zyq6kWKwhBKYDfbX5dZiUQPhp*M1uWfP_V z6bl(rCUKjzaNgdGnN4Ty7S2neYURzCtLr+q_E2T68~DlsuRF{;Ga z!Ws?;2eTAniVQ^Z5TQzAMdS-&Bo%;yIyY=4)TExrG()*vsR#)nBvPTY5hEBRSxHMn z%LS5=oJYIqp~MShGdD`O(Pbb{B0?mTOoR*os?wI}Hp|C~t)_=aEl_VlUjzaSqXBp1 zE@7991cEX@xp|v(FvN{kN8C!>g*9z?01;E*E;yx98wlh3r8p~^PWKHj zShk1{1~b3_y`Z~c2s*5>U6dQJ_IGXh0)yC?StP!YUUfna9ot$! zzd)Tqt6V=I(uXE32K{rlVk?JGcsp%7JO5e4@-zXZNC(i24`3h=!lw|rL(C4UPQl2w z>)P3QWaCTi0D_EM0yL37aKHdEEuburzffzxEqG4bna6OI8tXJW)3LFI^el`h3&0~7 zckwt^k;dFvtspYihEW9v6A%l*TmOlLtzZCPPK@H%Dh9(tn8gU35cqj5As%6E&~g$b zF43w*i?NWtn_q|Mgt=KRKe9Y@09uHs-TL5C^uHu?u0lr;!GP@sC&@wT+%fKOXSkQ5Q{K_ zH3#E^09dt4z?QQQOEQd-vM7KEMH)lF00x#rtmN>P0jeo&uUU^Q`5MnKAc9bc!wnNs z`v9=HwC;^iM}8y{#H zS#UNTo0}&xFSly36h1&52y;Uex%q9zH4Ih+0M-{3PCMcJ!NUvm03ii53gXAC1>dZR z1^pEvCvNH~vbN2fr^`|={;F_@?hsbk`ci^Li-?rWm*AHygHTkoA!YdBiJ@ct!%HS? zV8{S#0(P=Kj0I)dQcVQ+xke&XqKyVD!E#XojG~dx0-}{h%y&6_aMo^73RvB+jp+gt zzc7Iy1jZ>+mI^?JOluy%5Ro9X8U-QfTia&pzIV}AzG%>P<@*-kIpE2_=Lq@MC@Vq# zq^50Fc;u`8E_w+V6;{~L+(&KuH@%>p34{_OloVkUL|BFlJW#~I z5`i&BMA|m%Ar1{4Is%cvVyDi1?uHP#B}|ktf&v`{oVtlNEVc35_`kzP7M&2nl+afC zG+==9BR>Kw?Y=UH{KJYBsC7aXTg@Q61@{lpG@%waz$}WGWrVo|v=1ZKmXbxbK`w^| zN^gKiOoM;~3gi<9z5%h}oVJODfR06n3_+mW=1rrJQUODtf>yfeGc3VlLiuXFaGgz7 zV=rX!A6E*DE%rlVz}rfQwLsn7@_QQiK^U}gLP=9@-T6YAijc)Blp$3BIYO-%!hx`W z1r=Fr zE6B1E3_cQDA!HrL>FMr~CLYZwGb7o;5e`=l2v-tPA;5Bk5JEVTKq8i7xfcQpSpxgB z%bAcs!g6eYg(ZQ7|Glc}YoCUUJnWej%cyg7A-&Na;bGHG{xNjze}As`Nc(8M)KXMk$VS&2e~C za7GUTdRfvnNTyTC7=-oJ>9S1<;jH7dQy5pkhe;681JiKbB$iTT%(KJbW5EAZ_07>d#A-xpu0*q5|kv2q?34bfC|xGrHG}3vYK}tO^r4M zD3gNtrJ^Q>ar?QNQlr6G7(_B6r?d*2${1}k!mJ2>Evkhh(L_j>-@>DreCDCM4XSkxWLT zazcls0w?N2!3bErU@RF^Csl}3*%dlP>f~@Lt|#LONmC)cj6qPXB_rVSf=MZvN|i@t zm8hGc5e_Al5XfRwO(hkuCvrHhXbOb*F*zuQqm@3@w$V2;-VAJTNS0EN{l!%- zlOPvJLa3!ln#;;Qd%72dRdM^iUet6FdmLeiBK>JR7uP{P?qJeen?L)HU9tdxuJX}iB|WCZz*I)@ zOB^uZ(W&!x+6lzN7E<`py$&@(F$K3WLH?|Um4qTmF6U-cBydK9nh?B;hk^;PnoQvr^~s2u zk`v)@1Okh=8jlAnoUX!f)VK@9L69QHB#88aF*O{G##G!=r{j?|_}POhM<>(H>E8z& z)IqXi2`wIpN0TrT;aE@yLmY?507AWZh22uT^R>^3I~bs4;wbBGUM^{jls!PBQY*ENp!(qrCz>;dwU{DFhA{uU~ zi-6^a(0y`jQ`ms(WN9QCNk+qo7+4P?K_8i6`U15GaP6loLrk z9!a`QSu<<9r)T%RnfoMOi^@tY3UVC9NjzOj1;bJ}l?*|`lMK2nmD0}J@9mos3&OYr z8q>piFeqtsG95Qj;C}g_swK1vE3@Eocg=vqNyt((6_%86B&4aKXc9ki)>KKwqk|IB zP=#--_()9uk+4ZA3OQy1QYTrC>mmG3GNwsM&;i_YRAB=uJEiFK7KU*uMFBR1Vxf3M z2hEGZ_~TBYNFo9nP+`f8^I@8o&B9U$T$8GUyvlJkp{RN+7}BIfI2nq8y{Vx4oC{N5 zqpqeNHK3cy5_Kr0M8iQy;UryBQaS|55j7mgiPeaX25wSLPy50k#C=LEo`TpzOT=-n z4umG4*s(+?sw)r!R-|U%z8TQQXezG7qY*8k$dM!nq7=rsPm9a&2Xvvr5;EipQ(Kc# z;&L2>2@JiO&_gLHn2IV<_??V{WeQ7`l-|DKa@tj2#*ND`1bAd@Bmv<>ETjX8v1C+9 z$ni=`f99E4r@eV6kw|GNC5%V=$q-CwamagtBeI+d;iqDi41mFtX*K~-H5h_42;77o z3!#+g3Qn8jxr~aUN|ltvx$|`T_g8^)P_=MK2jP`v3BwXihhi0kHx+a_AkaBR({Zv; zNYRxrSjAX0uEij#2M3179;=C9I2m@CN-3pas>ZR}zSo)%PQ^S%;)*0epCBvMQ83V8 z;Yaxq$VS6jrH_xSD@Ugkis+azq>{;)k_6`)3dyPl1}7C#5|H^u5)~$X4({G}!OS02 z6pbsgk_t!UU=Sh!B^63V@sQ+@6xUKo+2tb}MqB?B&x2GW8YD9s2s7Y~hI9=~FxWvY zDuEYHRNCmxr$A=J5{8wC9*gQ4WQqJlg96S7$0@AEh zP?95(3Ua5$q^KMQx2dHPsY(vf;>Yx#kS{|Xt;ir1S}di86L@-e5S&CXBFPY{R#=mB zOj1qz7%8!^tS1tnJQCgL9#eJrHwHE-p~u6O=1lBYzMk$r#z;_;fo)(Z67+ypP~Suf z3>AcqvQlBv%E6QA|GoqgV?1dp5|krgx@0^cDISh%vJPofRIM;4;J8$CDw`04$#4<^ z$C!jORZ=jlhh!}r)FO~b1w+wF$8dvfII?T^fxh1U-7o8#ejb3TC+XwQocZ!?A zAtZ?5VR}*md{;OH0j`>eKu{1$;<*Nuz8qwCnASFD>*#z)3J1aW<8jELIG~2^EAbTM z(NR6323-y|v!SaZVh%i#4q>+%#-kx*MTe*zTvbGihO|g5gzL4F;;CWpn*&+30j-K` zDm_a=a-(T@!oLOr8kE87rDRzK0}@LlLM}6vR5~v1KVORO?3;-zHo$nL)FcXvq=mxZ zalo8~!jPOm_#KP8d?#!Xv}Z;LQloMBUkq%SDy8t)3OxcTLI_*|?%;DVX9hv>nV<%D zL?s~wh{jWDP?hmuNr+TpdMK&O5k;=B_Qe)7r~eyAPzfC}b|s33@q{%ny)quF5z=Du z2!!G8l4^Y9bV}ASbmZ{M`VJi2y?@_KT6{%{ zD3BbeaS05M8iUv|6%R#mb~6F#kzTSbpc^6D;^xliajF(Vkjuea#uv| zlENb73kflm%ZrFvOpdY3?HacmcZ%UHja{9c$BrEf7}p`@@&ldrYX%#)r-uf_LSD6Q zOdQS*_(dgCG~eJ8(6_@sl-6Jn{bDkg*Yx}jKcs}%TYf3x_D)7NykcEM2Jrh7=|zy; zjau=Z6%)6-+WWD&M1HNek!-lmyI?}Q*4tM{zVtf0p7lEK4l;JVcU_aw6}&-gBty2| zClJik1M{2N>3^*LlC`iuI%VT5xVFGZx8vW8@z8M+Ks@0ue{znykO$nH+$b-M=pLx(^9hf^WHr~ zz1=Gzhi<_?P2{t=rbVRXUEXo_82Cr;_4sQ6dFoqD&E&w3y?ZBae7ARG5&80my>CKx zHctFy!u#QQ6aVvB@BMY;oX>mTK;Hia?>Q42zu;X~hd<{}%>T0Y!*h^^dh$Qt_Rc5j zzrvrNJ_OzV?z_DmMEjn%bK<=Zc|X%+)~P4o`w#DH*yD?S?0qx+HPQPM;05{a6VST% zr|{<|k9x16j}!2?u8#cTqfJX#r#3v{l_sEMBd`AOliq(M-+jvadiGfSFKF}BFTAVj z%;&}AmS1{b&G5YbS6;Dh;%ooyjdQAx{|?wgi(dVE?>p+W+vmJyo7-q?rK2(N?rXg# z>s*Ip54q^|Adt7*4y^qI@y?srNxc6&2cNH@FDD*+hxb4oD_?xGX9fAvyS#_V6ZZf= zo9^*GSjT=I`H1)0dh+830MbW3<9!sX*OPaB-unvn3q-4tWZzW33|qI88@}j`qL3{h zZ+`dE1!VX?0OJ4r(7Sjd^`G9G=c3RpAa5V=EM>Ld_b7-%{}VtD{AnUrzmE~oL06hLj!@1%&-T^MFubOk?MmOdRGv@s4TCcZ`YRw{>){x#CyrT@% zyqmpWV;uPMKYA~tJtl`g?)?#Y|0lc|a`gkCC4m`6chS*)LG2`ial{ zi?^qa41Nt7LqEM_#qYf9$t^$f-o@&C_s5`;v=85X%$sK2Tz}ot1-CxweTdaq{VS+J ze_i_Bfa$k+4?IO@twaj-YxyTH_dpE`eR>br+A^F9#sZ( zaUe&{ES-MBW3me(x*M@DGK?3CP&d}jz8I&HLX_|%c}myw#G)hpHgH|L|;DN3XsID6kMBlqOl>J67yo$4iUnw z90XsjZQJ0vWrvteXRsK{kF<-qqqI(-mE#KZQ2^Vp0Bbc2E7`Q#ns0;O zl@lCznUWdNr`#NTy`Il1nG3OEwT1;-L&gzX3+%hNLu3pM?9-36`l&S17hR%XJXb6@ z!RdB7N(eWgSq;j_YJ~rdH=_LPPhJTeC|HVs;)jC420U<3#}Ez#68_?$=Hjt*CW9lR zLm*5mBBcnas0>hn9z|w~qiKbfLVMbkA-y=5(?o3qyDpAohm?F_5F(N6K)VQG(V&j{ zreqONQl}~a1f|tGg8!Q4njgB}z|@>#K%AJJL!bdkR+h$#h_#u^PkFDX&1SG4mAbf(-FaC~hDiuYfI zs17JUHmGM!BUpg0Up1l^uuH|9$j8QF03(uK7)wVQ-a|+@lA-3VI0)@IaDzV_0)R_r z#o-JRMr(q}Q;Q=2I!F7(Syk2vV3kR_ScO}hQ5PE$C2Bg_)&jGr>3pGRUStafb|kCO zn{I(DEQf!RV_=f$$RQXUMka0r4u}hM0gPWhmxgKC+;{g@TeFqmIth#*86d!};838vBkn^|n)`83i&7Js8fX!5?R+{h)l@x4++p4Y^NkE1H7b$iQGb9nPcaVH=>N zt|~Boh<%Jk1IPqrR7q#>(q)m$nbBJmX|UXR90Pj`grw$%AX=b=)4Q0ds2LIw5c_i? zWcMRbzmP+1!=X9`+{b?C`OFxCFnbE9kSGOh6QZNAp{X*UU}(X|SRYO2MhaY~c*KKX zQfVD5Wa~%)G&RFa?kn_sj#X?kMwDG1&ng#aM{-%HZ3z=$~Jh}I;f0d>_aIY z2I9dc6%1X?P+QQ(E~hpmzyXtmTTHtFHA10*4}?y79wAYc#PwY;Pyz80G;}J6Cs=CM zF|5r91~ZXHu`)W2mWFWywbRf{RQqGPa+Ko4#sRSp!jdsI21y+_r(4#B59N?zj6Fk& zpv~@ZeYfEC8$PRG1%Za8Wx!aVSxSvvZ$S`Hsm0cUu7eq(1$3~)-dr{X29Ej;)_HEd zsTtwn6BBh~aL)&6(2pzVb*vy%Wa`;(7=aVUYy9tgv{d31Xm`5&N;`T;eQ3Bi=D)&T zYbVw+UW^+*MwL83HQ#gJW-0lh!)T>j{YsZ8U6xIDiLxIgWOK325Jg=tzp)(62xo&C z&cnY$3iDdZ0JA#g9qI^(hyOYouiP-bL!I)3MywV^z&S=#JJnH#`=;Tn70rSqf{0te z?q(>0AWXyPEvp~fMNI=<+tx75UtLI-x&cR<(Rw%lqFT)7#;_W$UtrDQfU&I@BVzj2 z79?u{Q)^nW48kmXw7Wmm3WT?{VIzOPw z0Rdx$z_`U9FekuFf6QY^N|w#LppoN^xW6wJ^h_#ny8e}Wd}dI&=E2xgMweth?ppWK*Io0$bl(Y5feXCIO=g#RUgKV zrVDn9az$$(5NH#b**LTvc+-9OQ2TZyQ|jhFhGQ%>2*cK6wC>$5spxOA16f zio-0hEBkL(PG|TaEJ25xv-w-i5b%JlA1Ua#+1gN6J`ceP>4Y@;a6L7`>>mfy?n;5N z@rS9AL8(zSodx00dDY$Q!4?csb|L9$>Yv&nLP3?~`r?WY$BH{FrWi(~0Q!TI68WNG z0l-S>d3TyAcAFwAnwCb3-Oiy=O#?mhclg`w0}R*(vf#9})Ae=^KUdw&algjLt95h# ziJjoez+*u90iJvM(Ysxi^;d3lJ~+YgaYq}|F9uml=B@TxzRKyJ&|?|it0rHibH~(| zHGLJUsoVXM9x(ik-(T)+z?;!JDM&`>q5lm?#tr}h{~9icyPu9}`;WPdG_!p)9L58x zP_{reZ0-YH4wnvGPl4FpurhR_j)rm|Hw84d5L#g1t>%W)#uUInE?LNB1GEtXxI3H5 ziGw-x7n%;(GX>K`7=FWyQn+7XA&A0LZbQ1M5ZYjx(%5i5Z3Yfe#C{!ODe_?o3~L${ z_F#B($o9UmfvO8?F*Z)~Ky+j%2_wq2&ftYz&5MIz$s1^ROZkbmLTu-@0Vtq}O^3vl zFRxP@ngvhWU_%CK0b@)%Wm078(@XU+OS>@$ZrC?6#NS}shW(&#eblhhS(1kHO-o3h zZGGe1xAz7{)-VmGDKKmeO|`L|X0o2s4b0#6{m`$&TdmP* zqfIC-Xt5Ve*>MpkK?4Uap%0uBj+sQG=S+!POG?`?@1oxT@p{NL9>4LggLFD4LR$~$ z#e*g>t%ag!CloA!jnsCV8E_CBIIt(D;#Cq2;9syFn?(VOV6p;a?{HbGi?bQt4p`3G zU|ed@%3xv02@xm+wG3bYhMS5lwo91;-eu!;shpb?sh}G*Z35pe1_2S$VTvKt>X4uv zX5#n|+y?(*@C^T+doHDu2?!&KQIu|DbI&Xuy71`0g$ktU(8}*;Gpwi==_~{TxXzGI zkK$xM%TXI>9~-dG2+}0&1a!AcOw&RPmyEJNKg4kt=*3nxdCw7JjU5!-=FNPt3xVAz z)qG01)ocvuk-y8|CTQl+gczCDVsB`i?zfz7 z7kx_^8?a2n4mz)EYk(nz*nkZcq2s`SVye}Dan?#9 zDcPH@qE?jsLgR}1zNz46eQy^jvkJvF29nLuI~2YZ(6q5)94YpPjV9+;@US^XDI-*) z+%nk5MjH?ZUJ5p_wT+c_cG6B876H_vi@mnMpsIB5FhmGSY?)%aW4U54uq6%QlieTS zl&N9b=@JI;iQBF=4sYDTXs1$#cmfs6Zml4M@cY}UQ?j2X?Is;rUB}reIuS;v)wtE9 z?!R{WOm^%Lsr-Q6HX34MP{}MU6Ao_PFuDQ}ahhSPr)*epIVbN};A$xAo;Cia>KMj^ z=}v)(wPgr79JXdwZ`a_Jz+jZ;+T zXlP~Cpv*RbTkkk{o8~&KM`tI~^-A(;pNQbeBO5$FgE)oOwr1n5mYo@Yn?ON+>A z?ixmI9--8h0XMs>cn!VysAV5fLxUx4b{k2imHb^;%-dj$26h+rrSWpG5@a|<;;6R= zFHCd8!M#-Via<=e{UPpnlA?~sknDJjhMh#?4PS0JE>7E#;8WcBXh(z3c0BkT4LhHQ zOW1|)+)?j@akN!!8KrMp9n-liP8)C3yszFx9)8Aq9{J*6{pyLefA)T`MO*#4l6SxG z%@M_kdXMn=#o7(?e%jN-=0W%paR>S3Gv1by=Hv)&Ml9fN#Prd0U?e$`Esg}#+)$^v z@W|F3hR5hGNU;_27C9(MVy|&SoVcfGPQP4|$JKOPiWM&yDHN5_oVYKo59wo&k8U4e zZvt6(BjBqSnYYX##_ox~KI{Ez19^OraFh(x3p*wn=L>V@wmK&u3)b|bl6TDUkZgmn zcH)u-;rsJ8+fr@jNNtHJO|w~xw=5NWD;gW9?V$hJat+eAM98c)5=UBQ%N=PoveF}L zn9mT97kPvmjNjk%2&;_Wzl1u=neiy~-eluaAv&LxO&nP&{9qmt20iOY|8n7y1?+WT z;=$!YW-bR{StkxWvP#&t%&;lk(y*%Jb*qFH1NJ?ugjI92-`C&0%}o}FXRUCu_5mTE zS}U}g%>HoQ#663IzPdS`ofA(l7JBN)Z`KMel(SyWSvynvmk5U!pArwrE7u9j?HnV( zvB5dnwuv7t6#{i9p;s?|`OC#!`P?v@;Zah!#;%Ad{TL`4-M3W;FhAxCee%(& zoT^Zn=0GKB3|Z+DdYgGx$fg8OjG!F@g&l7rSNMc@(k;z7ptDUKMKi-;>GGz6EyqE9 z-gK3p=QvhufcZ|lXj0eKNQQjE`Z?o`WR)O1OqTeBJIGVb!e3S#vQkG7)HcKMlE1Bl zf&Cl|Y>&IEJ=9gwu(HD?KUgO$bCLQ_&-r!NOi2Bci-d;fTxGj<5#bMxKl!;R zG}Eyr^IC*th0!3dY!OyitS9ej5qc_d?{jm$@j~TZL)~1^p&94kXXiaIBUTqU_>wu* z8P{oNT*+J~pMTrxa4DtyJb6C%UDl)`ZiVIZX?*UCE@tBbDWCd-pYRG)btIG7$KTUd z5b*~v%*VN|x_<){!5>r`&eoUzXerr0h%>0bW( z@4tY#I@2oc&eN~X`NS+wPmiY)z|&XPY2Tas#i?^a!82HVVFsQYR>4q{p; zrVHea^Pt}_@ZEDdRdViP=uN2r-~fMRDgDa3VEfpC_!bD?B5URX6C!hk1LTIe!ky)~ zgE4hb$tx=E%%uCs%?)}M73Mx>rNFoCrJ#H7m?t#%x3ljRAl`=&6o+&ri%r#BmhI|N zGGZ&;k7?}Yr<-209k^AF?-z%$W?#CnrhtchqEQfiF5BDM$WImtJ2@Xdefq+^rQ2=G z3g5KSYwJVlwiUi{#ncVI&$)AB8Z?D~ro8#0(iyBhFnnwl%iIoN&1JRV1_{Sfy;`zP zALu8lC~Sxu8fRZ!xA(Vnk=@kEZwkVilg<@&zNqC`M5psgC@K6qIAg8~7xC2bvXybO zFQRQL1)qO27No2?Yuy*Uj1JCSDSZCaY{6^i{bD+8K@*NRQot5qreF@pCxYM}XIk+| zP!eKPi^-5A^i!=PUzG&kbZZ%DmxXRiSICGAI8IwP$iK?MMO2*0h7fQHMUyBY7}Cc= z!rIdigLlsR%MV z^076-a_t98u8mGv{?{fjXtE9)U{A(*1N6x}a)3S2QwP}6Z9otg8#B`M&FG)K>lPZ3 z7`gS&-i>SR-x!!5&6`zT1d7&eufjjKcj}(&2mB_CH~+=Ee5298_;TL`rcQqKHqW{h zWkihAUlZT|i?>)ekN({MSMS!kxd{7$FM764-0?T>9d)Ot?;evrgH=y27M7pHU*(^! zQC5|Iy+$jSeZYoq%fDfx!E)(mY(|I8kJ-qV=L<`F4FkkKVY66L@k6$mHB#=p3gWNw zPbVy<=p{@c9p`|$qlF9cUfDjEz(@NR6IOSztFFdybpuwSI~S-~JV_gseGf3netfKN zZOJz?9Q;|DBh9rl_P6F6h*0eRJ5n|urS z#sl)`yF9+dW~PR7DQ^ugSwTV}P!%b(WSKRqg6}=0yQ#?^Zks2NN8VFEpIq~)rp4sl z;Ux=6E(A8G_}(TD`M3XtKQCIcWHGrv#OaSXQZl!`mZxUQ05y%ow-UTMWx~#t!nunb z3>sc3>>}T}t4UZ!Hv-z+EZqr6LV=~eMr+pqb-N1Y}BQ3Xkyky(k;g9urC;s_cm+|J&Edvd zU5u}}?d%r|eiNCxcPF=Q6B0E!YVwC|5JI6pCe7O+u0yX%F550_WTH{GU06E*x$~67 zy8|LNbXSDz5PHvmzaib-0KoJiWUN~Vxi|&NM05(&CyFJ zg|zMzHc|6I4(jZTDpXcG{nB<-R=e?gX5tRNW z_U>nY_1-e8{j=IXtNqic{nsqGecf}c{aeO48;xwn<@`0n6m$~hZ{B9p3e1HzHLLO# z^2x{$!-&WI|KdtM4dG^=N`diDa;vwP?N`x^Xa zYUQlT%&N?+%G9DV&&+?_*`+eR1J1<>tz;hFesrF(l;yJI;8<)R6N`n;S>2n}y|YXA zZk_+})n}LPk^i_@I4~pH(ps`QRdH47d8a(HiZShq@ss**tvoHo@GmM|(JxVwMYb7< z+LYpfmje89ty)ldf!9R~$VV>~T4yDER>Gg2_nBo>!YN0L{W9ds}2q;S|F=N!TLm?>>i88aj1j)(Ea{)_{$IMI5B==93IEp=@xbW ziE)3s=w3A1B@U)(Q`>R%2bI+az!4$m(^UqX)tqG1t5TIhhNG5Lpa@6h zgukF4$HT1?!7e%2#o<&mSy&krU>t~`R|1)z5iwxdTv5s5fvbUi%Dze9@Onn?pmJ*) zhuL@4h>}Sc$MBdNcrT{#Waj`AA>8desRWJHEIFmNP{|gK>G>{k-~LHKuxikr?!mGH z$m9kX4gJ+jF|X-D1iKESOUz{_1;DCJsXb=pt_}Hd&Q%nX3Qp}>Nvqol({wdGgpkhV z;yNiTUfUH?PAwvwpd60La>UIq*!YBXU7-w8p${HE66`q=3m@s}n-tCS^D3c+#FgHGp@>`4R#$(ZAC_Zl}wH*WTM+ z2J(;@hZ^vVXATPf^t!{7+Iy!8PMR_}D%rNKo{(y8TpPC}J4MVR;ih7@LAfj|c8ERn z@6PEP8aq__w|APx$Oc$CCBT(Ns}{gDj9Yaur!sS=MAGBR)MG>pH?5LhEu)D|_ zc!-e6KpJr@m(OU92?O!PSYn)V4j5P!M=h99%M%vCRRC^vg}C{2 zK$gh?G~Lj%}{G0v4jq(v<==SG=4&=R*ff3ZdC)p8ex`K9C5FC2+Wau zxU@1gTTq+ZLa0*8?Z2Wm)PvJH#zJ zsqq(kx0IXwLykGd(x~CGY>CtCJI?NornfxWSkux%6-eA71*9#L8g4q_S2mH>(n7=K zE!EqWgyft0doB=L##)e|E_$I?EMHV|V#W4^k=e*xainO133BqsBC zFJvnOJp-As;lVag$}8{yR;#|~R-abZHMi<}uv$SMR`Ni}st0 zT(2==jd$4IAH}OTT8nMgJrxvFg=;USKx@OOy((Tb!me{NNEj`_Xg~96cnWBS%kT^r z1AQ5Nh~HOa;2SPQh>SCCBC2q;GR25Xlx^+&nr~!Hpr=sK^F=&guwA4p#qCCRmumIz z#^K(u3Gxpy-DX@-W(>@Z9VJX%5 zQ;g;`0Hp8^^|Y75pq5(d61B8OZ^TW3IN>G9AV|8#P6xsJi(nK@Fc>^mf+SA?64>pn zNi^0@I2UJ+W^>1~5ME)JC2mP>LCMzhIHjgpO*bnTywa$o97Ydst8C#`&AdXBU2Sdj zg`Sloc9b?xI_B|2AUU7rSJ=~AgYlR}T{CYfrQJGCyEU0aQxPaQt@x3OR@^2qCnhn_ zQ?N6eD;OGzX|DoyUN`iY^1-gZ;GTaaHl15D{71UP6NBk4cDE^R#PGMYfco?Ghl+{MV4CiVz(y=dp^zYo?K#X~;A~)f z$!s7_1oqgf<5COOg*rG*7&Hr5@QFqI7f(EBA?RB!2YFS`ftD?-5=OI_F~J)y9TtZU zu-m+M7~Ns3az=oFe=bQE2l;1}788+ulkRIVBrqp#bpmO_Z!}TNTdg5zFBdAju=ps= z^{JHR0_^fbdNElpU^-d+mtHjrfe6&^;;#a&0LnOGiMl9uYq?R$-uFZ4!)8U}xGGlL za1h2@x?kO$HS{!>(p!2JW(RVJBlt=-@1_Cf4WU-UP-smJ=7)hczaT9V#i)3o+P@vyOtWt$=;T zgIIY=py?UiWcmTF@N!$Fk}wJey?SJ*B&ge3KG1X{A6`;;LP_ErNIQN-)P)lz1Lz(? z?c$Y3!5xLi{Z)m6OTkbLLEj-iV8a1mI#yB!6kwTKGa#yBGa%H~%mtmHPR58!Zoo?` zh1%HRYv@`ivsiE84ZE5UYycgm&Q2Odm^aYl3p4t}J+ZlwVmcEzpex$>=?sL-oyDQy z&J_F%@LQ4D&9RQlQ}Jq8ev2+%T~F_D?d%+9H@?~BawmjRgD@UP%kx<`!kkw{Zx_|T zKI5)vL`lP;3fTayz`9f>2&})GM@>qnp+kG!yE7SilhdWb7=Xg`r-$ePcGbDT!5M_u zx;NgaHGTAD6L%@Xe|RVUuPD5%S!@0teg29_zI&aph8*~;XVb)-*9aFiYU}>7V zpYL;_PzD+jGaMcSMkjx-^5t_T?mH%|p8$VAfWI@1@c-NU%_V;3lcQMv(?)m&_C_JrYh(^282D=N`F za8zi)G5e3BLUW_J(~#4#0(!oTA#!e}v^eA8Lsha-l2s_#6v=8j_Ct!~D;coy9EOQ~ z&Jft}4MRe6lVj5&N1K9Dj<#eAqDcC3LTH(@jBVkgMO)XIThH9<{BKTZsnDFFe%Y|l z(qS(3mG0+r+017ndA$YKZEGH*oe%q~bHd6xMskyrWTOZvbyhYBTwi6k8hPiiFh~|$ zC9G*MK9f5^TCWm5NglsS2sK(eb4c@Xh+#HA;Mq!s@ysNB6&P7 z#J%PWto1%z5W3vnUsn*exxN2ELD;d#c+V@YUo>vklt}tv&$>o)M~p}ojtJ|wTIDvU zX4~&#Yk%*^FT`w$Y@5x zcM4eB1Vr+iF=6v2?%=HT|MFd5!0vzj6e!5$uMoCPLwKH8IMMY6VdWg{k;X^*2!wPG zk?n64!sOiB!Il0?QfRbd4J%|KZ+ffXGpo!eAAGB@e0rlIa?VY{%CkQJA`jgJjKF}0 z9J&Sasi$ue7TKKb{F{X>R`^2VHw&vyB~T&P-7KtdL?wuA@jPcZLcV%46qun0`LCPV zpqy5qL3Z9E1WLjOa?LG9KQK@rcisYc&7gpM%`A0y|KxAC2pcQ7ce3qm(9^2EoQ%8; z*lD_M^0v1bUA^yZg8x)qFofI;U)_S_2a(P@$1TcH4b6luNHz=^(zTz9L`VQc%j zTY*`$?dP!GO*x@~`@II!?>UMnO#2H9bSnW^&qv=@H%`{w20R>j*yAmAYgn?CwB9B( zl21MCSv!f>BI(bMpChTpEU)(-x!p>$BHV?6re;p8dNEe!?StB-U#Qv^~*n@L-jtr3NPYOb? z^lQS(-x07c>d4?{JmSRfuMx)TEXzm0^1TsZPLS6Kcg&^GcU~tPoA~T?!o_tH%Wn`i z&e49*KxXaYtX-V7i_b&5_`)`VidhY@u28!|+5ddC;?ZNr}B8frmW-^4SMr%w{cC z6^r%e#&>MPPqLPgcl^||h5S?zng#P36XRx+wnnlzDQL4sZPuvG8ns!YHbtX`FUK3n zzh4K!KMi)RKn{J~Bh-Xv^M>xch5Phl^z1G&`by}? zs@H%_n6}SvKcLll%&ooIrp|xR^SRdHB0u6ba8NI{8Wnkwama0;N7M4;1FsZ@Tudne zQ`#{XfK0T!N_gos+SK7)4n8$bI`d13VZagO4Fv!k2FEbA7 zMI%km^z6^I+D}(^8f$XbD}^h`it9j~|2hHsJEJE0ORH|{VJ7-lPj~{$ofl8rt#mgD z|I8D_(=nW9P|>fpT@R;XCDe?Q*4sgl(YP-)n~b_0P-PaOSvOnFUum9F<)~m7#N~z) zFiR~fx||tNv&8NSe6q91@&^H%ej}Zs@S^NQPRh9U-9~2gCX16=Xks?|=3 zsBm=EO0z=c)2o)7bt*WnN)^y|g>5}3ImW821C>s)GFi0UbTR1jR$FK%IlgMGS!?nW ztQH#e>~7LmdWaPz!}B(X9kF<+-FLFGw;UCA&$Ea{FS^yng3?<<8D%cswb>-Q;#pSK z*ts5OwW;hlD^}U%L@P^;ovwO|jdJt5Z&tCwr{5OYZeM?wm)cLeYOx<3+v(S8)xn-QZ>%wn19+!cMDpJ}41uo+!PeJJL@&`Su zEEbm3IQJKxPV#98JL2{ljzgb%>^ByfRZ0So-d}naZ>)S)lm!{l2IkY>G)h^=#PNOr z(q!64D_+^)Fq`fNNKvCt{^>UGMHthV`gr$k!e)zmw~Yz{H>42iY-VWxa+@G-6YcS8|B@aFX zF(^cO3okJUcTJVuu7oifxL?I!^5JdY7dF>55_QK?ANk@qh~cl_=2^SELPq{C-xoHm zu|VU0&TD7LZ@(|JEVh@EWj_!$&24LAD4LwN&ydIbOME2s8VI2O@JdK|`o0cQSiD|X zV2u-G@EfUSmTakBza3w?Uq@0dH^z-52I)k6m5^9y)FU5!6?pw)uM*mrNWb@0hKc{> ztAsB0YxApx^UaWS2@Xu><{DWnzXnnt=vo^KUkQY-8=4$lDv+)JjA_-cJW9|C)JUWq^( z-}gFUoyGBQzYYTOpZ=gpSj}%YFiKdL*k7{rT0vsO^?!KiNG2b}{0?ey0VnaGkJqb!9LCOe|J2x*oYs=w3^EU+H{)vgqrc4df-)Lz;Ev zZ#-+s)z=%Wzvp@(!hSslr7IoC>?hx2>Tx-%2>C~I41ZNRk)BGf^H6%TTbR6f+HDo- z+xLA#Sl7hZj|b7ycfY+s@H2$I*9+&;9yD4<#(-oa`PMApiFSV0!Qe5DY;MwT;~O8_)U%Qwz!W zegN5WwcLnw{!s8)xe(d+Lt~<9=!bk3jND-Ux)UouHz^E}e#CLpl!aXQBZH`n@vD|} zgdF*?u$27wO%VT1Z#F{a|JW#-Ece)GivXyJRNojFVkI2A#Dc^^-pa^{{5X z?)-A{zIRpNK@<(~jIrx>r3hDX8U zSo2)nkJ_?A4^bX9I(E&Y!lp^%XY!>-joC*!)%6F2M5nsC9%H|@66rC(NT<49{+NNM zJccDVJO<%JP0{MDPkY4W!-qo(~LYxzO^J)xPjJj2(t{whlP%ICWfc>WKSx zQ84ya#^L)k_8T`ZFzw}Vtm{k7H{+!B31Pk80K%^)b>2=oc~D3)PY9Q|M{wl(Pk^xB z@C4|^e|}%^l0QBHEIDJr*&5RG5LCYHXD~o5uM*;?8)=buJt1taHI7aS}7(XkNzA?RHfjD{rbq0!YYq(r;-W6832)O zPr~CJx6P|J<}o|TtDgkW*IoyN(O=H^1);93HB2GDe-ha2j7Z3ur-T>{FBaRw3w*tL znf=YwBMfraQ-Z&i7~-0yH*BAcAzmOc1o`xT2^(i)gtIqBAXoniI%7rzR>a>JjQHwJzZe$p<`CI5q zoDF8LT}d)3`;E%Zl`me?x^Kj+XJ0eqwQOsn&7x6HF0W>;lQy?b0?m2f0@kjlCFCXd zd6tDIt?j%uAsXhjXv^hg@y)GG_p=ngt0cY={R265P*;!gjaNmzPz2}4pV-}p z{DDS6``Fctcoki1QQXR_2l_#z=}UO%Z!NZo#y#5yjR`g`7e~Y$;=z%0QE%OR@WgnV z6;zSrpM(Qe7(@;{1AL>~ZZYT~kN!!xoY|vY&lqOxs%N0{^w-yQy=#<+5!L~J_}Z!{`!Y!4Vymttg$%~eyyEvbF1WEo;B_wdFELd4Ek&9pACcu z{tOh)y24pk_&jihU8oH&9u-!cwNoKxc@>2x4WnhaW}^I1RzQ}8X%b9!B#FbsuA^1!bP)Q?C;5oxp}G=o_}eX zbG94mg@&2cJ~01HE8TROoWIc5Le+MCBQwUuW4TL|F^pRa5SJc0{2Zw9^Im!DPH#ub znbFXfY{Ifhwo}{h%5qWCi)f_M$daGdg1Gfy8%=j!j01TIs-LMA2so94OotslOZQ&hnr*0HhEZ}GEGMD_nPYRwjY!>mb zbvCcx05;y3dh9)Q+go<+@9n?z!aniE{d@O_7hb$`&+cB)-_hB5NvOB8b65W^RuB#Z zC9xlPT1ew0x031X?Azz>Zrnat9LjWWAJi4Cd;5?MCqkj-W)J0TkODn zxPDP(PdgyrJzng@hTGIZC122sJ1*`&zax&|is@oT@5ThUOWdgx(vbB++rsuvR?xUT zlg=I$2Vsx^jFKz_)Iz}zW0u+BFBHczdSOu4i+(!S&hcOcXFDx-d~86^*4(s{^)8vy z#^9-?qeHwv&+2&v_jf19#9a)WC5sn@CQK_K`(|CO-pA7%xA!? z@@JI9JT!x0?__`S<|~k6teV~7mx1&oyc?7$8$>$?;GJ7jM(&V4gdT5?o&tf(=8ol+ zVccgw05J3EfkAjV${(q?@GzLMnL#asb->v!nJX4^Lw@8pucv4Hob?PG>e!JZqk6so zvU%i)md=CKOONVDju^v2YZw)*@&X$ivu|ac)AWK$yVhNSVywXE?d~7cMUFx=QP5C7 z0OPGpiQ)}MG%!Hv3`oJ=TwV_Z0+do5q36L!K(1MN6tHjxM*ug**T#K!Dxcq+A5!v1 zOZZJ+O*@;1bM&JK_?LOnN=&vBG&R<`SSGZBnx2|wlT>6-#SsVy2D0D?(UVWt;0)w* zBg03IB+-g9CJdzF(MU{>OQ~Qoo(x7bNeRZKU{Fe_Q5D{3eB6+VBgN?+H-xIFIC6A) zqLoG~Vh-LE+w5al3z^fd7{*9&1p(M*SOF!;ysjKYcQ!+QUJF+FYG-`pr`f^G;Lrw>;iMXl$E0LXO-RA89+I_i zP>ZBO@n9$#3%e3E?ZY~`*QePJ2K=tpf1cz#^bskk&_WECd+y>99AVY83xmn zQdL#c5}cWIw-ki8NA#K2TL~mS5!GUPG!zXbV#$aeO{zgvO2)KQOpTV(GwtIFLa!@B zqJf}9PpeXQRt#!Fk`*nk#uFh)j!Ixt6d*J#ha@c-3Q94ZGm)D286VLoNK+^p(IrLI z!kVrFEkP}s49E3QLQO_B2Qkw+oO{w)NZSxDb-e}WSXQU&tQbpKPbF1Nm-VcLqJ$cQX+|HFcDINQe2OP$|;)G zQQfO#$Hb(fiN!(C&jN(4BNZ`AE;cOON#J>)pR=_r42|q;|1!#z=}JL0D99(eV`cXc-=LEftUHp`0 zEJfu|A{7dUQlMPnSUi}tleN=H79&a=KSM#-De1yY%`45cmQOv9I~^6ThAjv@)*_(P zdMXl)sG*P&j{=K>kz_a#kwSJA-+7>~=cT7BwAJX5q^OdJCzY_S1wqwQS}K@`D={sS z)b(US3v+sU51bitOi|H|0*J6sQ=uj^l42D%s)FlUY_n#?};<^e!pBxRvWlfXgk&qIJM1ny% zmWt{LEou0yzP-Eq9W+h1pO}uM{*tq6uKVMj0LNOGxGSeZ)|f5Qw2@|wwgnP} z9)1TNM;X$Aq#BoWa9ap&EGa4jT_X6KByKc7hY%R->awj(;f|A3Enr0@KLFJD%XX9u zA>;HRf7#pNe6E=Do4YO8o(HQK`(u`3dER=!N3E=`>mpyRvtCnPv9r;FL)d70GAXr2 zw0sW;kgerF13`?3yBn*o+tF%`jy)y#rlKI!xWZFi5L{NQ45_G!<1CVj8YjU{b!AbU z3CJ@fXq6TSrz&DKt~gZ}v67WDL%gcOfBuQrR97{ti`5h$&X72{Elf_?TGh7BRb7;< zbvn~XRRet%Nzsfiq`J$~bS;ZczigGw%S~0VYFu=yE?9iI(2%OCaG$4AbqW)JwSu1d zy6p7IQ~A`;RE4R=HM|?vzolB_O+ zY(3TVlGVVTMbbAN>)F)v zhhyntyFS!iQL?6C-M+Hum96L-LU;OD?NaHoaR9pPoK%E(LND5_I&dLZU_{B&$bsF|Tv(Uvi^WZQ!aM^Vnfz$+t}qR3{y&L}6VZcI@dhdCB6Do%{Em5vEq(=urz(cb)=Mt73L%>dxAky0bQ>+U$I0 zO0iz`WNb>wtLdVv!hN2(=u=5rr_(=I$Slu7=Y0A*ZfbDObaRKPrl*b4)id)ABvW$B z)(B0D?5j~l~pm8vC`VAt00_={M+YXM~T{ zw>eeeqp{zpW4~cXf1Y{bQ=aUbPIr8olW}LE+dloBbyYOm*mGy<^=V@) z(`##6pNm%S%kjGa(*+R(SQ}AwZCY&N>2Ct8!a4i)z?!*N6>AyyoVyTRIM_=MJQ0;l zCZ{SzT?Af&Su~y$F$uqpin$b0pUaP(5$0Ck&RB)H_Kl7;Gq)<%GUht>Q&wg!FjPav zYC1j2AFW6_J3Lb4lXGW;r`7jkR^h2*r)JGet%|mcsUib`-#g>kpu{ATZD&F$=vSbTxWp-i^fVrc>Zp6^| z`pOyMXZ5YSRrqP&)LSz*t70wVrgQIbWnLc3L$oRubL{Gok>VK^&+6NbtFY6tA-QIL zRz+LJ&ytPLl^KdLt09>c8Cf;y;V%aBVj=ws;3P5vV%5A}D6mwDoh{cvN1{ulAF^!2 zBhZE*wCJ`DmdjKBt^tS^n`4r)AoudB23 z*s)^)#c*EHNU|gnXzVRC$+6<*NEd$Aw6^_$!<%ivE z?_^}dE7nD106!;>9`M)QsD1VIb-(@V9J2SD^WN$0V`+i7OHZY>9= zwcbYZ_)_0JZdGpc`ouc&)FboS$WNC0&R@!t3%+VSlGjOOg|8VaEFphg<_nPPR`{-( ziwCU!X{B#JdF@BMO=QpSy_=UEp*nM95HggEZtOZHi+?w-v#yQ&=W^fPEtu)iy}}UI zDO|;Pb^AVb@{-?sHp$+@>^Z{eI#R$>@{Z`_e^&Yqvhue;d6To8G>E=^ zB<}OgTV?eJ-aEdpB5(RQ!*eP5eZ;o~ySTyDsXqhQg$7s);My_(c`|tF&kbnD-*T2S8t0M>dA<)|k|MVQdho1gE5)b%7wgv+q@cPLg z?*xn`1>rlPz;mK$U1`Bz?|_20-r*HX3vPQq6#UNFnR?od}u# zQ6|F|%^S_7H5;mr--CK?$grko^rBu9(sjFZP?y|TC5-poQ;zWy_j$wQ758~pRqIzf zDc09_Q9SDp>P72{GUm4(h(3Q`g|7A82V4YfzD7JdvlQd%5{%;cyZ7{oTd^wZ;971G-tFB=Ev?VZ(vlxF)Gw!`kbh{XU%SYT{cHDD==6_2 z2Av)_R==z|_CMU>Z6yzX0_wkbo6pl=tRu4ClXZ*gn@LNnZxQ+7$6QBpDM^3KyMerA zasBc#TOl9kJ*RVBkPT#o!rrySwfAe|>mV)j7a`^`3fbmBuw5ihLcg)HzG z*412ub|>f;LX$SdmW7dzPbOT&Pb zn97?!?ApcYKpXz75y^~3HI9RH}Dg50p4 zt;v3_KUh@qW%08O-)My%_uPZ_!oa6yAU~`Lp?E&ThlRmOFrIghJH`zT9%~~*!?p4F zC6CM#J-oz7T{$g%w%ozWYHhT%xNqs@~t@=~a^fag_4w0vpE_gdPODmI^2 zzhs;5z{%lBqib_tp5r}EUxT^K==`=#x*3cIBUxS7XlGM3G2}9fBZ$U8z>PG+ia9an zZ8T35@euX`5{sa*C^?c!>3LS@WHMRV?_06@LclnrBg!u4qJ}7vKko8{*p(G+eZJ+Z zipB0j>1;bRKMYA_(Uz2whxYiE&!e}UTza9;*U@9{WCfI<%F6I?hC2xQZIIzJ=xO9^ zJidOfw`HM7k4%RlLvLH>CnNWHn^&~9;jjcmTTW}zw4Bl8O3!@ObxKhf*~gyQ;t%5! zP?uz*2fk$L80I10Dg2XkcP2)Eob?P>zyYx&6Q@f|Y$hYGL&}r&m##P+psz~?W`9;J zjHoJPuI&^P6^bh@sbH|g?dVOqrR|;c-+;I~Wz~ktDFuQmjX_{7bdBFfYlQ#|M$m)- zG-%yq^d&wC(?d%Qo0d7!NK*^njFmog!1o#wKhM`%Ib%D22ZZBh)_IPjl-wEhUE1W# zH^~hz^2wM=`pFx2a}t*DHYW0C?Z_9}lF>aoe9OsT)VG-0D{@!VcgabY^ph%gPbR~s zfC^wuSkRHrDw%+|SIH^^Y@XF@B#sm?LZ+%mS;p2mIc1!U!1|$dW()-dZ;7C%fXxYr z1smyprBA&E@vg+#ZUt;TvW8Mzyiy#v1YTO2Ln*$oGM7km3{c8BwAdB5*=a>;uE z2WG|OFETLilYPGWbrn)$1LMV*kwKFda>M1mWrAB04O*~_D6eVqk=^^jOkeN;?@pAD z_2l8?lJyG=Kz$#891UTRzuoCwO&cxgI}XNx#dN83zChk{ebagdgi=bgZVGAHiKdkc z93+MBmACAePN#9XYCx z*>DYk_W-rBq56;$70z}zQGLjXicW_hs&z((CPP6vMQ2OsAOnhxPEJ7?A7m_}fF%-);G@?x z`JKR_j01ngHBIX%@GX_ajiD&#-NSYa0-dvRqIuYkW(k|rvMUhcs)A*w4FOJj*%9>G zVAClvge})3a+SJ7XVEN-IF;t?QuF&9U7~Ys4x3}-y1+9Cgbxi7qgf9Z5S_m$+kJAEBEJ!cC)$ldbNr6%+RAGO8)_a)Jmg?v}f z!z7#BAunA~Ct_^hyohde>TadcT=RLp6%E4}3S+QOzV*F%ei|Jt<=Koa@WZOBX;ro} zibmPo&tjNOUbfA*ati~_nzh+hZ=Bn#y2*o4-!7@bY8*SnPLsjpvP+Ji6LXXEl!t>9xu>gy9WRv#R#UrF}X z*Uz5@ey^Q`-`(xx?FW6U$rrZ!*7#{XFw_2SH*TBoHkzpY-Oe+ON-?h~#mv(DQ$@Vm zh8PpuBgGPYt4i^ilMttXZEYF0vi=3#@Ezf~JH=}*kF%C2v8#{@-*#8zZIvkMcKo1% zf6{dc#GL;zWc64Y@93n5PGkN@w9PN!%c;X!Y#&Do({VI8jA=m`)h8d=N+z$UV^Z-6d_xVJR>&4v3kii=hz9bO}80!S&)Xy z7&L~%L8f27qC8ZI_i!!32= zsz=u?s`uISsBW}LSZI9zeAcVepVs?YZG!2Ac2sR5C}Q;%kE~g-}m4B z{#Di8?{&ZTMj9F0>ujQ*EzR^%Rb5?OUDZeR$v@YFTSw=d$zrI=vA6eTk<@= zw78C_2E`jzRN4l`@F$(C2*0hXT5=X1r;r5o*ow-NvA%eE1+~$Mjh(kT)lz!yoF}=? zc!68YxJ2+4jhL6Ls9YD)>RYre>B258!v3^G8%j&t$Nxc*whzr#+B<(A`v-@#`J{tr z_T>A4**`&XYj9$tW}WiM7EkVN;SLzB*@mrk-i)5e8d@=%PT_Ux_6`H+j~npoML7^u(EQwtkC}DUjLcsCe1Bj7dWx;!?N z-*RAU-uh8?wHd22bbMQyZ3?qL&P{1$*QAiRnr~lNtEQ=RsxV6{Ck2J-*U;gUq}VoMVR#MaK-FT^?r)?Xa zGp=dj+wez~*-0o1TwoT;V#f2xh+9w4qVyTICtrcL7|btU6Ts{+BAIi(Gir1@f7;9Tqe%3lQT6bRg=d%RQ|GEc}`$YlrZ z-GWD@J@p$_JoD`!ywp?zwQDV3$k(Yhh4y)0r?M;}o>YcSwDlQK(956pYYv;J&)X*Q z97WtFO6L+uhe@O{TgUvHulVcDr|$6AXaY+Y9W8W^OY`PC{2Oj~Id+wRB^oa*tFjHN zWX@dkp33T4%b@yGx2Ki}mT=AEWYM31=DGP}UQ-=iYZI#HT^}oNs$+NI&akO2valE`G^>o^n6mbt!$GAPo(C+Qgy4 zxE`h+^0>V|@RI93H8tm>F9PT{zo~NL+=MWEb#8pn%O2Q1@}f7k-@Om8z2e=gwE3F- zA6o+>csX+M>PFY2l>B!23&Fq|^U9|xg61D~1Qwg$+*rBBDe(a@?2y4j zEGgc$3#7JLx8+K4^EdDFZr{&ugZ90uuF~DDmF#-=^>sX?M}rqSZ)X1VHg9Bae=8t+ z+XtWX!nV?U+ar)Z{`SiAPYtJ1kNUT480D9^Mu}1Ul%d45daDupV}pae z{d-ID?9GpO^X&PDfoJbHyz1O?c(%ob&YNY=J?svTLfF>aM}aeF26l&5DuK15C$Hn6 zoaJ$Ht$?~ocFWGO0xA;{xKD{z0oI7@pIe52eNFw~apjJ@%d)w}N=3^?r2g@uz~##% zqlVpxf9-uTwiOJUKy>Ur_kDP>ckKJ{$PT&>&+IRNd5-zHPH4uz-6&s6mzrTMYtfuc zchX%gc++s;ay~y_-WT|Qx%XiJhL#WA3|uKJAL{}yPVA6fv)(g$G?^82SuN78(N4j5c8PeC9G(D5!SU%>r252#cIr#t_W1Gav5oe z#UFD`>kIQ91$)dHhx~<`J+pG0%Ba0!a4WvzGzDk=vy^rvwo4YL?5~ zVTK{+g?q-7zy{ySc%fC>7NY_i3e;?Lzv&^_m!gZMc~L@8{}axL)v~#%pnxKbAIlYs zl)+V|DF*jLzwmc5-Y(8dy!~Il@OLq`VzOYX*Nh>NN9HWudwu@nPPRgxgRNxu3K4Tn z4H8%~hFK_t2dY-9U?I-|maJw38;p4=YYQ&FdF*>wIzA5|yOv4N%!-G3fP~dCw<@0F zqVB6+lEd|wXTRjP!ww8W-V%dfu5SD5$eM_LpUM4hO zIu^K)on4#L?5D*5b8!Yxs$Rc&!)#!!b4P89s>tSCSTetqfnV-px#nAN%DMOUK*o$* z8;GzanvcGy@cu1tsv$KI|v*B8B5vl3Fd!N$uv);YRjzRL<_qoLGv98K><{cX=1Llt|sjM}BxUq5x zeF}K`Dz<$7*UhVHPp5o_%+IcdCZboiNCHylT={Z2Y|f?kIk9Xq|87H|kz6+!%PJ=p z^Ya%~VsyKg588E$#O*N7gU0N7EA&C(DF5o(2N1nC_db97qyo5UEoo+*lKQy z7PpO5QqSX_m_b)aXVWR8kQ&#f#bO~Xi1QtR)MPe?Wmk^P%J(nXvi2!fDb+5qvF{%UQ`szCs%7hqBeA_U9z#Q3%?Hx&mKH+L zM!OWi+Y<-9M06|xY~+W^t<`#i0tlwENjxRb9xmY(%un1N$Vs~R=eH>eX{fH!o(F$+ zn?oV3H*c(~Tq^0A{dJY6cpf}0<45w{PVML!n_Y3*M~^Bh^-fViIV?v|-u_laP(JvU z$~Bgt-1Ju0%=MvqaT|*S<&L*hZaBRL6CHiTg#}rkyKWS)Wr%WxC+N8>b~>!8#f(sb zu!`>6(s!os%un7P$Vy#x*H4tLx_NSy9S!V*Kk@3S)#eWy;n#!1l^R=C3%#u}aJE=q zvAgl6$yFQAfNpe!l#sgdWrAMsG2@>MxUNk=>bZp(53XjjmC%I&sdWOGPA5{?QAO32 z4Q#U$*fqsmK~I(o&B?j$xBCP3Vr~U3i(4FY9VI2{T&Ui6E(9z3-iBx^dzS`R6gbw7 zrywP7#m^7|qa_N3d}^%7p1T^#Wpz3HsR!3-!YIW=Z6ckRG_*|7C?Gk8UN|k2hpczD zQ!LT(L^_cd>gPlZt+RkZcI;CQ57JHuSS3?{6gNWxN2&9+jSU~F+>DjkcPrY-0zg%% z-O0>TKGR~;xDe&o;SuWq3e{p-c0LR%9YR4UI_E}#3&q)7HoO2dl~l@}W;hdAs$-hz zeO{SnjJqUXcHi@JOf%O;E33>^Z?4|BNS<4=cb#6J^-p4Map>Fg<}`m7sA#Pns8gkA zJ$J88wZd%{8n@tS#G@MhZ`GpYU5aRtCq<8LQy`wGCiV6x-I`?q8pN*<=AlDc&A)q& zMNH*7B>Ccr{ zR&KP{Mz4B%+RR(wlDbZ?~ zE>An``G*xf^3KDnHd=b*7Y~=#p>I39>QwEgoKyOE#7R}5YwmL&V^Bkx2JiD?z*^~6 zuT<&OFeAL6QyZoE(~^M<2Y;%ax85{!@2!E2$Nz9uVAG=H-=6icYC7Xu9X~pq%NOQ& zEYMxTyu}|#RpM9Od}D23;OtFF_Jt0y-1;~E<|f)4?~ZqYKOIMQ)FY4h0cQC(u?`;v ztSOGc@X%s|z4%Nqcoy!rnf~r?q=PD}Dv2KR@lFu-zyBNQZtarQGIDEE9Ez+E(c&y@jsbeV3^apAdnfH9JB7(<|JI#OoUd2ZCQX{1K@ukMkuwD2khaQt^l|m#?owS}@eBWQ^Z$O;ABwZX zFQ6VrM`C+X0Njk&f`02Re6kcr8$O`f)EbSp?#vd`X_kkA(Kn1blBwI88q5<%xam<8 zI?kR=&uY^-gT)jiuY4!3A(dBOXZ$KZeC0v^b4xViuQ~zI)UT0f-J^)6evNe>#9%i&3pr4**<8VP zIaNY$`gv(WzxM?}DA+3tClt&xiO>sWLLsX(q1>!f$o%dXN|X7v_reT#^?}N@A#eI* zEx?8|fJhY61$mhj$Z!vEg@ha5TbhLb2PEv`(`ZlZK;Ouy@RCcjO_l&6Ynw%uylNp6 zW_7PZ*niGJ*m~qm)y{U7^X9cJYHQCrWN2@^=oS>@ zgw22dl0URuobBx&=;n_xQ(ok!{?IDsx)8T`4nIDd zvoBZcv+M(j9P6f6#FA$Ec;%*boEdIXp1q~i5(Ij^)_T*Dfa3pJ?>l~#-)HGnRvkpK z6LOL9&DXsr$wg*Ya?t;EwnTWsq9qeId$vRrJ0WKoTk@)t?kux5p(kv&X|-$(izeOn z0&mh@rAfThiFnP}p!#yXW=1Ev#7;W7b1dk5B6m(tnvsicvQ6%Kx5F$*{>g7R$-@fCO4$>4tdaDsC*)YO zW}w&X5@Y5)i3Ys==iXw>N}Y&@jYPLD+`~qS+sr4vAnoFEin*&LD1Q74o)q&^C*o=& z#nFYj+Kj{GM_crgM{Vtxy!E}D&?SOU%0F)&Z=2LWx!yLT;{PdBXeFI$LD_!^$}Vy& zXS=J+3&%k*UY~@9ys58 z?4rublX4FZ!PTGe33IxQbb=?$1MWv~lB4Etjzc|i+D05CF$vVwGPEO4|d0M*qAg zWR@d$)QVR<1U=`t%k!;Ul|gjy!`1ea=-<3m9Yp6Wk{@<>)rYHtCt-wm9h0apcU7;9 z6B24~o*lEhalJWmE3o|!R{_x!vHMrI%e+|UTJ#fqdGU6Ka#<#?_92HHD|hEn(;L|- z6BpQ1s%0Ew$n@P52n3Ioee!IcRZHvWnRo+|1#=UJ%;ey!@EJUtR8lKu3#l}nfyt@S z5e+SqOQt5Qm!JWSpYX5<|8js;&n~x*UX|=}=g6(3KBHpGuo=`)knK<29vG=Ah=knO zYsL%a-H!x<%@}fyFQbqpm6Y6!T#;;=d?GukD{%%pKddZQJ(DKelb#wz)HR&wV^`-umII zjEe65DmtRFGMoOWQ8|1zcp{6iW*GaXd5<$GYyGk1q$W8`#TqK7aj=GqQ?|qp%a&hS zoZNo%b+9BE9t?S?YR^VBh`x-N8W5ZFzSITwDWOx~#-x%PVgj5M_7w_NkO=j%EPtX8 zE<0_fn&kH_+*g;BNphDO)*oof&(Iy9TIYgzCvs3-Jqt9jeyJwPOg$|8C zhx|R3mrgY6aameykg}%6eO&nauuJXX!OnMzm{9EZIz4t}iwHh?SF-L+*EEd-S6*o4ibs4*9w$F)L-~c$+KFS#^%Pm^}z-IT4s)*Xpf- z+hj>!)#l$S!Kt=9!|!nwBUujfcbd=Relb+!#$4xL@ZN^%l7X+P#s2n&|zMPwRULC9P`%>uY>VCjM^kArHxG`>ksBtRr#E>GwfI zB=^*IXCkm0-c{HY&E?rQ`wMjBz~MLgNhIOnZ}xQF#8`=q>Em9=>{eAZwcmdj@Z;8c z$@6HB6u&ZHgRx&^wik#aOaw3>Q)6BG^4pHnyz4EmV#0C&cE2q5{v`9mbQ>`qXY~RY zE#@-oXTABsS}5)cl}K=jY&9u>4J5t@d>a3}(voC)SW(sI8Gi3I;Wwk&`>gbulxQja`f>3wSo5B3`ffp&MkqR=KLy8t+{+^NR#g)%xTVJm z{ra(TafI;R3TBREEZ$t|eiyf!@y8p>1`hAT#sw-mHruTz-_LF*0524;-2Y7Qn_SQK z{VYEku?SA1m-f4N)zi(3qE^TuDO?7gu| zS@^#0jDLx}{g_QysP%wb`2II)k11)PFXEo&GuWF^LZ0`4n2DSB@JmZSYZ}oPesI@s zx_9Sm=kqUZNeAX%)KJ^MIA4v6z5|OZS-fqN50FwXDBypnq5@ zHa_$GE#tj>kMAU{$rz5|yyK3S=)1{$-^*EFdqr;=WsH0v4`RQBrXr<>n{Ng0)qO^L zXS$U2sec_m@)n5~x<7T^rNHPrxTVNmJ?~;D&iu6WYE8JKe5~<4(APWN*1>jprZ{D% z^JswzHC-}OC_m!4kdJ%qBHrmxr12`(GC|e;mVXG?v#UN>WTzdI_sQ9{LWiuO2(2Ky zY5nQ*;ZBL)x%W}c!>iy?b)pW&?OZQn+F7&x^o6#L`$pmoEbyzk%i8y=(CBivm6bc0 z>s4iPK80T_q!+MBo{+~}cJk5xGK3E9#@olitaVb=(NeI}*Rjf$jChR2#g>-66Kq=r z-520Lv=jL!-P#gGU@#P6)jT?6!rz%3Hc@9pHs>T(;UFGzYW-YeCe8NqZ(8d;@6AZe zz&G*4)3(3sB@X>^D)Xa{<#CR+HYhsyJf!Te_E+i#o`UhIh~z2c_d7KYiaW7ebFRr- z;2@B{fO4#jX;ktFzNvv6JGzS2&(|VDqJel7OP$w7uSfHPqKPJ3O1OMacsFE-=n_NH zJfTYwWh`A1SD>A6N=WyUkeN^)r2tYnyS_KZ$Di{>=_My5s_`PI%0zOC{bPYt9oVuE zF#aLj3Unvf@+KVowv61##zxFF;&nV(NRFL8v(xHY%5x>c%J}hP7aMDg-{+$IX@&`r zj>BJVGr7eFK*LRLtR8pueJ%9$k>F#du{0HOUE{L`_uyVrIJEMzdxxS?`>cIzc|JCK z*{0{%e4xMJt`3ypSn7)(slD&aVuu|kRmzDbL)38U#=r)m3wAw5^qa(Zzt~sT5U!a& ze`-j~eK|qhmvXj-tAW8he}z00-%7F`LezADI{pGZbHBuM`Qc@Rk4HsE=us$e{O%DFj`L`ZZy=uph$;$8dLV$GWolIWI_WZ_? zuFotOEB$vlN~>Gfz>c%5?B*&ifg^)zjFKFbIlqq%G)MyfN{7APJC`4Ea6MsMnbVQF z)EPQtfpM<-0Nb~YUcF;VG(|7l<<)+3p|Kc(cy?~CoM39I8r;xk913Ex*+FslOSivO zs=r|B3+>ouGGjgs!0P@@#UP;|GrkUT`@8uh!5}mPLAyX!QW&1mE=mxkS$PKxO=P*+xerz}+*Bonn|Ek$j^VZa zu)40fu^)Y_$tQe|?DjWvgDMHa)ad7}y%6%`9)WC3-x^@Q%|XfY6oEVBLm^O%;2ylwp z(4y+wA08poPLm-=?Q)6?;hIy^RyX0l^ANq z_(OolqaWb#PnwM509J>aydP1qEuPs_hROnbfO(q`+imBr6C+vOMDL^m@02HSw2uN)jG%R z$F_u?tb^#3^QI$sSsu&E)->M!`S}^IdWc9h*L>>n4vv|pnHFo7xb^z#=I_WH zsZmW%nch4H#KLI(Za;kvc%cyu)1>URqD7)pscr2A2I5X0bIWyb+=(og{dQK?Zt;`pY*v?-lh63??zEzV93M9h zJMa`8Jfo<}-mj{@4fQt2!fu53K7H^D+Umj?gkI_EJB9Ct0lmYvh2{Md#BYs;fR4^Y zQVI`+j8Y=?J*iP_KQ9W1K>O8wu9WWLZwM z{^AfF<_0)6y+$X+8oE%KP(=Rs=I4>{ueE&IHD->1uB+EMF}>S`2{{Zj7;tG>J>|@tt(Z& zYwx+lruUAtuglPye8g1reAqt4*`mw`7@7`xQqZ)a&*2O9e+B=@oXB}lRBu&Nbx*VB z#m*dha4e>b>ZB6gc%TEW56LmB$Xvq}6gV|l%KH03=4(LpR2@D&Ad$*ixF@k7XpT+O?pzLUcHLu??9_Fu>e~+qQYwO7i-9!ds zO8^C?wtcN|-k0FsfE;oS&nOl!!Hg`-ktrNhhZg^lBMOB!&k-Z4{qqgJj8pJex7s{( z)$z1U0h+0#^mNn6nH4UflFX2)C;CFN=3B zDCYgcc_8K%pPL4s`_#&qokbosUQltDbJC&Q(lp2D{lC44bUguxmL4?~T}n3kF-6aT zss$QIO<64EN&t^~Pb(nJw8hc`=q``R+V6b|)udD!b8Nl@cIz;G4+W&r=X3-o8X&^F zgVy`4!}PCBF31M(W%gL=uHjbOlu?JXb-_VeVXvtIM0H3bM!zdtpOM{gkO~jD?CmnM zt4I-U1{9!?n?*j?<)UqwAv&9$>)JjmUC7d1l(t89XFX49a8+!EsnVQ)>1({jCrITJ z8!J%t2K&l9U!>WOzi5bujku;?KJdO+X^l0X9w#jHbFID_9TBCWK2Lw6@qsf$>zb z-EHn5hWLHRnTeNq44(eI%n30g2pkw(RjVtaDxEB@Wzug03V!Cf{gb>1J?nL4t8sn? zQALgH^m47}IlcLpqXGHxryF*`x3PI+M8N#}3)t_jdh%1_YYAOiU#gAJU9UgpuWHFl z($H{A)>n?z*kbszzOC3lilGpl>tI2$DgTSSzZYkxWe%&+U(k4m-M@nT3(Yz=77^7y zeXoACR`Ah9Mld+zz5Ud?zqY>?3;c67cAz)ja`Wexkt#)*5 z7NaGdwF2rw^wK;5=O9M|vTfkq`D~zOJ zfS*dTlAXjWwUEz#?kOB*#tt4FGbWv9#`@>jNdq>gf)FDTAmz4_+K1;rIk|}x zw&lGB<-XaiwV8HMH5y|DCW~SejvXPg!Zc(oc4PZ?-$@(nTA%M}dSM9u)7>}oUlWvg zbEbHY-)v;Ato{r?mV6KTZ{mD zcpKq5VUA7r0!_Je8gB3a7I^g#ddC&GMJ)FxRycmM61X+HTb=jxf?0z{h^935y*O*M zs#2d6>{OMH9})4lLf#W)$Z=MV)Go3nzD$5Lx!1nT_6191x{%iUdnyO_w3?h~8H>U<2VotH8Mgz<*W#jmuu*AaX= z_@8w7?F0YNtHw81AO{AB+wX%U1gcD5GeO2%DRY1fg5tpUvH*&Fy;GTR9Eqg-cs3tG8Cr5XdL zdqcwx#}vpxyc6>wbw(Z?*Vxg9g-x~H_w^xNubak$GSh`zNdUz~% zvRG->S{Z8&rGq9`-hlgC`xV)30qOEYz7rjs1Y zJ+VR@!{cG^IzL^1lr$i>SJ@nLlE2>&cAXt9xG~X%6Sk(Dp^TLjG9ZDY;Qer#@tr&h zg;+>0#^Z$&^fcqvV_aX#AA~vPy8AASDrZj;nYgWah8_o;1&wsjE}E2!ux^dD2h!k4~Yhk8CF!Kid}19O2CkexzH>lOB#+07Z^u z{_cm>`4D$NC@=aGuHUtpxGYm?e|{F|Rn`rf!LMEF%@Qb#2i5x1-SO)McIHpGF3hlY z6Tr7?bDe6F`SbNwBJ5By>N5k5N+YnkoTn~1+p)>;J+%J}+$fuJq2Va&th^|XF|7&u zG%8IYzFsLzp5hrE05(D0%YJ~E%?b}SHV{^N*_?rAic5@m#WG+yrh4ScPZ6&Jg2$zM zD_btTjEnyF3A0VO1!uw3XuY4if9p{f%47Zl36-wOt))^0c5)nC3LK;B0+*|jMqO%`0@Mii zYIfaTkR!V->b4E#96qWxC(&StqXwH*&7!{|lW;>O&TXv|$xDprfCug0*pHtnOZd+#xoX^VxiR?rXT5Uj+V)~ek6v!aAwwV zOU;NT0(33K)(9r(tUf)ioiu5_WK8?f>K@WK?|#53XWznUBP4pKS+n&bG##j-sI#Td z_#xW@Z3jzyqw5wgLU%fPbH9OD1!%vqOs%5zxMS`_^DKHc{$X}QEZC#EW1iN>vfNQ# zZBKG{M9H%$rQzd#b{b8M~g24Ax48_Hdx@^Xb;>2C!zz`JrQ1SCoRf`2_v-DM6xsw`SqQRKe`~bs4)_wOgyGVQ7}y*+1C1;o zPajGbqn-ER0!g56u6SDZ+{2+|pM~1iIsk;An<5QU_4=?iFl)$=vcg_?vbfPzsjB!d z)=bs)!pYR9dUlgW&(!Ca$OJQY#N!IC_@XPD^Heh_d93(G7=C$1vDeH-o_mbPZc>zbUH0dU zJ9%?(CEbRd@5lIX|2qwna>YRYJ7hUg_Ya@LW1(Edm3v1z7<93jYU#_HcaM^zuoG%g z(ev~3LIviYln8*hD=fCIDdY;GM#;){B@}hM+7=6$kap|=@3$rq)UHcU$v@U7hO|=O z^#lH+9Ir#Fn5wz6H_NZe#mU2jiul=?^o7MmBHQ#c)Vdt!Q7_NW!=g08Gsrqyz^S00 zI^T zv;sWXFUDp-x`&s3z3Du|V;w}$W};D^#=uPJ)u_#U|4^}QV9M+5Nyu(3=jq%2g`hEV zi1}j2djKZO1A}$0<+_Lj9b>lTqW^Nz`gVZ>K7G(!u6Z%}0))zq>Spetj5z3W6b1j^ zOgZ*xqYCRL;Kr(wzPEl>9m7i%5JWDy0l;E0_Tl@IbAgmmTp;<~M#StW%6oEWCp*qI zhOGsBt8I*EQJ-}T1Hs8d#keYm;c#Gkb%}|2l^P=7q7Gg0!Zcjy{FH-ubOi*Pr1GK4 zhU@?k)j1gKNbU;in-&HWsF3yIMOo(*;#?5g3aCc^GNOBsWnk9jVModCQyMguA+Zd=F{#JqnF4gHy|seGf} zpJg&|S_rHt#g`!7V^BLrhGDSv!@I*Olh7X?Ag<&=gipeg6PRnjiPakp zk7iY7F31zVK|wG{@O`n=c7CA2Z6eEVF^&d8NQ*%<-zR!Nz3x5T&MV03j6~|6&61M{+%nXc-PE0Gil)YcG~zzR8z%&kk*t|mWF7?>118`QrwthR;nA8r zvNqP&!6i7u=7RE+yTo6C2!mj_zK(UXDp+IkMr5~u^pbdi$HSV>A5yILJ94zihxGoM zY?kr-?92kZnFNX4?;F|}K>0u45MEuzh*;YBsqY5Z!ufANvwuR01A2D;c9R0R8v83c z8g$dP*?Zfhh8Ilm3NjH8YTmvIuG@NZ6?bJu5{dz{0`9iUoz< z25ReV?KOkC8*&)N(COOom0UVV8~A18u3ue;*Z|Cl#RK|x5ESUR&$osZ;b@5a^8k(; z0KVjT`%O{9(<0DY;yU-#rNf_X1y>{|OEr2;_)#2}_VkqfTH4eMDYRa?GrmCm+jKfC;aa`XYAp189c{ zBp$YDCz=p{wG8&GBA|XB$m}9QG-4bvDmZwtEFMy`#{N985D3n=dhA)71e&HfzR;+c zNRO*LEl+A6f(O4~`sj^Xku(7UPH~b(tddB!!+W9L+~GX<+#AL+|6FwrSQlCOvBIjo z6d5@etON?7qJ*QU8tyeeby7YuT*v(YQ(RNwmMnvFdrpNWNkn&(;k215 zMF>;hA-S|v^IrS@Um(<~I|mxni0v$3%us^r=GY}y1UGH_;UlO>Bue^zO;yeCf2=Fu z$T#oxryFkloVr#scQ;Ackkl2^Me{`^`|6v39ppL4ww2QJLlv$+3{-X*Mj9Sb>lAa!*9jbCkk9G4V`VC6E;6H}y;3yU^13lf)ucVf48PZOy>bN6`A-HV_>rXE zwCGi%)(dpky6D#Y-r)arGQEF&Kb%{Ls4G{r*^z{Z!ehXawHt{uz&8OO@=tUJ%!W^$ zL}n*e3?V0O!=;8EbwNbuY=k@-=57?5#T7ra)8&-$Cjy;LoZ{wXPAL=-gCx6MZ}PB7 z7OPw^j|I1nPizUyO|ufCvpTVA(mL%K2+Rhnj!kI@zB$sE8FgMV zR6ec?k%=GU?Fl@qm9NOdTd;RF&xsLVe_XPkumO)=Disc(!fRdTo)r5QW9O;0aAWw9 zl}|01bzhEcNJ-5NpK-20(^TwtN@2K=iY2JLvC4W23c}#Zr1$W2_*|;(L>*=v*{+zp zRjgd_uBaquaS3ZiSM^DLVN{yHgX-+kjH?0Ngqq}-xbWsF{lzqWO^cFckF~A$ z0cE=H%-v5YSE#BiC!qv>-}onIhK3eJc|9Uq6>lPJl>NMnz&jIfOb7JDd7MiacMdnNlmA@k1`h8Tp3~lm!TM(o_{E)0m;T=6g!O0 z*;>zC`QLr8H;7-ZYX+nl+0PwGfmbMtgKnd*R!e&uxc?pqRHY0XnTXd7qvfgN)`-8r zay+!8&pE0VF)?`uv}H|HDuW!08>f5V%NfADB+VM_wL=q!SSPIExXraX{9aelkPkBb z@unF!GI&UHGlZG(SB|^efk~ z`em_ST`T6+pAB9z+JC)dsXcc`Igf8Q=X(9nFuO;`y#&V(YG*=;%T|z{{3KOQv1BNj z7{9R+Z&$&bl1Zf@W}(Q=6hx#d6A5E#j)$vtEv8l>3tF+a-CWaC60Nr|CitK%XH~s; zfzy1sf2;hxs=f+!{#KDtrZe=Tr?k4}@4^o&Qk#AgK zOE!{obXs4c(;P;I{A^w^pRZZDjUh|h3DkAefv;V$f^RX`#nw6CT;ND&DlYVW3=W6b z6N-yPva8(DY+Uk-gU;oVQsM%Mb7^4Rs3DYwox?oSAH-V3)B-06p(Wv_NtT(|ZzGky z(Pjj!B9*nDW0AuGay}ird6*E*j-(`amG#d!u>dt6AEgxw*0^l17#SxxE&{Hwcnv38Ym0U|Cy8EzvA{eyyC^28q45xj#_0dKYGExs0;_}!O zS}B~75QgTSHTSo5VC7UOV?C)c4>E<@n7>}VuS;<$hULS0*wi(2x>zF6(?L9#=8;hy zkTH!>mY^#{kx~=6G7|jXaEOMjln?fDY0lxw_UR5)+c^5)dr9@U9>&s}SEh|7alC|- zwn;16<*a}JnR0a{5CoZ<-<+Ce9)5-T8nX#iL2f{0D2t18KS$V_zRAsziIS6vLBFAW zR4r=Vs$kxS0BY*9qiUeICN5f0E0xUv3wmuIQOHmoYEzVv<;;XdlxhL`cd)w*iy$8T zcAa#RrlZKGF_NNxiusJcKneczNL7&@D?yU(Ws<~On;Y%nHr)-ItJl9xMBF>THAwMe z_{VBQ>QTv4Xqz7xGnL}Z2w?HSPhiPLI|(eRk9l~5|Fa-hD-*ZDihR+c+q84u?2?XY%^Qw?JEj3y6;yONxvZ z|Ll0xND^MmnC)iFcTS$RFFe`e@ITg=nuA34M&&RKnlGq%Oze)ZK)8YbUSQ|(OrD(8 za5b8-lyh>f<_m;w4iEC&cla=-iIW$3aFGOc5acT zoeUcFNoir595`uIkVB|0wQ~k+2Tuk|g07fG*`flZ^RRlg29sE=g$NFz&ZZEH6BVga zI7nz5!hB>d#rTa<8jTBe{rFlC(9TWh)Hf@ZbzRH(7u<(`PpcDHn%kBlzV$Y=H?+v} zICr~-uMfxKOizd5)UWZ1oq#!%2RM@2!ZZ|#?q6z}=*ZMs^+=PvC_WNL=)CD{dgs_t zV{ibu$gqBT!+&#y_Lj4#{YjRHq&8;s2B#oXT%`a2l2z5ro zADgriu!Ur7aKnvN8Tzl#<&VI%tg6^y=G+a(jl279U#ODn7qp7VBmYR15Yf7%&+ncs z14_qr+(#Tu8*mW{KM*Nv$eA|g=FP0}&F!H5nT`in;6%4&`KY-hJn&Bp_grg&aVDlr z(&^B>Ne~6Hi9eyC$ckjfAL+%g^=TLvSmsX(iC_f}(dlb!v>UP-1dil^;dz+0ys$y5 zL(1m0LB_icPRcn_Y4&)Ck|MklL6(AmSZbMzM3yAlr@3Ecw@_qr#ra4rqgF6tIOZgy zn3xKa)_yU`nKQK88vhu$-72D?h-}j#7FJy zU|2XDqIQBC!xaiAuYgtfZeYn#N_gZE%HwKr<^a5Im}rNLwHTxer#UmbpnL}~kHeU%T9O?N>m0RPH;#$2LK7v0p8G_Bdn5ya235chksuqh>rfR<4kWatTb4GS z5+=g{+p)>>sYtYb(F*zAr9<+GE(7ujpc{dHnMT=nzxiuz)__i}exVUSmo)?U1CW!- zlr=L)QP%I#U|{m_?rmf*$)b>z90KR*Vsa!|>tTIEj_1c|p#H1_g&EQS0F!(2a(C+* z8ASoN&)$*Fh-X?>>P|gMHCnh+h7<_50Q%pPs`$vL+?7M#G#NOIrA}f&@=DB=bpNSK z`@lB#C+7aYGzIP9y9GyRr>N&hK%Hssy33oIcHW2DY#A3t*$ln+EC_%H2pXKNff)N| z$@(6dU_RJfvA#o~5q?M8t0B`t)GeAi+pu6F+ca(wGH+!X8t;wxT%6r>oN!+y)hDAE zO0_*vCtkSwjq`<4!lPR3)t>Qeu7^p#8?oZ3Ed|z3vO{&Iiz!$}e(3_TSQlpJEtlDB< zPtDLuDoLrvu6#C+2~iAe&yu?vBV3WiX6C8SC;9he)Lj<0dsNbe9s(72{%C?)B+h|Y zWL=!#%BY5-<(y9a6)Yv%C|2dPaxhLMEmPd$n#}TuP0pBCfEViqb}FMIsc;!ltrk41 zf>tGFP)3j9Wwm1=(8Mm#KokMVdeA=U6*J8BTu2JcX609`Fu{T*Mco;z6kBfN1Tpxc6{CMsh!u*-@Rdgw|O@1h>QCw zN$mF2s7zWmlU^3O&|Mbo=DH?^?%BLbU}4^8slhlK*$+9ot+v_L-0W#`y`0&wxe08m z1_n^%iP=NB#k=V zKh!ocy{1dfOR<*ul1|`VRz>pVt=0@1Z`lCr@};DYNH$sA*Rv#&$0b zO;+X}N4&yF_K9$|&2EBD>-LZG@C}5WM!my?^W8w}2x4zYmn&;je+=EL#Nfc7#ckSC zGKTZ5*W(irOkY=9!Q%I_no5M1GeW-vD1+%rs?5AHzawEU-uP zXPhF2YcZMG&7m(oTS5`2&@T4bg+9{+l+`v_7vRVs32%uWC<{{}mB^lM@KiD=1SFcu zw8z$u*F6gEG4#l6wnw!;jM7=Zw7@xo%9C{w&RH1=kIrdJIIpdE!R~sPiT~;|j$BMk zWeJ;8E@_x47!0|?YDFTql5Av{Gay<_(45Kw@W*!nd_b%z$qGQWDwZh|$L~}b+?v%S zs+0_iV^I1yMnSy{&sL_KLGhI^cLxA2t*AO6$DYcP^g|3IA{Em-W`kKpHP~M%(S3D3 zv5B4>|3=!G*%1hRP;uwPMM!CQb61h(Zl0cI#_{w)NBxtZR*RU^d)&&|r z@4#x~*#dK-yK1eXWlt{p{J0|BGW#cU#{|!x40+`pz?(`myW?F;?(o2f7(hvO9|CGE zR{*9uzY0MN)2XmER4F5lW<=ISG?m6TT10Sj!-zM0+*!7}MC+Faz29`A;2u*`EnC~zMAJRo(jG1kAWceOV-OWg0*P|qf4s?^*M zillsn6hb(0a({#tRT0SSWB+HJCl3tA)T7QoxPc#u_b?Sf29H%|Xv4(p>jFZT9gtC- zyX#~4Nf0=J;-=q*-lONX?LzB48jG*OvLOb6a3=4Kr*&8iq~buSJsUgQsFTYNb6)h9 z>VZ>K10$Mj))H^?{B+fvM3-usb?PtdE~nW8w@R*imFh`)@;9blyT?Hylf+IQ-|WNi zm3d=&#>pQOzrV0%{^(yUox?cae;K=g_4aUSP^{Kgd+i}K`g14hIS2E$-eAodpAx0i z{=olyo6X`nhn=U$&ETGY>bnPZA+3tho!kWrc-;`8523@zIVH9^bU-PT+HCAUW+;5` zINQ=C>}V43*_7qxMs&Wc-8`327o|(W?s{S|h7@65pKIL`t!BQ8`z?!VNw#M+z5sIzUYthA8s^c1nS&~G@=0R~!=jqq2f1*Q3ZEa9`0ZHaQvvz7KV z6(K{@wQNFWtL=v7DjTb-;H)kH zFK~e8F*uEOLX{O;)rz4(o z4c#Wj)w!iL%x!4n-#48+2TbOhh5M=I&YLf>GqpB3HQPUnTvRp2Y~#De{4UNz9Xu`K zMf)>1|F+vp0#Z^-p_+XQ$1ZO4VDoU3yYqWAPRT>JNb0>(5^Z5_0~_)7EMhP{+HMm$ zwpl`Zz(!Ylvt`t%;kw3#lK<~tXotu;$A7?R+sh5j-9=?iUYsi(&7@mB&ERiK^UL@* zXaA1r=FIYXW2fVAHbB99x=8Aq;?Y8)%j$C_cjm=@bS3r1-m4mXs={_prK^*DrvYC! zW~Jpt0FplfJ)YvY>W_q5>ocIaWhg+3rzK#2eFugc2H+{K3fM=_WdOox{g7@b4gn+FJp3R<~O_>+Q{#vq36oH5O^>h{n* zBJKvLz>hy+qK0aet4JQ?VL`(7rtItP;waY-(Y` zl{KYHQv&kZihW2MR^;VNr>yJGWdL1i!S(jZEE@M>XIx4WyR2I)b>VStpe z#Z3e$6U1RaSTPW!9EYa$7lrguPZvGpCyy3|^k+s%m~d^G+?f;GOFx$LQXSu$8`hs3 zC}}dd{0~ST-T#7==b{-+V33H#05U`1qJfppa0C!(I9(JuW}i7e&4cVs6~s*hDwpzW zA^m?!p#L5JpOm=MjLaB;X7F5HH5DfSO_*R-|3S6*pQy+Gjk>^_x%w-Xkp4_FNNghA zL^CwZu8WDY!MO34HUSo`NeJWnaLKHmF@zno?dBZHvBbo3_rr?0bJ%pO+Ud4wTBmzd)IY~!Ej`5zjL8~7L#}dJNO8Z8zs#bYp=JPee-+EXCV6t zj{q7R9kSx|@MsY5qZJ|43Vod9^Yke{+E#12pYLp0AnvrfH)oqi2u$PMzCj+<OPF^8lWZ?Xdq)-W&tO+JL{1A zX+jsIr;0d;R=T83DODj$jR1(}mh`M!2f@uJX0u~2G8&}0&Kn2zq5~rY3KRa5{Bu@9 zCnjhV-i+jX$)C0$soRe>`04{x1PY-O4AyUGi6;I>XhyAM=gl4e*%@?bcm2k2R)2B)S^ zQ1cwwXumBWh2s1+qNL(0S)ea~Cj}1uS6uRn9=!Mu4Hmld{-yT9A0majW{%)P)ppcJ zq)WjV9-{nP>Pm*Z=Jv09g=^~y>LqUMY}Me-dt_&-bz-h8j-6mlvs@=x%4nzSV1+D0 z7SF+BMlT`E%Wv~`=)844yl6&rMD+KmS2#$Xv~>me_o+NYNF&;#)j)64O-Xx&=ErHm zy!Vj=gF%u!k6X#RloYJ9HM5=rK_(dLO$0DT=3RTDH7nnC!v@pu7eV_NO%DtE>5;X7 z1Rqe5ry1GRzP)3SZm-uE^G}G6jzf__)4`Jd5qAFBG_$EHM)(`3H(tF2X2LGEHm8hP zUw8@+?|EIBDKSLwUpd$|90DIm<)+qI?`tA==-PjJ-jK|lDUVSJuL+cL3kt)Xo}yL$ zO=u>$2Y5=ae!L*O;9H;~N*cCt^W|hkym>QwmL`W_EjxQ6g$15BT?To5BAWYj7y>1C zV>MzW>kc$29}GSHq|Bw1*Z>s!6o zc?svA3_KKk_eMEXLpR;mR%c)pk9*qFWppjWV3f!C>Q;?Rh}_pPZHj>Vyg)_Vg35k@ z*^ETTwL&B7uCtgA$7qUjJ>1NoCfJ8}G`fNZ z_M~J^8J;%a;D=)FK8vR5j(;poyB|26j-sHg6%60tSo=lTh2kGRhXmoWcc>N`RNx7O z!3I3YXqEIvPTOYut7Lq%C|a=Yu!yqJcW4w2FA3r7*ULot)VPKktkknG8Zl033bs|| zKp!)N*ExLAa{X8%s=KD zhZfDy2#@8Y5k~l`0v0kiI@e&f{gam-ni-NdB~$VIQG!p&98L{`P^--RV+N9XTO6qe zEM@qN$b;j$G+HO~Qem!)UrZ}m3OI~dDm9+WI9PF;gK(*Z(kWJbT)EA z?x|7c$V{GE)TA)}j=1Jc)*6Pc-{Pg59u8JlBBR(nj2o5R(5>PqJYAL_93Fu=>-}ki z5}bcun7rGgQjl~8Ao}*0u$8?Rn<`?1_@cBw=`bO;2Sv2FQjnSc&xb)!#K={r(>N)< z@Bw-eUap`Qd!v5S`>%|XY;A8zRAOQNc@=!(qAbi;jh>^cq zSUQ=25A?^SBfSiY>MDgeXoPkQDt#SmE<96Uh3Gv_r@W0gLu@hXu{O9pp$I9P<#dcY zq%=0-j4cAh1w_hFTNKwIGVrTXZ&Hh-e;BiPJ}lpm&a~FYIW(@83_GUte#*siA1A}tvn15YDSZL7%=jm=D z&*HGAG0)+397(VF)i4gTe9slnwv1pY1)$BNd8$`p7a&5&#Bmb64LS5S`f+JZF(%|; zJo;KN*f~no+QIKAD9yMS6~UXU>L`dp<=}2AJT+`Tc-`QK$}>z_?#xH77YFSX%P{Z zrvzstVFEkOh^X8nj(H~gDdaDB&Bktj!3)PZBu0I;tra8{o)3!@jIic+mLoA-yS~em zohaR}3c0~&5bm`*u`B3Io7js(vGwQ${7HxGyn(yM^!RaRAi78j$gLq^$)J|LiZr=9 zZiobU(5Wsu0A$itTUi>*vF$s7{3fqATdS=2X*|K?nt z<8oxZFk*W?R=`G=)y|(7N1scs>hL(&=oU~ibZx+XdP%k_w>diz#b#WXlmdcR2UsD; zwU!3$0FEr1WyVwj2UnVlUPi|?mz0qq=)yA;uAtpxV&09}knE};S13Eg_F$U zUt~|i3NW4)uJtS;g`3SJvzAkEH_RN^Iv_RTT7ccK6 zxik?>QtR>pw&J!}g5u+=hGZ-ve+V02lGJeno=3xU!DC}HtD~Vp49QthAK7!lsMmDw z0Ug5Z5Ce`cKd>Rk)fd(*Z{T_P$y$9c4M=1st?)3Puss=NBfnHh7?6i9pisVf#bqf+6E{rDAwc5&*XVNFJx#~ zNet(vHP3LE3_fLskzIrYUkQ^mpohih6P`k9qC68@HA!43JggD}Lyy?(LpbW9ViOQ% z0b&3!{;bR=sZ*NR)Q=5S_8yh_*JVk~VeNUggUzg#D~nL<pTRY4 zR4)|GlaGIE9AXKn)xwEX_(jBTi)cgok(41VsFb}OVEL=1wmz8jV;uvZK4ob5@)?GC z<|@hXmAwJMmcUXxqC5PJXu~Lt7;;xYV-p#!(txXpi>n@IO+`6m~qYC55`U%$JJzf zK}2-1Jt%zWNhC-=CW?irTt0Oz55^4wfi1(GPsU-wBWiLV&u8t{B$xbr*YVYl1b=?+ z#1ohKHVFrjV%CgK=Tk@UE%B+4&)3}O(;BtdV6VL_6oHgxpYQV6{=U)fcvoL+C|(c7 zYJ-nerd!%{sl8rKC}@rBQxgTb8WlbtW{A%Xy97cC3JilMn@rd}HwQuGyxDjW0YI16>W5DIt|l>(kf zUtb2{qW{t<5dHGlnb#+Ahd4h9A~-caFEOMvOrQEuP6!f*W48%lw9wi4yjlEFCzl~(96bt08F3he6~GC_c|V11u-pu~xj z4%HY>zyyEt!Ghq93Ua0c`!$nXilWunptU`TUkVSrg{PnK<0$m@yBDb#Vk>uBsK zgwkLBxIAuU*H){R4Y`FhGU!TS@#KJV46@n?OpeG|pvIN1_styQtlf7XO zkPO&px(%dB125J{U90CN>K$!sXkZV);X9i(!y~b-OGbP9dq?U8D@4ig9vl`%lZLsy zvA$7OcDVP|@rDLVpG@Xp4kKN<%V&dSu)=#-?~KyJ0HeaKZ_uu@)e)AK`-J{jv}|Fr z(4e3ZbvfUtNTe`3tz%q#5`p27p?GXR5hUImzKC)WNE@%A{X)V?(-OPA@H*aKF_&vH@w23S4g?729ZVBpcONe%rXt=7+ z=VX9A{JduxYicP$3XUNT#b%0+fbU!waCIQDlG3m(pMdBt-!Y-yhV_Cbj1t!5|6cQn z>pRg7!k}@1>l)ZUI4~R^8jTMP4GgIb=0NDUJALxZCLDGd`nnL_umuKgZ7q~hXOy*f zqI~AKp(y|4nJxG%e?9g6)h&+C;=G&~znVNEHj++;^~hN^Glg6HLXpMy4~|@3N|QCn zDv^LrfcsfLI51eUM#Qp&nc~FX3{!W!uVgKW3EZ^Br4V)EKBX3JnP!SqCA>$OOu7fU z4(x|Xr2JV^)F?4;daA?l9`56g@{PzN)&>v01SwO8ry?Sjwj~oH;;QVebfIa9NxP5{ zq1p>UCNE*a*xF$Z1AzRl z1y`LHqa^PhR+A;@w%t^om_zw;g&eIy!E|6LqeAT&C^B!qAQ;{&41`E<*)ty62bo)j z$~iILm#Z5CrsMG`&8=2sy-TkP6YFDry|H1&^PLLIc|%J0(1IM*J#>Q~?uvouw-ET; zn=Ttc{8b0y{atZcN0y05_}As4+8-Mn?CsyXa7@DCo*Pk8pGXwb1r;P8Gg0(Fn^BZ- zj~N$~rvRp&wY(t*2~owz@GuKv$s`^Bq>1%(u4c)TB8k!{jzK7Ze|D9~YqY<~8i<3G zeF$PC4r-PMqm+HvW#zReyV3!3T)b1wD%Hzxeog0#TysxykjW9}BsxB7IHRejs1K}vg-m(yspHbqWMS0E1E`## z`9FUk$j~J%;*zrx(8?N4mT2-JgJ%HPts}zj7$7AKL~kF6&9LPfBPY7LEz26B8Z8h; zzIrAmiCu1i1nb*V8W|yIoXc|nmcIUa&C&mm3Y@D6xqI2}6DT8fFT+Z?01FgUeZ4|e z17FDQi5=)05oXOuY_9}D(Bob#4&}-qjr{hxYh|^>dG%~xyHMNvv z7az7R|A&9&5-b)jONp1AHXow0%ac&3>Lltt*13^e_GmxhO{Y0lJ4)*TcEiFsJgHc! zpl1+=W3q4;u-tR+Y@9pTAkxtYQf8A$4aeidD2?u zI@QUT!aU`wjJb&~i;M005PX8{ux zXXcqSPl@HVlQc~cOUs?61a8k+iXe$uihU_#mQp$Vmr1I;NlN9~X`7=&|9ehR*yWL{ z_1P1gphWePHxpPyksI)G$YOrPX_+^9&qmm|ECDW+|1+2{J!RZuzDzE8;Za$GM%0^%FO`@#?>QhlEkZ_}~x#yG_=G|Eb)xhhQ)aiGK|-jH=U5^f^pER89@cJVW+s9<3`5)ToAE~T~;UdT<6*BHw(O zYYZ`sg!Q+!K%qqT>NNE6a3N3OAbV01(3+lf4mTM(b4CFx?2l>D)|QrNxTOuX;ep{8 zsf`0hVp89!)uJe6Q4p^f7#!&x=)W=&iD*~s2kSE&8`_KCh~wfC@+4zt>RS8qUKoc# zk_CyF#vl~H!u%18Gr+3iPdGeIZ(u2tEcDZ;n5cG;9v%HpkawP(}W^A6?VRje?m{- zZ6U)0&RD_#sZtvt-+yMe6jKEY7KUTnjqJ5yu^YWQuZ;yXEMQfk>v{PjdKml`;Kj6o z;U%(l7!D+p1L?Q-Fq78X^1O3WQY)@0rcg-2VFMZmKAa}NOy`+PXHgBqC4=|1C#Bk8 zQ0xYONaiKdU83vw#YFJBpbqxO5kxF{OE$FTz^&Eug9r^46=LdeL9nh>*^m(J6ru&$ zm{z5SR{{Y%8&Hm+xVTj%ViO54;zqsnlPDH)87r19hNu-&*>nQ;Xeg8x zjuUITv!G${K``T-L|F$pQ zrqCr$skT+Qn02A%9b@CA&Y{qVR8m*^hf4yg!(o*0Sw74t=m47*F`w*2$UJPTR4#hb zps(X`^`t2ck?F>GK4sl0<Y?FrJl^d)`DixZu-SPRyv5uV{jPB^gG5NuG!cGxi6GfAO$N>b zc?N$6U+U71ALYFN9?sVn$4AePw+~uY5{h1I@BDfD`EE-RM}OHpK7r%56)$Ui9G&hR z?4F!%AG~PAaWv`n-U4yzkn1?KsI}36GyO3h=TA~N@IhcB-+BQUi4cDbS4Mqg;>yRr zo&401TE7M&a2uPizA|g+^&EL?nAxiNzS&RTHAjfb{P_E?HnxZ|fHdgRzz}a(jPg`((GZVN>ZNNq6w)6C6vJw!{4sGnzw3N5C#^nx7Gl zKz+>Nlpv)@#+w?rIiwi`31zALH7TrD&Cy6G`~LRfbDE6(ozC|DK4#rPX-A=OAPoz& z2nR)H8w#Na4v@|WAz`Gze^B6g+Uw34Hj4N(M##xnhyhATv?Xm^HmKUxj#-10FlRUB zWap^bh=#MyoE1TE^rS8Popmo#`>36)Lx1XVyO5@NJ{UDG;j}RIU3v4Y@aCDk z$-R)L`>^<1@o;47nLIhz{_}1tM%tU@5g8@y}=5d;2esVdwJCgT0f3?bDr~T7UcoX;tM1SV!t^$;Rq=a(eLO(KQbHx&dv*eXG3iGrHqtOvn_k?5qhTwFk_ZyDVzW}ACvgy=t9CZJ(`{7YlKiO--e^vv!^jt&rlj;0eG3Yr9?c`)<}b@2rGgDOwR zDn|qtVY4C4@(T^1ebf(}#BN|f=)9JMn*E^#T(#-tKNkO=XI7qs_^(}FxlBP=t zxTrI2M2pwi8sDa_n%xg5_apY$x#ilOxTUbd$T^e@eCw=&^wGqxfSCZ6=#!}+6+!wD zS0rhC7Lnqg_9G-Ln?H=S&P8~qOj&(E!oInU@z7$PWKpV;r$Uz$|HtDW@tzSX-2A3!*U5~ zKsF?6aWzc?qqkh5L=Cg|h=}BAkQfn%S-eL2wI^7Fqv7B!BD^wow38jrVGCK%x}=`e zNOwyrPf|Qxb>EG9^j@hkp73UEaNR`=SEB{B>LciQHpcxqnUdgY8co&=cUfrMT(ZmJ ziuNjwY>}ljCL-?Ibzp#dpbp%$&DLnTw_95gvDLw`1x+M%E}Ea8XBY%4B^8BW!CMg2 zO|LF`Pj$U+x8czG^m@Dgw{HEnH=FG?RKA6`S?l~toYXNF^tDyC#ljS4y}k?pGA}4D zP2TsG&MaqF?7@loav6o)MABhTZIn(43$c*qmK7)&N3JVDt*!$2jR-@{iPg+aJ$?3e>Sc ztbB$NQ`U%tJ4E*KHcmVaF^S+!hmv=wsjVbyw%1;t#g%sZO}p9zc7CIInNW9#R{_rI zeEcqDpfox4D8HjY7E~8%<_4A25T6w)I8N(l?ZhKUAa-;|nGj|SE;X6cMNqL&9+me{ zEtCU=)CC}UggJ!2$>{7xo(MMC7}y^N{zcW|O-i3GQj$tSnj@FLSfe0dK~jpw0jpp} z-j96z+Lj~Naxy^MUxIq(05ooB72-A>^1F@E8%-||=f*@sd={7TvtUKP@3yB=F{88%s-$h)XXYp8X%4%2_ffc%7M{tQ1{>+Rca0=Op7HVm5*4^ z*PG_Hf?q(gTaTG%q0D-V@PHQMGS+N#zk>L+(iVO0n&XWdl2F%Tt8ZdEj8(IZia;zJ z&cZ9`>~O{$0;_Ws{~y*3#k6A#I48_-85el1$=nd>ol<6na2Fs@D4*OI69pDGgLKN> zl>$$%GD@bfXSmq;NZItpi~%GbGGegbGhKoLJmQsf|GA6ppqY*Dzk2MoNfzS0TBT|4 zYMrJFCsUuoWZv0cNn32Vj5W6>4&?VmR%Zgt`d z%xEgUR-@2Jx}5ks+vrhY6chOp4G!Vig67lvyIWuAa9qKhNCt@D#dy=wE?l)F&R)Q~ z+-SrwajRAXVn=~ATyRJsoGAe-im;7VMptR?tx>SZ-B&M;cTZ4pZb-S4awIU_(kPf8 zZXfK{>}4{a($aCN#w|$Hq(OH!V)*BAoY%SIBx(CdXV#gxyQn&{T>-~T_}ilyBw$7v zX6WhO@$Sy)(eYpF$U+i~?mHkc$dpKfv|QV!>zj_Pqa&={M(n-nV4S&@wRm)_Vj(9n zoh&FPec@%Dvue|7tIjbj7gRX zEOCZ#gh?tJPp-%CRosxLeZ<8TsQun}hyjICi5U~EtZFtImwbC^WF-0r1(SrPO}f3b zVH@DjZb@r5D_(*)^4h)UoorfTw~ve?p74df@5 zVT@kHgrn#5bhE1|nv=Zm3RL!0aLrEC2)N5huJ8UDaoUrTm9kJV6pB{Ckmd{IarBD< zo_7=VtjU@7i=;Byp`N_BMM7J$sT+al92H8^qE|kxuoX|l^9qZ-!K24y#e^J)Y8uWk z@)9rXL_oE0!@sAa0YUuJ%qwHYw{~(F@0m#G=;7r$0z)%{IK(&)PtoSYDisKB|@mc17s^ zVKP|0&#`%J+mYgN_AFmM9A+B{&(FmmJOwan6VBCZ7G>Y)3DBi@PGh<|bqk$^Kr-y< z(I)g@@PQJK*g#4RHSDbNdEG_qt;|fj6v@v*Si@LN#u;5Cknjiv5TbVt!4dZkpQ~of zT>_BRVt3{bTCO+#>7#L}P&_|9cmb1MZ_chKw@u&*>h_Sojl&Ztcf$AwjL!D4xXI@Z z7!}-Uka+wDM19p_j3gPmp=Z=$Y@FBD+j^zK^F^9mTP2W2?j*70Fs^e2aAuNDs`N3M zpk%W`6=#x_R#jNrEBOm{fh8L{Chp+j664&Z=c>V#$9Ux!q70*Lr%1(TLL;%YmE-Nh zr$+~L_k;@qV+6s9@JZ*QA^FHz>yK`6bZidUkTUn3`E@sY+d896re&L4nsC?V=D^OnvdT6o>~>q6 z+x5Og^(v^3PYjEHPq^WWzC( zs5@?-p-llQkXK4FcjhA=fZ{F8MviaD=^5iQ$AGR^!v%Fm9V9?VX2%wB>+g}@^=}mp zWH*VpjxyyL$)uMqXY$(DF*2du8(TzZ>{GKEia_y8=gX*XRirkz)f1Mln}$tzfKr#3 zIZ?whiJ{JD=x}5WQD<`w?R=ZgGRC#(0o!3qz|a@S@?`K@bt@VW0pkaxsCS*ELwm-< z^uKQZPkXifOZ%(#dV8&1ZGUXvwm-GE+TXRmZ~xFv+NQnoX8qGT{1?Z|CsF6F9p7h; z+OeZ`_gyC8_2KgJW4Cz9=?YFu|G|`Hi~Sm`jvO-IPfK22{oOm0_9YNYXlVJ?Yon!& z5zf7!!;an7%qx2r>`$p{*%ss^|Il3~5r|4Q+W$qnNQb%|%aE3A3ODwpE6D8$E+O_; zJGvn73DCRlo7Z^sV>V>5UygB^^SN;!4jiIqmlU6Duz??Axv*@T4yrS+gDB=CiqA>}*DDE7ebvHii-uSHZD|Ap$KE+S}A-SZ;3;OO}KBdP``2oz7=bO@mH{Q=Uk;%-vmq5C+HGSy3*s7sE zlLl+!*R!A)-vPxIgAeal%(6{UoP04@Ce{`Hle@6bxfrBnf!EoWWOt2j0%*AmG*b0| zUR7n+fw3g8_M5bR^*qtSTI5=JD|XTNU{fg_-{6TwjF^>?Mh*+59n*+Bo6Zf?AHJ&B zN8>shnpwTsDmtR{uxEHGdMU`K$p!)imV8b(E2w9fMd`4la5!9sC|uO>l=3RrCMDZo zL>G!SE&wV^$m$P0$w9~(rWZ4V;YcIAarP@X`zSOZY0r`^a~o&~vF_v*y|5Mj6%EXx zaLz?~$}gl;I__|X(iNNs3Ls(tiwreqX#=f;#z{%2i{V(B?1^Z2|M_b#7(#dJi|Vfj z3>lftgN&)~4ZgRdk7C%&eD~e%(X*(s9^prDBd$jCSSi{|_FD0mUw(P8{d{l7%BJuj z=9h4$re1>GSG!@N688dBuaQ9knfRldMl>3afYE40;=0r656LmK6{&kK?gjWc96uhn zVl*9U49D$CvjGgs`G2P$X1C2a8b2QDOZynp49D;?WkYBXWV_Se6$T7wdC#DZL3h}C z6fH0$vbNYAbTRf`FmvXoM0aeqAKDYcR^Rj%w>?_Vj;tSkmko<+8vB(*R=OKRRi5Ax z;JDzN&g4?NPn<9r&5~_wMjN88+e4f-&r`Y2(9J=ifk~=u&`=Xq$QeF_PRqZu1w>f5 zD3h0&M1&dcX&WI_QZW=N;$CQ}hl?axw1#k{IUK(i zNAkiDWEQsr`_DDgldc*^n+kll_qELYD7zE~jYF?{Zp zv2q4Lfev!BYw-^R;K9Yi4rkP+%bSNGYX&VN4lQ?uNAB<)xsJro3@QIjngthEQjVZL zWLMp(#h)0YnRg8rB=3s{X?c1PkMd0!b93&~42B52e=|zc>%C8LHn^G&qA19m!kfPU z8NZNQUYK^YJ2FIohl9Ql7)IGa?u1<8EkA}e2*!@|04G-qfhvIF{tVQ5m{F8x_l8Y} znU%Ba7D};H-}BY+8f`sva;GC++e?R7MGys>KQ7z+3zm2sc@!ZoQiLVhP~j`5Bj)wD zoWHkV6GhaCzu*YdeIA$6h*a6@HZ@J;`s*+19d<%M$<;X?l+fJ4h$fDZGT8G=OH(19 zl$@&KTxIJCUa(4GVlixs%?_gk0$T(u?_0F29?X)A^34c>3Kj7-1~h5%5mpQ@#TN8s zXQ!%aR@)2InTQda8?rcH@yZ>^S7hbDq{}z2w`k0?tBR-sJ%yF|1RlXQ1`!q)BC{rUCvjnpAnE|%-svQmYNn4nsG;!pmd zfAJsq?^ExN@&(sraSb9QeBw|3pnvfn`0rD?yavSwSX=`myL_S#`WOF!|2|zTFIf;_ z78fiSDxdh1Kj>fl2mbpsSYCmmwJfdy5ko$~Kk(nDJ7$uQV-}ZWv0*;xH~k`?{6YWX zKk(nD`SKba+{}{Mwd9<49FiN#Eb;4mb|GhYR(f`&ab*<*=*t;uhJ|fJq0%baxgz?? z8vwB|>@B3Ca8*}UJPv#X|F*Uwn~3B)ND~UCNRzzZRCFAzNKvGBXU51~XwJxv40}ci zo$Q#9r^AN?pH}SSC~QZ6I0mW!?eKbzI&tfh;p>pd7R>W_gQD_+Hd4^w38|AHArD%9 z5X3&{6Hw{uiZ3#6>VRodWqYf}Kj!6OAu;VA=oL}3n19BFIl#A{-*u1p!7t0buc1b#tmyY;GV35^OejM6Kr)Y5set+9zZ)bYYo zv^4M(Hw%_f`-e~UD<#KtF_Whkc%f3|nIg}Z0`<{bfEE90E>BO^wGPhWYV zs1H0&c!31plGw|Pc}02Y#>39CZ-k-B1iRV-oA>l>^8TC0 z^re?x_Ig&vSQTcRTpdOPZ74fR9bqfLbhg(oV$U2t_c_6#e=Yl-} z=YF{>#eH5bvi;P3N1iNQLICNWqnRo42e5tWa^TzX&p;w^2I`dEQbhEyeLo!|po}pU zrE3d)yn1*6qU)hUeoLt19Esl$-;1CHCF9p#e+#^NZ#ouh0p-$#lecgh8EYYcq!R|6 zgZxvaUa?ly12{!X9>&mb38XqaCZPB9@q>TM!zW4wa?>SXbn% zvsU4Fw0~xG6`#Q00TxH6%xX!RsG?`B8X_U;!w4~Mh`42}Yrw-}A)Srx(r|x4x@FH- zGOv67BCmX2cwrQitARXXmm-Fk#S6H%1B^&|p(v?>9uyg$HllcDdAdM5$&m#Z%^V>* z)W);R5T$V>I?3+zJ(`5hVQ?Zbb%L|GlU+^I4>JU{<8OFeWo^wxkcB>uA-Sr`T^e+P zG-<-FF??tv%6XsWB>lzRoEC~5K|DLpJ_fuz>NGqh0$WcCHmEj>Mab#T%8pgX!` z{bb&Nrc0fzTTvf4ChQn-7Xvn+X{oofG0VK2RV7B9UF7=gU)>EsSUT@a$kCb5YUha4 zzz)nb`u5mAYYe-IkF5(2#))7JQ~sg@$sl9BTvtG`GjG#uS>*Yv?z9hyE{5~$3fY_p z9kUVlo{-Q77?BCBpM{;!7TXIYp8N}Tp#JKs;NmPb-~P%ke1jP0sPjqn*1!1ZSLZjT zv944oHs70~Lv}EH^ATC_{li94VcIgwZ}AY4wSzw<;%rXbSSAR;7+>cDj2~fI@l7@b zpcpgt$6!G?6BrEwjXBWKx=(lYh~!Cj-x;9>UqBfM@|8KC_KewBf+n2~E(cfzVf`t3 z@tB;7I4T2-5KR3wFfns9VnLnyV8+XXoPaR$Fk-|F-YMjsU|XFNq!!&o1O0m6MXfWU zkC6}J8P=CLA8hu&j>;y-E*KfD)@U4Xl5Ppf@2UMwhADse?yE=UJA9;<7X((yg>{A~ zfozz^<{R^Ew1WP&ST-W8x+Jik`7wz?am9ZTvu38f+I9=E4J)y2>`GiWRoiwt2}t5X zO@$S=R!G_+J(qd(-B*9WM%VqTO`(NSj9h5?3wri`imLZ%hiC9!i(0aXWbn_S0>yTQ zW)iw3NLy3ZKZgtcpgsn0;{VKk2JOxDHAvLS<`)-(4=qpSYh7g48<4`gzgw0clbTSL zcUTqH3JUcc88QyCDHC7^qV4g&vg#F7j>zbEuA zNlb#1l`Mq%T)DfgWzcuc3Y<#>=JqkHQr_P}k=d0L>N~0z=J(-L1kc8Q`JP+6(Ja-W zi22Tf~ z#A%Z%XFhSZW|-b4M%z(5m+IXf`uPWNU7jVLwd8<2Uqr=rhj>bSTZ2Ez`Fe1XwGgC2 zFe?6s4Yep5)-{!0+3<{g)h~ObcDGpf|u?x`HYvy7o3BagLfK~;p-fWU;llXjw zK<+{dXN-hPyMRI|LE-0P4Ap~A$Th_JEb8CB;oQUoAo`v8k(1i}hl7tMhWRc{|2 zxJ4@=fA%y z2n1w16qv=6k4f-XqmV!yy0gQ6Q~j21LB=toZM?G+z!#M{(nFo-V!7hVi7WPdxof)b zmK9*R@RIt`_o96=?2g`MI_Nse*Nlgo3e+GTTobiXObNT!-bvSNQECfiRogo|-zQDC!flEdoEW zgVs`$0Z;~X%w*|Ie0oRY(nerrBw!bW6-ozQ$^-&^TG?iln4FTck>Td-@n|Cmpeqh^ zD!6dVoh>V>btNmIxfmZ~(2GUqdTjFq8fmA2#xsy^9olEq%p{IhSLp6#RdXtaYs@#C zcElFchXWkq0n)A#?^y*codR!emHDE{V^_!yyNrOOOkYOhk$y*aG%sG67q*Qh-ZkL2 zhU3feJYxlM+!%IadR2As89A&fg){1pIWkxuxKKKl7B|zf4E8O&Xkn;;+$HP%Z1SZP zETf%ZY=U-@zX0=+jPzXBtDA?|-E%pRLM!`bVP%r2P@Rtz=6jga9bM(4KP0!O;ySi! zD*kg*FQ30Cr%qP?XLf&9gBz!7+6F&2zvH%U_b`$(Npmujb??+ccE|RY zc#!&-&U`2Ia05u#5#*oZIU-@PtuMp{-mlfi316V0(K(sF(bPk#X{?m$NqH)GYye zzT2g>5`!I5P5Uluzi8dKod1NSQbz16` z<2GgShQ!<%xRwF1&HTpufvy%W7CVxhXz8fmrL4ilBM~jJJDwUae-^>-#XfLF^O8|$ z&~0f?;1j23&O-{;V@d^wagr<2GeA|=!i)CguJVPclC#f>J>JptQSM>9OC7gJ>={{p zgTuw%hD~!YXNb-qMk^rky`%8<{lNtx>4`+a*Kw(M9$UO_67tmMG{YFDv=zoRQEFSt z$uZ#Y-Ei#9tMI}0e(`m0=h?~N;yN3@F$#&g-stwbsQZP_bNS5pGrRUu^}ha^p7wh5 zF&OYKSfHG`H<|F~hYwz^*B8&;ynghbZ+@V6xH|Cjzq{|aN^Bi|W*>rO@qu)yc7EiQ z3P3JN5Cv)xwqJe_hGV^19X}qsO16wE9N#GNW`3m=*R3!n?s8L?V7UBPbJ;$V3iC@j z2aD%4$H6WS*h)Hw1jMn(U3z{*%%1?=y_bnwJ15KM?AH)Ukb=;%)mrGSeFM8Cln;qR zDPtmqSE_0Tzd4jCR}Ql1rF&<|(w5b6D+ybH-mluDu1T&?rh| zzG&HCgylrqnm)O>CoZ=dLnW`@{Lkty>mP5ozWe@%IKls|n6K8VpUx_;-z0t!tXPmx zDzWSWTAFSRk}6&d5|K$0jivY-dld@B**fEVm`#vv^$JR>p%hy1B0@f zkoGp+c?$8G-AqJ8cCI3wai&DZIg40d5p@+AXY>&|jMyEgQC^C)FdR|MfMW@5cb21l zI0Ipf#jf`{on4LlwAm(bGIhH4@_{Q@wJMVy^E(Bw3B4?~*cr=O>_&K}JM3}Pb#`xd zabQV1En(nzETLCc(Tz8bk+#g%ibp-2>Gk|LSofA*XUt;}^iNcqxNRJ^u4R*hNETmW zc;GL;OypO)@%op>oAnAjIdfn|di0KaZ-q&AH8k*PVR?EjP;Eh)_7OqxZKhUzUV*t` z+#eGP7`m-b2gE%C%Out$7kZVSV#qtm@N;VHZJ0X0h_#XUva?q)u}l&!fz-0Bh8?Bv zStl5dvTJhL-krk%F)U~(hZ>8KufK3_avuZxRu&mO?fTE%0kwr(AvKHOH1k#mO0<#< zQLFVhf9dL>isjmjgumRu=E859D*R=ww4?R)b+dbXd~{s%T0>S2nT1Zn_%xf*8LDDk znlQ=%J4Hy0Y>odo3W9bpr0R{B!Oks=DNuH2{N<@_Lr13`DFm!BghW#t;0*`ek485b zc`(>!!3G0qqL)yKtVo)TFDZBwqq9Qh2!pS7#frc?9xTLLHU|L~Vf4?@q^Ua+cnUJV zzv`m0Vg@H?#DEs)?Km8!L#C{mSz~Cy|E^lBC5*^`JS`%=7!-QCT7oq_K-7)=s;e9y zn2I|R(7d$7&RsTH$pPYi7;kGUZ>qNRmV$imFP^0e`+UQe)*Kc&n|3EAxud|X5{v$X zjC?o#P!jnH#H)_E=}4;XWXI)9$^J6D5# zI-X~p?5czK03{+y`Pu!2cVMjupHI%xV7yy zi)4p;Y?R_86^{?}*I2Qbm5ZspiZ(jT_d8SWd5}=}`I-8%Nv6$6EBoJ*=HK(Av4rNo zP@KR#%m-V_#!Q@8KU|Itn+EEh^{*%L8?j`?tElZi<~2F=_iD~OHQ{SeKNAa7al$%~ zgcLlj$`4z2oo>3vC__>*4BO}^C)jS{T&BjLYR|@yNZ$N63VYPQ`3dRzO8(+9$(!~k zAsgV!hTicr8E52xitrfesE-QD;56cNAlTk@1TB+&7n}@UZ$6jA+uOSE#CZ5gW0|GJ zl9$)qaw1MEtHNgx}9aHcyL9#M~8DoL7&^BSCA_VSG6nvW6vHq+mgFLrhZ` z)NpGDoV+L3+5Knf3JyeGXtZ6wE#Lwu*7t3}vp;YZZ&_Z!!W;P}NDj#d%5ks5a0jG4 zqEPMVnK}KBB$2p%D}zcD23=RDrsca*ow>j>`iXble+|NggRaY4ow` zXl-^gk!$q!S@V1_YEG|{Do{P!%o7rl6$f(-$lMiL5CECHNUEYrLv1iDY4~w`0BzhW zb8-`K4(slX}!|n4_75ITq|ou4|U1!wZVT$ms;i2O1QY z&7}alMV~X5vJG~Q4qiajb@5HZ6emY7k9T%yWTPFm`x;r*#?)V+bY8(~eW+Z1Ec;#k`&k6c2}($YqO| zDMDA64`+kPP$nO@nQxWFe-aYeYFKCFck*CRKG_rT4UP)u0YrkhXQEoZ#>Q|PP_X!1RfD_)+k+;tjLqEVmh%5;p_eO7F z(Hbe4R$BSiv-A9h^?_;?Tjte=RYa~}5f@$bJjuGF>z6Kd*q8zb1^6Y}o(Nl%yNu^V zHB2=eC#4%uffPTFoGMg`j`i#9&ipw;&NU+y&Y=)HO;c2~tPt&)>1@1d&De zoDuucaJ;SG3MCUmK)+Fb{TN2Dkf7Wb3z|Bf_Jv_~KrNBr!yp;<;!fZQ5gk?1;~aI> z-8hrcfq&S05RTSSHY7@{7K|7s9fO}_6O4#W*vbN6iK}ifA`;IQ$6ECOF}!}A4?IJL z$d8Fmev17*a|-#c^Ku6^+uK$$`+dgake)fCudH;z2~g+ftv3PseZ9Z;EG^z{DXJr(A`t(#)sM#V=E@6kRhi9+@~e(@-PvPN!t!G?@d!9yOVar1$B_vp3`>Z!f z0@C3V3R_f$t03PX-cuAoVkDYt2w5dyoNN`F(O*0M}6j-9lI^;8JjZWGpCr|5G0u;`$<~$9`5MqfA zHmX{>Cs=-$e@DHu7nqn_0iw z@HA)Ek`G7A8`0R|{^6Y>d^pztW=o1G$FdZXbg?@pCLJ{eaq?x^~(y zrkc%3bK&#NY8jA?hwoHa>JK6L+Ba3NJk5Xd*8}09i+{q#at`JwN%)kkD9oQoB>#ZY(TfNKsI{KY#cn zb3k_8p^u-K8;gO>Js+lCG0JUgTBby>HFcSYpmNa#I;lj+Xfzq(*8DeQFU~n^VoQt2 zfyt(&0z9A<&V{kwE{K(;t&sMHU4@EujkIb+l3@bCF>etTL^Gi~{!@o3>p*Z>-k}oc zE8XUE8F(smX$>K12q+=AgC^e_?azO19#L^TDqJXb)0Oo^YZw3_we-f z=JD=d_R!<=_2%~T-8XMa>(gbUgQ4dSmGqhvSXK}cqd__e9$|6y_h}c|h9{O-1sj;X z(#iP&CjA}E15+%`KpfIVx0ix6iL4Is4psx^7$yq$Lz12PP$X4mu`uuqT6ILb(C!;4 z!TNE~O$V=R;^)+$5t!0vw5?JWtp+2Kpt}hc8hKfk&T37n6J^@eTVR$;x`}d}hxkPJ zBq>En!!|)g!=mPDkm)w9MYJz+*1KknwE$dIRRefhI#<(M7oq?O2KUx8s0OQ_+?W`3 z#3@ZcQUW3{NJl;2-xvC@p#5Fp+#8VC^~4TKu`3aCc1a?V{u=by>Da^ajV)m6l-q`Y_qSmvVU-cSa%7eQ&6Q9S3yHGB7E3q9X zu1Ma22=;%MI(w1s+LY<8qu)b!z3!&4V12JaK!9fwmlDztw9gn9Hz*E2oMTKOgmyX3 zZaK8BAo(-l;rpDp5Xn!&L<-)1@(x8)pkZ`-({+)vBzO>z%Nh#g@8zz?!yt>~I*(oi zS5$O$6MEFEuCU-yuP+vR)H@YHK)XG(B@KRO2(it&%+nKR+D1ri4|JLkQO`O``~=kv zb0E-WaDAQjak*inFe-UG)q4h$hlKY0n4GaPTb{O~6-Dy%n+4O)D6?X=&qtNL@kIX; zy-%TwJE>XMDV!VR#V+BeS()T?SLh)zya~6J1nX@maAOE$>owPy1r0_*?Apt_Ay+yF z*gHmqT2VLpTN>)_56QWPd=v2z0heSgy}@R6xHN{!I(a*oaHs59vOwC+gTruD9yZLX z`5DbR+FZQ{X$7O$$1y!C3=9-X{SPwIhXhv zc|FDzr}yaeS?E5OGx!3Ve%9;rgwO(CIKpH><=uRl(vSyT`D0_{{we=39;@_bk<)~g* z>iV7MXBdB?44SHFBS#7UGaEXI1nG>p!`$=U03QTqbc8V(>*7IHT`cVKn-<-(j&PaU%r8O}|G8i+f3&Fug5n7mZb}T||}Oa35-OC>1qD5y3O|p0h98 zbR^^rTOB%hM)>UI%~Wzg$*85?aQoyA$>x9qP72=h4H*aE%_Hh9XC&`8+`^Kl6g;G` z;C%(dtNQQqXFad|viB{=>#&ghtAfoqx?@2FdzlC)z03iv7qlj9EsmEIic3ysv{+N{ z?GuLZqF9iH8@3?G62_tt^DoN|*W?nT<^oZPr2;C-gmog7YEYD_6=<=e(~9!(IWQm6 zZmR7)$QE*87zTeLJcIsx%082FjZFC7c$JH{JB)m0p}XZmdowN)l2Q_#ANqR9?F~q4 zLEfbF6pjmJ8ErXlZ9+TssCUpf*ifI@G%x3a8zw`#xLFv}0d4U*yduf9rh_vaHj>}A z?41}LK}Z`2d#}BuoVFFp{EoV1QNff6YY?W!dG?ew)>53sBS<@x{4=tfY=&ssm}ij9 zK=i>I={XVU%-KI}dZm_Dd|{gDtk)d&8`-#l2s@u!cR0E2vs|%BP(9NEf2W+JjBFy> zSj1iDTKeN2G1|WJw1AZX#EHu<#*Z}yksRQwZ2HdA5iv(|eNwTc$6T>Yrg8<;DzQI45F+nqAQdT0}n{!CE60F35uWG^;4NdqkFiW|j6!&FpFFi`RhaUEMh3lT9%o{$1kux|);^E!2^ zsscW6a5!PL&O422X4M6XAowm?p_Va1rPY?o+Oqn9GE}&JRa%C)Z!SXlMO7esV-pOo z#1L42-EOx{^G$EkHmp8dfe-3Fm9OBL9`UVTA_Oji2@?3PP3tE?Xj>hc7=D(ke(R{D z%W3TP^g>pEHN{ex9Rq!EO7$MVix6CGq1=P{J%NYk)9UrTG0t5&EYeFa0sy@q?x%dgo_F6k}C(Ug>rmmzF9V8YZ-M-PSD6o3A)0)&C|+yKG71@Nm22 zYaa1U2TBl_5F^!-!KfN~gi7}NT!DJUo8 zRQIGGW_oQUcAD()rve&7s^igWn;lo&52H6d!R_(Cz$7AP!?DmNB5&;=FeCV^g?{KL z@OKm)W3e%WVw{U&4V@suIdf=(1^T?=-TKI~Cn@BWs^1(FA>o(uWos~|^;lJQ8VqcO z;=bnBPq758O7bwjrM!v_erWs0CY-cV3_TO<(KhUq{?$NPw)D2C#^by?>5M^&Sx1KTcfG`9HT={$mWc5BWeqs*XPY1Z$jjq z=n@p|MJObuh3oNrj9|}l0qj$ys$9_lQmAt7n1JhV&-g->S!J}=Bod%O5xW-`X!iMD zWb#ITh~o01TF4ty#-iD1pd4=2WE~H0YGPtXp~BILL4pD>ObZm7jS1G=J}{(P8{PuJgH<@z4Gv5}86-r7ywOB)XknKh6?oNtEn3q*BY1HeKa9QwW;F2DcPaWoCu`ihPUh(d2_n zuPnuwR&Z$-^w3sp10SvqV;;u*@@gjMj2YW{y=8*vWfGC%3u8`L+s_JEsKYvED%%KKkS^~ zC5>A~wp0QmVt6O}2vIjFOG)}Ia|{2k=3;Zov@X2w$EfEyO*D@HESgqavT7C?1b79h zRe)PwLfU+SFv-$+e_Xd7UgW#&tmr56DU?WSC?79HM2V$R_X;*eQc(M;?SlgFR-U?O zHgCV=_X>98pnKyS?urr-vK`}bL*igCN|+NMm~1W*l-TgrOI>Pmt0TEKXrv98xXDem z5QMNnO?}4UiSb&^SIJnkl$x`zX5Nuu0X>DoNF{_jF`lL>E;*fB?-- zPSsqFTv@h zu`XSb9aZ^6`S3DXN6)&16N8e zR&zG(|Br20xm4jTm%-tmq2X6egLJYgv}+o0*bsCtqy@g9#zF_B z2b1-z7Q($OZXhcJ{ib0l8vSqJSV+6gKhwNCG_P1$cdYO_^TMv@53&KbV{w-qIQ~hB z)}3bH!bDpE^8Vu;R#86W{;}2#lV)6y9N7YH;Gt`Hcnq6zB5gIt_KL)CCkO$?*h|CkeOn z0*Kgf@SDWSvbKh#;>Zny3w2qh872oRuGpnnsR53#2rJH;YJfc&Tu4hTtlxDMBBb}A76ZF2YZC|vXe5W>Y z_q!6Gwt|_bMB}plT-;Tem(keoJ74COEXU=mk>N1JUC@^#5spMJJ92TAmTOhZplYS* zUg^?_0&5_$+VzCgsS<+$0hHnQ8Axbl$6LiGvoR*RtSa( z&_X%7d#d=?9G{~QgO&IryWRizWul0}bgn13I3riOZ=vjutX*5)b^nJ69>|56g7FbU z%GgC3D%c88=Hi&$y06xOt$Zn%O}}m8h@n#GG9}!DG;maA0bTjy@xkrX=%jKYKh&&l zB>%e?zsict`I9QYe}${hb->%H{OvYWnTE`?Xi&tdT;aI-KsBesK{{2%2DZU#hQad&8+%m6H=p9OBe~heMD|js(}7XH!znsJKkfHDnLoS2!{( z0PniHqnr2L8|6cM9=qmoCHWH9Ys#opolXz?wHeBD!o6+!Jlv{fi^gw#Rh*=hRF;{w z1>)-E!!aPyq_P}~&d-gI6R zOaD^ZX*)dcf^u1d-`&r?;v}7!`GhtC1C$W7{B=rUB_$OIg*m-efLnf-lqbW;r37NF zrDHh-Z9#2|f^0!`Td3DhWlHL^M4@o4e=qf(*V~*H4=Y}#$qT2|^X3WeW{Y-N-u=sU zdVS8flDObPSPixx&Xtzr4YWqZyY4t=3(E>RGS=wR4IAos=ho06So6@s!0Y!7T~Fh2aoexe=n@U;EOm6YTSlOEy@r?VN@UF*XV!)xX8I|SaBd8~>VPY0K% zUO@cuL9a83(7}l?exyfPB4coMED@qsxeHp|u@OkGBuZ8hR^KUTp9DdHeZp<#g|0 z_vCc@;6>F`{<3?Fn01&tS{+>U(+kt-^d`f3hW|wj{Ak+oPCEv%VioNfE+VXGH-v-~ zD7r2KP+^nBADV-@K>6*+H^FgRDktfM6Cf0ZeT=9cnmQR09uHAW6dXoTfJrvZk1_~9 znuO+r)`jX^(5MTIXU6ZX!+}M3Q=1o8FLB+NjE(9Y;|*CdI&VeuL45bgi^qri0Rvt^ zO*Fkb+<$!X;!O1?S|qVlwtS~P3CBdXJC2F$_?>Xi%Q@^z9Sgi^4-Z^@*sLPCGT(o1 z5*{-y%PJHCijjWk4d>*`J@M(ra=Bl^&eROJm)%*BU6Kf^gcL zfS{Fp7mj4EPj*CeDsMTD3W{(1#?~Lkx%layKxQEE*nRcl==k&m>Mx111vN48jZAXNgXJsL4m}NUd+qg`#_RQ8DsS4=W*h%DnwNI;o2IGX zEAYQ0PRw^@Jy_ZSTrT-_&U@wJ&V1&(zkAy(SP6D5ELaM@V(N2OLB0%G0NS4i7O`;V zt+Ix2CzNHS^TRQ)dVoCq_^@So7InUZg}$b@%Z)b{u1%$(bcAl23YX186wIb~R=J*f zk^1g=aKX6A*;U#glr!IAd>p@ZG{$y3;4d8Yo>d}F?I6Ojua zsy$q>i9_uvKmYo%Q;fPQu#H}4PyEr^%+bDu4fgVv@cFPJ>B2W$nksc@SDfj?u5LFr~}qE5sznuMn_oU zUe^Wsn50uQRzoJePWO|;ev*Y?2ACZ!+1SvH3gDp=u1E)>L$$V4kvz^W{-AniI!x}> zMe<#;kP2b~*#jXS2ovetXIDWVF!UD97FmSf)uw9cTQ0y;PCsPPiIi9g%M4aW1V2cg zXC2OMXaDq7F}TI+H(Sx~QHp6rA5mxd5hT}8OVo~QW{uZz)jTq{HKx?OYB^Zt;9QEA z1w0y8?;s2v_Cn-+5mKN#_qWN-%l#_xTKSpvDMNAJIflV}X1PVmhMYXDqR!l2Uw|@ z?YcJnapQ60k90Co^wJM(=%8=EX>1UGvR+@WU%<2Ttp9lZllSYJ#-reOI=sL~vZ=}^ zFm^G#P5o(cJ*qnz7JD_Bf4FyPaeh;K?tiM?CSCF?7Y~=&p1X_Ii{It9iJZ05BQS~< ziwTV6U@H5kJJ0sFpP#6B5a2wlU>ubJDue15`uSpS*Yo8Ii;gS7Zz?Br;}fQv(GxYu zD5-xX+J-E5UjgeyQzk?EfHJY={OQh4uIhTPG8%W##uPYR8mvm`a0UwQYLc^P-Jy`S za`|Y@sx+cRG1xOjDqcc4l`_XxH|>2tjk!{Xe(LRik?2GXN#O~BHxoQmNQ3Xu$n`F@ z`H31W$M-M_%=2aevs~;FM*FM*D+aN>cT<9zgXgj#-y^yV&Ac&8?Dnbku8 z)B1DDPNkP)JmKg*8aeN-Tr81)Zhz3{pi&$-%jPYMru5yCUo>}AO00&;>_0OKtlJfY5TyDC7D1Gx7nOxuj5kY5F z`8^NS(V*0dI&dPC2_#FRRY-Z5Qs9l@m=xrf<1z9+R~%OUxn+ zMv+OZl&+vdV`CWhWMszEKHEAZX?KWxRgCZQ@&)$pQGOK3pY6%FM4`rw=Y_~Tk*o!T*j<8(evHw`|l z{*d_UtKi<7dpf$N5#|;h9$;f8;|xeieVbYpt#GsWdV>k}Ms4HKqmR+bO4IC_=0~zP zG$yMx)@#ybc{GvFU*S`XDQ^?qXa3YtE8NXHmjdH?zv=L3q>R%Y`FJ+sB4rfw0iIge zP67~9UK+gjSAz2|poMTwD3Q3^6qp5-GOgW(6$I4b;(V`@a>}D$YO@s5DLAvm+ly`n(Bx$}=#k{8%X8D@y3{ObmUp-mW{Hc*kk6luCo)aO;#n5b zEirK7A_{Yad?S^bwVXkhdx3@nt=JkkeV|EnKfC9_TUrFMGsBb|B-Oc!JWEVx1V(y( zHf#tHf?OHV%3>HO+ZatBD~g}KIm7TMaWi;PhOXZtaPmYZsPBcdDZ}ht zulKuCvDgl;8h71QV@1|UEFNv-*TQ|Q@RW3#1MYem6G%c6VID@GCI-QT;+^AP7&C17;w%pe3V|;RJJuzfz zaNPxUnYy_2Jh0#esYu}yPP}UahM4-y<}YF=Vy4AjtzmQgsw=_5cO!#pt>35fvWCzl zWHmRVfz8b7syTYwMcAbG5=OBLtl>z_MNt6b^Q#6j-E7tcVR<%7Ng}*Pecfg?Sgpt# zl2z#$#YfY=z-*(`cmdl6cW`^XF~-2rgV78lTHA+1`_%1>xS|_Bc0A5mq0(02N!BVX zac8X&w$@+bK?(U@2(X1$nrp8!F7y_;SbE!)?dOeylCshn(-z8wEv%3F^ujhs)L!0# zQo0=HG-G{}PvMc2vc+uAAoFytO(~xH11l?IWqkgv;(oy9qnWZNkX=%u zguQdM$?VyKKPom@PI=)ng8Fmf$n{{>Q4i)xcRJfJuMx0&G=4*>l3jQ&PWuSajVW-q zbr*R9Bk=94KSpDbRr9PQVrotNdkLq5@=zpzFnnxT>(;7xRX-fRSJu1Oa$>$$7Q96- zjScdB&4Fc^oN4i*td$M1sFD-19j$(0*ee8wQ}n^6ZqVy=%yHYp!NKiqBS1Q3akTom zM%gq)s3O$L)k4{eze#9w5`t<@F?L6@!O-MjL88?h#vcMKFfJ3BP6RM~4XJmKM@&^m z^bv)Df!fhauutd~V$shqU>-U!p+XRtLyd4QP|1l+=g<-MRs-X_M(Fm{H`)9=n+;}S z0FO;Ys1%Gyjov@g@j3E_;(OgNW)Fs;+j~pk$OxH%YP>L{8yCU>!^v9_7}9rqr8+=} zsrmUZt&@vupMV)gh~AE>%2wjcCO5L?FRy?jir~5U!%{;bP3}p89eI+PC*%2a#1`CSZ`qak zrtyKao8Q8x7`M0gcbpFS0qo*&o_jk5Wc3T@Zl|GVm2Y)`nft9`Y(~J7cSLQ7SAcGNoadfixO0-o> zv2oeYfPx@~Ul84s=p+;Z)4ucc#rEk>q#Z`&hBXd4$4?8BjElfe5JfrP@pj&|8Ux$N zhAj)q0~=l7Of&X%2!d!g?7GB>Dupwq*n4fkG;TYeAPcs_(YVoihOuvLY$S(dfs1n) zNCj-9>uzs4*59~X@~9d~9$+HT#j|RDMr}Jn!r(q9j~=og(AaX=z?yn};zUZIJWOs; zcTxh_FB^^^`e>W3?n}nQ7%UU#=T|iLYOCrActR}fkv#A%P01*X>^Z_%CGGfCyRtz8 z|EgXep~)GxA?F#1E>_(s<1TusC-)!b}~NDAtPP zZbZ89&W1pi;ZP zAeI1~mB8`Zs2gyGk1kWcOa2D=&{ofH-H;z#Tk~Fv6zABcwyGkRSfdG-EKx+E` z))K_yr4q#B&zB$`FOnc=1Ha4|qbwPXlNwMiiXa4CV$+)@nceVZF*?)t`+|cVDN<@r zs>1dE^YQkJ7rV!ulbz$e7pI*kyZc9n&rdqQ<=_?R-m&PQ7ql>UxZPEl5T~0o3wG41 zk#JkQvyfv-8cA+*<|$kww<#SFoxJbcwJqf<{0M<)O289J9tHc^)u8u(vUNoWGt~vO z+GWh`HOc?_7a;*mw{#b~VqN}~woKHD;Fg{<)SDIt(_R=g^$jBs~pa6;Ct zU8#GiLXY_`F!GJp$lOY=9Q+yMECvbkj1g+n!tQfZr4exy%$40G1TW;S$+1PFw3lWX z$ZbIrW##0hhCGfz_+ISYV20=lIiH2j7477?LgOHe+jQ zD7qX{0XjUDY@)CrElkb4BhB}87b8_NDd4u^d$#w9>l^8-=Qw8Go`Gh zL@Dp0ua;kg(1Nidg2H+9b8*l8N{T_yZM?1Vbt*15nQ^GRVtL;i567cA3(>@bl+?@G z0%3zF1H+x7*dl%rWQ0u?`XHG;Nsms<@wdiCc+RyuII;50&K+FM%}rpkn@!7Pmqv8A z>tz+~>&3#kk7hS1YLsbAdENz0y?{PD9J-{-CoC+Q=gYG97FxlhU8L#2{P?96R<+r# z(Cfl_&+{A)71v25p{H^2IuB=0;8%Xc9c1zlcu-jvBRlP(gp9YX2ZxI&#!s-Mi5XRxGq$i1U zoTC!_HrR4bJqdr1snvlBEMy_9?t5M{tDV);+S4tJ|!Sl3I(i$BVB1s{zNNE;6C!FXCC3@;ReKT7}( zMc-AvVPNGM95LCLd+hS5I1B5blTCY=1tLWegy;}LK@Gdj`e9HX;942(&NpJ$?^(4aVDwDrfEFx(+1 z-Xme4y@iQl#DqsnAU+b--jixfckf_^AW0Ej$!Hitr#!s|j)gU+RkEEHpg^a7?@h;9 zR>$Q)P4R9AvQ2o3w2a@_KRVm^l{5$|sk-0hb=tUW7;g0&PARAw_D}ab{H>1$AI#Ty z_@%)s?j}9PYl~m!gjwo9UeE9q4szmC3>rm&@uFKiZWEr$v;noXd_mKl&&Ei0DV%PE z7Uwi~nM@wBVCD|wB!Pep5PnTQSr>1^^4}9_I(jfwIT|5Q0vY z`?RY#ow>TL+MXs!eI%>*8Y)OlOSJx;hUwq6Q@P%(nwQ9=&gLlJ;v!V?8}QLHrq5j> znZKpeajpzD+waj`s|4qol7_g)K$Sfk;lQ$sDGZ3tKhMAT>_NX16YEbJFm%Ape=Vi}h{ zB)EwOaq1}87b?K}MP`&({Ia|kdVCTZ5zHjE%yQp+N59e>O`o%mhH*Nu+>t+2n z<8{%-hi-3&X}7O{bIJnd=GJ&dnz(ShLSUX6EZ(XjgF^)2A&6UIG^0IHGs-FiDvO&{_{m0e|tZ8 zCQIA*j}dvi@$|%=`egZV{=0X+AR5h=h(@Rb>gBnO`*$$UTb8CB5Bq!1PFfZCCrFJC zbCLkYW+^S>V#yhVvtk0TSy%poEZn4A`rrs!(2Np}cR|;elu^jMyynHsb|HT$v+hmU zk}~c*rWdxWq_7ep=JV?CUT;091vxRN^iknKaYcH*%Pz_N7uDxUSIZ~tE(r_yJS%0b z0Vn-$CuoTTf+^Wyd_ce`s8m4(f_Zv$BJpzjQy_go89{)$j5$`qx@3U^wKT{FVS-dH z>5g$Y88KUjz-XLB zZ#Vc(V>aeH^q?SOP8c1L8FinPBQ8Q>&C@CYKC}a}4z8U37}}I>HctuCpWN{e7Grjd_r_BUkKsJ9_iyEoehBYatHYmPTRE3)&%RYgCtTJ4^v#jLRbxgEro`TBq%l- z9Z%0`bfmG0ucWH0E?s2eJ)=>dn&O<=VQ)n1%?Q^EJ95+ViQ#t~t%6{Vi1p?>bbJ^$ zuD%Z+!EEp|hTc6m*+IugHYVXjTn8m`4`Bu1-DvKql+UPSwC2hCtRr8dRpOnz3~68|Ceg&&6bf?tphQbQ9M*mzYx<->O18WzB~ zSD2IT^fG+b&EWW+<j!kP+>#p>bd5 zVEa|o&FcPX2cN=2qi=Cyy-e@~-|X)mmS=PC?TRQS+IaN%TOS#Egp+yF*?V<#`jg8b z56mMsxGv@M;}>B{c;Hf&ta&f#%adc%fiJtSc6YoL4Pyk$8UCfUNi}u$4o_d49(PVV zPj{c~9qvB$RwOKh$!yx8fM)q+V4M1M?-*9?i|ym>(<84H!DEv&6ZeY7-Fvs0_=V~` zn6(b!?pIN};hsT%feGz&@{gbX*Yg)I$QwPB!J12iV zIo&;QX`UUu*gfq0{KUlX&to@QL9aTGy|K!@F-g0fxG~fGVb_BK@~=#?mE3R8sTe6` z@1zsFgWX>>YxHlc6=tjQ@--OxAlG=rQeRqPJ6c&=P%2J9`K!+3YE^o&pi>kAMo-Y|@B@={ctUU2fou3J9beGQurD&zT{DoQ%5P{is^;B=77V8)oN$z+MkQ2j5g7M+O&;AA51NHtwX^Ow zS~y+`^Z<62Wjz%Ee+vo zIvxugq?CcTiQ!);k)m^;TXK+=uvV}h2w9EF69r}Igfvt3^| zGE)3Q2TALlPx=@#7=_UybG&$rbJ;2W$pf;7u|;IHkT}$t!K{fnaf{>|ACRhOa*Pg6 zHcXX&afX5Q+U;1P>QPL+wo6BUHpZTby(oL__6UA@QG(*F*cY;>P4{U3V`=}A=0E;t zH9y~ezumx_Ki}Kw0M`ptPW*CkJ;WigGW&Z^_`v_m_VMBN0jCb#$+o-+`)9eR1w*pH z5GBZG@%G9`!|Ue$%Uwvf;UZq?zq905&8=tHV zaCElJzcx;xQhP9(u@U}vu|ro=5ykL(V_gkv3%E;CvWJ){M+9{f!Li3#y>gUhQK1D^mNYJ}CJ5%LRdl@j(67P>HRUMUY4(~?}dq4ZL4 zc|mLMHE?%r6Lm_Kfy1J6Th?ns)fdg3$YH4%o@p&2G66BG(cyr+Px&@5UuzI0NfpbL zbzDXI2mdX~POTyusZ-LM+?X}joZ{{gWg{nsE(D2P#S2q3Tn7y&v>aS&ZQX+STalx7!|aA0C~`(R~%HYpxrrblW1g=ae=S zI=7V4JUv=i9iBJ?LFLG7-TrE&Dt!*DWIK4hubE(TY%C$eg<)eAyFWwfDbX2c9+$yP zMzw4jnXMsRrG{U~)}= zaPnu9UD*r;MR8u8Sj*|fsOe=2>bzE{meT=opF~z^J=%IOFFXpFVNVjT;0l@-#eS# zew3h2c0dH4$8vc;7Bz)x`TFa@8(w5gWQpq1qFLO=C|9~N#b0JX8Zs1+Y%oqMHpju- z1%sfd%rz+8l?B`tq zzxLV&j(e|0+yAbqf&}d zF!3QOdwCv3V~;Mm?@@l}yy*PAy?0tOp$HY2k;v(_Zb!hXO1ZR_sc(cMi6TgMFyyVo zc4cx>xYcy07Sa~Lz+7GJYr#!kIK6dQdSma=bz2Hjp$Q%e!E;%!h?LTX$xHjseSbHXq_L*c{``&>Yi=6k! zh!%MI-48sq+dZnc>7>28}rxd-tt3Boi;_yjfAw$nMa8;NL>O;IpB_b8?$z zLYNfQhVYlXN;EasWSU&T+YslLpqI!uzn(2omxhgQCxQI{^$OpbF7qGwA457H|M>jX zUvH(b2U6Gs=1;qY%^pStC^&B4qMp%Mov{E{K&Zb+N@6c>lSSZn^=v!&MsaVDW2~O_ z4FSfu8S_g*5w2|f!j;54Z2RB9X|$ZH`|!2cd6&6(;#`8&l*#g)`|Hka@Qv-{x1HMs zQ!94?4{i9~%&!zx6K?0WG2dnlwp+;cH3sRu%sCUTMBIWO4h@i5W5JwEk{4JVp$H7k zhHx+-Kp2;M^dPc?-0?#2VBm`8!crm73 zD>)V0&0)SZK&S@UA>KY}JQ$4giy1pDuqVXv{N#i&oXr(FJRcFg!V0sq$r}{|WQfCC zaX0|=up!UR5x{)M%o%$JEZmpD2%Gy-tZ%S2-QV(8>jsq_Dh0(pi+goPJq3~0-?f(W zH1qO6GLXQ!e~V!it6vQZ$vk&KD82j)h`k&RHKCf9c7Ekl489m8%~IKnw8O*n)`+UJ z0$P`M2g}m0Pjc_LZ#HigH9T}k=&Ue?&WZz2Yvm21(=vk2^*XBtqYW-r;FGwU_u(WZ z6Mdxu8-?ZqWkJwK(NO;m;tgnX0&-WjRD&xv94o`)-_@55J_>hIW5}mhMB@|M-IhwYfJsBY{g>dczMB_2NL zEXxzU!oa>{SQD-u8Pci)S~i@ONKurSb{0_64iSLPwLa@JcBL@_18lPUf_hKc<>k;{ z)0OlhFA2mO5A~H_owl_ocvHUmiaFch{i3GnH|EQxX9~GlqXtJlflalo0m_)wi){_E(&vYU2O;FIRJdkEnR6vH5#smg=Mk%Z}4W3rhFz5{s|r5+$k2Bh0 z0%~~F4z&U)dELJ@k6Yk*|+#*WDw0`Ld!sUVfoSf>bWVZo|_l`Z9|KdaEs~%1*~pZ zZWkW@+X2+}rwqRPH9iN%lKbT-g*aH_xS&lT5j(W`XqN`lXI>$d_hYRIzicps1A#vL zfTE7@6!Y4jGfc8=Lk6Q!wl)rX!pOE^jCJ}IQbZ#H`yT4Mn8F+9tQnYXo6qPDZ?@Vu zB-YKV8iCT^AUeE$hcVq7G7Zauhe;i6$9I3ji!q8#&4H|ie33XPUXO}hEE;BT_?;@SBFu}u1LYKRxDhnHGPrhaw zBwiTL7*8urB_5@_icuk6!au&&$yD8T)TDEA(BBRCOJNPox7`+|Q*nT_kGi5eiFAT7 zgn+65)xqub@~4LnAHRI*WO1^Zni|T$+8-NW4Uy3TwFnd`RpYKCtbs&!E z>MFT~a0Xfkx=W#3%C8o`2e;fdcsMz3X%eZo(-`&FUr%C}J$%;O((-f1P3}%y%oH+! z{yMNwOwF-(=4FqzB3r!P5EF3st-aSb0^5w-6DxsA=o71fND_UGXuk%OOkxX(-TfVP z{dY_SZ#9@dCPzw1YoGbMP;rUJnRAF@#!$RMeD7HTu%Lao;rS7Vlr-!{(1iuF*ow8W z-b^;gYo^h;Om z?r*Sap9L4QoXHKE-3IZZIJva^?(wB4ALY?+&ieBH!3Kdpl0O{B6k(Q{n{kcv2mgSc zCrF09rE_6tVAIpNuyIv3x12>M!WDaK5C4d+=XP7c?c^KNDHvtM)?$mj!OQUNcAO0h zi+OS{?RtBB7VTht6oVJnk*&HOG||diRhs?RR=s~S%Z5H^k&MeB+H*4tF<__m8DZHy zy)9sKUASownvUeXM*1Dd`YqAwlmpyFv6~;0^WWdwX-f`HMF4zRke`y=(jjNvf zYBkm%*R}rCN&S7vKUm7+o5oTnvM!ya^8?&j!={G{2xXrvf5xhgco| zT_$DbCe2Xax!EB6jd3L?Tk^!!8bd5VF&vmD`EbS$%`k>VHLnLa7~KIFpqUps2?P8f zH)-CKRW?#TKiVoE%|1S0O+lHPEzCdMVqK`e%^h>5H=TowB-9y9xT=?}-X{3Vj0MC9`{oo3&$;e@XE1^RX=&|X+ zp-<$aJ|g3<)+fB1gIQ(0Rt}2?>;Zv^LYEcRGXkCrfF7FsqD>kOfY-H9SPW%qt^fnNJLI zaNkbh088OtpmH}-%&<84U^MVDuwzNqE@=iQNt0+Rl10by_9vWdH2(;XPgGjZkkh=4Zo9Sa0;Ttn#f2l_!%2tNzXl9*+%Gc_`O&njw4`_>Oz1`=|OtjCG_}%yGNE zwYGFJHLN6rd~UnLB`Ou{KPXE^*%Wjt+t%5eFauf4N(eWwvt!6Gko0~zv#loS&NhCh zWBw~*nXB0-pQ2z5j8zTU^MIu^(#n+lg9EHU{@Y)z)`2RSjfi3(!>uq^L=(Xe#b;P# z$@P}4GjmDf{RYfAJ_6S_l*f4+LQc^FbTY|12+mBqQYU@K3{ADM$%C|Y)2{q!?!2P3 z5YTj$7Nz_)1YPdP9*kpJVMa6>LVv>*dkDUis3pmB(rMuQgXdX!NjbemH6oRr|1<9F zG6P9@J_dPeFbU?O<77kd^7f@gBNzju;U!~eIGzdf6kFz;X}mNPBjEFh)J|$n z8Ep~w*8fsa!mkVze+=qWuSD1Ym9pbXBFCCjsv(jis%onfxkzEP`J@BvC4yO-p+5$# z9eCf)k6nlXrmfSQT3;r_l)-kH#H4%Xf6&|o?O5(6|8qyZzqKeUoB*aCw>k$Q-_hxaXB9Tf5QC`~URi-osM zR;SC{=QhfmBui*B*DtGkm0WZIO{Lu?2_$W4k&PqsN;RS-S3H92u0xV|ix9gUh0kT& zp$zPf#VDYq{*uaHs7UE(M!(rS+HH!lXh;{a)zmC<)2!VylGwG~qE+N%Aj8z=-#FB(Q z5UBN|-~|jl8|AaCC`o;}WP%$XU1g>tm4Ifrxx0UVLyfmOcb*7l(AMK(nnOlx62);G z;5&v0ag1koGM@n$+(svM(S|K=C1;Qwozs0Ib`3V zeC3*Bydy7(6;S)LxjwiLXYT>W(eUZqfqc|+ek3kG401~Lj)k3MZ`IdyLmimEf-2Q3vqLgUgkiO!JIjbVH^UZ^cMfMv%g~v(BSDbI2{i6oSJl8?SYoGm=+hnV7VVF zSb@5$l5i>KOq9{dKZK8x@@zIOCMc6^^$xd^tt~5FfI!mq%UBV?6E*>b-|Z#G&pA6_ zU^4giIYX=>R0-fqn%SS7=lR&M=FlM+mtoTHZl%judt`EvDI+Z!)F#uNW#{343mIZs zJdjmk#TGNev~H#an5cKd5zhpup3nuTqxFnbEVVup3-p5K?m_q7-1W{0m!dB;Q(_*{ zq_AF^z7Q;aOa*UP+uk7#GWCYiRJ>EMlvo(w%?WN>?@7{a`Mf&;U*dSlvw2*Mak{&Y zAO7VTP&b^_tEBrHt}D!mxwB__*4^1NMR&H|Ss`aXNQ)?j!E_(m*mr#X{{D90=LH2s z{0Ux#$rkA_cmmF{ue)I_?u0A1YF}K9pi4`rL%Flva)XpZrBCu+oGB8}un(=V@W**o zH&&jhe(n6?3FX9Vu$lt72XH@g9TM0exFXiD#BS==>NTBq zkyRJiY60(&!!?O!*oE-*AvAdJ`HJGF`Muy`E#oso!vKN6f;+r$k8@`B$3m zu=iyvufNHOPGEf!+$c~tFOxT>^|zS*$KJ>2;gVf~W52nAAAbF{ZDUvh@FOeA`kF|Ejv}?f~)(?u;<0V?*6C?vM$qhe#TV~(kA!Vp&O(H zl|>ny9NX%-DmTFXS+A0iB_J^n!3^JL!w(R?0`VXW$VnLm&_Beca4-k(XTuCt=QY)b zh2`^SBV`2H6^xz|c{3g%u0QZrpa(%WK&Ke8?!QLhaDzwtMR7W=;KR@;WzKBYLWDN> zi>m86-x4DlRSTzI)N9^?w+(&*(MbN6EF2f>>@o> z-&k!5miEmkEloQE3D)7CZH3twLPg<6OTiaX=we~1sOZlmmG=mx1(t*$ugg@Gkfi@85z#dn& zlTiH}vAT}UGeh7$W+mtX!NPt%tqhBiK!_q20nc;jLI#n+S&bimRGbzNvi=jKY5-FB z;K}Q@saDr71cs=%n06H^D}Q?sCL@c4F*8fbQ$$Tr!wa@)|0Y?-68;ApI7g@ZXz8Da zyU~+uo_lARg5z2aGe#VB&^}z8zyUbD!deHD|^!un)T4}02}u_T3!=@f7mq*7nAzUo!Qk(S|Jvc0 zhDU)>ENbBbM7;wrZd_1~nuDE1y_k=iZG8RcfvNxXqeqKs{^fb(3l1wI3cnbRYPB5BZW) z44A?{K`Az7_83@k(J2{G-G~w}Qj#xR8xzyDiMfS)y&>dcK>)zsiCG%pReM2i=`jY} zODMhW(0Ax#WS$r)q@Gk`urQ&)lDFrd{&3}X(v`P0u4I|7+$vwevR%QdU72+-Rd=qE zBYR2Xyk6O9H3GEx|I;fsjw>~ctKRoJSKsZp+w#j!h}X&zQ9D+)RpOSytBLxqG*bzA zpbzj%z*oVrd$*lP1;sN74ENVJHZ_WP?DWAukGNLP1Jt^yV!$+}wzk>}UA?Th=0czS z&-2z_$xq+&IE0@~PkmGhH(m948be?Gg?_7~Gg;!T?~1g#>+2$m{q^l~f1blW`!%oS z8oJmsbeUtQ=Reo()J!{neXnMyx6E%J%B&clb(5a^OMUjm+1yu$D-Yl=bkT1(p)j>z zZ&cn1>-y)n&1O8%Z>fhq6Q$ZfW%#Y$`r%Zp>IeO0{`$05Ee`u`8#;f9wS4xe!WvHd(HU*_Y3*r(QOFopcG<_d zjrr`;u-2f=%V_g*>Kyai4~XhA$Nk9Mwt4Qab1c_ij782jtGewwKOB!OGUY5=G!|ro z{sN<)#_u7>gB7fT5Cq=NKv}${jm`?!8R!g)+Ij)NDG_0AL?&kTZp4kWATXKfZ9GJ~ zN%curx%ji}D9K-566tKePm9|+<87XQafaF*Bc6Jk_n*c9UgHoHFz@nl1uk2m0FXr_ z2)Kly8BFq=WM;D7=d)snOf4ZnScg@c?-_V;i4X4Igd%{Mh&mgB4QYDn=HV&i!xldg zLtW}wF#`>}CMymq!9gVWyb*efYM%S%%$JryL7o7vlTFvLNjAkq7ogeR2p~mhL!$2* zx8VrD`@A$#0*uJe0QTY*$2&2;d9WGm-0ilz@0Qzu;TboIpv*UbeJ_*5ivp_&t9aC2 z<0#cbSV>e}d2WHJf&UtEiUmtZp`Bkrv(&XqWIkN72M_cvY{$8?odbD*!sA>v%z1g@dgZutv zJ!tg6jJ5e#?+&l(sBEe1y^!i|-5l4z%O;G2TfG6@`f&z=S%Q>z(L-=S&NWkO_e$S= z^z4IqiekI>g;YR(9(m3z-~xrhESAM0WPoIoE$hY7bi3``UsiL98esH9IOqz2OpcI1 z6xy2}72BX}JfOqkN|Y7iw1}oe6+HgCDwU}>y1sf02}}U%1$c@}5W7xs^DyovULlg? zgl3T7a&TwCXtL5G1joL9Ds0M0Q+6^^S+_u?<+IAcIHu=V4LAU z0x;K>1%o$l%iV9jIe^dLVjZ+Dr5(J*XT%DYQ81fBx1@*Th9M>}-U{BQt@je_3a_b^ z_J-G1>Ukc9V+=p+{S@m}u(cwyBsZ=H*mPK zp66RrhiL^)K-!kzpkVdMHtUQbEYc%d`rfM5uvexId2HZz1*SVI#!H(~`P=?js7VKQqnwFm0$`~V%GYsa!_?va@``2kK&ut@||m3}x-Rez>x=rMJ-Icx6P zNpvOm#@#7+Ji&N`#}W%G!cB6Wv@Yd0in6hYen<%f}UYMzyzR{Z9{cM8>e>& zj4fiCom9Ayk9kX>HnW&9N;IgphB-iLTf!62=UwbCdJCIIc5&=NbvA7@BHoE;$3(~F zbHslpRJeLZu6T&?D1Of9sDcgfKj?!;PO~S)1$2-wq|Gu<@@Xm1%#{C5Eq42**zwDX zP@8nsQ)?@CrM$P63avFgWSeL&2wQg-ww9epU+hj@e?mGKzdxbD0Bn#p5di*S+@xHo zyzhxXyRb_4T22C$fRAt#v!@sM>e1uphfn_e@+${xmcFLQR&&$}zfNLe5Ofo*AB(EBK_errl(>QiJ+!CQs0-6V<@l zjf{0C{;kt-1o>D~%K*2^GE_n?I>fzD|C=4q;BR(ThCsRbT4{l_&%2h|j;o zXvkgJ7@gOD>Lj5GB=3!lxeiUrN^*gY}XLv3l1GRjH z6lnINa?|Kike3CD0f=qah;ajQcTW0-)$3=j2H{*_43VF#!d?q34S?__U&L_PPq0+i z-B0d&*VZEJAy~pv+vDXH)YU^mVmj(dC1iUg$6bda=13me76>3axfj~e1=UIZ>%NH% z#E@z?h0+456S!E{xe?geY7n25&mfEI6UOyPV}M%Qs1&x}LJtkOhzP~5ndVE+itLjE z)S=la_MC~lDMgEOmjX;m<>)a$Yy<{Bna;<6SAy#Pu5Qxoa$xMFDV6_VRB?(d*1n)- zuSOAwWCu{Sh`q;K+t;i1hT|I#`2ToP#NOim!DoYx?ZcS#vtOJVclA)Sh z_LJ;mR+QjGD)^M{VB1T`DZ}wLOwIrI1r@T)78udFh#^^BEVrjS)&K-u>F|EW>HVzZ ztIqEV2l!Vw!S)CTXPECHBD)SQSux)lJ6W?Ts7>#c8=V~;p#5K;v0O$u|HrbDhdT3>(7GR zn9a69*|T2T`tJWNcn#~i_*<`ur#9B|%HgW=iqoDL0ww#rc_M&%9hzhDB9yRXk)Ucr zf{Mj?dQ-6|+>`j1A0ek*J!gd|$4|0mzouJtJ}!QldlvS-)}X{8Ds_Y=)A05vO-9I6GNQE;nB4DX>ETmr22} zmdS*`OR@HlKa-b=k86SE4}432Zi|H3SAjHm+(fsV}GG6gMr{IC2UUkN(eV1QMrVcpDtD8dl z(eB;k=yreSXdBdgwCLnZ<(xaX@{!^7?tQa2%0KRn=Vhstg?I1#0%%w`O!N5h4=)}+ zH%&)6lqTOKwh51q(^GcI5b2h$K|{`fzz90AvhiFIZU?Ixp`h8pfy#f)g6`}jKNIQN zPhMeCOPdrF9rN5?5+WvRgPgEx<_X0FqnB7V$&QP%m|fb;m}tQfK0lk!s7c{1P_Q(Q>S!ki*IuXi3pC}aUA{3S>%mIah3?S^6%iEk_BnA zsK66(27yjOA3%!i+bfir_eCo$ga^IPz4Uh0izYh-B9F$ba2ovtrAh#X{s@t|1+|v* zAr25br1f#^qy>!7t>#7eUzb~HgF6Zs0lfU}O@)`4?`d=scbE3!Z8OfrxkG1JcK-ii z01W3{bOqv3G+|;Yas3A@F4$RO%;t6hGtKvOplt~hW!JS44T7PUzWE%PK<#Plu}Z(a z)=XLYxofe0Es~_tFR$Th48E99Nedm+CI3i6^UU0!R ze{R8&&c~G9Y~)BLfJS0(w#c7*%}_z-mLCrk#7h#~BwSh0Ap*9DnTTltgkH6^3role!mAl{gK|^hOWJqdTVxjzb{W#xau!=$U=@p* zaV%y;lSnpC!?+rHkUB75BXU(K?2gp@5n%Fp&cpF3Q`#PIsc4y3XHafw#mD#DQ{6kd z{pN2;_pRYW_m1xB{_UL-^d|o?N4 zd7NSNJQa-fktbe>T!87cdz)$rM76fMENc&&D# z-Lym_Ft8yKpu=y&D&lBDwOWE}TrnoJ%NPp|ZbLZ>H?0`d{;KG2ga&^x-mRr{#2`wa@&K`1alRC_<3k9C723 zS8Jj;w2D1`u~mehi0A{~++9Hmk_MD86qA7xFimHrpcL~CwsW}j4AOD;BsQdhqfcLq8g5LLbnl0Yk*4EmvCi*@$XD>UiC72NS zqk!c$t)V2P5@hG#<6J__-|2fObXJ_cH|IaId0Lx8ceC%%7Q^5`TBR~u7!rudV?=5M z8RcVUc4Zh)hHex>T%f)tBfzG!AOZ*OwdZ^zrEXby7B5wygD$G`L@&!;giwaF8j83; z^C0`pNYr)VeA(O#dj07I%YoqwWiO_-h!h5msi%B7^R&FrrlXK7IL=`T5dD=Q`^!svK?4H^Ypb&_ zgbR6uFh)(2pd-?)G`#jJR1$BI^a;r{L82cjcx4f^%r;^D|soH=jBTN&+&C?d}MX6 zr$*J4{hvHJ(99feUy2-MRSRz0IJ>v85mW650aCQ7#f-GF%ZQ`fZR!pYzk;y7aH$)i zNQN$1jXQ59C)YJ)kyV6@pc`xyV1%pBlH40HAn*`;xmI+|N%#P+HrZ|dIh}|haWi?E zJBn>hn-B>fjOJTk=S0ilrYV4Pqb{#wVst$bzALo9VhpV-UQPFityTRF{X3-emw8M7 zw^gi|S#n!6ChJ)b96Iq3GrC0C8>5Cn(oXLHTD-mP4Gh-63?RRh`&o;ay)~ zNihg@7reXgC)c`-Hs$EGuToIH=yvOA?Goh<(3?Mkui}__6i_|kAoMy9-N)AQ9&Mw1xVU_Oena7ortOlANc z`c^sP%cF5|XhI=+!>F^`K_X6I`lx?ee8I~H zI<15XsX~)5;8_&vz`GOUxS|(L=;(-NN96`4IEtScjsp35x)sodd~CsEoQ`s%V;DM3 z{0<@nQIqVTI1HYG^c^$jQBUvA4!;E)n9e@CfWUuR(1DOgYo*4`M1v~7kV`J)WfCN$ zwq#Njh{l!>@CQh8j}8xO>x|}7rhrz^-1KInjx2i+fP6UBgT0b9Gv)(~&{N;>*{z2+ z*`X)T7ku|p_MGqoJ~|8QFDUfNW1~149UR^O?sG1FY3P)=3vPp3GoPvA@QaOVQVb&(_3VbRifrz1jcGlO=f}}RL2mO*XQxDe_bk#0ag_!Bi}^)9 zoTJNO%y$uu4*1fh4nvx*c=9iIkZk#gY+CgJQ69v+B|~#lES}1j^Q`U`oW=Du;8Xa2 zaWwzpXrhB+uD7AQWUsaX;0q5Vm-_H*RHy#NIw?+pyRSI)Q(eJrNiUTvzju}LTk_+F zKfz~@jX!tO##>VtU%q2Mee0;-l%BJ``JbWflYDwYD$moZ z8i7SMkoem)iV2VIAk~V)hAxr{c_^Ru{x-+_z2SjuGC#W)G%tXw?D&CJc0d3=rv-uu z%%@W@)b`AtKFu+@;_sD2_h1zo4jVT~VNgDW(H@c$;A+<9k zYwGBrtPYBV8E7iVEGem1a)P(^HXG#zmi<&gg3tr$gEnC*Ya*4BZ6w`^8x>sxO)JU> z5*Y^HA|({SHWp`-UR?jw&+JG8pG&~CF&rWRyrL?fVfu%JkO_K>adjSSMlhLqkeGYi zr=Fq2%I7v*3GAF%=wrb4OL=k;O7eno1h8F$Yzhb?e)Nu;-b%ez=z7g*MF63;xln1c zm0uLIr2FkwW5F2!lvQ}kheze?(C#l77UKz`(fW+1)$=`BWju??U1VT9t}{=!As=== zv2b@Hx6TnY=+t9&y;ARU1fDkmLiNZ)N6i`vpQ}>oKn!iDyqzz;_5C7-Ta&D81c)81 z{W);Y$QPM^9au6=o}44cvNLJ3=H($`D+`q?&d%~t0bAor=dQ5y&Gp{4K>Ud>VRWDm zX=s-TbGUZ=oZJ07{Wo{+{Q>Nj7G^l74w!{nbMu4 zOCfUm$(z6Jn+Z6cgNJ{bsPMV~uDYjN`V%O!Ln6}na(m-A_ln}VnAc`78Hut}HCI z@J#W}v6_uw>vUk(&GP3rYL5&h4_+-C_x^btDb%m^E&gfQlR99cZi~q;qYu>`|b$edI_` zu$e6F`K%oklAYB@qrQ=74cnRzA4H7HtN1j(pdbpHU0}4qVt{ zwTE|;(|KM4;O~}UeNRBVE?h3a1>5Bdxsw&U1B|1HJg~Xd#DZu@=y2xCJ{Aw@ z0iZp1K|7Lqd8fn+= zPf@nvL^DqRO9}_s1&FxQJjcQV1_Ww4d?nX zmw=5VLn}2HsrwC)26cR=Wp!+XVJbhE6ccCgi(x1Ir86H4TD5TZxWAgIuJBy19I!R z*)}dsSdzS~xZk|MMeUS}^ExjL;}ybrQ4g?pKRo>@IX1VOS%1nWl_e*jwWZ7`BMi%d zggN~N|JO{O%~ws}kltz1-UI5YeJ2&2fx+^kk;+ZIN|;)B)wl_=#)xa1bCW0EVx$Ii ziuZhS_iby`L8${ce7kdqWzlpOjJbS-p~gx3l*h}d5n9?2cnM1W;ob|{6G2yn*YHx@ z;Iva>k`W`uw+0VHw14y%P%qm7EdyB~vAtkC$u@k;PU0LoJcvqofk-H>5f2PE234ub zrcw?V`leg5+jRP;_1TC?k0X28H+}ncBf`?ae^w5nP!2F0j^yrdKQl{wr%;BRXxxF0 z^u%by))0ivq~Gr&UBO(U&5iY0(I}r64DsJK2qL1XibN6lXZiv2ead?alMMNBF`@hK zsteE(5X2!tqAhO>pVM8-VGdBWq`ZYf$qMmXAZX>qD{>_1MjVrfdV`!x@gB{zVX$nkT zs7`4A=r2UADWtM@-A^wcKe~oHjYZQW1LUOjtuc#U>+ zu449LcK#vR`eb@^`{|41;2^oToqQq@u6y@B_@-Q6Z@u%9Ub%mKKi=j?{cOpxe-`!h zPk-?H`h}fU*6OACls=u8*S*mt+-B%{fDgK#BE7xdH;<`<*KPpz1^kcSh@X z6hOND2B?8+c9TF<4DeiP&QrS4$oio5r54AU@6_-*_INmctkbkH-nd+pi9s%&H^TbeVVDdRK*9Lurk^DL)1mRdOk zJ`96{Z?!}Rf6O5BTJt2(^Wd~KPFhM4XfR=>0!|oI4EL+@-9v z8*+nK3F0U{>OxU+--e^tCRj-ow@fx=?(=+b+3R`Jj=_`ev`h!+FWKo?=J(j% zJrp@-X6-UL$G^o%1IOSo*w4=YP&{p4i@#r?m|>(G^0W`(Th+(-w5a`tE=%o z>Y@pWk`&gc1FkU(ysPZe!Grp7436GLfGuWjdQoo3oNl+8y4tXUXH0n92PUdlS^etLg*ud+ZTv(h1@liAS_ z%BtN?EK}AhO$&b?XJp&%sYUuPX@3P6mT<~e(O>y0%msR=7S9)TTd!0*96H`!aA86C zkyJZkHi$Qec^fiBhB?a+C?%ilGd&S&P(l}QOouIXZzEWi5%~}pi?`G^zjlkk--K-R zF-;h&9NLpFMpM8l&IgvFpj?cG#pBpvhotDctZ4L&=u8)>Vu}?L8M4K;%7zr=X-0r0 zc(&Awf*X#YauR>d-B`)5E^auHFSH?b+3#$)6JaH@g6dc0sDxZh)K(Dxhpl)?<#mFK zIxkNGjcOwa7%||jnZVLUuI)gKO{Jga@Ej$*5(7()_#nqpB*R5Z$;U8mH}*}~J?f0g zj<(}w92XMZ8{fdU3kK9^?qYF!FV<;?gjPsuy;`00Zm9|N#u zU!N523NyFJExn-RjgCEU z(5r@z23gNA_lQ!(fh8S*V|8+3Q20~Fw+!cM+Bwco!A%8N;Uk!%t<)1+5kv#76>>Xl zn17t{C&l}his44F3FuBN)}`&Cn$wmEU7AjP`J_6nXWO)TDP~sbleE>=EfBt=w9${7 zGCMtOs#Ml+_-e%@Cr63}i;fHnMEFS=&NcvUgea|miDsX==qAWITipQ0h5C3JG%0<- z&&Q!HOiiX2{8u7<)tWj@J%fw3jYbL}x+&Qpkp6rYic%_g0=%T;F(MCmo!Cs1-svp4 z8~whGl(f>My(fw4HnNP{9*9k$6jbNC_LUIaa1Z{&UeV1>xRUeYpXCl%nAf6DgJFXQuWHWm0su!d`_} z(ZHci;{msc_qtpX_g>_3Qyp|Ad>12B1hz0Bk)*F{u^`d;Nxkm{tVraGZOlkZ<4oLu zGJy8_c{XL#UGYAIo=?xnVP3LtnOR2#b#Vfd{^a|YX6u=MA8hS!nK$kb;p`-L;Qt`U z6XJJ3xwI?Q{n7oewEgNctCXB&V}Pguwf+oM6jc(;@fN|t4>|plwUx_gXy#cr!M3YY zSl7*jbA^#o8+N!EGrNf5zLuO*?CdrJH=7yNv>v2zG)9=l(QsT@atw(0pw5Bjrulo= z(vVwTatGl245&{i+?g$gavePy5MGBspvc2wj1TYWhtvFH0RuG8e^2f+bZTCq>W~ns z@zjtC>AXrlAa-)EXL?=LOa#yr9HHv7d6naqG+ zEm*LGT!3^RC(}GXu1CGhP_`@iVJ@{R43FOSJCS-FZvBw%2KMic_eq#{n2>r_P39N> z>{-!o%h>=rHz>x#X%2L#1%a+Ts1*b9;7Zs}=3|Pn5avcG1a23@V(IO(~fZJ&{#rvA!KQ1!qpejA*T~I_MNLYcYFW) zE&cn=9skeh@AilIuWgl{gy2z#Eq(aYix-cdzJlrD?_0S8;Crg^I6pNr{SnUF%*e2u zt{~=6fTYj*6VMnVS57!#GEtvUOsvD6oxN7_~(otXz6b{^anpYhEbdE z{?-Flu&JjxG2N+bzAzP4q_gI8rx=U6+T2;YAMNjw8#D4UUk3OCK!c z2w#tziTx_Gj3dtdgK6hI;Ho@hOY$PXv4og~gMR!XP?%!`Io5}2{jPTtZYGa#aEXx- zB#x6 z*P@caIMpZHzUF_Z`He-*<2C?PK&!ve+{Ct9p0saIRIn`eg=+17qdCKmtk;_B5!~m= zRpPT73h1YC<@CTZpF!4$XzCC7;ZUP*LGmvY3rB#(iX#O(W5ny-n3L(Wn%Ed`|h>xAitUXnY^-4 z1Vntc-Gr*rZO2w<5Dk-e{jI*HZ1~?6YSuh~D0;Z-^;e{u_&Fov+~CI)HE4cMFGE|g zo7t7z>-9FI8udS8Kkj!w;m5A~cf!4g#t#QqEbd*P!mZ}h@Y3$L(gO1dE-N3wE%3|u z;&X|!lQBQ%p0LfZkj>o5Pc=kpZ6!t|doNtsR)1?ZsS8j|i2>*wbNP)KZ`-K@&Hq1o z_A>c@`oAY-3;}VsUi;xDU%JN~_$l{ZF~co5N$bjyzWi5W=x(5JV~|<~R)!Snq+$UF z1e=O2lf>-(AgPp7N;VaT?%EWtbE&?BrRq%v3^e?gOYNNAF?$V9Gs8|IfaYk9ajw72 z0ny!N9~CvRxHOsh&(SXljyk}Qi%*~CeVfv~+WdF=ccPMcVDaLSHPLG{!>#!Qy|d*T zHm8Bj=I1RKSz;JpnBM^N%-U^`mmn_+Sk0731CMm~e7N*Qop-C}4?@k35hyT7}&b+^|dUk^MNhXup_jVq%7`9D-?yV!ESVd-Puf&IF-Q#crkx`{4VRD31#LiQkYn8O( zM8APXL4Az=hFx`>TR7tpIjxfQ2v+;~lZPrlIyDMjkOyECIGd;k5*ZL!cy<8c8{Lq| zJK3uwi~y0hiSrxpgOL&JL09JQ(;@5d5=TdpB(x+cw}Pw2OEEL;MBaVkm)G4-OoFfb z3a?vsOB|B8Cf3?#5Ps&fe^08Q!&9vh{qVb*8^AicnbBT}kO(ok>*+g4Y6o^6LnO}!gyr7-^y0_sX>z0sH;&Qg zd$cS99`K28%yh~D5@JS^RZ;dw`m1$^upyF+RIjGlxJGxDep&G$GBmo+fA_Ir z3(YY8h(C$;JCpqI(WoXqnkbx7mLD&=%lT&voOi3|+Une1m3y%GYO8v_Z?KnQmiy;? zfVD3+1TKbOru0cp*x-Jst?G~8eye>7yn!kw+t9<-^TBN$v7gn5_oM2^f}uvgy?nrH z_{Dg~*gwUwR9(HDp32r`ez^=C=Evmx_xI%Qsu z@Ch_3QE93nKlgn2e*2auEtwBY-)ED$8ePfop>J2k?3d8t2&@`Pbk%lRm$Z?d#HuO)m4p6PB0TN}zuaatY}C0P;hU0LX8fOu&7N{jk7oET7J5 z8V@fW=kbP^ouQ;uF>E+xP;qPN3)eP=aL9OXxVj8VNHI~eFU=7d=fk|N9g17q0VBUt z#D+;JSE&Y0Y3`<;Da*oPB*PmEwT^v~YG|b*pf!GiG~0)wGqXd&W1swd2jGfy(4`zj z)}<7m@h^}}kaOq9{7c#E_=Ww=COv-48e((%Z=K=pLyBwW3VzQ(G7^7FZrP<^?752CnAQsondGxTBFNiHY*`~wD<_a`Z?#9Jb3y5RXtZ(D23+b7YMv&zHgR@ zq5C9=Rs5W)`sDY?@8CawK!uzvDEn5yx&mksKq^uNL}muF6?PsO2=HPm;T&QlpXoXf zor(yJnpBxRQ5eFx8nEBxwweG+7HxJ>T~p8`x^A;;C8nDpxHogbf#ck$I7NuvV#cmm z!0#LB+pq$cW)^cJ+fWL?8na^|I4^xvqtQvAU%|uF4#9HtV4P6n;?kyb5>HYHRdo4B z;_IU0OmGNNOkS=F4dl4k3`Al$889CKQMP;>k2(E)?bn)g|1d`*dE1St<^rqry|B)~- z1k%p)VHWH#hun;eMO$a(N4Dg#h?LZY5sAPEw=aw^V9n-m&CMJTF%VDmtkiJ~zdcP| ze1UYT?JH9EIDNkv z3ct$4Dk|Sb=Y2|l!?ga_qxQcBy}v>D?P!x&r%CKErA(%Z;&x zjigt01t2jipUv`VKLTU-g*PqfOrQklMGYZ2Em*nOpj^Iie&6L-b~VY2cp&sD9@c6o zSNCp0h=Y`L8N(b03X-I8&9W=ID?^Xzrlqm9T(?rk8X%Vh7i+rvWq0Aydl1u(%aG(M zY+Xt<5K~Nk$%VKe1&p6Ak2B6o=|wPoDSzU{;-PGo_~9YeXm8)7D?Yv|UKX@-}>lCN7eu1%-SqI3(`Hb%p#=EQ|A!|JLsev7rB!?LQ;5d-d@bI=Rp zY~lxZRUIJBph7f6@>_>zTFr2O>bbQql|N?hJuFdIjIaJ<>B&k&A=DmGDfr z>b?FBEYIE^AU6u;u&YW3ZUI2E?k(3LAoh-X>1@B!T@PGx_s!o-Q{CO&t#^@TER*V} zuiJ=(QKabT@NAR-&>l5&6y20&3KHt9ToU1(CQ4`C^!#;>I}5o8>WYl)H@Z zl~0gg9C9pS?#-vofrh{XIF*KSO=si=?|Y8QAyDFm`r3KHCVsq)fkKP{C~<7QZ73lm zX`8|_&BvpDa=YK}V_YtL5BDv8W;@k+9eu}_+ z47m?2^o6HGxe%^ha|4XmW$V1k|KjZa#o7Ir;p}3p1wc&Zn7aw+S&zsY@mi)WcOxdO zMAJ8KYA5EkYSPS$f9<-<9`9TWPM#$0>Wv(l`0cwo3E-mPzJP!H%lKbc@xQL(o4Sf| z=O(<5|7o|e*NguN7c$PwmBo{|;*RML<2Pn1(~|VzXP{fKv?@W9TYFnlw`CgC zvHMMd6h@z3ldEnC& zqpTR{*b|y(Rkh-%L7qVzAYS5@m`?{7QsDaOn-#zRA~0QAPQ8;;FBKul))MvYa>mA`#_t+KmD!Z(@Qs zdxE``qwJJ!&UrB+3=nxi()eXQv#r?7m45moarw* z;}-`u@(sle*MV0+m(f8UvjW+;cymbt90YDczGOs?MN` zNc>Ry9kAOAE3v<5rE>6k%zQWxI#q9Dj#TDxr&imteTCm~(|KD-D6OCCC zlFV=%KJQ`nqZi>hA4B1RAqv6f;keXEK0OO!q~V`voHV}JPF$4(uYM3CZLdVd6OAnJ z(aZU9Ju7B&-Ze4-BiT3(nQ_VqtXJOe<}~v6TTACl-wG613>2-3CUwf3e^Z}q8-`vGhn(#wSrZ)4N*r^ zc3)I!)&j(E8R|<1TU7q2tDkP&Pbgtb;tkD>-piytaLIYxwW)8n6#j zo!un72y|7s4D7S6Zo^w1_rk3KPlbKOlVN|G3Gv>kDe;~=z@#5!9l_)U`UmVa z!~_L~u-at(qw$iB^gflQA|MEo>XSfN=Ai5)4G|0|&`@2xLzld}zl7s_ht%xi@$2W$ zUc7qg-)EE$p@86}r_Wy5Xx}X9kMa|=b@r1VF>e9D2m;2I%4_0rD*YQ*`|GDLuC2*YuW(n$OHYv;{ zquD`I7A`sSpCiZp!wi+?NTt}8eQqAHlbQLe&AqH^-la*eM1Cf_fB_8fkpnIA9{0*T z>D{&BVgu+5I*@GT7e?mqerpEXsXr8;w&%TYaFS^bm!u(bJU8sp88ao67P_j)wuR;( z0Fp%qDNv_EuG7AJ-R=z{fQA>VvJu*m6p$YUOcHwpJEq@9$DW{b``DR3qpuR+wB*?o z(jFs1$aw*GvR59}9>+8St zucF-Bem5CzZ$A)Ff~DKin0xUrG;gbK0NT!fc>OBfYW>8I{}HXwY5o+jJuIJXAUjwuVv6I$My}(b@P)jQ{LRPFTX!Sv5sm*+ADig zQ=!`4pm?4jZxK0Ln4dF9gN`>K{QxTtE}VBh`Q2i=jSBAUG(7O;t@p^zRw^8rH>|CSOy1p3wADQ zXZ9Yvr~1i*vPRpmOhr-;GlUME8!;HD8Bh^tY3H;Y(i^g?tIQe6->YJL`|h?2tQ!}@ z9L=6&#GXSwj@caW3<+Bpa@r%BRss#wXripjIC==jVr=cbNp|1DB=6lC-LH4a75eD* zo8)NsE&RD#U;XXqZujcw?$N!g-L2%`!b{Mc{lzP>B5%ELr&?PES!wsFh| zBWD7J8Q%VsEl+uTk(`G?uo7&o-t80@3Q9}K>RC|Sa6(hLObg@LMrXfjH zU5l`FSmgYDRptZ1#dgYRt9N6j!RGsh7}k0~SFyt*Rb`Q<6iG7_ZpaH{=8&B&&NiAG zL^Q_4ceVIO8shcr(X)Ma=YcFLXT?9*tZqtTb~R}l*a>c$YqyN>phdIRHX(W>c$tgj zEMrv)FL?!lRHa}cw=^t#-zqYCM=KN!>pZI_O&0i*Ljk_NNNrgJa~_%E_V1)iO^C+> zWhbI}lz!Gy$lK>u(;DJEN1I?)b-i&mcm%W45g2YzXD4|Ggo`Vu-bdHXQ_@EZ(^`18 zY*OpUPphYA4IDyKW@x9MPedM`k3&Q6B|%D)S`o44Lu~61+PaOwxIG*NbPwhLWtvZ- zvbz2WpBdiFYO%bx+gsQkvGjH*k18*tjbj|nvIcjaOwJB*s!?LeFK%oGuk1$fh?^mS2vN7sR2=T`B zC|Bo5u_Z0R+OOKTF*#P=-GmUEB>NgJf0-;QfgB=;5^!8HDe_?sLL#+NO?P39NhSp@ zvK*miE07>L;oAN#WfNsuLQT}eX)!T(8r#ey?8Ge19MxVnakXjIl2q~gGB>2fM^yPw z&qyo-m|e zqcFw(5~FvF0%#?b8iVrUo| z&i}!PP0|BTOQv}#r}Fy8mvRimf#7R~NaAe(kD1VynbQ3W43DSrKQ{A#){1w$yIjJS zrv3!I^}sz(PQ@?te2(!mEPRX$khg%vLhmzkF!~}v6a7H;w;B&K_1iSgNfFEm&rHdw zd4j(_9NgV#kVrittLQou<~@droQ~&Uqiwo|%PfBKZpmxQ7n#|-?w8{abQ)ti$)SLq z@-e59R#5f)Nw=Oneg4y{mpPWL_d>RD@Jyy{UiAu$0j5z*#3OWI=5vN4rubHd6 zQ6?smsh$Qt1fM_euPM487MVo^Q{?sMO#Q-1XDU&QffS-@0=^i|{(d;$ps%}#O|^|G zP6)b9cBR&tE)s46C7Uz>@y1p&>wUvp|Ib|RWsBG4EGom`jW?=v@sS+L4K!ILylYrl-Q6bo5>+S zj#M8l#x9vlln`nGnXPSS@wuj@?&xk}?i+q2Y1+)2uajm+JB~B*bAM^pi|H)v&e!H1 zBLAetY?E>ZqsAwcx{X>=omAdnnrm`X4g5`3o`J`)uu!`Q)|_!Qslx6)c(ah(m^*DB zOds=KlDj@!9DS0|74g_h8dZjppTNyu&1?OM3^8>bhpX=-e+wltZ)W!8aylaCE`>oy zj+piQxCWni%qkzM_u*%KbLj(KaWtz3p>w|*Y3hy z_1M|HKwI(yr5458I=TbbKG%vR=prHP_{Z0FIc;oQ#J?kn|kwjJI5oT;THR( z9$c?-AgC?xmT)WOUlFT(GPZ5yCbjFe=(1z^RT&w1AKL5I-fP`YJ`dAFE;z%g)2A;A2iaYez+D+?NqFc{edzjo4IF{APJgS!;QdA#|qvAxX0=OLL*^) zKRKcb`7MoDT1^KetFuv`?mjf~lh$_lzG9La*6MzW4RnxpxQA*QRcuY@=j?{GGb}}4=K4g-$jpQb?jZ&rjeC59-`?XVzg5}zJ{w3RV zt-yXoWhsv(n1*&se}v<1HTADfy#BkG_%{;!&uYZ^CcFWVBCO~U;8Twq@d{`?6gT7< z5MFt!n*WJ--GmE3lc0W?8vym}W?TWNt($QNptf$pC4gGG0k;5ZsMR$fw)cKx_W&e^ zH{&9JJjhyZ0`23!L018v!gZnyn}5k!^*$BoJH75fSE+rQ8d6W;?2*4!6wbf49hxR# zGkHurg^tdXygT*~Vq76m0LrD!UbUOb@*$nWSXME-NJC;VS#F_h#SU4?MtOr)%Eh)v zU!IAY7MnN=H)mj6Vl|BQF0=_Q_T-au@A;p_1sG1z>^O0oV76=BzQs|Nr35D)$ajvM zK^`Ht#+O#WN1TocvG@5XZX61G@A5>t{;%$Av4X3`5=RTy0Zm}m@v>Oy3{z-St2ol; z(HxOKqMpo6fyA;7trCePTx*FW*Ym)X zvL26LKY2BH`P0LPk6*sD)afCqYY@gX{C2< zG%CgBE$}mP&L4dJaf1=mfM=8nlrZF~iPQ06Qc&dN!94>KT#i7bFx)&|H6w{xqyWLx z&&W)F+`mtvt(m;-SUPRaY^?7Q)%B6NTgww%F$Z~ri*!!tWl4JUj^T*5FvacZxB`?S zHax+t)=V`YfOVi7D!th`0z_kgi!*;9NJish_e)!(P($|nackBut8EDf9h0@V zrhL@0zH*n~mrpW7#0NR1D@%=d3*s&zbqG~wrKXX|>01n7HZ~(?s1DV&4)F+1q#-*@ zb+59Hz2;zG3H!#{VeB@6t;P*e;nW$hTTpf$nOS3Pc2(LqS;01mYSFwlFGAPK*dYM)M8{G|!(r+=H1m{}s@@ ze9KTL@oE~)3CYhjLi&8pY_IyE33j-E4bYHMpNkC`jOFdjaFNPf)Kiz*#6 z&5%eMQ!N!E&{Ig=-p?gXTbs`pP>T14I7wbqXycevAFlgzItj?<6ZS(r$%c7fMsi*r zgxStpZ|*gnv&oU*Y%*vTMVs(K>9;Y%VljgsM~QR7YWYBbJ$1Evm0TgPlt@(VV#M*^ zZ%lp&9JL#RO7*CgN)!45v@873*`3Tu?bWkOYdHyaD}OPhU`e`SH2c=xQQxp#B_h6E zcenONTk_aE>+;V=%zK)2!*Qp{=H@2urFve>@_lsOOvVI#2l55xw>Cdzn5?BCXC0XY znk+Qy&^Ri>8Pl3Emj)1gyZbB0C!4 zQ^SQ`4C{0&itF@cow8fYkd|U>iWZ~9zo9UrdzBzD#Sm>sSIsHJF?INGh&-JFX`c}d za_FB>u8WDuQkhgj^+GCvNo8Y_bZDi)lU8o)Za9YJeH3>a_}N(!>P=|Hm>iag89FaW$R>M^=%P=~JuPo6$`b^8rfe{1AX zPDDBCCl7$FgMx-oFtRK6v>&kEvLWc%DiGVN0Bje8-rR)O76_pTd}Z)zO_*&9YZPfY ze79!PQD(hu_8k5wBBgGj-3>CgW&f~-fnCfy2|@F9^6=}g#WZH9jyX{C;jEh0P#scb z6g4fJ>1+wQ;foxwrjxsO`hNh;0)^z?zRWIfZF`D?S$0Yqi-Y9h>(@%hPyPP%+z@cj3bVqMjD*0EjUq8dcN133o53DPxu6k!gXS|qszaG?7_|+ zsDgI(O!*yxamT*w8_}YqyBB)CZwI{3?d-b&@9%FXUg-laW9P$vn+9!5&-~kESvTAu z7k9;#TeUl`M!M=9{TVR6k(*{2l5cBCM~un^2)=l11V6V)QuM*GwBEmmy`yAr%g>?k z|03!CBI*Bpl5Th58niu9=OErv8@2zxje0a#PM>`E@h*+%>PWsDr8zgO@-!RQn93*f z6G1qvU^Joy2*Q0Qx{HY5tSZ5qm9c^wQip3Ye6?zub}qFMMQmGxQHgM>qHbkRlkc9t zc=p4K2S0vi{vKBq=t(Y4%`T+1GZvszf$B$W*znZYGb48Y7*gDT+FRQoC%U zN`}*_uKCJDQ`PwLJiF{~tketb0?-^QgxC*gx+(9IvUmKN^Prd>*O^8uekv+(mvj1E zcGIAQxSXIRBLn@K=TK?3zI*o5tLHzx`tGYOYj4;hJr-@qHm!j#Uy^U%&y4?K<}~Ko zr<1X9WCxw+WQu7}$JKeC>{h6UpVtR>8fF>t0CR)c(#6s0+41~1oCTY30u+aI68fR} z-n1|KXcY&m?;<-Qx~;9)jBoi=Jzs37YU2J!k_bo_o9Z4P@c(GF_QGTUM@ow)lONtu zUZ)pyF``#$^l`NwH7{SRe zIp?nB=wW$c@;z(1eQze;XUO8_zUa!#p?d7L-sWQvr zgYN)OsZpF&Cv6(it@9*jE9IFnwMO$Pl+lwSw28shuy_ zVU4!e-D7d5xD`nZ6~7TW6M(Rw=tQKa)u-0=Yl&km6>R@d_^O=s)LT!~TZKw_1{now z5#9o-*(RiegKLo1{y&Ht5*$3Br(!sR>#}}dOePp$7~?{`EuxHO&moF&iU<#vDnBC{ zkpZkQJ2^p=J;oF>biy#@MKvY6nW=zRw5^EQ-bWbPB!t$+d012|(Dfm<3e@}B9GB~( zbisK}Keg7v1ukcU`4|ozyuk1%{OiDFoHD=eC)fD@;Y`qBmfo3y1B~N5FkAuFa=JZUYF&HwkkehpN|q=E-u z$i>JS=zT+%8j3ornoozhi!#tYJL;asul9$jU%63Dl{Hf%=%>IV_}_ECsmRRyFr!{n z@V@rp{ruUW3*jvR}U%ih#Uup?+xj_KyLwO9Auf*83y0$Xb42E4@X;o4PGtNrTQ;_F zTAdBRvsKbKEZ$B^*F@+st!?RD`acuBW$jgzFu3Q>UOsu9jB<+XGDOjOq{Ce^CeI2; zWxx$UR5F?WkOQxh>|<4o9J;OTD7v@XkmE$yO^zOe%4cW|l;~uYv*|3!PGk&bz;Po=JG)<#wj&nGvjdd^LSQF^VucURV7(~_USi&!SjQK z(=X8ia^6zwUuMLv?ZkE0bVIzlcHSH%dvEbm$5?&G2K=1A2Nmu@u-?}escyxyJkwwTaFo;!Ecq*fX80B z^Z`wZ*;3N3-gc}K2INW+={NNm%?Juq%)6i%$aup8@#i!H@eI5-lzUgO*22!{Tt*r_ zZH-(;=E)?R&T4y{gB-gKa!)9%K<_aWM{}6 zM$=HVrl4@?C)Oc@UJeQSbV(Ws9AyhkzH6f;2ZS%dEJ-Lq=a5Bv-<22{O$5T0{pv7Q zAxM`KOo568Gq}qx4#|MP)Hj4^I^c+VezIpg2vxmhlm+TJd zpzO+)k;G<5=LwfIr4Ybusg19b^L8@j-PLF{5*T39D-GBjW=#-j62vnTlP{*_9F9SXrBZ93+^s+ zoKNed2grT-0h`OaBHZJ(XkTosLwZhB0# zl|>yT>Dipu9Y$en5%W3%Zq3nw6bU$HIE%mW3&J?>?j7CTn`}uh-kI7Su9BZHq6w#W z^p0z8iI-cJ_^?ELm82xtg;R#2SMX4xYK%lf7D_K_DK_!(R{W55ys)i&rgOU=(`dLkl%Dh(^zm{bmQ{*BfB_O2>z}a6O4t2&}T3 z3Go61Y>X+Bt0^3&WKz`yx)L}?9jGv42;?sP7qvOo{biS1-gS)5E`v1hcI_uvE5|-E zyE|o8>>6HZcUhhdyL8Yf?$U*cW^C81>c1#Ga{>Y&SiY-FeA*qMKAP>%Cz4Dhq`7qp1lQSb&F+bgpXKfUrjI7(#qk)tjuis)MD8F2H(+JfjqSpco=wM znUUR`1v`jF4Ma93B_1sa1 z3%+gU@X_G#$)8_5c=6Z4^9Qf~BKlNfpb*y);T~n={kY<6t2I@Hj;st*0vP)1M{9e( zywm{nRqcL*e>DAc%nW@B6HegdDC0?xhvFJQ0qmg8D3TwP7N72Zop!%VO_OG4xtCTL zHj@jcjg8o=+uIwTuu;+j6w}PVSZr8<^pJ04T)e_ zqI)yrDZvZYbDFD@zk@pADK3K)s3?(GESbOd-J42v)}-g~WPY>ZFfIh@s$IG5dc@MErIS%^nQXr0!%vKN|luDfz2H9m>}M)8-eJ+4`ud&NCloBn6%xNe804$bB5z`G$H$Tk66XxC@iB%(Orm5 zAJ2;MJa5#5X~KgYx^MXv++wbwvzd5`W?YZ~9{V%nE0A!r2*1X}(zuFA3S%v|4mq8T3TS(pdB@{uGE+(oB0h{l5zq5G zfxKHRbUJ9hkycb>rwPRtCEA=+FrwZ{QIzz!(s?C{5WYK4L-s&|^;=g0&bUHQN>Xo( z7`=#y6cadnL>zcI^jhECs&PPv*kh3`w7^$vtF7RS#&2!q3;R_^Aj23BK*Cf2b_DHY z(@$4#ru5EL5d=ltc6kF%pwM7W!7gP6lMD-BH4%0Io|*jZWC`v_RiX2RCzQ5K(7qII z`><;aQ@Yh5gZi_g+J)p=aDVZQj)9jPz54?O3?Zi#<93F^l;1M5Rcy^|+J20^-@Cxt zQ&ih3p!a$*=+-%se%k(pQW@Bq`KU|}6<6R$1EBM5+IE-VV`6Ob;#^$}I~vv&jCRgU zL#_p^LmXLhl+!^tyn9(#^(zhwx62MCa5~DfNf?J$l}0OGornvdzScz3O~wsTA~qQv z4pVwq&|Wp%)SVf`EuNDj0dsRuHg)PLxJ0XiK}I(Ph6PaF!$)za$6JEv)uw1b+{8{W z;)8%Qhi5uqM~k@PRI3+Ap7Ud8#2xJ1C+eHRJ|R;EqY{X#p@A`KEV=~_d2xXi-mOd7 znHLe6EYCKM;|;64(e2fofC*ZUt7J}Ufx#!t8)`$&)`xbAc63o2YhohOj4MfDb|vB~ zajv6uQNeWy$hG5_9LM!%)xu2WQ}Nho$w*h{u6Ek^oOZia`8~$b(ZBu zO(+9-?m43cecC>WJCjKV<_mbz#1-*@m{FvexP}R#Z%FXAi%JqZdyN&3HL47Hf3&S2 zSC3L<{Qe$p2nM)&R4L8pqdW)<0I(i#_oY^Rf%a{9Ot#zvN1)w&(<#UOK_;ta#f!BCF?*B7lgI( z6D177hPXWt0}ExV(1b=YTgBDs4MLdi{<9~hUm27@Tk0AvN7hIrNW z>>9Rg4SR8rUsWiAF>sKCE`h|ZHGtZ5Zwo8Md8*9LacQMU;ZS(df)`%Sc5>>>^sGHI zeR64TZU))bo}8OKJ$)wa!O;pnhG_1_q|lrU?$qq5PM~&<1vSN6-zBDo`fS>d3MIM` z4Lc}(6q2S&dCYyKkgi=FJ8D_0zqJQOSFr)&DV{hpw=g%ilpL;AbHjMrB?X@>>-@yo znX%36Mses!Y9#fP1t?NdJTd?BspN1xfp4r3Ud&g+knET}m9;FqTW7481p&EU$>vif zr#`$^#*dbDX72R#%+%u8venCyQfuX9+|*Yq7r{iq7i&_>ly`79Aj`x~!O1)smg_KP zLkSEjPztkUD+T(uhBu=+)f9uD&GSbX!8QJP6_*{^BOXcS&xqsMrLnd0>PFqNPEMSH zw=}ey$V~Ktgrq&hpAm;7JWguQSAipP7`S&Jg90B=P9`l2##9;vNbWMO`4RXuo!tC@c@Z$y^gz{pYw474Du*(1DANa@~ckP!W*_*%f z%aK3t$&dXFdv)RU=72p!mx9*D>eYs04}qY+TFBSe$Bxl6W7#nfJT>R$xBN;Z)suhE zPu(Sp|71V*_{=E^X>fRKsJHcFg9Z8CBLWVH+OrAHi5Tf zX?#9~<0ixR5o9pz!t9x`{um9iSbsp4vlH*0TNpbM^ksS$zKjHXnV(pid|~V<_@cLL z^+P*9>UUzCchKudVul)Tp>;@?5Ga+02U6u$VuSJs*+DP50HFj;iqN|zO6XmaC-klh z6?61ksx}-=oXjW$=-{P2RIxFK)tk%H0}lFZ)xM_ZwbXN(GIA1NUPhO(q16hg8L440 zWjpu{2QmLr z)sCS%V9J2{Sh`^T;YO{BjIJ>||HRuSCkN=Fy4FR>w)`tdD9iAa^b?G#Pb5854CI#f ztkP|7TZh8>Y4w|TPtQ)yoI5qOh?YK*W8FG6_saP*Q?oD}&p={4Q7>08WDnq$9L|?> z@ZYsfu)|WhRRCQo<9cLcX5dI4NR3mU#B0*#$b0MLbDo7BZ*<)_)giK5hl;4C!H68fRm1A4 z?SV%G!4_E-sCf0E^>X<#5Ev7Ba}|3i8(M&Wz)~XJTK%`XCeCIi=jU0hpD`OHp-z4w z579|Jv&43gOjF+pZZ2jm{+KCdGmCTQ7A9riW-8Ufm2BNft=lN9ayA!%Ia>(FoXv*} z*mY(8jmyEDEd*fB#;`W{pjXAm1tQIFEaf5$5X~%10n08zKN`2BY8fWaEi6pUE+x}? znU|)ir?oWX1#9&)9a8BKW|Ns-E|rHWP?{s~*C!qmgrIYHXK*T(vsOQ7Suaf<&ydKm$9k{i zj!OdNYgcW2=Pwock}uLbs}vLIs4b_8%t?uy4UOE;)QsRtkr~rCfBN!rcGa^Ae$~@B z=NiR%!!sJWWSM|(86Zh80E2Qq5XM&l1PHr$^vIE?1a0jrHGGxitrbfmiQcc|D%JAq zdJ@u^r80zUTYNPLZWh$Z9$Z+bzgbr6h47-hJNzX@r})3{t_g-2)JG`#cPHBR-HFh?JJGK1PK5Q{iO{|~(XQ`KwC%gV z9HD)8qJzE*$z$~0)GJF16PZ)fi%Tr37pT-QFM@s{1Rd%n`rwrByu(3hSpE9lhYr~b zjgoySHM~+T*J~I>?Gif3#93x?`^8Wdqp1RvS+3zr)C$YY@ZI-TIpG} zvpGsgZ5)$?N)<}BvP0O@@Boy+U=Mcux|mJzNDi()X#}u`$Scl3_g}x!Z}*S(TUKiR zg}K@DXsQgme;RiSlfQ4!o-XB57T zMC%TrZ~(#@#gA%~iiHi_o=-PK7HUjIDccyc2pMpg)|qhKdj+ooE7Y+Cw9t*Ap7@gW zMmaAdqSpp->5?LtWce0%ya72!!A->32)r;C zNL9_2Sg@+IQwx(X0K|!t(=*dc=dsbJrm#LS}IanlZ67w~(Y2uv}i8 zJjm46Gp8n&CU_+x4HWmBJ+xsTKXy#dDUR6qGwZn)Cl{vYmx3})&n_-a%*=4BksFOH z36V%zb$PWKe&f88k*Tz6ENRWoEu5X0$?&3(HEqo=OquUuf)K;&E_Z7PO zCYygfQ*-K#3IJyYw%=X# z5$>UvK;snwE>?TvwRl{sc=(MsVwXlod3h=Y*?9u4FtKVWZ-#NyCBAS_;V|js>l?47 z1^|{o(l9eCpgtrG5fbybaX1rd14i#4J~nk%PY4rRQ%lVFcIw%+nl;Jaa`c8> zBQ$5gOAU*pc;)?u?@Lp!OwXR4qi3btBn8{!c;k=b*2LMRi3Li*2Y6>M_;hY*4jG2t z`7=wEj5e;`*cX)QBArS2iI-obgqL3&wNMrVfAMV|dXl~4)41^5Q4)KEw8ish&n-<8iNrIc zo;y2#a+>92kK+~|m&#Ck*b`5gl_?_6l1y2Glrsxc)E;_(_gAK%gD8QX#;wyL$7z;B zys|gNW8?f$riqzoTz^+z)$B9wNm6;_+%s;bXgM%eb`UJ%!?-nruA=doQ}`sij6aT} z3wiG3yIC50q%@Jh-e^^rCEz2b&Cjuf`8jyQ(^>ci|H9jn4s%IDMIOYVfXU(+QeOlH z$Piiiuq~C(h~s=v{qf%WC>}mZEaNF!zGsNh%N5f%H5)3G?VW z5zC^dj9V;l7k*(+7#PYX!WzQl4HwTmwX8CiMNZXd?RA`%mpF3#aojSDr*ZX$UslU9nI6YA(}g9Aw{c4v zY2)mPQn0NmmA}CkRE|ZJ@`b14HX!4hNPzG444qrXFYIyL!hNkbTTEAE|qR=wX~zfQd)I~KSS9K%StVt zJAHckm8r$F6=?UR?GQte8)>HPCiW%4Gwn=zp0*?{%R?Cbfra{+UBgb5#W5ViKvKNh zHXT9tuCn4`bJ~l9`ufCKnh;4-O4`|tAzYZMIxxI6Fg9)URa==??f5v4VoY0OkBri; zeHGG}A`QyolxJj=r;xpbk9j)ag1b=ARO(l#inU@wRH*hzytt}dbqZ@GTiEN8sQm;d z2mn>tArvb$zc4j9J$G&~E!}yRct{8JCG8*!G=BL$;ofoHch9Si8Zfe`?%Hx!3Cb!^ zUW$4klFpNqyHz+Q*uVz!ZpFtrivmB9M?ABU-CS{!{iE%W-7;v_2xd%MEs2^A^NC0& z2k4*^OXn6%M~B8A-4a+J+n z__4Zb(_S>%{ZbQi@lc?DBHhCC&^sPan0`S>QwIPH?*~OVO>ny@*}_YLKm%MzG$tq_ zaDOO5z}6^vncR(IW+i)#OV#5Q5xqS>#$_G`C6$69#)KaiItDg;Y%*t)k2W5sP7)+W zJP+0Nqu38@@Nhi7+8>j3wE-7n;9{ZlLvS%EmMu#j{|M<_y$_`eHn~%s(2|yXv8od~ zv84>l#x7AT)S%{jxv(I( zkUJR*oEO=vp$u zr3JlwKI>kCkb=A*MljqJRf`9<#&~Gn<<_0^)!aKq@Z1DBg)KS&l_mUCN zNpUmhSNt++Fr)}c9Qxu-WWrW zHZKurhL?wj59UV!2dGkR{e5G!HaL9Ywc(3kT@McS>xJ0;Q|`q{tN!Frcm{TB z(oiM10)J+sCXOZxQWR!*v3XK$CLfELd&^_C_CY1eVMn{x**4~(?1pqcQ9{}l=@v^? zehY1avb1&PG-J;^JFOmSOet1X0-l9e^IBv4NV^~duPQB~BO+?z5xuYK1HS2B(W|Y# z;v0UIW=L8cV<+F6dX^+X+atISJazhN5zshM^*0?wl1J(AuJ$Z+VuuEmr>H!Q8V0uD1z`ZQ z5DqmFwnyCcQgz{u5iLB$kpi zqr=B_`9WwD()*}?Rn^))n%kysV&N(fz`jyo)zQDuS7PTu=JdqO;?y`h?Sp^$C|E70 zDXgx1WyL(>MGezH-+-1Mk0HV*#1WPWFQleTb%V;BH^TW0&@Ellg9b7qA0dewIZ<62xKuLc@_d zoGSEBTK5Ja{5HNJ%Sxe8)aL-(5TR;6G23*+^kxbk%W_jM$hnP&sq)dv9Aab#su@#} zJYcZkY$X!~0CNP1SsBL=A4fD$$g#jUlSYadE~14&jmBX^mbN*J^pW8iCB}@U7xm6y zgpy~(7(+xa>_HVrOzV-X7Y6q5j3;dfnWITBMjdXp4h+=G6bGN*_l12UBRk`!{5cF?!!F*mYn!#YvtiTj zdUj9o;%4n7jQfITA?rz+{qgeWYdOcsK{h-_T2ooKZ@Mn)8xCvW4HxDI|^#-*_1wW^QW z`Kh5|*$S+OyeMM+=vB^oMJM&~^Dao8XiQkyULXRgVCudFx zZ;|p8>7_YBIql3Vx%0&1P}z>tPR)sPGq~kk?iU!EPO<$+(8J^M%&KHqy!ZgG0HnsS zB~JH${dD9&bC`dy{41J}S0q@#F7u$-Qt`=28uL@97x}*iE=iAU&<@k`HmcWnq8UUA zU?{!5j%e>CJk-Q#&u=~qM!Xq{IonmPBX43Jh&Xnzppn%H^E5kYK_}e9Af7Tf(PSER zT3fPN24(=c58AVvUC$*l-TdMoM}Et?Ir8g~Lp>v5J4w`|oyt)()fE1J<@KBIelt?( z*$oWp{^BPi&*Q_*dp;HU+%B>Ed&m?vX`d)@uY4wQXg8#}-~XA&!Glsr^^ObApC|u4 zpN%A&xYOP6?5vJ4SF7CaZf-k>>0QK$r>`C2= z6p*i;T}kCYlb$#Wm@~y#>>h5?_F;WHaB3Ji2hUt2DeTXDv8-gwyl^;@YeSj+M%#%4v&|Fo-UwW|NcL z#zG$?=}W-&XP02Ihks7NfAjF)X#52ThVWjbw%DuEq;)*5dH0o=I4#EYk(kuYEO zw@txe{<&Tj;~2!zv;92sI6RN{iwM$VrE=3|P)>q%xHvPh_(A~5d|(+GV-g?Ij`*P{ zeBnxMG61$0UXuXo6wD!Ah}F=G-(uUxeJQ7+6PVS1dM|H7Ii{g2WV1Ji3#`fe;t|LgZs(c-~ao_ zqwdD%A_s2HeJ=9Pz3xwZA#zMt@&5b^ktC|OtI; zsl=cAZ@v_H>K;Cax__~&&vt+3OOdyKpr`M|2VU+Qe$);&7C!I|eZS&`G}+TP=xVx|4J+Zs* zz;1jyySvX$w{oEB{#CyZ)%~k4Mk4nL2d?|k-F@#k?sbc55KQ724paAuJ$=!%?ilrY zKU=syvF@vT`riJq&&f$&dio;nAMELS>^@<1W9skq03G(;)pub3GTV`)c_ZDY@9KN> zZ6>ys`+>Xr{!RWj#=iZ>deCk49ea)jMajaWx_AUMsRzN5iSB>-Smg1?+vIuR<6v^A zJSs$%N&}QtxGXa(*N4nRrfeDI0|I8L?~Z%r-mFbcRoaPPhY0Z9WGFH0t?!~YbU zrL|k{aV;tsZeTScg(WR_|9{(i;6Bax$NC=a5$VcnhUt%3O6{c#`!g!o89njz2Mj&k z{eh1~VwCPa_8XBs-r5e_gRKKCS!H>fRfctyBeXqOU*b6iF zvemch_E>#!_b;u!c{T+w+5Ao>n?q)^RF1?;6JvgA0zu53Dzc|OIt(r~nMLf&l|AMq zna5MjQF4Fm-hF$&JP{6#RC4pcCn7&*xi5b#QgmYVk&rEyjlTndNFLJbt0-QG?-+_=MdB>s}oX{-iR$!=_PyP z1JnHoaA0B|~1)n+@m0qA*66M>&c zFG_ln12Jr_23k7?j_pAQAnCEG1dgW0l(d^hatk7Q;CT`B!ZlI@&=Zzm(}SO>OeM|K z7U+2_OD}q%V4JmI{P^tSqn}61N_vu8VCaR&P;4q3+ko~U8Dw(P(PzK;QBSl3tI3#1cO=HN7mUf57w*Y6e2}A?i{3eCZ5T_m#bUMfW}X`W|j@|%@6ogL1?fQA_kEfcq$Tgyl_76-v5MnK7K<_-C~|Q` zOV>3fE&V}5cba$qWPhLIzWb5BXFhnK@02@r0QA=Sfxdg(UpvtEp!>?hK${Og3~9!P zYwpw|@cLo=Q$Emlzx$p?`yLB(V%m2%*;YRCGGX7-1BJ857K%=O?8qo?bijYEVG2D| zvb7pM)Gik)_%G-uas!(@Pr~O4Vuc`hwqO;gEf?NP7Y%tCj=kL6h;(;oDAqlr`S|&&|83Q4Wy%v66a97 z%hte*cS8q+s$`p@9ziLha%~L%;Y89>TF@s9nS3EnJAE0seAH@^bZe9}g0YH%$fX8A zwzf_e)y5eDA}@}p3XEa714nBtev6Tu(n;F1gEILCkp?@#vavFFbucy$=J{k8#RE(7 zyEvQv!Wx083VHgK!@&cfS9A7I?vg!Jbkt`~3iVYTBGV}*pp5eN%j&8Q&ewsolLH&6 zXI@#H@CBbt#!S))xby7l8up4Cz_DyIpm1R0S+QGeI|rh%Q&ZQ$&lIsOx1gD*s4dHdS~d_WqVa_6Z>E^LPRmT0_A2!{V@B@&Cf@EbN7DV z3DsWrzr7iG>>-b94fR6$aG$0$x_cFW>qkm+c1 z3tx&1cePmlcbzYYpKxE^)i>K@>#Ux0OA?=3Zh~(i-Lr~*H(xRS5VXO)dw1WVx1rZh zJG+F->509|=1C;m{r8Xcz5Q{|;`y?9=7`qM-Cy3_cR(*r2aMdm+T9nw2anER-6MPY z67I{9z6WX5{`Eb5N%wlB@8Nc9+wb(RZ5!u(*_!sZ?f%dlE@^+`uA6`Ndyz+XJ;W~5 zXt8vg?712JMC50!`?V{Q?3=&+@yNY*q0jiSn=if@Dfiq(aG1}S9?@s~%*mJiBY(0RcXEt8;A7p*-R>WJDe@Sy)X%=$ccKUR=Ub6m4!hsFt1sn#^myMs zwHtzVK^)Rgq=_SFo%f{szzMK*x2wNie6(ecd~oI`zo$pu%Kt`krO2FU}ugd2;JE!V2SFzj&J`ve}Afqk}iYNGU((U_1 z9+Bo4qc#F8i=T5&F z`Of?Gu$=C9d@^!yU%zGv$>i7r=q$j?rzyCqd-0Qzi|#LdGV+{z@24XF`fdir{l`y5 zBE7Oay}BR$RAkzXeme3V{PU>$EuW6$+|Oe^M25)VCjUBe;t^kjRTO_o_XB?&NtMiR zj3i0*n3*`sPit9%7-_tKexow9J_0QjI{!fVe`qz;@_rHEB^5{Edj|BoqyVu@~Ji2ZN2ajd6VMlpEZ#C<{xJ!-P zI-U*FPA{zItLo%}ytz!`g+A1#IhW;stsDrLv~^$NyZ_;VZ|_p zN6o3D(pag?f{0O|Zn4{7TpF%Qz6}q10x9z8iU;oG`zZrr+%Y>7`UDvv9&fU$SWZ?d z$l1a^fH01wJnjIA`X+jlcp?jr%Ucn{SaJ9SnyPWs4xf&P=Jt6e6DSopD(*kN8F~Aw z&^E0oKVF9xHgE@b)j=1S@vXI13Dl`wrLx{Il7vkIb5F!6L`$>p$wz4!JZI=Ke$H#p zc+DNwtKH}BvAD4}EPR)-cb_l1sz(JhRk zW|yN#`3p71M=e?jr*t=RX+RHdW)LKWSorb9x{_)WRqht*?!0Oh&ijL(jO@RgDox%z z@VUsfo(D|?XhHTqO|5Z%=x-zMemh3=lp$A#hRE(1;^*hwiM4wpZv6c{_wpex!ZDXC zc)E1VlU;Pa29t$IzyYI6=dXq-MBT-X0dFElVwR9IQ#d3|w z7@{70S%}YJqd4*LgXU;<-~8LiL7mb!t-p(WyytDX4mxDi{mkD+-fpBq;V<5t{Kv>- z&$H~{wrRJ?sOW~h2CbrNMO50&uls!D|J)r57K%QS7CR;>)EhIRA&O!=lP@&8KdYPg z0xgk?AcvRqFs-slJVL8-+-va?FL?vIhL-XU9@+QgaBj+1Z#>4h_NoOWwYA8MasFu1 zpx57JV`=#T-SwHGQ(CL9XTbJ)Ja?IW^g!p*&mH_i(6eT7O|P>E(twmn4ef5sc|35JD@jsy74{0FlyC2fR&=kT7xLQT`l z&>KA9Sk)^~@Mu?cQwe+M8CjiH+sgZnLUqj+^%dW@k?pEFED%x~ehO+`Q&k7qUhS$n zbg)*@5gSn7tF1|imkCi_O;#Dc8`7*zxAB^=Slezh8D>aCd0;6`fC3q;UV>hIukLxm zB#r%ARl-8dku#_})@-(KWEH*LPfkN>MNR}b>?Bbj@suY-NB1XfPK6sqHL; zDn4@6UQ9?$;q;St77g$Qi+gMQjL;}?D*1?HzrhJiWJrQ?F9E`E6A)Jjz)^zG^bN`u zFmMnFAdM0mZ9Xh0IUL5T3IL9urWiop@e=}qb9{Hi;e~7r!cQZO1B0ARg^tPY#Ql^H zZ6oM4DU^q<8va`$`mY*e#iNTPhgsMx--jlALC27&z=RI!RZd)po54VO!I}aC!DoIW zjP+|5UP~`84_{1Qz`ujTgZ(PtJAlqRO*xleUpk8mxoS z<^3&^A5$sq&Y__pzHc#=f@gMx87T~Ab7FRaPyK8-OujHR`C>-h$*e_-CX-{2e7ct} z|FJhq9wcV(?wenX+;f-b-J9t_BYq)EYXt+!X@9tg>8(nsZQhUC`> z5=<10l(LXNm*)Jx!4_b6fJIUAU99M+^a9;bmlb%jYM2q~NtzTqnYk#IlGwuzYPBS6 z4(c6Gh}#9^T$iop*1_hfQOv4A^jx98*GL{vOfdFvtv_J-2wh`xjN_-K*>^-4;dQvAvIQ+bCHbDABHK|k!aJ4v zlM!obVPS3|&BIL>oz=RXU9CG+#dhh~y*4M3`=K=OKMtNV{PH5UoN!tlUGA;fI$uu7%fzk zOT|re%Qx-SYI#HIFeH9sq8SV&n>!MqX1$Yw7X0)M!p%(5-4xnCYsiaC=*wjn-e)Rw zcg&z`tLpW920`5)|3c)QO|^n3A}q@&{&Mw7-&Yd63a)3NsLe8RzJK{!U+GV~^)E&q z>{Y&t_kR(@s>&M}f?wtS&=(_@RpFcc{~U?z(tw@(QsnHg0;ZJm@J$!AEo*A`dcNxZ z)2_a_qXje9)>>sub1jIu_F0Q%?nw;}Y5swi`=Sc%57hgHwYMMcdx!S+D}Bks2F$>q z;)(=TPv6t$x+H-&)~;B(%r@%fjbn9(?LfgDY5z(i_D6d9PHEia3+b(Y3X1G4BX@_d zDcC_vTzb%JbhCs+`|cL19vvK@Y5~IadrCdQ!rdR+)pxk*@yFSQOOLJpY8tgZ%2O6{ovhw|KsYHUOIHp9$qPwhHL9!BTkk#Ho%~S z2Ca~SkhNExt2W<-MKPWE6~;CD>N>kShpL9JDa)$mfRF0@Ow-uWBS(%89eLN#$dT01 zrz`?q*{l}U*6Vg+GHH)I^UU!<{QETheP+;x0!QfYQTqE7{XIs1-$j3q(_-@Js^i#; z<<rh=F6AhsG*nV30alx62cHJpc`#Q78+jfQt9kp`3jI4?sFqU= zXl)(zp&|^_=LnDEDQUp-rlNVhigng_ood0p>PQXBK}#LX`eD4*qMR?RZZhK?u!GqM zO?H@-HfSLpUyzh%Xsx?w&o@?zg`7Q8$T_7NZJe)QN^PACd9>W2Kv=6m=PaOsF9LDf zKs>w=EL%q`t2T3-Cjm;fv}qT!b(J-+rK&-BoLsT$^>W2wo(E_Tt>CXXcvr`2qc{i< zAg}%M^wJA+=a%e=+4J_x6AKFyvrFek<%R|4io+lkHY&veuI*>5=+W2&Y5;({QbljT|+v!9)S z@<)!2j2syndFsf>pnYy}f?73!z9exa3Pwn$ju#k&H)aq~237$O8Z%R)n5zoU<5cTN zm8@hG;s)++f_kB>^j}e}OcK~?HwO&F378Wx*B}ia4CT%jcjPePtX{+0(hUa}8#+`e zmTmB!#mrSyDyhfdBS#PDAy2Fw($CgdT(unmoz9LefwH)KDSpHr8d`UXV2DU=L9vSm zNTKeSC3HaxH#&jRJC?Szo?uKICj}OwVEAB2##VLW!ucQCk~}iP@oCViJc%@sC*++nq21 z*jb7)FYQN=JMakp6h7w4z*fhfvNvG1u1V1dm;xnp>*QT6pe(L~U|P>sDlibJ@YQuL zser|RzZj~>ZXoPo-Y+<%x`ajpf>ecai3(@gfFVxgcNF26gq|;KG&ZEvwOKdgwMa;y zs}8H#5i$vAfz1WHYGU)17Dk$lxFk~YNV}??Ho#kPt=#Xe~Fgy>I z-tnho?=y0y>4~}$>RHLI6tUH1y9~CRg?6chhaN5XJGB1B5c|)eKSlPplC+eyyKKRL zx-d7tG(9(aF_lW${8WT}0o28Fc-|IME$ap7X*^wUDeyZRi_{z9I}QWJX*9uAoqD5+ zonkrFDlVL|jo*x5RobRjD%+P!<*P^)s0pU0&!W>D+TAErm$fbbv6jh2Kp{ScE z85t9~3^QNB%z_PUn+<)*7n<-eN>K-?UtNs@?BcZoPLh0^8XE`BMg!+-TMh)=P*Jn2 zMdm*M77?^zTi&oC{QhyVe2N<%+0}TL_?Ohiv3|_Qg|R=M9ONR~I-Ok)&PL1QA|o0+ z8a!+jCk>XNUdw@8s?${;sA1wB4PF#)3QBHGfqTEw01w!N9n<^1?| zM_X&r0oGksGnX@0K(Nq%4*jXJzcv0( zLHt{m4<%g$i3urg*dulVb)X53L^8DQ0Sy$>6XHkG_PG)hC7>^i^mC;;=FQl#LLpTO zQ7^6N!2CU1zA9%vm=Q=lEr6Uy9h(aP5b1bGyH;iy0V|dn^|vw#e_n`0h!Rs*v*KK} zoxnZFcCm2TAxV$Av6HKF<%>@>$&@~Q6Dz-g?7@hGh}I2rkXUR}$3Rw{(x{6IXY^`B zf&dv9(NS}y@&DTcJ4vxoD}mElqYgxS&Oo*XeNIAp&Z+P^#2Dzw2-#o$MgHTD2T zWhI1e#B3U-4b;jT4wKa!3Y0D32)h)=3nCPleuN_v*%+vox$6gJb6Sa(P*^^aA2s4u zL<@%*4PN@#Kt-63=OD7Ez7Zp6nr6y;*{ShsrvN%lJv4cW88^X&*d{7=AP@6oq=>FV ztCmmCY7X`c2tJ+qrNy!Z2Jr0k?3pwd7C^~3Xjed3&F~}-dI{A$8tm#w4%tTNKR`Pf zXKijI;k=E_0GQWxrTj)e2fRU^m8)P@D`54qTwueoy?jZCzkZ@OC|^#s*bj0ccR9P} z)Bw_%YIcQAACPcYkkEO6QdF(OAr6|E|W zuYyJ#lX*$<;X_`?Xnx>HE8}566ahOexuo`<-2lC@GfAd^wH&|g1(^aAJa~h-(L8Ke zLN}Dw3V!?$`;>Pkblft0hz~=5Kv%L4%rB1q7kiZ!$XRd1DCVc^BCRjLYU-#fN_6KT z*A;lr1QCps3fU1jck>lfq5DGyc7RM1gfQ1v(BnZ@DbrYJRLQL@ZD*vRr#^In;}$oD zqUI>n1x80QQ;Gu_nPWi2a~ zs*Vo)IJhg2GV+K~YAGcqlk7>dqsRlQ8z6E~C5t{Hu$7A0oU?)crShs)+K$`tarw^N zTrsgV>+m&O)E}a*lC`WU?yXpCt3y2tp$pa1La?WrTzxhU8@> zPs*0&D%w}k5D`nLi+b0$q26`9Uf{M~IS+9TG)@@vG6FIo_nh7X;e~QWp?*AOmPq0r zEam|`GHT!G7qD{vA%K=Ex_fqXx}z~rY&8Z>0}4Ai1Q`6zMu6}@Z8Pf^J7)djt+Kvs zK{q@o3U$O!28|4c60W~(VyIp(Cy9gMxlOjj097@h4=TVn0jve(moL4*QIZVSF<(LP zAkH#iwqmM(854I3bVTXVE!2dUDUVbVYnXhU7l<1RpKpc3cISmn9Z=wEG(AJ5{mRdd zy+!-}ZAlLq>;Pa%G*d8nxvBuM zEaKL2nMW9=e3L{w`FMz0%$D(l=3d|{&$PBq9YD+eLuDHmvfe8Gf1ii{85Is8PRIa- zI>Xz+MHVmW<28r2Jd%YY8iC9aj0sz_mJ8PQKpai*{!6?VD(y|E1ujfGndu8q|ZdOMq^hv#AXUJo2|n;{cd32PO{~F)1|=+moHu zty(+?2KnINDExcjwbaFd_~2mwB?73AdGa>a1;coKj&d0p_ZRVTU6T@GltU;w^?nw} zQ`%?5cI@oVW_?|HK4rLLs!fI*&@FyB*gf8Mwp`9@6n?TVn--JXG-?q2AS@kcg9mk?B}VRd z=c_n;-;`MOhKd_#`qsSu4A67DQvnKY#2Gh<;jXGm_FAJ}DAw5WGA%S1jtxEVi&jzK zDx6&2>Ch8{aNjCVjBQVf#sXq2dLLH+wCTRi_qf!ZB0xheBD+E&21>D3Kz$CWJ2(rn z3e}!YeR?J3N6e|BcWC;rIL>7|TMwL92T`aXw<=IX2d12eiTo;QKYTwK-}1!WBaG-` zV^>hOv6UaruNI0b+yJ4%96=HqF=;!I&F6>KQIPf1?z|zS7A4f|{(51<8KU@4xK~oW z;ooXKZO6>btuZqbTiu0RPoy`8o;Y%J1OMbx@aF|jPEhS3TO3oT;L*ze)vn*Y-#z>5 zd%pYrv*mmPhRQT3|JQE*)35It?QwU1{r*08?Bjdh<^I+;?6=(ivhU%axQAt{x!?BY zzUaOU_L6?KQGCvNwpe)1{rd0U|Mq?g$e+TE$Fb+8SakkV&T64lAm#tr;jGFWb!UHm z|NW20o_mSQ%xSe&tuj9G3;UmVB=+3NYz-!crOk??0Xg@H{ZGQTS=@8ASl=w_-|qU~ z_CL8V_S{nWvg4`u?d}hKa=!)Nrmov(8ly1 z0C?;w2R+Ztp1;rC82g z&Xka@r{*SUa}<^#bbL@np;OZfQ6FHH@oLJT(r?s-2v^)XYfW(pLU40^Jbkt#id zk9k9X6Eo8ji!F1!!R1>W&pszur8w@f0dLq^wd|9qJo$VZs0O4qc|&V4>EP++F56}x z)HU|2z=K{Swt@x0=@1D$FJ{%im^ds=oUtcnCtsLbcpi$eCro@^(NA=#R!V#*7SZek zIU{S-QWhsCW+oOS1w3E~POCz`I?T!?D+`KmWGfY#<_3IV&HA*G^sW{3fK~-h&dg1| zIJ7wRo^w;PlT&;QCRi$ryoK}nfJ_e9;tP`rK?4w>h5|UOkm1J^SXKQ;AYW@+xlso4b6B$DAxZ1rQ|coQ7R&~sE{CVM4YD3av_hCV}^-JG`S)N|_@ z+*FvMoHbE<(th56h(7~nErt6|?6f_5Ze}Ja+P*+1$GxqWUKVP(o!G!F`6~{2{?G$S zM{E@Zk{;UNr8e70n=sOh*+&Mq1kpnnM%%o7_;9!2{1BO%2t1nyMg!$M2XM!>1kv`k zoOK|);0A@UG5h?)*_jMeB{MK?cvl29A+Xhq9S$FstiaC&P0UZ*c_&xQva>uj-nUfS zsi{erYNrx~Qax$uY)Stl^pv_iz@7#f|KcIAI;PS?a#YkhMcemi-TZ(GMtjy_ z)||R{B;Qg{R zq}N+On^AJHj>{CQjZ#kUx3DH*W&nVm#%?<<1SI{F;RAro=Iw+l?3}J4E4t$D9bs&B zULRLNccd*KCbknUPJ3IX3@K@Yj7WYBt!>?=9?T}~cH<)mCqjVyk!`CCKy%CWcGy0l zlU#Oox^ZTGbi!vRniZgZ?r_5bYP?0V-cpsfld_sh8#eB5y~^9iqDFOFr6a450?(?c z>|DK2EYvqUoy_RSBuD`kzP1KhYPPLz5QvIC$+po6M4fCw9Rn+MRHL}{Ru;pY1OC*i zv+5~X&#rk&87Vb3F>a+GDyvYeMPuoRY~F;_QFFa@6PK_q&!VF>lW*XB47x}ynEH$# z&Ny{tqEKJ$j8)e7%(%Bu;zWy$2Igg0AefNI=;Bgmz^ z*!96Z+@Ot$h1FK}4Vb9nGdqm?#v5w6$JT8lR8WQGGC#4fI7Nob;?l&@RMNgK z3-PU3BW#iUhHStYwHL?W1&Jvy7_R7w&KL6ZhE$$`!+5u{*1v^@2w$0=94T7X*g!JZX|6V%|Oy$9L|<{k+0Dzc%RHb#HIm<+HKy#q6}y6Lm?Gt-mP zOBu0*wS}5Jwxm(_pgq#6`W>tFNJq6!&do0I+Pkk;Sh5|{T2?EibhlNaqT6wGAy?xk*pjuUP3z_NJQ_#wpsl~;N@Xl`s1}zy0-QL^N)*~IYRW|JO^ui+c z=+eUZuBr|+@Vgm09z1pigO-#C>gVp!2zNVl$?0M_j`hfkQ(K{iZtZp783KcCue$?= z6m`?G%`Mc<49|{9Pvh>E2SbqCq#N>^SnNpsExRD7{;e`YJBQ8|yT(MSdoF43^w}1~ zx}6%^xrMqz>efVv&tKFv3*QpYY*l_3HE)qIT5v))wNIU$Upl`dI2g3gJFD47v2FtA zK86v^zc5__ScN=A!*ZlE;zodd!I%87P7(J7jCl$KZtQm3mK|=!Z$SIC_Uieqgzilm z=7pk#WB5c5oUUx8dn{lfe^h!s4pOG1MmqV4zVOA^gXUr^GY!~stlz8A(vRS^o5e4d zFR=J1bV^-#i|l6^b=W4==VF64$BMZExerZa0gor9W4nq0F`75^66TqnonA@^?uBErU(K7V6Bik^;YYY2zFod>y>9p0* zk{<#c-M&QNLG*{Ra=tOWCirC;)%OlwqCB*On>S@MNLdnZD#Q!4Dlj7riMB06E9)o#5d$xG*WhVU}MGC z8y>eTYdjvENMu}PDi0vvTaFg!e5x?B&Bp)-AVj{nsj4_ zMrBZ4EyiWAe^?b2Y^hk#K3a0gr$%y52wL$9T;aL_=~`k>Y1)>^R$!wkvcL(NyR zwUE(PPNA?VUOYmhMF&bg(3-16P`ChLK%T#@9Uv&Xq@1sH#C2(<$l=`w2_Jnq1fi`2 z5%*vab(3BpO5pwZE)0!aOwq1TM?3ATSEpQRF=Kjb3vaO8O>DudBm&50MBS zm~AK2j%QwT!fo$m40kRXJrbbs2$~LtsfpeD18>urXDLfUe>-z3T9+2wUD*PIj%#gK z=PjP1?vh$voU=CQ(G@v5Y4R-`+3vE*ogeD%s>R;(->sl-{d{-_nED;u+jgq_)_w|~ zEuBu^N=@zN_nkcP(~%BRHCY9ECYK>KxPg>^je{7+MFy}+C zO0shn3XS<-&*7F7cm}V{l3TV|$ktM9hkX~0)m!x!;6DM*j&3!zmgFQEqSMo?3xARU z4U$kIqlxLv>(nhvt?NJ?Y)7_E7)>WbD?e&0QlWwCp_89hgp58Qb(+BkuKtY%7Lp^> zTZnxKF4P&JyCHTb1n-9Eof2MoeAQFnQbLO!F?*xyp6I$4OlI%6JHC?mK3GKfiH*N5 zMMXEH=!6{Ikfc+x=v--vQ^{Q36%_(I5dNLeq}f*Sn;$vTF7%m=8X%3wgXejFTkz*` zD;f3rR{f0xKNc9>F5$J8gKgxLXO}@xgA|m5pebvvC6Qo< zVUkACq30NF2W|bc=vEjaN5UZE4^NHJQ5v-5GezP{s0|*%YVLqM`l4hPA;w}8X= zkL!3vP*)QQ%fkx#;gJ?F*zn1&wITujL8#F17tP+{Jr8&X~#qzosny`Of7yf<|4$bEPOUvcrnB2)w=vD-Yre{DPt&}JPjd6 zu$Z!iLI~W7hi`<)Xnnp>Zcic>9t@=!#`)Byh_d#38J;;wG5=U)AP&X$QUZ=n4zsl#a#|QK19f-9PT|7ofFWFN?83^xn3@%U}#(2i`MPIjo|Y}LB}?HP4J$alGTS43^~Ns_9R8?>AqdCk)+=z;BT{*+Vu`r z#yH|BU>@jPWertUx3;6#_K0BPAYV(<$=hWum^I(n*w|zYO5cVD>~l4Cm!eZFY!ph^ z=qz5$RDn6DYG2J(OBnfCoK_E_P)E9isyL(si3fd~gCg^7K4T&1?IB|aC&b(82q7wg z+LHv+ayW51K6&0h)UVFAwmf*=$#(9o-F6ZFGiJpO=D%%?B>Yw!iTG-sPSBq0ssIbu z@nttTbe_*J|%Q?KDlE{VjHgT3E4^;`rD=}f2iU%n~l4@ z7O3-^f!b4}V{2&p;%MJ7g<8&CQhtBs%~}6ark>D0edJ5n29UpJW>2@_m+?f!+JSIfB zV)+#`9fqv3zBRU2H&|{F!&?%u+jgO7*GAVZT|gT6t;3qTzPz+GxWKDT!(jyxX&Wy> zZP|!+bI0~yiPcRsg(MoX7EvjiHl#xU5Aw-NPU?C)SJLHG%%mM(|Rr`L``rkgmm-Oi*%LkuL& z$YAImzQFulnPK>A$FV_s%uV&A+kvw_wZ^-$#J6q5GOXXb zil1^jCT#uJ>1y5%+%Wl8L=!hnqd-&0J1H4F-KtFMfw{Fo+5JrpZS{w(4$HuZWZPvu zZ*h(Y^iSTpIo7>>a~npg_t*JK{El4J`c}JfG$wp&+%hfY1pc-zDLZ}GO|ogDRDvIS=aD!S#B6rbtSy|U(6L{Kg+j?|Vs zTpc*LR8QWrf2$k!mQiiD;m6v$y9Cj?^>%r?Lk!VvcXpXLbUqGm&(;U|;g08P+dN;o zaJl37+Ih#<*4Bz8%+`Ld8@JEzb$c$32|_Kv+6|=FRxIF7%KAr4Pz;1EE4cXU;Oe>n zy%vALB-FlaNx#KkN8_iRmeY3YO&F$I2tF=;-HZpLd0ooQ9W!x4uMYf|=B(VVEkoPq ztK4CIOa8*t*6ua1t-3sz4o2f^$Gsn{md;lHgD(xeRexBpt`U9>;=g>K&08SPc6gIa zH*%~)hT93R%o(TTRLM{&vEgSkAgpkz_4p5}d@I47y`FAE1Q_uL_%Lo2iy%1ufFOAX zF$c`fzo9DBqX{rc9~uQfzcwy72*60o6aO}wV0dq}o<6kbjU9EDc0pSwf;#YGO#jW8 znX0quDd`J$X~w&(vHLx@QV?fcC}vI-o@HwIgj z2r2@VrZFj1uC5IpJ#yq|+JK?hgUf}{@OBIYHbg7%<#KarcorE{w9VzF>WWhZEA0FU zzmtSUoe(l6@If0tPEX(kMVNJQ`c+-l>v0^qRx5mkTU>*>z1KelIY_#wHE3S-UzXNo zAdvRX2o~ir-@sreINLmdI4a4tZJ{?j6rsRszUHMivaiD=01C)RAjTLFr*-*4iI?9g zN)<}zHUu%gQe>C8%L_rbl~h4eLZ4GHE^c`>5hiAmLEe;(xT%Zj_!e7)Hs0&L=-DAW zG1?Xu^?X}cn5*+GNUcVD(6ypo`5F)doRU&uQQCbMCj}K|;dEOTW?8fg5hN4nV*pG; zoUe_dQe?M}kkrnX-HJE-R)cqnV2WaA5Vd~XP7}*p6=P`nLjk}8=YN17tl*dg2+SkG zZ;u9lHsgAC*PX%2O5oMWo%F4rG;$^mR6upagH=?Zn=f4_yNE#_q@{Yv5_BtCi`&o$ zsW8}pSBR1u7%G}oeQIhZtYWX_iN64^X)Ao%2bd4XxK&hneY=7Or4E~Q!)p<3=@Qt$ zTkW>~)&^Vq3p%-EAuwaET-o#(Bxs5#LA>>w7`nNAq2(pEQ zAU!k=b%}Xm2zIby*;3{88wPkAn{F4hI?07Srj#5)0*C{^5;{?MY04~>8h>VEOwp{T zgU8VD8iXynmRihb!Ol&ux`HUQvSHhaM6F4_Sb}=<0)$1r_nZE7*Ug!4>HDUiS^fTn z3W$R2ngbXh0LviglESXtc!~h%0e)d_r zP_AdKUcQQeAFN)nxr)D$cac5Q#bNXaU`d0f^$_XQ=)H`~(~`YGMD-R6B?qZjY;2TR z3JN>fohGf|iHB3l|4U3@?i8$gdZKwp?Hk_-B;2 z!}icN{t({0U>I6I0wK+AV6f}ZqjtGbx67-LR4lAuH!-I!zy3YNX~$SiqaIH%q_)+| ziW+`g>Pl>@Y~X66l(S3DRfbh!1!%LfSqHhpg+76|(?b4TzX8-;wGH*MP%6|5(8KR@ z5>HlATye&7fLE!IOTI8`2hOM2U(XpQr znQ`=+?vqpNhYaz8XkOVw zSStg2fv7?41r-|@0i5IQ$#S*YpnNpapGQ`~HnnZEmrLm%oi}85*4e35;L-$@4WbD9 zidnC~Y<+dzsXCers@f>7n3y7Juwo#a%PU1^gEXHMWjQDqo8HD+WCcv5^Fij~dx<&$ z=*ud|Visdf8M9-Q?BiujO+sQUZN~@zHg==7rerM}v)***cXacCK`} zRK8lWc^0`7ibRD7`OAh9F%d)kFrpL8#!S2?N=)2|NY7HlG4|$(K#)?Q$aw*zB)_h$ z#-{`k1Q-`1N?}aGcr3}PLr}G=g?et?7#)zB%R;-^5Yd*S(oi!O3>AL01hS*btXpSX~8%QdL3!!34+L8EGq6)KC}M4bExQEotO>6ipooaR&2T3B(g9 z?!c$9VBVt@W>RYkC}Si`2-%PC$ZVJ;4Kp(SJIIGIzKgn*r-cSFW?@QEIw%YKG#JL9 zsw)&iC7Rt+gs-mXL3>ML5CGF}WG_1juZonk*kECULQQa`l+?GzY-V95RNA1B28m?& zr0l<~J#bRy(}h5s>q{%3M)9e+~WtyRM>kaemd+V-U9X4?XY@bsk!a@0Jlt5h7*0V)v{=l#-!!ykN zR|GhqAbhFa^L6-gLbm zsZuKz*4FFAP1Jm@fLKRqN7EP*%^;YFv8DjHB0 z+n$nua#;jabAZ>-QDo3z7*Qf3aN_0GogB=8YhbiFxoo56AQ&6zz`k!}H?bwm`^5ag zYh`Rf9w+jwgbtH(L6UN5y-^#qNlk=StV4?m=m5S9y_?HIBFr3xx}qLh-`HBggV~w_ zJZRU@y$Tco5YRG2rs`CR*_@LXO-7xiST0|t{;d;dmxeh0l{zlAKn-K?l$rwl76&5l z3lP9#2M?AS#i9mDHXTr+X7lod&MMS<{l*|skTL@Gk<*cppa3HtV^pU2z&ug(^pw_% zK!^eIJz#XA0`@S!-H|BCgk4?^oFvDLuD4@jV~~h9z&%N+mzXnntz3puG;HhyvKm54 zkdMAMy9OPFqYuWk!(<&xLRrS1#=z{t&`&UfQ+@jbB^D_|l3AmO z7RbsNBWVm>ft-|@mQRYu6$Nh;-cm1u7M39QgJ{Woy~?t){Hf{Mtgr;}M^sa}XPv7F z$g~7P3$S9nEdFH$;49#o;BA=5=c^=z;inly3NU2XO5dQriWu}ggbs>`jKHk)4Mw2= za-ddc(L(Wc|zAFhJcu#w$w+=A(Odu(*cP4NF(z<@~C% zoSZV0J%^|nhyj;Tos8p@0ai+pCN69*UCl*9f#aE1rb>x`3xh=|Sw?QInVET|4rpX$ zYNMG`QwfZ`LX+^|ps7YC7DA_z`TZsku}CRfWS-}=w0~&kWfq9f@@F*T8UpK_;Eqv5 z>%3pM*FdQ!H0DN#aq`NdfM>1SW#$Vp4DMa%NAe2w{IDJCw}md??oVhGBK8AgaAL6${oc$(EJvD4vVVGyA#V?skybR-w^H$0H#^xy?P<_De- zgTgZj$}<89=)@%q$JU{d*Z4Amm-%YYpYeiKIzre~Q z5PvQ5Q%mpwD63TPc*jPm)i@vbw3^p=*QqnZUqr4shwjtbz89y@m(U3OU)*6zLfVVhk&> zsAstusCN)~*DhQ%+!;rbYAb+-;6a7pA}D$e*Yh+@A6v^v=3_>HR>Th;gM+yo3i##7 zDE#}ZU4(xQA12t2mj#@)05mcJ*-jdfx5{+@s9UZJWv)f(zLh>yVePU{%7*px!1gdHRHyhe z-2sE5`&VO8on4d3z|LvGyl1nOVAh4~9_F=rFN+j_wPPI zgce7OZov9D3DI3pC<#4;L=Ux!2{vkC>U6;==4(LY3s{ibsEOo7CE0L-S;bu52}VMM z!OC`~Xx3&gE5g{FDoIe**#?{V4Ns^q@5xQp=Nfd`^~1>IcRac(Xo=)yFDMS&Z+D{qL(i%kS&e==zxJcETLSLp*P@SVkPf=voR7Za;Q;C; z-Fv^`p-1!o(DN5m(>LC?2i-evaXLEr7(YgyR*SzZ#r=2F(ZLh!Icz1Fe+^hjcHjBy z4?gmcvEs?WLZwID*WVpI>Hb!8-vRfVUW`8B{_eY@KjnVQNA7y?=GVU%J@nwV(82xP zwdljF-9Kl2>yrDm>wBB-uEO4TxL^Bidk5VAJ{EoC-riWFRLib9H}^jmy|?EaQz$Vk zf6X44Ole1jlf1>+R*uQknKB<53CN83k_iSbHP0505;aiA-AA5}{`)=-&9_Z+GUfj9 z^U>wBMezhOLjxQV-B%2#a$5f_7KNv`T-i^a|7Z8q6a(h8(q#_eLb zu5)G*7t+cbxYUIQ6LYwY=6MTe%lT?~1*FX;28MzG54o#X3l!BPTeq*$nqjeU*?|lQ z@yuoWNw#Zd#le77*_wUTDHdTCrCpb70cA4P2yFM0D;JJjL{SLMn*E18kGMmBx91-B zW8=~L4pZqtJ29EUGmAjk1l#+W^zYep2R^X(arZy|$iw%!`zE4C+&_9D`i{FZWEQ!P zycm7Vy*d#cerHAmshCXBhHhhzBGmuCoQ&E?-mm*U;I_Y?h#q~Lr-VClG8(xrBTo21 z*5CP&hYz@`C!@2wSouTv?=KzS_ptlvlhKFv;4W47zn_fWxF4j-S^lo z=~h z=+wguZ{b(uExI-pP2SC)e|Rd|kNEHX(1U&M;_2vp?&qeWdoiV_`e2k&9`bGRg0D-T zIS_Hb@71^ManGHO_U#g6dH?C?ci%;ox`)n0U*gLM-fc{(`R=!$i9UKPnbdbM>BI@y z%alysa37hD9&q106a7B-3*Wx?ko%)AL>IK~Pq~Muqx+a!AGvXofyyvHzue~Orl+I* z_iVCFIwbL8O5%w!+;go8f$U4{+Dy3d^=KbZdSX2q-Ib`h5B<_z2O_wK(zBVvBihmm zun0U#4b&=l|BF%kK8+FGKmDl(A9WvZzU?meGw+Um+dBmS5wE9h`Mdu2{g2%I#TTQ0 z`M`Ed&(GfV(+eF)Pj_D-dX9vhTP#HTLd2T;y@hDgef;(48INFa8?VFHPDZ@@k=LW| z^bc!Heuw+~$>@D=$yj#3_A<1y&1iK$d>N>E`$nfbRgBv1*A=0mI5OSK#ptn)hL!ta zEa)3L?mrcwku3&?`}9UMqQ-%HVFSRl;dS@BH=sX58T!}mbAR|{5YU=e$bCHe&|^3M z;^pWs^#n4z3(WpqH-F-_==<;9632hd-QP!1E8yoMNnR56z_Pp(1vx`!nl%kK7p>cgDt7=h*n2yMBEU$Hvq5+~NE? zod1?_{`PD7pTFxf@43U+cNqJtPo)2cyMO);=ilM{uVl_o^|*5@fY8sZL`UxxWOP5X z09f&y_Pp%gKO23a=jEH{W}_#1-}<5XX3wn-!SB826JbNJSB$>c z&3_(?zJm?F-4=}fhi70MZag1-_0BlFGY+?B9J(+L&)qyQ6aCp9*ZoG|Q{Q;|g?sFv z19r5rbCCUWbLge$rJgMf%USn_UInK5sf*FkFRuamEBF55{G9=MXMleB572+ub%4&r zcn{^f&U>OCxp&sNO8ZrB9$kq3*=~32TcUQW;p)P0T~>vrUx{YA9=y9jQFWn?xO*`Z zeM1f65&!WC&-Qd}+ceehHZH+15(B+<54F>&yMtg~28{Y+J$ro+9?3<2gk-_P#^!E< zbh+-1=c7+cujU^aU7ov*)7^xWD#lG>WeSed3IyBnBQYWy0$N%P@4umZ9?ZEQ2_G z&o}RV6cHLE3H<-F_b%{p9o513&ktGB+SbF8{LtOCuhtLkN~@<6$B|!=WyvwIWk-^o zhb5Gi_R3zg+EsQ}eqg(S0xhLH1M!fgNk||-Nxnk9mKylC1X9}m;A?pWk^@aNHg zOL@~!0_8tvUU%l+x%-mrJnH*PdetG8vy?(2*g+H71%lpK5&Q9~IKGXxqrf|f^(dYez_uyIY0#x-&dP@>fUABzSM zthGlLgh!UUsxm67Ke@N2zKjweIbm$LK4Zs46;HqJ0E^l3AR`{bI<9vTZ|0P~jziJe zV@w_-LhhR(B%09>5*J`(q~TaIj$o`Ag{<4wD&wdiFB?l0dgJl5-8Vz%4G_?$W5y9e zIrP~ftQqZ*_W3`l*??}bj26^;w^6?s)Ayg>Qq!G&xXD> zsvmeewz6TD94Bs{3{Kv3hl4``GIty6u3=|ri}S$AiQMv$;N*jSDmW<_-EEldCOiL9 zIRPC0bsYju%DjKKQGXNs(jERyio4GLCdbL^jsPbB|7$na`PjhNyp+6N7dJW-Q)B3Q z`_y>T8NdNaB8EdbY?}c4_dUi|gA`Xz(PoFpbHioV-8DD#@Q>;l*t~tNldz@Z=)v4M zM3Mht+~@+sXDw?BHg}f6uRdo023SJ=27(z6wqW&3@fOP^1kmbUqjiORDFEv2H5yGi zsIxQfDOw6dG}~*mRCCyDpFfyUhJZzFCjSZ>f@E@S(Ux5=c*Ra|8f4XudlOJ%udx?> zCs@6TS!w=iyGGg@!ek3L$S)3vCMBqKv$4;p?4XS3I1`$G6vsjfOo`36k)OZJp|iuA zUB+QKBP&9EM#RXK8w|!xN+&pudKN_Z4F=U?XLB6rED%-WPwXH@^w$?_)~#~Ir})t3 z@_ zN!+@9zP#E9xX)acv+OCaZuGm3T9$KQlRCIwbF#9W2OHTNH|Wk$mNOAs`$ue^Y=fSw&N+Lk*7v`!&m)#&cw}b7 z?1IiDjP*4n*fMMcSzu7>8I^MVhP zbU~NT>(zi)qbz9#5omc<3A3b$QlusGjkeLSB#N3dGATFa>%p5^)#k!kIhEG|7~MW& zGY%ZGE&OsGJ4;em95RBGcRCIk_j`Dv8y4RHS=7@rc}w^KnjCBO7){ZZ zM~)cb3i0-jM~p4#;}>gIl#vrI(dK*b`?t;N)s^D7OZ1N4RMn&Jer?IpM#p)OPEWU- zdAg{!x_Zqzho5U-gM_iDted zD@BDB=eAApY$s2KT*l4^<N)Z->a z5#_{5vz+(E8-|T_8*F5hgC<3X{RPID4l-XKHulLwNpQqCO#3T6Vl=MfC1Q$thvb2n zu@*fsVpKW@Fw&L5zPd*AjS-`d!rE}uXj%!s#Mz3-e-Yaj$B!CYmj&3JZ zH1DgaLyx_?W-WUD9%ECTXO>6rt67Eax!u@|9{X9t$}VzvmMJ~XqwAc=%~4Vl z(VY)h)hUzbAT^!xIa@iaVsOyge^b@aW=~M@bF@syhQO zx}inCuBuzcrm6amW9^ZBxT?n0lu(YQlmbt}c>nz}#yjZYYH}61>7lGx+>2Fg_5C&V zHoV>9n6i0*Ox-K9&OUM+nG>8espbhy5&)uDRNokwcwSBX=oI7AB_yw_-0Vada1 zXVhq0A=4H4-faXMv^oX7{n_ezF>41c)(r< zjVdEkha0urMX9&d>_sc@Gq#e6K{RlmaSfU1L$A3Hdy6oAhyLO|;uLoGChQT{s1O#X%juj zdeAsVG5Pd^#x^p^f`0oTESi>AHzM;POn;a&L36rkH5Hj;E{^Yag5q6udl zRX<|15g!}veFXEk)@?>_dIXD^@Q~4;K^d~#Ny=z_S@h;dj5W)P@?25!z1V;+&`U)h zey?%Ed^}AQc^{^s%cn%Qy$`pwVD}L{@IK6M3+yH$-=nx^HLf7q^C(tT?|KvqVCAq; zi%vgk+=brqC>FrC4&y&d-;cWlr~1$*;k5v73LSbsD9~aZCv@Fon3FeMtf{_i{t_zt z05*hF=LkhUfc05kF9`kphj8m({Q-=p@NUriKY%++^VrlnaURg`{uGPRCq8IY=XMOxzkU$oqP5i}uw8#@gz{$cvgFZy ze`@SNr#^)9g~5JS?Q-;Qe~J~SovNDHXxE2~ee*Jr(XSrEe_D~zei;m5wCyphZos}p z@y9SbEQl$Kn*R(d-v^(?)YMq6(4OEGw@pE+BE;rIpL`tu5)DPad>nJaOWt;*%~%jy zk#t||Z4IyWHUf`sp6b!dKG7tWu{jt{RyyDI-%6Yn_?789nswrImCy-06g|VHq_z(LL{8TDJhU zrbqoRNo%tTtj(*I=2c7cs-<}aEX@d+0oKp|x-PpwV;{n_xoVMKwMbts7U^&6?<>?I zMX&!DE(I1SdhlbIlfb~NA_qh7Pu)gO0zi#%!=KaMMF0LV+>=+W%a@*YxyLWM*=yU` zRns%S>Df|gOH0echI4}ySfZ^`mOpyfFr?QHLW!$(>Qy`Ss-5~j%uYo=d=l&MtM(`T za@GEPnb@EA8vi^X?9b*3AK7slv(Uf14U5K>`;Dey#{?z6xhQF!-bZ(fh9+1TNLbuu z#5$5}DpmKCiV%~v%VIQ$^!mGN_LX9MF5ePkW>mzqLq}rmN$X734jqZ*FiLM$jZ*ct zX^3Ko$@_5CZQM#de9L+a4UA(x{pGQm72GV1$!2LcuSuaPyV-aP%PQAG4c+=m-qJ9s zU@fiM4p@kJ#i7KCjzhVtP}E3A%7I5TZr^GqAC; z_W>ikIM%LO+_n76D&8IRY9`XvkMv;`%I$BGQ#HZKFnIypb+Kl{q8O@w5Q_sI>;jw< zzj+b6L12EPZK$RZU4manun^w`8>=Y^Rbjwi?7$J&?i_P&+?InpTx{duBuoX^?m3Z& zPEOyLN?2l3^L{A`7RLRs_R{loYF6-seCd>c7e?0|GTwRB8kDR-Kl*OeXd*)!+vplY z-+U0a0(>afj%Ri6GK;in61jM!jVl|tTtOQc54LgT6Aqc3SzKlB%B;F*#Pqm}-^-3E zH8Y#FV&t|#&ItIIb!OI@gztn)$!UV~P=QqINy3Y^ju`cWn(OLd!Ax+bqBk>hiLCS9 zO3_pz(>j-LWMTC-MFUjpnq{=730nxKu<>R^|KaKYW!oEf$H>6ip)QMvld-MxD&^{U z5;3znpz2F$XE&~!&K0zH-5O86<7|?Zli##o&SzY4LG;lNU}NK|nV;LtZ&b{Dc1|a| zY^myX#>TZ?JVzXW3a$erM!RyJz-nwykYFJi^%OuiK8CGZ;T>#J@YN1$EL>`Z%Wv2w zTh7{BX~i|PvIJ9q;%?dd;b%HVvSJk5X`d6+*+p4Qq z*(S#w9UUf>ZF>L(_!wx~jAxrOa95!@i?uEU+Q*Ziaxp1vxx`~PvB*620FbgW*UWwF z-)rvM+dqq~x9ABA8zW$O`g|QN=Eit(GBFpk%-~5YF>9qW?UO;XrNbAWnN6j$X0R{l zJ!5I;jMd2E+uOylsee#9fx7S(tb=?oD&13$^&T!rw0u*0~fT6jSv zoiX5ZxQl4p=kYlA_GgV%Xy-k6Sk$_R=v7Z+s{HVaMkSdh&^UU_C?le`K8v~OORvI1 z>py)S`=XxCT%E(2LmR$etVQTqJRFhIyT0JHa&g_$xQ5s4HQI@zhW_RA`1S2yFj{Ku zhOt`Fj=O8t?m2=#!o{HAY+12(yXyum3(oBXdm63-#tcoyFUSi=2CyC__7Hm87md46 z^_PtO3*|gKi%o!^nAPR~6Fdm?2Vcg8$lA-}Uk1Ad)?S|eG9E*OsekclJZ4}4{8vWJN#vo5V+}iD$9LDNHu>2xuboZ1u{Q zsHH~Rs|d{a+0HN)FJd|C`1h=O{~Re00e0!6>l4LNhDHT9jv2O61Bt zD`f-AKP$CHWL9UTsFuTx&!UUZR#y?Js1#XB7|p_>Va|!95S9ZFEI!XEhPlozJ{1x% z$LWb@bUH-LgyaZhUoVYmwyT7z(uT0tdSpQbFW`qjntB?gdJBBG)c(AI*-Lipj(?xC^)Ud)$SKe@}Md(8cdza0@*MqThWFbEX*I(AMwc&a?O8q`r?S zvVa2<`ug{A>%`czrK7_J!{-e~`iDo%L;WR=9E+~30|Hep?&u(T4Hi=f2-c8WPDZn! z9?3jjlpN$q4|+X!Vb2v&Wozic5q#+^myVcf(#!y=lYLWPd)s1XCNck48HBAF8FEA_ zZvMzgi=P_`C$(9?o*6TXzfPqRiPUMB1Uiw9&R{*)gY!cXY!zA28B=|FuxcD08S3vn z)HXcQJ2WDWI34FqzsI!BI6k%TBK?E=0J5tLhdhx;O-_%KvlI6n?mK#@e{clKv_K&j zR90a>2@+;>;_Q>QhSE^+_ekyHwBt+Ag^F;NiZT+J^gYKH5Ln z*Uw}yM89Im8@f#v$Z(6vQ>aeR2_QiA1kh?D!>}`5$QI%=Ot%^Wy*_!bArbK|E#8pmj*&r%?Sz_dZbBH@0%3@rYy^}2CSvbZWmUUiIf?mVG-31v|=D6}Ue$tA@#^5CVN+|~A z0%_%tHIq7JIommvPR)>Sq>W~1W-gP3yXq#RSkcAI=oBn|*=-IpDuAt*n+h0Xk4E!T zO)FK@$y=Docn(T*TdaRT}=^_?ZD?;Pgn0NMZxfwrg6-ixQs`K z`ZY&K7Fu8bp(7)=EnuyjpfPJII+w@-G!|hIPvQdc826Nj`4|k#a{;npd<1e42aWoL zFs0d}tYR$4%7yZ@NRNkOt+Q5(Gsfw(23#`ZoT#B!2h#Li{LZRMl{i2xo{3B(G^rB_ z)Ji2&33A~ATv6-+#BlGxZulv!$e2GQax`3?+$u9x!I&}RXQ~Z z20z^r6+dNVgtEfKB7fKozz&LCAj6KWkTSRfqV%>|<#QyrcN}(rQT3YB;l;hO3|4G*cQ7G#eIL)V64~epsq@U^V|3|3 z{z~%N4J0>@IT~FYXKZnygTJYWcr#5-Y1Im=28fpITInGW3K^VE`I89O9IKLG8qATJ=98+UlSHgfG{cAx zXhl?|wH1tSd(M6k-Bp~9l61ua>L>kB33{s-%j$}mK?NB|u*WK&Riw_-zMyWyt~}Pl z`SZ%KzAJ~d;E`3U@ABof2PKc3+QG}g_KNm8o)Cm$U&3u&V;a?`mg?~;rgM$iSVV$s z$5}Lo>J|$_(B(FjK0|(GJr6zCw_FZ~B(EIVL(~*!sr2wL z1aQ}o>EV1xclb(eU~KKM&Fq~E%J<_vonyXS-u--?dZn#er{3G0mxmR3SmnPXvWOKl zs9d2E zW($d3HS8ZD5Mloa10B@BhGfm>Fx;ZK5W}-}G$qpZ0-1|N_*xXr1#`11>Dl764w_6B zY;w6^?%i_pw0HO%5bZj0-;(%7&)SNR-ie`foSrCrT2Om+PG>Gbl2X0=Ug-q(mP1;v36ONaU3ZGh9H|)rEMg4 zmq$F@EevfoZDHKo+uOq$5ad`$yM=bHiL@0Zy+(*j|JbCHX_j-s*|B?<2EGW@3*=SKIaE){BS#px0-m?j-N5YVN z7|(_zI!Z|2cCbIp4GD+Mpw~#$(BqJ0*{u;xa>W z8z5q*M;^1o%VzcHPG2PtXv7Ya%UOdNXzH;^;s|uLqaa;nXeL$&*I10t$b%-G{-MYI zC9*=oX3q6{mkQh;E-&E;$8g>US!f>JnuPMzY|-b>vAUfju&S^b{i%35s)Ao;_jVbsg$1VfRLR&=;vTjII6}>1=Z)vHKu4~Tiu3GED)v~m z!cS()PmR1rygLZ^ss%5N3${LeF^vZ=CN1xIoTaqPTZF^TO&VPOvz&J9j`?65a1 z9g!CBkm8(;@Y0#yXHmTborBADijDKADOtzC5dd~;bL_ux&Nz8(WX-da)nhBGYuh5* zZz);UrPx`OrP-bZo$yoOo=&n%$T?JFa8-KGqehzHc;Du+X0NjcF7Wy10zATkHz#=< z$_603ZSukw`SaW5`9d(1)nPJFGPosde4%Wn=VZmu&w2PqE&(gvi10j>uXr;;JttFa z1ioU^fhDc!T=^M9iM>d8P9djL6=9rQrg70RI2SukmN=ny+0R^aS?eD1=2~PZPA(Tj zEIlTZ<|Ct+EMA_KjxS5o>dNfXyu5^>tn@1&2pYkdhiJU$o$wsKwwKL1FK1gLc`wL# z=sGENfyTxX257581_P5ag?)O6^Hzydv)zqyY{M#ce1!&onN`K z^DEx#S^1||E-cLS%H<8~F3?pf+*$I>sb}L-%{H&q_W7A=D&OWA#ywWt7tT=QoRV*X z$b+);BdqJB`Tr4KXKeSZ0s80591y=-_CKI|9k2IG$)L5_icL0n=AShIn} zOF$N2Jyav|3*eu>!0!2F(MI!F@h-_7zx?aZ;#NaA!kh3OE$@9(q<3Y7i4HNp$S3$E zd%Q(Vj5}iZWPPX8ar~QnJ^(oj9&WFMhWPZWF1goS^pSRM_Y_X8U^knLXPxI~>Q6Vv ztv<)jeF-)N!x2+@xe$>Pl~f2g1aR%C^odA!XJ>a0$u6sFyYd{J>pCFa*|k3R`PSoU zYYHn~l23ECJ1(NOo#xj!U%JYn=p*C{KS6#$947s358fvvdz?(=%y`brEcb%U-7hz- znq=cUmq+68MChSBu{jV6&=8w%>pgVP<{vMwB9DDP6MYrEowds*#!NiPzmgDU3U}HkRROl6N`E zcud9i63UoSa*CHNNZAx|6(q9a=1)#*Mxh*}b(t7cDs&H}lDQ-AOSJvA~u&hs=H120JbsAfmnUnEZen?R)nvJ&ms9qZ-PxE5H5HKFhoq}shF0GZxGpz4R{6EJExy$KW8-Uo7<;Gh zo9`sQQ$_{GoY=?cj@MVMuHYw~kheuXw6)G(f9b0}{~wj3V3)rP{q7IS)}r5Ek3wB%x0{bKgz;+w0g>NIi=iA`lhEup6){?(WE*ZDV=FS>wE zJz3Ur>2;0%UoC3^KBZ1WG!c(x+8u{S(vPI60HPT^+2sGiGMWj!CFuXRO}J7NB$QIng_V{*CDKoBW@vqE+!jEYUkd{`Hssdb9rnODYBC=;^y^ zSEG*4lvM&jc7LX9Lxo5>@`l=V=;D)QzB2L&z2h@w2HFs8-b#~D_2o#OhG*SZnbG!f7g!BI3@5&lb_%mhI zi`mO^sfF;Ng=YENzbmUizZ)E~q=vnBmH8tE770rU4TW^Z{7b;vg$} z=cIq_r4z&cpRGk7_;gtfTK800?K+y*3w|5X^~7T~XRK&4L-eYfE9r@bm!3@c*DpaE zzEx!|qr8Roe5=Zjo=^Ed1z*?HX)I;PvIhOrtUrY&?=7pZ*BP+r5u9>q>Q4WoWw9Su z{Mox+L|XA{OUl{YJ?dNJ_oEe$H`b#^_V}x?vK-##Z$gWg`v+0v*Ntm0eP@mTjf)i> zivIGnzeTSd(Q~K$n~3&9O=obX67?GT?=yZM8u(1vnuXVF=%3H{XY>jOO`P?Iyp>78 zSmjbD0HhMVN>?aFlgCq~6oyTHr2<4fKtxlo70{Y<{`IQt_xjK$uJ><7U)bXh zqTgKa-&aOB5=B>InQFbpA4c6f{D)C>um3vqhOM~nk!}7h=!qL~Li86#BYM2tsK4~( zUcc!>@96h$MRytKaq6WT%Frts{I{StnEwAm(!mBz zdRezO2$(`1-`C%Fuy?3GgaL(hxa7hk!rO=qQmnK_~MG_arN~9~}$=SKAeW@ztEpy^5CciZ~4Zk55hG=Ha z&P=2d?dE|gm>z>K@eIHtGj-G&m+n9)pTZpMnWn?sZiUF5v(xk;FmiyD~6^qDB8!@|;7703Y&S7H9 zvXA!<_8s1LU~vBqR|yS%tr$OdMkc^^BBd8!%X)!Gv9~xa5UbX!+J{fl*`Ky8Oj zIvZV`0!_gZd{;hIDcfvzACbTTEWX&B1fK+OxP!VTcMvZjI*GZ0n9+rqnUHY=L#Hr6 z4QA$MXHyxtyekC(TbcNYWPB<<8BJyrXH7VE%7qfNmg(>X_qUi<2iJy%r|c3s4cpUJ zI;-W#@D8pmC5E4wgBTy&A}eciI?i-}4hC4Cnp24=G1Xx>1YgcQNRaK45i^#8NR5-8 zx)J&~x0cguf1>8{tA93rIaz|)^b#Lvk()~rMX-C9AhLIbIuFTqYNpJ17N`PIE7Qr; zX)KE}aTPVfOXW2BHNFkE`g7R)7u~QC)fde2E&!;b9l!n|pcV z@Nf;z4RWDlCLxlJgsIsFb9d&@ zK%cpFTle)|0756T+1Z|sj?<@4x5usQ6l}cjNKZ|||4^?@o}rD1<59&i(2 zW@*8B)dGgrR0?(rlF7sb=?5QtMd$f@|N4q%Uw4B<+{3PNt6AX7r=I2@xTBBKuZb$g+c1# zP3V##k)m!$`9ONr)EkS%VYvwVh-c}{wPZ7isR7`T&NKT+!_Mr(xOjn!rb!gx$@oM( zE8S8FpVJoB4W}qq1AAi?h&3QET-P=)aM%S(r%u3>(QGuH_7u1dFNNW-UzwM~EI-QY zoXg!>jXzWxa!vUh?;P8qEy}fgh{D){iMYL!?y5S2`C||E&U*B1Vvkg?pBLI@I6@t8M>iG@Lk<)J9d zqP+c_4TL8cPZEp-qLSXz%nmpo=WGEf7cP)Ck`-q=^GVsX$T8B&1f$HgTN?YFhMTj5 zGDYZ}6`qBpHatP8eY!!W0II{|IZvZ|E_f3|w&S|IA&`63^~o1<=p11J zR1@}hJd%~DG3@VMMZi#%hyA^?7#NBkkzia`h)RKpn3zq{Y#N(hf~Fa7qQWo}nkM~g zPGkRyhztB|ZPhCoZ-FRa1ehN4Xou1krUD98i|~NlO0?|5{n50GGRTz{V5%}j2Nb6> z;Zdcxbvlpcgh!R9JaPn&kR|$K=T385*ld;AaqEDG&hQp#+IwyjLY(UzJpp>0PK(lD zlH6lmh-q)QcpmPe&n-$KZ#PUZ(T442Oi*~?t**kwl)lDMx(kfcaQKRk*PQ%Ohy7N< zuuTS!{9R7XU)JLVbZ$tZ5}3?3;dYWw*n9@Mb7B%&f_;C5NqICGCvqjMjS?s*c6;eE zdkmhrX91K=4(<`gk#}!@zDWZ(c4?P;W&$``TO}T#I`OFFWmdqnOtJ8~V3hObv|O_V z)H_nP5y4zLcB?Y5FVliwDeT!1gp=bm!W2M~ORs0+e)n_E=TlF!q<}A>amZr~l zn%yrUH(GAu%gBY^&vsWA(0$zA&*7V4CL8m_uQk`Q(sAJGF>oTb=QS0{v}RJA+o<8} zLaavOFZXqFuN(C26|xI+;=a(fp+dE&ZjdU8TEwL}=j|Nw`Pgd;an>CgMIBZ0JMD^2 zxh9{YC{nM$v(UN)9*urc+g+fNfu|@%1CO_|fu~S~15Xa6Lo3SF`&{|tTlJJ5v1puI z4YhWAD`HRV@F@GSU%H$SBWk7L%Un=kR_A)z=@ zPq_VJ)~5(fAT|~-L$X!TU0Y!)0C#6sCz+#?hz==5jhc?_+Rle-zV4!cGC6Xkv4fHH zmNna$*F|>WnRJic%xo%?fm6K*wQ|&4$ZClay8`=Iu@8ayJcp5`-7qHnNE)CmuFJTf23DG{kM< z^R0Bv;(B|2i+<>Je%R;9sW_uNgVybwKfA8qTLal;NiEy24Lia0x~Ai<%Qf@nC=HZ$ zln1I8T%PIx6#$$3)6AqUgf0z&)TC1h*-Hjjn@l57_RXP23$p2y-~ueJY`D@a&EyVE zp$jzH0(OWB%j860AWn8Ln6N+9A+1Ti^Ha00jFr~y7irrqHjFq`7BIZbkOMkvt;M;O z5w>8pwubGXNICZf50sRxC>SNzUKA&8Vk4!3V6hmICBs(1y1UJ7n!zY%`R!79?V^iE zi`Bg|q{UvFX9{UL5v^j|-mkX3tGl$u%hdB;cv^TWy7moGD(2fbq$OvOlpAnRZu@*G zhiN}A(p{N8(CRGa`?a>pTVcgd+*OB35LblgtihuPotjFDCU@`f&EYEMXiW2HXR}_x zYLJD;4hV2GK^M0Yt9k0H=?q$Ce#&t%i_+w1l@~c& zVe-xtXN0^fT?vl&si%d~vp3yw@$?`7OudQJjEITf<&28wsU#eJmmCmpr|jh^EEb;j z#Da#x!_@%`6$+XJh;Y{) zIqSK5KG)%~t}YT`?6_;^rlgB-Y`B>5FdDiPz|U71J%x!3>Ch~k5QZJ%kN}68lC<4y z%K=V2j#I|Ktd>~pc;}du+S=tx$6us75TwvyLJ#L!sh!h7Nr=z36Q!VSpL7Ou0T}Pi zgYn*iFy6c17;p8!czZ5%w*#(HVz-*uov$I=3u?tyT`RWw(odDL$V>(ZEyDwBHEA( z2#sY0N)3gj#W|FcLS0!|JG51WX_gSWY8NdcR8_P*b^N ziJ_%xf0P!>Z2V6PwUPE5R@_nTwuCAC(7AQceRE!%y z3smL_vZR?DP61Y`G*Tx_#qfgY){@Kq9WKc)op$@)r8T&+fFQ?8ZL^6lRLO4% z!qyDzPcX^&cz1; z#Ik2}@R|j1g?X`-+d#-!LUhPiu7R(F)Ch}9>x#H^Q}JP6tYDrnFP5vour8XL7b-q% zixn(BOp6sPIxLHo%Mpg9HmQ^_D^`>|g@jef`3nf6QV}dFOp28$GAv51u%xIbQMQCA zCtg+`)g)52QA{f8B}XZ7x)l(Wq^i$+(MDW9%)GKjaR&QAV^abT_*lTQiRlD_^`!5u=vc9(_1Wj&^Lf z+hO~84kI&nFpFSIHE2b!rk-I-;aDBZx*|+?UN6SwoaV*x?CuOKjY&aRmwvoNzd4B}7PQ%qw*U zg`%a{-)!kDE?r@GZeAA8NGwQ~%MEO-;F?LJ$sofW!kR3^>a zJtoZys9Lk@J)FC2msD1>PuRN|lD90{q0Z&E=bOtfs6p_xXow}mszgD=aPLl^2Qj3b=|xkc1d?togrx9CS_oGJU0F141q0>+TRtsfAG%L#3VI2{ioYwpIq{K@-w*-z4d8-C;IF^`j_{} z%e&;Lb?tTud%f1ysOWP~`*)(>`-*=JTKSCMEQ8WxXxCT#P3Zs3lr66mkkPrX_#0`S zPK@6LRQ*-|@6fAWQ@!@m(P#We)-|$Sxtd)XX!$e#U@h2+q~pezibm6)^0%Td|JZ+c z2_Vw?6aSs$$NPWc?=B-7L($;R{hLt5PyH52IQ>)qR+dotbN}_^XE)8W;b;EiB+u)A zCg(BGKmW|Xfh3gw+`ohTIQVmaGkVj{{Rw0|<6m{mjV~4ucmKPywGlajwFgb-qsd`^ zT|M2H;pocmFZslnvjfpRzwq}gKvy8#6%q7D&-nW`i6g(|HGauUfn8abzVwX$Rm=QJ z3_80{k~8n6fp7XJe7Upy`49XbSsd`lLi3>Hzxl64-}-^S`_eQ2=Ks+mbo~GN>(QO} z_{-59f8}osurXMIK~*TN;6p$3Kff5Q`z3Dmil#wXzT zEG&1uW}lgePo$&ivnJoS0kcz*Kht=E(LY#D#Ry<`zvvXu806|C~z*`6TG0iaH)7l0m zt<%{!PR;HCF-awH@9)B04CzoS2ZNag_IqXVU^#KtyeXcBty9DCnN%`$%G`M-enZ;I zq!MuLEi`0zyJ;REoR+p=1F9AC%_U=Gp4l=F9T>sHn6#1^3uha)sIfi;_ZA#H(APgW z+^^X*gE<&OlUSH>E1TavayEMsbIovSDtj8dhXDwxAw3Q&08x+)xc<|(Kb1O>07jdc z!PsD??*j(3aRcU0r86hvvm`MQO;4Nsr=oC2?9?wSd>wG=SPOO{ckMP!m>b8sVsoZr zv}3fz91XR%jE2q8meCIQ&|!{tb)1;=`FeMl$01N@jF#$UZ?xo&4puUIcGfbFw~QsDGZrmOe&H{W!m199ZifFz)YIsBescmKfKwreL*N z6B7gzlHz+|G)Y>TWN?HpAtOs^a)G~$CJBj>qg|wE2!4&8$3z0q9DocRu#=(3rwRv; zGuu${ZvflTVc&2#nj{R|f(vwXoa2ILZy;|Gd%;GI@_)v!yVLt z3rr-U$>~?;+$2n4>6t#jA~f&0@<7CZ`Z31Aem@*`wB<1R8VhmMbdR~9k5uiX}wGvP{j7L37h3TRBl z05^qn1Ri9wA>xyejc9T;_|tKi5^8R34ucilJlqT_dKl|Nk<=!V=>FhwY!47PWPLx_ z+10)EnrpXRxBdDcu@z~lNm^zf0k+@Br6g?Oxn}3gw*0d%lGa4^f4u`@xDb{ZR0IddGMNFCbl9LaHt0&mA6a)HmbU`%Lq zc_NiOF%ms-ByCN_&p?nk&eg+B>PUBIXLnDKX{^jitg3O|kS%Lr_Ad)yV*0xM#%P8D zgsc&@4kb1SlQ3wunm8AkLQpgIj482VQKFIwCbX5HDxK(vSWvpW0ZI6cECU3Cq|0#5 zpv><07uF;}r8_xm_xM}^My|+x2_Z{D1t#?cR-v?U1BFb4Yi^Q{FeCW6Wx(9vvwT}5^ash&ihnl48*T{x z-AvsN)?H!7NFi9#BvTWxniC8d$!HRDV`_SCmP{O-di zV*$ZEGp!0I#%^o}e3e?oMTrR&JI?_sWIQ)1I1Z1KJ+v{mSk0$k5fP@p&MLD97y~mp zkve6;ZWCInotMH*&=eLe*w-8Z%Y-%K0Gz%- za$^doZNsgdDYZC>*WQ8uWsy1YWEj8k?Y4xwj>k!)d-HfRoB9HV6Z&SznoVF?B5e$g zg8&EZodbN9S%ec|+4GPHQpF-NxRyXP zIZw%$Ue;dKD{Ml-&WRw8_{u}8ODoGFj92n2$lwp_#AmH6i|vi|fUX6EC{dWxac=TL zn5gCuiI1`Mb2zAkR?F(}f-hG7T;oU0!0DCtkLAB=yvGd8eDuwMvnv9hkKMcI>y7BClV!#|eSv!64u*aA+#0y{o;L^Xy|igjV7lUk!R?zX zzq0{wTSr33Y!8*cQ74tWInZ8@`oCARdMPB`^U1)8F^BI5-`(yX`ReHbN~w|)2w&0M zqCitC-|gY)^3k)LNP&+o3Sbt|6;NC}sl;=O0-dBeD6}}>r@#6a2h8Oh3U-e(XC4Y0mr9z z;y=o#Zu{+fO9I>Nw+%}JJM6d7rGZ__+a~nnQW?}Ymj-UwKKf6PpEs7F=avO-@I$iB_#{9Ml?T?5nya{>Nh?R!{cD{cy`?;`UTw#p zl?QenQrkf+MEIc^i4M$EQ&A!(+E5W#x0aO`2BN5Ne?_2WiyM~Ed@`gzt_XxFK|fj% z*kpIdH!1@Dh?G$>icmm!Y2otCynaia^6bS&@1o>pT|I!x}>G_)S&)#kW+Iuh9(r1nvL0 zrzU`EeqFT`a;;R1AkWL^?jcJkX?aC^WOxIS7QEO|oI4MZd191N>IGTS1Y$ z77rjf>)2Xw9d#Ou#7T+Itq7PB@9mVi;yIj#x}b+Qt_-xJy*FSI+`clfiRmZ!tG5n* zQ2y6+d_(_I6$mRsS2>iz(tpq21SXJK9T+2n40>HP)=4mWpueaNL>!~SE$}PnB;L7G zvIo4ww8x4ac#z;j#0B$ZF+8CEtO;zmtYZMm)CL*~Rr%W?O9P!(#rmpPzeL6Q-sL}Uw8a{IcwM09F1G%e$;L+D2rxLg z2FB#!Y68f?30pk4PV#{Wyz;~FjYNFr!J&r z0w4+ZR%8pCqSfPY4A7^_0`;50RIzh1O!ZmGq`sY(Vz14*1$w~F$s452i~j4o^<|5L zKGF?0unC+4V8A4!34Ze3OgxjJ2j83^AcJ8^p1Iu>#O9Vzohu=Qnm(9>_k1=m>QJCf zIag-EkMh#4*Db*i(G9Bu0UuW8jAZD8ivy9>ynSqWlBa!dabUAonz1CXVU0**D~3Gr z;F3VtGw~0X1VWyPpI#CO3cp3@;)v)AbnVi><_&5Fv3@5qWedsl=Su@2O{O*_(=TzR z!nOJ<_#1O{U5i2T0+3_PCt`OyEa;$yRe|6taJyiY%ZBMt%9~ZzG@$^Mn;eerCTAhB zYGE%6`btseHGFnj(C^#9>N-&DO-tH+zRRH8R|{*zo~h=OnU#~qS{}S zwc9nAZRRcU+@B$XP2tUflFuVYG1uX zs(0C%+7B*@eP`KU1fk+rRb3zH?1U---CaTSyN!WHyGFEgUF~Lst8GIk*41{RKVDw@ z5%j>i+MDrcUAww$B}}rTuU6NtLy7v@RqXxI>e@#1!sQvkjsALKWo?rT=k*P><>+tfW#Ap`=jQra1KnG%;$ha+ zHmfAsLjk|5s&8Mu_u5NlV-*4F+&5Pn1X*5HDYK7cTH z1}Xfft8kW&)zx1A;-dP$vY&syy0*1WNKv|dl9sDPzBRQEvpkQjslCL0POPmx82i$q zC#n8g4y`8J@nr?(v%eAzCclFUGo?}v9maBj5|c}T7L(sWjY;oRkI5g1BC8Z1&?hzq znwGJ`psyfr8_P=-*7-M5h2@u!b80N?xqi4|3o2V*yN0SP87I(LG73a#IWjP1*RdHPw#pUGCmzL(Lw4lBEn9KAc zA8pf%z6#Te7ICO8nn##k^i`N%^i`N%{)_5B>;zf-wPfewg$Z25FgsXb$@)=k*cfPdL zRGpBbQnVC}op5L=^3m2(^i^mn7H*+xDVj%UDf%k36nzz1io8l%ioV-g3f`%fq6LMP zq8T+>isIzfQqTNvx0a$Xg_fc)Z7n5|Wi3TB<{ zl+B$lK`q5JNAYf8W-yS`qg#=*}HH9St*C6V!4DH$liq;$liq;NZ%zlkbSV- zK=OgQfvm7_16f|GvCh3w(pU^R*TmI#->Xbq$tVdgkU_P*Ks$r%1+r{;yueG_u+|c_ zzC5*-gGf#;-bCS7lgzsvhkB13IWV}txMs{mXJ=uP#ynfWz?9ku5g_BtOZ8`{Q*(v40}Nk> zfAPv)ZZ;z*lSrUlTK0e>E#C4&%J0lko-~ByQX8TG(QwM_EGRqBfbi{GW=cX|_1o?aovcX}5mokB8|(kToU8JAy>K7oqc zc28SpBkU(T%yj;pP(m1hBo9@BxW=ohuf&HuUw{G%{ zUWOBP!jaW*ms<}PVEaf7a9bo&bKHqx7jxRkIcvaeO==peF^(KfcjxewO3zlfX_rHy z3L3VcNh;M`gAG19)j$6H*%Q1==G61zl+85G_A#l0bC0^l1TF1%UMGoTzeD zu}I>a5AgBnvD_+I66<{Q!LY(!3~`|__V6A(UEJXs^c-Z=jH!k3h8JLc`T}xBDJ@zE zzRa;l=W&=k*x9Q+*CUDb0 z9+HV%iPD-W6gcdqNr2E~P1Cn%4W+n|_jHwC9&k*uWaB#J~# z38Yj}(-gg4g``T!ge?ToG~E;J&bHbYwq#bmYj<5!_*$Gy0M;V|vV8_-3MU zI87^SM$;!IBaEZ*?^DOeWV?dit!}&ilhI@<8ONTZ#DDnn9J{7-mk@GxDZ5}`#ue=I zPExH?teG+;SkR1PaKh7Mkn~EYd-l}ErOP?r0}nqs$_wzE2VlE3xxvctj(5@{HQJh; z(0I2UO-?6Mr;}!C7EbK$F`GAMnn`!bU>wGz+g81xP^>Tv$oz#&__i*ci!o!(%%o0P z1ZXSGPmyCUtyo|}q&R)YP+EY+Fwe7b%YnUWQ$tC!t<967Dnbn3)>e;6eAfC&xJOZ^ z^NwcVuzPcJ#ys9OIfnntjS-E~)eZ)=+1}o6)4o$CyLODAO9nPen+iF1*x1tX#zx1f z{o#?XjmokEksYaQCo@iFznD~s43a~@f7&3_af;o;;T~<^VdDxv^?sMkYF-s(jw@@? zZfK&6pqK;|)I|(#t95;)gP7|x(f97pl5)q4o3XMXuJ$^Wfh6q8C)z=>DsAEX>}Yy8 zEYY8H*zwJ=G4o)GT)K`&lDU~#@&ispNYJnJUTPxfJtiDrB*~OU;HRb%bD5JNHV{cQ zDkHE%iPO7 z009mnr+@_po|k51Iy^5_mMB^2+4cx%LE$2e48-gUY+; zc9_gid=FLBIb$(aV#az{hcMNo^4Li`Pkz&kx$tP$!tB<0LA>D8>JDC>X&8+)FB!#N z!a=i0(xJ`8tI`M&VKl<%ULwSY9{0c`AzQfmbdteVpX;dFGWj5R!Z@pt3zfu)xs z03I!Y)7*?UKLsHA#!CrE&2mqgieIe+z01-*n>U=o1dn@}xCUuH>#O1x&yn8YVVFm7`kU^-tr+6B+0zX!S2gxG8(wn)UF-?`FMt0rw(+sE z`x+Huc?)y~ZD)fQ)vNH6Z^6I7KY*PhVa&v76Egh>}?I;yOKkllk zLVLbZRY?lS@IHN8Z3TMehZ1N0XB$Q)xW`sW(f zkSwb;S+Z~f$2Tx&sa?114}@j3yLJa!Pb9Cj%Y({h%|O6JYs#xv;_`~*m7|U~;y)|?wXveMqlL>ogF>WliMeYR z`q5t8E@;xCZt}4#yu)niK#R^*)f3rUPNue5DO=S3;8389V&5&kZbbk0ZH;9$HGrmNi7 zyN!xUPS9>Op&XSR4y-`uAI2U1DPQ$cbmZMtOUtFYL(9!JlXneOHL=5iS~PHDpi)A{ z&eqMdee`f(Ir``;0v*e8LR)_%P=~hN6j-s=xg6rC^+;e7O5EL8i8kFFD6dfK!ihfg z@gsq?gb3)%M*^!V)Z$BS#(d;e94GqF$jz9BW_5LBC1xj^A%(uIbkdOM&?la)GL`^G zkrQJ7kFVO+s1k?Pxi}P8{n#sOjl~WY1zo$;=1{J1%Uw%Z9EwxrQoZ@bw_;ra4Gr*y zx>PevUZTkVYFvAK+86KSLmob%oY=5Ag@Vk*?Ga0(@-;E(v z8^HkXGi@Qn?=7g~T~!q}3A)KxE@#5;>rwDsRSh83Qa(Jg*U9-{q$hHW>+JwJ-pT6~ zL;P|{68Oip&M`sc_SxL5X0``}TzQu{*nOF!2p!o4lP^Erg1q-kxF33y%YLvA%Kb7TiY3Imt= z(l(d^f}6lRk_iGI{OGB-;c?M9%tKbGt&W`10I$ht==)K!&YXQnz`Od77-(?zssrT) z^uD`m8+0f)tYo>hnN_THc^A8shJ-scBAwkzQp#l|p`gEtM>R=u2j46BcTFdQ4Qfau zFPNli=dM8G)zu;N=uqIh*g(JZ*5SYtW#~r_VRz-Xd#jeCJIl&ep)N2*VmiIOK(PwTC)EYi&bu^u?2S5AL zk8cmGU5p}QxSl0HZCF-Dyl>RjhOO)eep6L}E{+BI(W)ObG@`nHZSbKzLEIVmwX9y9 zo1~SZ-NCZeZMKIR+7e=TQ*&FHdnBL2qzL-{@xaPefSo+Kh}-x7zA_L%OUDC~XnH)b z3f=#1OqdOmfz4>;9f1gX;-T6#=+qs7-=fcNtF0kkPBd^-!gl))8djknqq1_b`;4N) zuo6=!wB#Z5#T}U2ADXFJ$;O4c+iUBf=1u6C4g-6-|6jv0^qp?}ZQo?Tfcj#9%Y(Q8 zns|Fz*^*4_G-`Sfn^>Qi47@t_`9*(O30`~;dTslP3iQLCKo@#zYi%p~=+Qt0I&f>C z1O5K3fe)d-ybW8Dcie_ex$@fsJJFN3<2L{5_Q2zdeCP*v1lFUcj$;E4_t4kS>B&HF zg*>r>mcA0(jvt$lXoKl>N5C9(O=E1%n4!%vdpV0vVua{S_#TsNmpD4qA2fT+;PBDD zzW(9iV3gukCSG!T;D&&H4T&+OwxtE}Vmb4{&^u|9(#vqfFZJ4+XX5Lo2hXX)8(gpx}SeZ*L0>pe1vG)fK}K zZ|jMF1BByBbC9Goy#a!>qKtwYzOHs1`pw@qE)#88{U1w>N}4-YTUhybXR$>B&6&FI zcV)hg7N6My=X|D9vAIcDZin|4>A~;t32uy^N+lAh)398ZOl7SMOgLh`FtaD4xeT|F)?9)}zqlczErlXK}b?w9tH*_lMR z-865p%$Zasn>fqrHzABPn#i6^&7C+&4(Dz$GpQMi?4~9c)Bzp|D+9NU!z?o0FG;Y( z>KHCYkK=@PsbRC})Fk9jO~Kvh$qd{NPgW%v08&7$zw+6%6`cVmJ_VQQu^r%$o9YBJ zo&iX)_^EizikYdTnLVAtrL5UZkI6fos87bga^1r;2-~hWL#Re3!E@A1Iuk2!I`553 z06fY&HYftgT?*QZdmE!Vah7D^IM8|sL8U^o6lvC29qw?kdlUmoo0AEgD^1!8>N5d7 zZpGS3?jww|Q}i~z$rR?gXd3ofw*UlkO<^>C;$#-1ema_tnJ`pZpm^xb?HH9P?mo;P z8Q3Novoe!bG8RqpodISjl_tOr9t?GbO)f~$40JoLU@kL9?$5;rc*2T>c|&?9v-EqG z+`cO+@3chhf4Z(vdV{RyG<> zh@QF;nkBj!8Um~dDB5MA!vwjZ!$9n4@R|_hL_CuPc+d}t1o@PQpR%bF7GVnlgWQc| zLbs*kWM_}Sa4>Z`!eI5VPvjXM8S3vn)HXcQJ2Vo)?3jv?gP_H;kr0y!3Bk7AS+;+0 zpL6L!Qx@})UGiA}(C~r7gKhf`4E6Vo95~h=B3qs#bXzhn*}NHaL$fKioZ0|JdiP6( z*)ChY4b`*(;C$Nhe9@LRT!(sdTU%SRJHJO`asKx9c02#xgNOTWYU2?}?pikD0U;*D zE}ooB!%4=t=djwRYLW1)10D-u(ICB1QYUF%+T_6p4lte_=0GcEQMByx0|yV^lA~2X zhU3j1x!twm++)R%tofX0ZWnNz`+_q!?!TeiJlfsd=D^!KGvtogxo_(C$Y$r>(+s_m zWH-WwBy|&(WTN-r(f-_UdhA+z4<6_p4)J*>ZSEGDDwP@RyYcXlcOhJ6i?a+CATC~+ zxhXDQN|`2_-bB;wqBMjtL}O=YxV@ujugRurv=$Hy5ls6LEq*GVhG8VgKMG+1eK=vA zh}%X08z*41KMcu23l*UHG}?_7!s>b!+hfdjfWe=NNpu2E&39Q89HP+f07I^mwnJ`v z(mIoMHXDz1vsjPE;rdNjX2tHXs=;&X(tf5Wig-zNBf zDwT34fXUfJ?u>BU(JiuK?J6~VGL`4T4RJ+AA=U>rBNU=~v_T&BT&;*tIjnauH?ggQD@&SUZbqO+ zE`kL~5hE+0Nrp`c(J+M1IfrM+sEojjFsI|#NSdH_IkS&ARSr-K*w!W%Wp1$N!5blT zpaiv@Z-+I-O@3~A(OTPOx^=aiy_&`d_ASGw#F%XqN{Q7TshA*XE9k{EKKp;skQ- zx@OSGK?FCgV8qAFR8VHPQQ2MKin2-}^j9#PFEn?Xi(_RxBA<*(7uLtwBn!KoJ} zmR(+NI&BOw&;q=<43To?K*0s}u)=APtL4Bf%8-k1=rk?GSM3qSDDyD8a#&WmEGMmn zgq`m=b)dO+GqFaT1BWeQSHP1uBfTg~Uk0z;t^a=L62mnLnAA z`LS7R)|!(Md8xcaW@S|gUv|4zH-@_8B{DK1GOq39%^a{&KxDDKXx=A|7v^^e-<;3l zHa!qPSj@MnTuNsaq8xp)cz?b1?IM>~-;T%ZB!9tJ!u5cQfAb)GfC`HXAdX;-32HASvNQUK)!zk2)EJ`K zO3(Prc?|SZ-{n36nJ}_tOji;K=fz)4Vw$iK37Fq>alc^us-O0)+v@XMWNuM> zPlxDY1OF<+Jqfs1<_Yv7g)lX$RdWRw8{+R0E%B9A4e>v7_Rc=4!D~~jFbYgzlD;3L zSDF@aZITW_^(wakup^X6Go>ChbP6iN>?;#n z+p9IS;{?1o7)jMLw4`^pRpWhZ)=us{XM0za7QO$EdUMR|hxex@p5qb@z zlc|BMk}N$N;~|VIQEiLav|*`JGz}#Z%=$=S`IWHIU8L*}lMsUWZ`r_2O6zYuq_I+& zGMqaFSsZD1fFV;h7rsWAg-}>YI8zb!8=OC525d`%?a%>ZQa?FeM@a7O@34_dN-#=Z z-ptO%BW?~*gVXFaZpX?z!+T9feX2)jPj$M}p*u~I=i@6x6IAD&^`_k1KfPgnT_+dp zbjSp!!HgX?Ir4##w)ZXt9sEonh<(UR&c~Bf?#p!_*m1QQuuKgNO%zt4*hNbV&|GZ| zWQ8p$D{R&rK_P2`myCi_uZaw$s{t{3$MzWaGqHj5F>Qb#ueK zX|WFR(*5<8??L!`AWN-HP7V{h4S2XAA8yQn?F6^KZ&PE#`O-$zr?j}?`*c3TWouJ@ zz-;}3AMX^HNO69T*in$f3REJ$3iU(JGq0aA(20}@pXx?+7uQJ%Fp<6pq}+!L(G>nH z!OwVRNr6`Hnyi{=SFsIkOh-Fq=pT{9$skYjAq$_4IQnViPJgdrr30A$Yv0)c1QAFb zIfT!gL6xFsDCG6WDL;1fhF86tsdU-|kxLknlTmu*O0W>g$)7<}XoyadUG8Kd{7Ug| zW(^*XhBt($mWgtWtUaf@^WKdd&&=t=G3Q9h4ux{v62fRM_^#Sw*micn5f(q6Vr4CY z>ghMjQr$Ji0DR;h7=U~x8NeqKz`n?h@l_1^7|_v~V(h35yk5Ko;mz6VKGoiqMg}bD zs|X3$%DS*x`4lItQliw~FsCdhTlpsam4L*{9lhanoLr=n^T7<{kI@=eX@Pl8YD2)Y zjIsI~)Tf97b$uD3q5Ptyb92Idy#$AEWV#$$vnQ0T@&sn=CpfsNKjdbI-@oy;wg2MC zcbc=#L&W|K?cES&>8q`+w6kL78dIAnXYb{H;$n%83-`48g^N6=&}8tQNo4D1i+4m| zRA)53oM`qDo{}e%9^sylP5Uyn<@gk{N%l@anT-HH5P6d!@@0B?0-;8YqzQkW_69@f zpbjoV>{}jL$NoD{&&QJ+{x|Af?`4$_x7*v#J9QD>BIC$QT(9rIPtnlYlgkkd0#YN_ z%QnheglmhVX5}kuans2Aba~NdE7j%eAz`5gzPv0Ku-$*(8wtaMSiFnz0PGAFP!E6D zeJR>01x#ze3aaP5$-8x|3zV#`HmZQYXptR4F3(3Lo3vXLE5Ei@YJ60S9MtOq)Q|`I z54$@@&+F!MSSB6*-M!uYPQ^u#@ZUY`ZXfJDvwLKSS$1yZl0F7AcG(umC4CGr+4E@; zPr4Pc&Owq=GbUSfkz`|;ZS&$SvbBE7c-0Tp7dyDtmG;^fxz?o#Ld06r1c9x8QxWg& zF$NYWZkq5YSWFBlsW~WYdV-rkt)D0EhYX&N3}+4SsUy<2KIww?^&|;1b(jE zb6c#h)CICHOQHZdI3J6=zpzH#*>ZwyM~*STRth2&DREU{_(2)26ceCZtilAmQek1X zY_~W+bW~&f<(DuzHg$C5`1s4`f{*1%@W(k*eD3(TRuUUy@bP+kqYy^QF$T%w^@HD< z1d`$7erJ!u#xI{fe#OVaEr#&1!|{>fSD`V6kg*BKSh&T|AlnaWjSWmCUZlm)Alu(T zittUqXvtccI#a%_2u7vqkIJ@bdC_I5w@zw2f~ydHT2|}H*W!QQScW04Tyyt z&(aYTpwOJJra7RU^@eGezutw{3lDPId#^W8`1?r;<;AMBAf3Lu5Gc~cr7GNpbm5L_ zLne~TJisA5eFpLBVQ5dr!(o@3*?cI>OBetd$}l%8xo2*wn+vS|$o^><*bV;#=E}%O zk#S@*M#EWxSedB`g1F1$_PgjeR1*C~6X~d5vH_KJs_gf&FoyDz^1#fbG|n33c7&*x zd0d5{Hut`~;GIuT41AN~8=E(PcIHYglp!koOSHh3{FbK~h+&QepgHTktpr9Mc^lgF zGPpNtUGtmc5zV=+q3t@@oK1#=K#<4Z*jo(DQA{+{L=F-03OiA4cA?iAQX`Vi}` zNa~d{oOn7R@Tvkymh+z@76UZ-^h0Do!Mi9zi(=~$gSeaw%8WqvbjFTWjmSZ|F&&pMnNh%al77E@)ZfP#lQQaqUTV?C2`5LZ}}o9&=|kt&X0k0@N~!*4=Zx z>cnXN`7*uKA~VtvCis^5OY{LP$S(QpdhdIKVefdD+GWy>TCc9|K`f|QE|RQj%?AAp zKDUsL$D6=C9J^X_{K0W3d7SKkU*;=iE>4WWPi4t^dPZ4^P4g>0sXi84RA9kJqNv#8 z$LP`8<%`>8i`zYV@k3|dr~n>V*T>efWo!9CZo)&c35C=toEO1@E@Aljsj$S3Hc&Q^ zpxSQl?{^Nmor8lH2PV)(!|YA*8~GUf&ECO3%@@Tm*gN7k^0913-sbJ-%h1%8A#OLZ zhr_hT-~n|=W%>ok@4yy7WU1tB^T76*%GW+uy`EMMZfHFg;c{t;IXI07U(TQ|nw8AnU6NGgAW+Qpt;xM-nNj3_^; zzpU!I_cY-3MmNa?p;g6bIFSt&&<7`eF`f=E5uGywhd#S%SCT%PyTEvagl|i zx{h)ZUBFiRc7gtQHokbMz2?@9l~c>!VcU8<#T3b8pKvWLCHniE2MBj^2XzGL_f-K7 zV}^baRm7!9Upy1*gx?uq9K?@EaNyf07?1qhyb7^~jin{W;(vG(2oWHYbwe567doSV|>JidU~; zhEA26JE<)TJ{{Nr-v%MOi`8MEKPMmmmeK0&VfW8&{6Z{VgDt_qYTkD*Q+RBV$1cMR z&*Tl|ZDc!6B(=M>m@#FFThEYYZq|0S3UOmJ=x@L~iih4emy5mMD)|0}^FD+O?6voQ z_%rp*{U{*1CNNu*BQGvHi(H^xB%$Ik76iPJB!AvuUoQyu^@3nu|J=Zyoq#Ez8;L8! zDDT;NKSgal+MXGl0i^Ql%Gl0a?9mfLmYT=Uw>l3IG8#7xwH|?;;F-mnQnSdYbktfz zpp;yR;xqVgi!+d`5HSI?F&7+qBYx=IgdJc*Jm*T8QLNRLb4d;%9fytWfstbF%t9mF zsyPHwy_EUffQmJ55)rcigMVQ3Jg&aj_%}c1__RHH4^PuSB7zFhNQw5;qT~ z`1kA>7y^D0HHM|~W5DtRzCl3MfT#g1L=6DUqF%ApOo1NN>o0syF1T0{y$^-eC_CS} z12ZzJM~&;r+{e`<#zp0~j~d?VT0BLKfDe@sKWZF{rH7$`Lmu4*XoSzq$*ze+NJQQd_siA__psgks#dP-n;52G=P;hUGOa3mF*3GoCCykd4j8 z<7LRDj^M!zCRX9j3^KVOv0h-fz-y=SEM`1&Y!88snwYFw)In?w%!EW`ngbB zAA)UtQ>d+_U|TDN+FA&<^-H0)o&?(hf?A-l#b9H13$^vTU|WA-6qY?U+RG7e7v!e! z$W~5s1eas&m{SOdtl{lpfkGc&1>w(d7_kKsMO0CZ-5-x?Gfe#rHN17d3ABqd>Ui3l zGz3{=6o~sfn8bz{hij~+j#-P`5UDcNOJbhsqZdsrtM&Qm_!2bRS%f;MRH3nPRz2}X zG_u`G8mVQF0~b zIB2-9V%cquOQWRK-1yc^Po-YB>}*j6OgQoBFJ|#wkKC9q=WDnaF>xBeAhuN;>LVh& zZ5d3TMq|1qi{mwcBMel>slfg|maG?vyJ*|AJ}UVpWpgb}EA-2z8)m9#2SR~{PR5tR zJ|>Yn9YCQ~;ZO#&d2!i9?+kUp zM9f>wNaaDEq^EEI5Nwxcb?)&q1$*J?B~)fXB!GNBfJThnu$L@o7@n9qDej84fSxR< z?fQ^U4$1}!gw`D^HMxOYc@1$jsIc7#RXqnY;(+2Gm(3Pj#;5Z=cT28oJF-Q-pdpF; zm3+^1E=dgJk>j^~3>}{)a9(1}#kva)Kg(pFet$LzIm0;ZhChnkyi9ritPo&F&b-!w zz-k+=e)1(O`yLU)q7Ry&5e{#R4CRawh&+-DPE~UQr3kqzmPoX>Ho7Aj2L%HkW30>+ z=fV(UnW4egG8YdC9p&W9miXjd1`t2P^kLX;R*EUrFi42y;I_^C$*>N^c?R_uju;>F z>qR#7HtZT0_cM5u^Z(SZ$%o{F?h!MUp1|3_$D{1vW69&V-(S8ul-b`J6jnE!v4q_? zXvk)rx@=RqP7@2YlhVxv;U6C_?S+5;^8EY;X_c7QD^X}F1%ZDAfpJc-?9h*C8N& zM@U(gJjDpqTL>?g#~RWz%1*uvZS^iL(9eenaw8BWbOod=mdcYkXL5PhN+h4fAdS7*bPi)ln2%&seDLgB5g+uX+@9gY8pZoph6c4aXm>RYtxb$9o7k7PIxM*tqsAcMH{>1AHR zAnur47^mOa4@I9e_z;6W*7A<&RZjJVJ+a{*b`Fkm&%E|P#7u0lQb?i22O6ME;|mvs zrWv0X$RY5MyO$c(T_j~XP8ls`hq_@ponq|NKVS9~7E2#YtX+x9DM;uu>T7*A1U-^e zE-Tij$F$8WXT>KZ8j!td%%DCyoA976gt7&VsXRnla+V10uy)=PFVUg4pP>8T>`-9y zp}`#&C3BUr^tZ-e_U0_L`3RzOkK?R|%jt7)$P>lI1%Bsp@LlC&Zm2*2o_ax7(=}W} z+^T6%ykb(MfSQNxGJs9^((ABw1xE$ZwU)kLObBK2uZ6>rGH;}`>(uKN$`9#(oxUCL zW0T>}?9PeMpFGz0>>twP43r%rDu8H!^7c2|5Sx)kl&HNaLKrodL1UB3u|Nf3D6DF7 zoczsNYNJ|fLNOV4hbY3%Wt+20Ch(81M*8L|uyg#`esTtY}CQ3x^1jUQUeelUJ zy_fvHb8xu(Vt;LC_n@Eq-^vD--etnx@JesmK$PiG|*eVFp)(E`_(8H)ZcuOt@-Ke=QqYzCE*ryMmP+|F2 zw_r)h2f_{P!engDc-tr+7Qe;jnG$eryX@#pbDp1qa~}^<{JG{aBZf$Cuh_Zu=B|5kUYNCafeyATtcUn0#pb3t$F zim~Cn5VwPhbFh1U!;-%n%BmF6(f-(U-aF;C5_6Zn5xew5>@Ka$X6L<25m!%rxcWD? zL$TCl!EG4I5&MyL*Yx9UuR|T>Cuyb_L-emTzBF#6t$37zz@x&(pigW|>aatI{}Iqx zE8QB8&-qD@=Z4URH>u(J=lcA45~0{u5z|7U#7Q6} zVaPpQUWB(s}A1dhH(yWCO4dI@b8Mu6Q@m<5;ijMyR#DLUV6DkhO@cBOGo|Hpz=6{KU#c+s| znea2Z7z2VGk1x?2eVm^3E`>nC-`1Ohk%3zi>mLh}WX4U7``Wwrbal%Y#1z)PAg18Z z%_>|$8a6*4w(vuz06U2DrL4pTs4&e2cqyZUFvDkbRpwabMib1P9l%MY4g_|TPN(U# zH@OiTYWXwd5i;|I+IDl`48$q?lQ0G%i%B8A@THN+ty+%c6QrBuCiwKUR1uphG?X>+ znb6MPxA$HZFt3HGcvPmJ>V5@JcD7j0!S{fXL>?8XYfsH=1tEubgUtFCzpQhfg95f& zx^u_z5Tab>Y|J3ZkvCyzAqP6z*@)(QY$ZVBD^uq7@+TOA;5GY5!ot26K zlolyKsrKzr5>W!8Aw#b&f^dauy$8;BY+ZdFO~UvW6}%DMG6~yvXMDN(Ora$Bu9(1&69CBUM$j9eZHa*TuMB`u@(}L_`| z$jnt(f~$hSq`|)F6AcZSh07@ni*?ip%Peq}kz2Hpd_w6(WA|0$7i{J;kzg>p7FeEm zimP~8rc_n22>+qBOzD+iT?3wCEa5?A$LTGabA#M~7*h%BO@>J%*rRZYb{evhmMv)p z7yqO`o;OegA|AEBk4HX#^|=@fgM4kD8lzwgl`u%bs{+R%P10Pr1<;Pw2&trE`pmL|L*zVCY4K3qNafH zmxr0S;LGtWHlh&fS469bXhep!FM$z96b4ag2*fdX%Jqpk*@a?jKz-#hE30Vkj2b3dOxIJv9wWO4M(+#Com2Jlg5U{J2MN5tf*tISg0G?rRDWR zOPy10K?D|%xfE+j%}Lw{SKX6fJE+&PlRLuYON=?IEic=eFjrF%Jz4ppsk-U(gt`vv zT<~qmk(<|ra#7r$tJEH>fGTF4Jm|FDRI!wv&p*RLv*a_S=e#RZ>FN`0B#e$5mF#4H za`^uJNW|ZpW8CnL5vJSS+uiRFdsz;bHhrs*!Cbd?V_<|LjaY@eBY+Rg^0z>-J1v-1 zT9XJH1zc8Dw7gsbhfqJU7a4AKClTL_FVf9BG6C~l_!xd^t+(KxZ?wJfdZb?ar{I;f z2B&d$A&Xx~;BdbQzpjrbZyOuU=Ei0c->TL+1JnGfz!$eL$~x0f%$;Ea=-T;HIBkeZ z>sVx+_=eZZ7GE_IQG;ByA{jVPrP|$ElmhpT+(u3|T839j|<^EMgj1 zmavk2MgiWAAu|xzAlw}9h*O@zQq$SwFxn^z0g;(H0W6GqH}Cg2lg>?5l{iG}?||N2n}cdJXwzWQ)jm;rv%I80QKXdm+4f za)^9{CD-rO=-mi{`xT(pjkU8@CCoAc=i85&af z8{+d|bTYi`<8Ved>hP6Ul+s;kA-KtG;UTe&7S|#=(xwzIRTh>g3(L#)5cx1o_&fG* zr)r^_$sumYw~l-L0hNSNia1PG$^_zgT%^wnLDAW+4)2P~)It!#vNjq7-svPw>&ToP zOXnSIZPR*J(7uP(ZBBTc+oENy;ifHt67oh^*c7s+PuNVV$drka7(?0>OW=tK5F|uJ zL(oI%&`cXNn=oX>Z{Qap^K}o84tDpy*R@#u4(9_IFN1Fy3EbRm%dfhJyMOLb1kCaV z2#SA&=wW;B|#0*0FlQq zeX)b2Pi&o?&Yq2)`E-q!rejRbk;gRv5TRJXbk)Bgsa{ZR3B4@ z_ZAj#_olQ-o68|es=v&;;>fBW zu1x)USK@J|n>XI#4OnlL6?ZVqrolP)aGeqLiC&Lep_A&TzIT`54!Hrc0is)OYIEt8>wu%UIE2r7{ zVoYJpVrD4R_ac8KGaBlP5UK7nwzjR^GZvLN4TpF@eB^_$yvAnSLg!*ld{ke=S!+MC z+D+OfvJkecE^$R`u6~@d3}o|C+*Q7W6x(v%6mFf|su>=NE@MB#3_?6xbzqR&*Ra?)Fcs{L*T>*Y4) zSOWS(p|nn`}9KJDfrWK`kbmi2_2h!$Ue@zZTJr>b7Xh`V0u@owp7`{l00N)-|r)h&?_U_-R#Y!C0?~%?3DL zSuJlbHsnf$3YGLVB0YkLv&xj=w&o$Eo(H*K6qm8j+z|hjB^G1T8;?*Me>$F=2U(46 zu2k>gE~QFs*B;f7Ke(zGSqMXbg*95M8R{1WF98Kc(@*LxTRIlzOOpTaXFoOHutsXH zn>EvU1NF5FkIYVKIo#`lY=+|Y-WKy`(S`3ODSUIBi1Al3%tf^)Jjtfd(bK1ue&V{e zmKCen{9-g%20=vM0#z^ZiBmk7c3B9lU0wbHv$Ke~1wo}+vS*U?;zPQ(V z1BEzX`)D^Ag=I30asU%!TWiVh1349x&P&j{(fBGNIY8At<3}I)TiB6zcLplTQEjG{ zRTy9ySz1rBN$H+SMu=#zaIAQU)- zwu48iTBw!S51GGE#L*O2H`8HK2h{T0iH$$<1UkOBQRLSL%X~$X(HvtlZ1WuRw7;{& za2^6OE)L7OD^Vpw&gbX$HkUa@W!M^36E2&O@%gIZ!V)T;tf?IUi%2z5(JmYyXTkF8IQ5P0C&LgsovhJgIzO! zumOr}(=kzZ!Eh@yWn<$>D-!@Jou1%NYC9J_M)`IwwR^Lbb?gzh?q|o7z{GJQ5ROZ* zBBgstd;LZvcVb;h)@1v%Kr_i!VxNB4-DO5|b(6(M=4S`#RMi9J9kO?LkOaRAV{{CY zVuit-f6Z9#^0oajCN}6{8uR`bj(I2Y%OU#`0BSO|I|ls# zpeR2fqa^ludVX?oQ#XMFgIR4g1YWJ_IxQ1y$?9YE5^3r!ExuPw zK)5YrcIaUWct$!glvvtVJVugcZLRhlm_pj@mp{WVJ@(7Lz%O0+fidn6;m180?apl~ zXg^u1HO%H7!`)T*@psDbvR*@O#(w-O{8)h>uWRtL4nLOR$4|mSW43nJHqYd6{(uGI zp=Gb|zj-fc_pog{W$ik){lx#~Qm~!J(e11T+xffbb{fHU)}z~52)6UD(e11R+hK?n z+fY5&&~kJ;KLy))6Wz{TR{(T$g^Vk+jlPyL&U=xnavRaf5$?J&5UufIT(-+QnMz7U ziaBs;LZGP)3rXFkW{(e)i=o;6){RUT@h2&9B{4%ecOFo%$KXTd17VFMV>l$_s4n`^vlt7 z@OA{zmmn{X*}F408MPMcq=B{1U(ZcHbl;zTXdytVNQ%SL5Rot0&jL-VOjcdGsjxc9}b+d!cIOkCzNg7uvD2 z29_e4oP#2mKh*t+_^$Lbx&_=3K7*FrE_FVwrKEZNpvjXUTsNEStk_C6Nib_4bmRxy z@WDp@2hZdO9r)mW#0L+=2hZSxZ?m&1G100S$@8!kuK8jtTtrv|qtEOF4Al5!rVxU! zwu8NJ70>QN>*+YyF^@X-P1^vq)!Amtx$szE&fg^T6>K8GZ!iXV5a$2`rKhTYAdbmX z6T~axxDB-r@cHU0Lx29g&!?lvT`q3OqvP5d-#0l?9##t4eBK|EjyLFR>&w;aNCmF1 zQE~5D_dT)Wx@daKe_f&oe}77S024Yn8=qhB{+rodEG&&NbJp#?b59Km!>Nr&*$}d4 z^HS6Wn=wFDxit%t)qI+3zn~*b?aBO7RB5Hm^ev%z-Fy`^FFpVEJx1*3yKI zF(gzda$tbISPaT`;--0}2RekkMbVWK{suZSmf&^TtkmvdLM6j;2Fj+*?cnnH$GC-7 zq&Thj!qad@pcz6@Bajhso^a8e&~`7`;pu*-keZ&SNKWhvYe00H^vSa~|I>&q(IWQ<(O+Oj)w;|XN?-m>nlX5?)% zBXwR2r#!r8kmcLmRO{%{j+%*GeT+6n=w~e`W_tE02nw%j6 zW71DmhrB067vyYkJtNEswzf89UKo55t6VtF9VS3E5@-bODJt8#609NyC33tqi z1cYQJM`?rp>sUxnFxY8we3KABl7n8c@KPTs?UNi~LGlWxxU6;CO#u}wwWJmlWViP^ z?F0JI>+pHFe0IBkc(J?h9Kp@z{Ns-ugpOBjUfqHlK+b!EkwuIML?Xv%EtF@J<_PU? z9+EpsBDZft*;Owe~kol;x*gWEbI zc9D(e@4@_#T3-GpCZtuTl5568V_78I+2XEmd%H)S15nuUeh!cRwAW#R5~k33WXRD#%_uN60dp4P&u3WZ4JZmFwNgwLSbl@hf8*J!4g^{rDWwxSVWaCcV|x4 zB+R)cH>qW`x5dw(tzX<l7K%-7aRmV=c(wJe{KL z&srLHP38pVqxRE0AXiNMR#LZT!R6{KouszLk4Kw9a$=!I@ViDlhk7tqSxFf4@U-Qk zykBo1%Ert|-f=O~BkZgw*6DuYryd$4(5I-}(On{uh8Zgg zpBiITuLWeb>21Pr*;bq~aSX$}AZEN}IHDY8u3?y{mHEZmh0PCiov_Dj-lFfY*BU+fI#|hVAjmAlTd~%7}$IRv&EZ3JyKfeu~ z7d`s8rd=bi9!R4CQ4>v~s$TeuR^cyz5!fXF1H)P`JgoJ?!&C}| zE-O74*cUH8XxZ;wtSe{~G~~6;i)Um7zg+dprvren3o(M4_RdSpU62Nln5=3D`9}q> zM#p3ZmSeK6+oBU4_*J@wD~9x&6|UeGsno|U-e5wpe@kGnQ`75;obzGJ3J|z`1+mZ% zv)G4CLryl6+F~siW>yWyydi2h;gi#i zfi75hL9FfTphG*JA!u*wD0FZg?n4-mzp8}oQoo#S*>c}03v!RQcL{jsK~4k^L;OV7 z$&BxSxWJBc8ZeSth-nfz7>vPP4Q3~2i8V91XMbwFanZ@0AzYAn2fT1-KXkZ!1ffX~ z1bNw~Tertvi5{<;e_yH3<5GP-sMP1o(`N02@u6+Ny$kCx_n)t%h#2<+^=mW z$bj%GG29{HF5ZBuqfnj*RdhpvygYU}0e{gJLP~L8ohtc)i~ixIp>#h&fk3jbFRi}uLHZ;6f8HYbaNTq&9_y$c@^EwgL2*U z)6?GNaOUr&WKO0S^@o0ust{fZ*%r^K-~f4r4p|>u2oyO@lV=E_V*$g&iI zyli>slLY!=WQ!MjZcu^YL^(105+^C&s_Pz=nXQh<#%vGUI@jv6$T@Mr1;@%d4;4$^ zC6Dya;RcWZdg`isf7tjtGP*^-J`yIw72!C2mR|SMlfij!NR%Fx1`+#Fsk% zB|l*Noo6`2E`rNAQ1d>(yWwgwn58C~g%M1Q5B#97cOEoB>o1yngtwkOdxp^!;x%@w z)qI9G{fqzUNZ4S+#>tld)o6f8A+o)u5s9+&EU+2?Neya$9|RB0iM7HyZl}~;r3*4T zF3~ea_OHrzo;*qZPXIu^CLU-_K-BpCXI^}colG8@`G(RlXVbE?K*vu<2T6EVw+))& zPSz2-?$BZx(nXPb_9^h7M|)?vw}@pqhy>hS94TIWNyR;{sOb5qxlVQmFure~_V2 zx?dODNEp`@jFRxJuw$q7XkjHcS^M$_stUA81^7m;0?}g4N^A<_V(s$rS}=!Q5B=3B_@r7&1!5`+NO52*pne zG3+s(6YY+TuNU{n{_1yDGA_m6$LOh?Q4-uW#O@LQwaSr zj??87O(oP4WT(;U3H|G`Y6`uLs_F`P6;NBq%WpHzvGl01&q}e=sAbg)BMNcjM0l{N)mQ1BFes;-RP^C%Z$4+G9{p3);qqO1`li;cW?=Fwd zDIu?07L4JFNG^dOdp{TtK{KfV&F4{5&^z#}O;T$#LU#LVll*Fv6d$@u4<{!SLDR`2 zVLn+S*@`xfk7>O?lf=ut_U^uEiU^t??pZZ88F3lC<%-4HbZ~w#OuO&Wn{E%X;HCXq zayqn&So%qg1f1KBopa@@6{MIIr2oJF{eS+~fBg0RZ)*Sc|NifP|7Q6={`0?o^ZdW) zyZ;~YOQ)YgIWRXlG71W3V`4FS3OO)0H!}(}F)%naGYWW|?7a(+9LaSU7!B@+7?Qgr zcllX<#6p9MnE`qRRn_&K#SDnWX9+GA3*tjs#zMpT&NR`}J=@)b!EhI(C|SNc$4Mt^ z&YHNNeUd1LeRtxSf*lB1aUqMcr8`S^Cz_&tXT_P}2}N|xaqA#%1VFBTkB3ub=KDVgOM^bb+GAg zjiO-_{)pE`&8gX`spH3$^S#laA8rJrPQQo0k8=Nm-}vb2YNW*dZnwYL>8&WeJ^)d? z;c#OuQbw!ZNZIOdDBb|R@zy%sjyF&?JEK*26)E3;>Xi%1a6Jk-aVPMSE@oCoqxFU3 z#}U8z{$S-eesMgwH9Q_{3(0(A%BLe`tv?)fw^;v5XVg->?r62Yv9hXk z2()1z@CdviAhj70Ji5_vs0^avXwU(&ZZRx7BY5`uMh9NZbA+uA`T>65kCoBD>kZ@n zU=7Li81kb*2s_zY!@-Qm?C2?BH1ay#bfi9xWTnH5grI05idkD6 zu$0|6U^wjvBH2Xlc7`K_hvU%gl1CDG8ueEqA{GS3a20hB4%?u!j+CYtUhHqS7_0^M zi2U!$)yrp3y)t*@>Z!|DXFweLAz(kNr2jiin8_vy!FE31_Uy$oO6mWEwjf7Y%TJxX zeC7PB7w68LzkK%e)$^Y^JG16}7DNkFLVqxuw48n(b;C5w`awiAOa|cUsh7CMtH9fC z)LI`zap(4I*7fxB@Lg&9Gq0Y$_R86dS1I9Ts87$$%}p1-uOJq_pP!%4zJKw;tEXR{ zyK?rE*Unx%eYV)kVK4|`I_)~W0C+TvVB|pUQ?*EBHV5yOQN+Hw5vF_Gn~4a<>thx3)jw$hqI9Ndg{XY zQ&(oZUa(3gOxf2*>07SN#nT^u^>TG1Xmcdr1}0E4y@nfcGQEU0hv@r5^nKR!%IQ-V zPF$`G0CYGs-gNyv>R&#>UtggG3Gm<@u$8GGwIl_bffY3?!RrIE+hizjN&pESWc%iklDjqZsHCs)@zghhS zVh>*x3E|p^wxn8qE`mo-9UPRE0;)uCh5i#U=m){Z`W9&Q&DDOFh*1|j3SMx+ez1XV z1@k8m63Tw37ovCAA0(m#<2@wa2e=UeQ!8lT&0c|uPMq`J(cJ`J2RiE!Pp1=rSD2zU zgYy7qN@`gVO=31VL}y!|C-deRKNKu5W6Wj;oFt$6<;*`yxN@F)z?n9QsBoh{kI@L> z17&E6;xOk;B`$yBdeL6zdA@1$%Bd1!1>WNSrah+WrujEli_$HVa89u{6PV2w1`pk6 z?)42AoN%@bST=y%Y%ozwAn(`i~kNA?&7aS!OK5W+my-nW z@x3ymF@_06UZKSYVXF1i0ue}CC%zhdQ^Zom@82-lm#jd9g4esuyf7!yk<11zq-=z zLnOZrCgFC6x_^72_)rv@htM4%JvPhdFhQdg_BZ^AR6VG-PkDn*e`Cl9Rft3tu>_Tb z0bpXwqP6wWmO@r95@84Zh*3;p5jle>Lh*!Vh1aM*`B`42AQezs0=bEjD17*)s7w{W zpxYS{m0p3vQn3Zht1t?4kJIM+XxwVqJ)Wb@7WuUs>siA0`?d+?gEUT3Ye5x9u-Rh2 zcL9lxYzm0}l+2xrWEp%Ke8LVc!1qB%-s(h~+$!SSAnM}MYcdVc91)K+Thv29F)kTq ztwhNgr}3)Q8hIlu29>`6SwN=0DzqVs8tJ2#&t`v<)d$YVFvD1aU#o~%s|2G~vbvhb zC<{Ya%$&w3)7Ph4xFpoVl^$wk*&~75qYcwLf=@u7G;D?=Fvh<9Q`0h?l z(>@la$s&KSN}?p<1Yo3{t}n1v6XR{A>3ku^nYDdfL8`)_+MjJC`;C)15$P^zLzWU$au-*wA&b<5p22ZYgV z=nKqxBWEVieq_sf3-F6NZ|F6MaX(51^+-EIA!-%DodghMdndZhATmFh!WF*1vsa^A zu2S%SysF?C&r@B>{zR{oH6^4>GThZzaIBgX4W6%)AXBMnId*4qb&6vY-HO9MsMdj> z=v5JYlc^9?PrM>a#R$RiTR_7R8lBW96J%_2HR_S=LUibQL4O03)LcO8WpyGL+A%%08<+G4hw8lW`cO0aPs`cGk|HL33|$VxBG`%(ARBc9il^UoH`>2 zHmUI8Carff!Zr926Oeq6sjT$}Q8F**tJqFPtA)eV;>0ACD&lsPdkY9|dJcVslZmge zFkNsIYM5O7|Iv7HAnLY699o>5;2@FB;C)M{GpZd5hh8+2i8c8@TO z-`K`yCLm;TdrzceLJP}8skGI&e#+^T^|Kr9)bt5o)|DoHLvsozHoqUikP z96#Y*&I`=-&iSee_rJ*|v_K9QW$=wkm6M>J_C_r{H16nk#_z1|m5uZmN&oXcv&RSs z6Y82MJmdyySNe=Nd0{`IVTae<^tOgc(k8lGY!g}OMVmzrHXiiX=sN^OHlh{fJWaA- zd8OoOwj12mmo`I}u^+%9Z*awv@Z`t*VHAq(JKX9bR|XSJtD!T4#j*M{kZU zY2o%WotR*D|>9QHHpB4`GkR6 z`Xia_`1j#TSQlTtS{2RZ;-QlHJ8tfdlPrF;xsfi6m^j8|lSnf6q)m!a!pj1wd^+13 zZVb2$5Pu_%v5X~g5AhjuK0~FqvF5|eeyjwm-oOiRwVH7Bax~f)z&H;;G_inVBfxT^ zmJ)+Jktea&>0&=KmK&ha8&9hIJ7LzXDd{g0Zp>3Bb!)B6V8~W|+)E&az zQ{gSI$CmvWXV?23T;*q^4sUkW%PE~j!Wb%R-r(ju&cxftj)@P!7vEUxaZf4Mb93nf z+U@dsf2bT=R5m-|Xmv(-b-nQ64T64(-!k%Y43eM^I>Y5)(2YgFEu{dNd|#vrG1GG| zC}ql`qUK&8Hb}5Yu`(xs5UGY2ca#W4k>ct@i<`SemhXEvnBv&n-{2g)!^G=!pClfq zlTo2na-#v+B%<<$0iDOhkjdVV2_IrpHO+>~^&40zIm`Zwyx3G0CO{Hcy{Rk$R~Q?6 zodDEQ5A0Vb*?pD6Ah;`ZFp=`Ik5;j zWPOH>AhsV~Utn*w8~Ert{WYiEfR{32%Ek-FmC01n2UxtQ7tRb@GJp$3Xqz|Y=jUfD z1%uFfKgxiqwxK9EWF>%1hWnDCF$$twkN_--l0YjU4aDZ3A_t}p4mUfaU=>@U6MS~+_@-~%Q4%NV{E+(Ny$F3Y zZ?JW8iU7Qr6*k4F2e|stK6BXSiNa;1)Aajg7^CIX#fD*KZ>fWKh+%Q@)#bC7FTZ-3 z=*mInEaF&DYI1HU!vsvj2Derj^+?HklCXuy9Af=ZI=x%qXL?wSg&pB*o~v;LT4Wh_ zzA0OVjQ7+`BzO^@6@K4IkvoU&a-&ICTJagdk>@*)(eS$PYk3u<Z>oGy~ukrWn;IPj)*WqRGhCcaUQa)7CO9W z7kI9fiFhJh#%KX+r&OxRvk# zEN+vYp^zMN;9=%{lSoz84GK@jwn7V1TbO>`G2aKbF@k?7J@y_{Ct`Sz$U6h=z(MtF+`y^0W9Eu=Jcg(6KN4|}KkrPje+XU2NzE8JM5oj13|BGpma?n>j&zg2 zxkKBQnd$jTHvqq((CT;rl_r={RWz8S?zb~s_nuP5d!3f}*H9L=oR*!DLyzMd#R3-BDa4%a4H3RyUi zj7Ng#a*ARqE9B#(ux*(rG#X&#hfE+?IPhUIa_7s)oi8JIe&5MWqscO2h2p33Ar=U` zE)hY5x141g396nUhGibh$-bX#F!-9Gu@X3b=De{-XtUkJT3DxCt(K$lNZ*(c=}Z%~ z&?_oowpb5L_8hrE3$q1290yvJLfM!+fhK7X)NCUyL%0cMS^Drhr z{isA_>6sX!<|2nYlushWfV7wZg(JH`ft*iKfdj5xP0;@#N&f(?(jgNo;3w$x&1ud{ z<0K~C@svzQ+F{BRj5>?h303tIAh)!)$Pr(O+rz1>&Nply7 zRPcm9L*gX9A#YC!&$*0iatIc#L}8j1Q88Rdr9`)bXnmAIA^*#=yh%|#n5=i-q%q6C_ubhtu&snvORa`DQlqWR#yzp?(Ipn~xu- zSs90B>KndUZr@Pq-@N%|e!F*!cTpGa!X$88_2FKh1n!OcaNn2&?w$H@4^IO3NPW0R zCxLsYKHN7afxA>6F4~v+fSdIJKR*fFkJX3!ndw;ySelu|#R-R!DO%4p72xMRgCj>U zLL5mp=(Dq4! z#3Z|(fFj#TO^XSk@l5w?Q$E$%)yeyKVT2tl$$Tfe0hp zZIo}0)!G`P`$|_U?KovTU)D-m&}Nun4pzOh)}g0RrCu*dyKC_uk%QssIQA4x)rH0J zsd3wLGu-nuKS?M7fcEMxPcxEWZo*_Uk$ z=Qo2(izAac#qugcqC{c@g!`PxwBr2nZt>Hn#_Y)-X_K2C>DgpCMhzJp_6SJ6irIV=&hiPgO zQ*;KyB#n!O8H^H&V_Lg9h+=fdnU1HGxE>7?@FI$h5xHyy1`uto%#|c}%(mEee{PcJlC4TM{i$v$ zPNB+O|AQqafy0t}%(BR{Cly+PZ3$Nxv)r`gOaJtew`~hZk3jUW+4;HkuEB-LcU2!UNEBDN@@=Qa0??aA-f#{GW;~3{3=NL`QmzF zi=CLfN^ap9KlFv9_3Ufrot#KG%M|5(4ju(k9Fa`m=)2-PWY1e7ezW<8B)yq=P{hk8 z(ttZC^h9>DX-fteReLg?Nwzz+>#3uVlo=3BBqJaIn!{Qsy*jCD?1ioP$m7|n`PN@Aa(tL6{)FRnz-Sto zaOz1i-~1@(uYn&-F5$x{_4N%e9d4F?rI0fnN&JfG!@ZE}v&DuqnY-B`c2%V$Ww~1w zbE!}}yVp|#3wrv%%F*h8)@u;fV(HbSXEZN+gsiBizN^m3)$ygu7XC zKtW)0%P)f5=H88$!Z|IIK&B)Jo60nA$#fOxH}8$IN7R%Q^+T@VLRHJsNpU_+Bo*RA z;NpU7DV`Uh0eZZVDaywK- z0^p%V(bcS1V4mh257U`aR44Vaedordd(#faCoqo>w2NTJ&48rRqg0N?vD-T-7VN;T zWOy%x)GN7y3=Cw+4P=!9n$O^^7YBY%iw>S~Q-h%uLUX60G$7CDbbw3oCia3#E4Qa4 z3hkcgxZE{uKy2}rwrb(2$_OqNDwhRge}06k-(z=xN2&B=N`qV7W($+tfiJUTe@&$d zrU*n7>U!f`PZ6?sjaPfw-+8T<{M~w>VqJF2Ezn%NB0(bI>zA^S7nY@{~8G zE7s@BihoLXdB)YIRIa7vL02yijsbrvzn#S{pdVGzTHB?aY~JK1O5K@JDk||9QTZO7 zBGWc~VV2ZppX+yn4xa4ET$EF%2T7tE%E8xiOvG znIxGcJyL?owM52J$S z#$c~PIa2jQ;FgDSb!Bl+1dYGme!Qd=t8L`@QDtcx#gvVzHQY3-KUd7n%TDghae`h_ zS6?kl6YuRR&0?n8!Gld-xQm7Kj<>2Jg7kcJ+Fd8vrlRyF8@WWAgdsN$Id_0H`O|V<*tZ6E@b%)8%oD@Z5<(S=u~HHS=k@N|%LVm#BQv zD}va@^Ligg*~e?ZVfOh^;B7FQNxx=$Qh*KaZ$qEtFt}`ABM~(rEPGgW;oL)}3kzyu zuasf3z435p!}O+=N-ZeQXQ?bHX<;@NNs0ndBPm%!b_Zmdj<{E95WQBsRtdW0~#F9v8Uld|Vy>m@{_}!pR$bEpNhIgEfDHp{DsCBZ7kM>C00KkVp z%WyZlR_YnPnzmZg$P>lKr1cPPe;l{&Ht`}9%-ZLdfM}gzS*BtF#@Zm`gnrRt(1`s59lxudA?P4YqEV+-fC)tg{v&x}><)DO?i7Iv9$#qs@;U zKKN(gRT$~9R(k4ST{|sYTauo?Cb7$VV3;$@Oz)zuWt-XAZj+nm2W+29&ZNuaRxpy( zFoK-$!&6}-cVi{f1F#;1q2w&eUYSY)@*yymI&4i2a%LS0#mF+2XA%>?{-<_1ttx}XOsm!YORi}RAi>@kFb=TA(O}o z<>vzu6?&PJ#3q!~){i$1j|RSK;7eG!UzVfBfw^f-7>hxMbVZ}$UW?KLbH^^|UaRPZ zjuh#MKT7;mnu_w`tFO@7A1?G`S+;v{@Nrpf==jq+@uZ6WTFoP2bKyuDN#zD)o<-iC zFRVVY`%~~3fwJ?G#CN#>95;kWP+F0sPR)}K0f!g(RBIv?FIQ`L+rC2TiPJ!%F?OHU*#kYf%Lo|(joHp zP;xO^-NTHFr0)ss1>%dR#Gg+N?c(WfDWHyNx%vZ*$?ZuQ_4}-T(cy-gO=^dL_g8q7x zUFi8dxqno_i@({Wo|%xp)=NM8fwBL~pke$5|0AP!NWn000soxu4^~>bs_F|$eW)Dt z3R@>hwXboT6Nv8g^V1V7T+uzLfK~2h7q#@fwZzZBKiREovdr~m{5D$w&sLw5Blt#o zJi5oOtryQI$DW7tXR-Kk2Enu#HZx89y2(yy;^|;T4;($|+U+fJ`r&8sY{0cnkCY#e zoRTGdLfEZnFvOh2j6i<3Cr2TJdW3+jHu}{og+g&+v2G)sKjl|*mF~-d7aG zo!hC{R<5Mf8`=cw5eoLc2e-UjWRige2zxfDgm4C)QHqZ#t@Jtln;+I|y_-F(aZC9( zFKqAB-1aD(!I545lp_Z|riNrA*DujeWb32+DhcM7;<=iFOG@vYCcXBy(jaA@E;%8m ziPb$OkKH#adPVyZfruv%)N=B6=i@y%@3!nt84~FfF5k#1C?}?8Kcri@qAWd4Ch=W> z>zR)_UfOeB{NzsT9{8{&sx8?J4x$Ve;U$!4Q3eD#*wU|s}dENC@udc=d%f(#=4K(ko;>zbP6Hanh zvUQ4gK<~%AtvUy)u7Tptr|c=Y1Gu>wkZj;5IKp)Qv=y_(y_8%$>Y50PAB{Qz$(v+E zl#+h%C>gFryhwM93ZNG%fWj`g!}qBUvT&_pR*!f6Yfo<>)HsTDmm*@6=WA9x9DcEv$OdH+<+b4JTVSG$`!J|r;amPNFO2lXvnep|eW|TVG{a}t~8 z%Tr6XNEvoiQ#$*d4Q! z=k@%IinWRK9BQJh_pkW8SD2)uk$g+K8F~&3*YO`_lyJMmqJ7#{jLxw zI_bs<)W)Eblcrv$n-eL1>P{w7;!4y03)p@KvG*-uwU*wF(m4#ahM&yvoN3!dL75gz zQMuBWq(~R{0;PG=!V-_LJf78H@HbUWw2R2c7|EW@KH7zccx7r#F~HHOgUZp&w_^Si zTajjIDhR(5J_HHLcEZOWE0+)Zu;3y) z3Is6f_sH5VsNl77?LOf~QE}+x>u<^3Y3DtsXit=5|463fHet*-*7rhDVBW31+AZ&4AoSDO@eL0 zDt0^#!w?#Voym0ynR`A!u_dfzt$gr3~hDa)%WIzy^lvE^(O{ z+FWjBPCqZQKN7mDG8%{?PW?QX!oeyUq9MoT@A8N()k1q8rq!v^ozP=Qv$1wxfLoD( zMdg7$X0lOnwm$PIs6wU6r+OJt(0&ECBHOh_UqZH;Sf03$%4u@aKF%RNtlS>~tz{ya zI<1mTWRNJIDMRXtBy>?BeZ}bebboy-)iOfhT@tWnEkMzNMELYHvymcfyQ4y4ZZf|K zzrS0{4{Fg;`oSrkwvlI&e_TN?j4LSe;yc+2_5a74@D*0B%(tn#(X=b4L=O?l+^%usYz zhS#YhqRx)@EoC!jlBrWMl-VL%bEN)qqF2PLS+FDp%|kaNL&7_4t9~_#XhMU^hVi5!$H!f3vE!!OH?m$ zGD*kid?v!nE-V>Rvaf3kH|FQ(XT{a&{d6(X)35P#E|AYmb5RnpiUo1>$l-(_y`*p_ zSr8j8q+Fp3Tk7=Ow2RAEr{Isjh<|wS$LH{m<@Bog7x16s;vM%NV|Ukcuom&rG5qJF z=}Osrda?cI)7$Oob@ns(&n*6Poh_+xph#^7{JQ>9{{}{zx9H7hB*q4>5wAT)MKJ95 z$k~Y9{z@m9pIFV-U0Ql!l550|*I%+aISJee7Vkc`Pxs0%P6GE>eYhW;1a7N7-1$l1 z9;y%b^OL|mS|2V=D`3$)qaoIW&R@fYgf8cVZnmLS`0T2z^^> zQjck~6E@IiMMU?(ZAKqRU~Q8x{C|n9R;5fQf8eN*(mKpLt4sNb6N)jb98>Bx0owBw z*1Stf5NVMkqX%oaVnbi@8=-VYHb%p>;%8EAmHMaX@ep$Mo zhc{o6$sCMQnkd5AD3q<6mWQEqSjZuM1Z1*mNS+^2Z=Y7lZEm-n2S!thS~*eaRtbwV zC;=Eer)N!)^Sr5^ICzu`E{;NUkq*|l-I&79O}rv`+}f9TKvTH_t#blZX;ww$u~fzE ziRm}V-o^CN?u)Rwv!{8gxLy4H3&42Q9jx}($mx@5$E+Ycd4XFV0j9o^TZu>Y*GwjG zq32TPDp`I{(OQc}tNk$DDig+G5-;l*^RiOFi^?%AH+{KxbJ|o^(3amn2Ewh8b zl0aygK^=Pr5+7W!2IuYcrpJS*JmO($q0&KBaYZ^q=w5ZO|BM74j0{}=`UTX-}iGPc|xjA zi`+ZgRw6VAnm2YiaZ4DUEX~mUVY-ZwSvt;b&B@gRQtsn6L%<-xBl){scgR{JB>zoH=_&Xgh9!Q7$`d(M(u}RFpHk6N1o6-L1qAkuO_{!dFmW(8$b^5%pXqaLGnlWUj{VYO`fWiSe@v~+2xaum&8=t+ZFR%3dwE>iPpA9b;s zpoN~anB~$gYSx|{OEN@uYZ?TJt+ox^(RW3ut1gNYOzPQJ&t=EV*ADz19ARuxcQ}H1 zu{NG2rUB5r<<2l1&gbLjA*z%FLK^%|Qd)#8W9qE-O$*c0HNH)R6~Csg7F!yiS@ta3 zhIO6j%Hk>sG^cxxg{uwn`%c{6-!2HsP-F>*gU-t8s06>nVc@zuG+}?u%I@gxPQ~u- zufNw`n@(;)spT3SOTFXc{B8Ga$V9JbPg2mTu9zqv^xXRV!NQ!#ZdBMa_EoV%$gIK| z|1e5UPFtY&MjsT+Y?QR)D+!RU&CV!Ttuv?CCZh+mOsmrilzrl)QD?btyz+0RU%Rc^ z)BJ~i^@on|;fQ4DkE%a+h0lA{AD$9EyjA_-i^7L-^@pd04+qsBo)JEbDnHc3u9eCU zbyfJVS@B_0_zE;n1-xnTyVt6|drkQ6;`9RE7jp6J1!d;&ZO5FgK=!mgUG>T_1>O z;^Et;)X8C;5_xig!n$w;k<(S(scLt240>vHZ=#r9qP<;8dUN-; z`(&g16NCHYTKOjqc^F2qx6vK3FDCL`@MpE_QsKPN+X3?WilqRRY3!PIn)h-rRvY*o zh*}0)X;(mdYFcTbEM*neFl#-6`q|- znZ38XE}3+l9`p@Nzt-!J`hiT0xw(J8Y?p91b&`bkV*y}d z^)U)&X~~*RK$U;$B%dBpZ@16Qj_p@qeJQlFS;v}Qqvs4uvHRWNIu@~W9AeG{hyfLK zG20tjve|Shyyf)*A?tj8LKRj}{Y)P3aQ=58@FB~%EVL+zd9$FfWQX<+3t;beU3UC7 ztu#$5U6SL1>4`E6vj8-UE~j!iJT*Zz%OT|!7s?hE_G4#g>foelg`j?SaZ%ued5fY8 zqNJyu#979s%@@aY-UXz%pp8|d*SwU**)y@%GFoTyt<&A!xIKEJrK`V zY+{c7oa)SJ?Pm3r&P%Bv);^PkeLev-*#^vRcPROZJ*MQ3+o1$ZWz~HdXSt++^hlwI zWaZ>E3SD=p&naahCKaY%`9Mi$=fuaxEF>pM*A;`4^^sxR=?i>7 zDaeDEzfW@H^Yv_*lUw5D0`BO3@(~la(p%vb*Y%4<0OkH~JrB6j2QI7#)%1hY)w;0@ zO6A^g?LO{Qg-R7ZaXqj2U`de1#h7D)f)cN}P9%9pl)L1>1Tj)CKk1RXNjm2=?f=pd zt%P8!MM;L@%zmwgNHQA#T(9|vs~(7-n2$=VnCEW{3mLd&Dk#ew5R-7T>a599aQD{E z*U7&n^xo?9yBI}s6w7w^9<7@_S~n|a^4^w4Q6}drJVcenIeRQV96Kv>%JI9TH0RQV zQ|B)hS5S(lmcs1ot6AdlD+a-jeAH!dIA{^Y{pr*p?5!EU1Vy8GPr>2JO5?&Z6md-u2xwlCj(_3jJ5 z`r=ciAARE!AKKpetzVV^Sl<3;-}rRJHy_yk>VNq3-7Ej}r{7xk!Ol01G`?^9=l|sG z1j=K-{^Z>+eDl!zs=oZt&W&dq&u(x3jJo~RFMW9Xzx&hP5$5?6)yxrIk8S_#PkiL= zFa6PtCqGpFF;zuK(cR5I`}Jo_`+xm?jSp>q{b!%t`PwnS;mjYY_kQZxhJD~r@mnF@ zcw=hkcb;y%zj0^h8_zYK-FfDHjsJ6|2F5q}mfo?({LzX=g~%dn_AAF4{hfdJ{zeZc z(eJ*!imM;E_r{UNUwg~LOUOMSj*lRAi(MAUbFLkH$O66r@G{hbl% zfB24n{2L(Bx6G$C1&c#B0 zw!5#N|0@UHNuOmKXCSs8y!+~fU%r-n{cnHiFcH;%@XE7yzxdM!8rk#a_HX^nm)Xyq z$6Af~?QeeRZzQjO?q~nwcr?>y~=Z&iQMfZS{9**Aq(%pZ0AZs2!!M$3&_u02( zuMXX9{^E~tWFFoA(%q--KJ`B|4^-m+_qf*E@A%r=w|^8!8vTK@{cFE+YWr{g^6S}` z+Vwna$N7*!Jpnv@sYkv3IudhDNlk$$QeewX`-Iu@q zzm8E>OWCJ0+pTZZ!~hxejv8w0e-;?{mcR1&-O>O4#m6gE+uIJ7^g`9#HxqW<{n3B< z?Bk+bzw_t+)eUa+4&VLnfA7V&@V`%g>zPKWAUwZ)^8eoArSR_4e{jCRiQx9duRM46 ztN-SY8a#&&{y#f!sZ_cgqY&cp?VtP84`l$KCkl(H;NRqt-2RvU{&NB*KmRB1JHTPG zb3kppU)0v4!d$lRee^(M_ATo1<0%sPm8j##^Q$DskKeiXiN_l|NpJVw`PRmpPb5G7 z(Nm2(5C_K8t-lVvr_f_d_wTwINJD$daC@nJH=%qP9LTAu@BHzR#+OQ{`>}gJJk$8m#{ScI z4`}>aBmC;yfB)CUo3X-b$%mg+Z-5!Ah%UCDwBP$s8>b(9>h2F+|FLtAEYu?l^~gef zH(98}jC|lgqx}|+ckunammhEZ0Wg+A+Bl1h{{)4)~ zn;UQ0{=+|d|J}#_n|C%oiI$zBbt@VSJN@2rdKJX{n)liMfSiE?{~h;Tr$@iT|K2_I z-~O$}D;Ze4Ya;tJy`3+;z_#qG^+80hyQP0@zyIfc=R0g5?;bdqCdqDp^{3yX19O)U%#_Nqd(+^ z_1kaR9^HB32sz^E6L@nZW*DT`6~)gSPZU4^yc*vn6?e&7y{$M^Snj8wt&g_$J z#~Wr}Y@hhYzh7;{Z#3+5X5qbq1qsVu8~e9_C0t6SD8i4umWb!Lp{?|Kg9|hca{b9sll!cn&`DNQg)B%7Ml415_-F z5SYC4tq(So=PJkI-jNSA?l!&$oSyeIUK+!vYVj-POYB^pYy5EdA3Zgp2ldxqFrMbt zmi>+RI`OEUQSi_8{%`?vkT=QQt`GfsG4rl=TIU+-1M!%4zIv|lN#f+}Joi%Ll}EnG zL+hLD95~-Nf}Y3D-1&wh^CEWs^7)4S$R+shatU^NFE_sM$SzCl^3Kz*G!}Q_i;X9C zzWqV4fWP{3WBQ))p~laCZU;sWjv=f$!FYt%s+Hjd+AKY2+&^^wudjP4E?-T!juTBC7d=N%tz z{Kof~^^L#$%(@rc^j0EerH>)&)D+m1{$QlcOdV_vqPQCcqbB^hLC*kdPR&kDjkeY! z1&q#x&Tyn$zrntm{}e{VQ}mRBnQrpIta2gh&CFu?1T7?ZgB>PMj|iDn?i5>G+4RPy!n?q zV8$_5i~RP}-{d9R$ZvUVNb!UqQsvUa$>E2=wB`Eye2-0)biQx_xgn;~~xP z+|NDtXNjJ{&!H!L%Wi@5V!W!xkA-SGcz6PyO{Hfh0Ezh3P4O!{t;=WSF3H2*#u^zg z4{(@G4&$KB6MC})G}=4a2?jg#zP zu?_%2@$@LGlb`-z7T&Ql#t_i~3L%V*PyQg(Vo`smw~?G6;dK!tn>{dK7ori2>wSL7z?@dWLe<9wGeO8nOEvJdc34-e*s-=TN?(FZ+vK(4;93|1}a zb?_>z7x2FVA2Kx0kPBG>2@lZ350it}JgimndPg;tTmc9$*;jMZ^z_o?f)=0k;d9I_ z>jMb%NgsaNhmU>uLLc-iz7J$ZkBDJUWE>V@`91Ed4*9AheuY^19Z^_wJkN@d5*DR| zuv1`?`NT9Hsm~+7>Ea=>;TB)KM-Q+(PEKHf=Hv*;)d+7wDEkC!9ee!|J69&1ySEfU zAp}w9w%eQxa*#1E+&p{0~R?rCGwywl4g%jD?JEtoNB)_=e0s zTE!*wMv&*BoTIHcIJfAtnQ{QvIy}Dk%MpL_7~^lgvui|*#NX?qK`9aVu8N8mfw>D* zu5OVZGh$(~mbBvKN^KR&+TamQvZI2;)MP40iBxzfjq^lS=+Oqs8gA?LB8;ECL8rT= ztl~vA=}po%VW^qF@Txa2GKtk>BI514hq2sz}h$)&?fq=Nuqe?M3m@tAB74CtQ~ z^1&K_r@({+H9Y&9$icb?dT^$R=iPeQ!M1m%!nc0;nS1ZN(fIN~?yqDt7qs7V_wyi zs{^k$>|kB1*FApx?8WBN)QQ#6T6gKhD!8vpC)T2or>u@f>vPfT8=YH=&C~SQrn#%& z2R4&KoEDpSmd$Z&_yX2m52MlIwX5gm90WJ&jJnYh`j-oIV}xuMFNfa9TOKN4gg1hb zayg2l0iIre;yC?&>O{BGyQ!=K^8mW%59fp7unD~EE;h+F%WyS{Mok6%QPw?vAhrwp zx3^ZJUhSsGDbapE+=5?+=H`@_qFyxc@KhRqOF2WqDcZa_?W=Hgm2FyE1OFvh9C+{uXvr_ zk)A(Xf8i4N>L-qqhbNAE@c+=T48~eN+yF8~DD+u%^8`nBlVvjl=k-7okqH98GcbS@ zEjor9gK^L^XmKZx+PO{@VkeGME}b|IOxy)C_ZV|fojAV33TWpriJ}%E$$vO%*i<5N zxT-DHm?{1MJ{_)kU4VQYkYs?OZj<4=GU#utFS8YNq!*~KmPps->M3rPP;dfax z%9FKd?ffVLTN;Bt>Gd}U-Z~P$0`SOzicR$P$WNjT#tf404LboDqr)q)W0`j3XtC-$ zzG{Y=r#hOdYH?r%@FZ+f=|D}pJVFL4N2vf(L<{I$7E$s0qfvjY92+{41UwsSI@rrp z<_`yk?|N-h4?`!8ZNv6s&uV+7;k5P8b}e8c%@?B5pR%pMw=fz8glkI`nBxZ&ZxAs& zQJrKV!30W0NsbCZ0>^Z(#t*FegJZNAX|}04ZO00uz}2j_Z+M;=#J<_q^azmwL$TL< z?%`SQoiN8}87h0uXc@=IeWuHa9_Fq%MNA&l5V^4vI<{__ejK#jFt%LPaw2%-TdE$p zadQcA+Mk)Akb_0|QIca*HcH2dGDVX!KpylUPFQSaN}4o5jYuAV7jy=Y8Fbdsa1hlv zRYU(1*zhgUsNh7=BRstfM#g+fT$ABZbA}7X3WnK7vrw>B3kwNw!Y?Uoi1=3kqh`U+ zgC05{NX^32^+A8sZ>F9DHB;GZq$z!i?+4ir{23O$-7j--RM{WZU&(V~qcT!a{-(HJ zDI+p*Ec!>lm9QT)aR#lU*kv|>JeU$ZE8-_qN>wd&R#&Qs8cu~u0{S5kDqM@-AA?lI zoc$U7)KX12{5ADt-Qh<)%tl`d`5_qn`!cM%k{da{E4aF!N`sltD$xOhh2Ms}siH^q zW!6sF^oGhxx;zjM`fK!b-#(sKg}W0N=q`}RltqyR-Vw^3RgT;9tJGg0tr%Xb17+Cx z9Eh%l;}?blTn!`(8Fckxj`%VQ^a%GCFf1jZT()!p$Y0s$DW^78l(wqq`hux1XojMz zs!OQCjun54`X5=ahRZ$+$B%DrZq6qQDgD99aejef>O^O4MHvo)Y^`Ozw*rFR9i>m2 ziKDmH3BxYvz$|hjQ;jXBBoQb)q9h^%*h&mpSz4M3fA7f8hdaL$H-74^$nhkK~!0ZffHvY}QB{sxw?0low_|VQL zyN!20!`w6e-<`&0L(#Ce+>{}YgvhMW%t_HnCW_aNT~E`%y84mf1$yL#o@P6iW?R1J zJ8pA{R3PmP*Bh6%?Vov<4nG6Y2Q2c<`DljwA%IqBFFTCwiTPeSWk_0N7D@$958=s;2E*5+s!42StvR1M>RPy42l&; zegMc@acD*!7|^&4Fhd<|sEOn_PYH3*ot@w9H?Ee*iW@;|5Dd!=fJ2_;`I@ilfo22% z*fp9 zh!H_nKvWzP31GzW#=Pj6T4rFlkr7*30NPrQttg10X`}@K1bB|U^U+b`(B;gGEiBNZ zJuwlq6Ldz*4V8fr-B1VzDtIG>vm|zpyty!Uen`fUv#jt z3#J=Jz$rro(`UMIsK$odwry8;y*Tg!jd0--&jmcjG{*xOka8ZJEUJDPoF%?j!?!4>u#_121IcLma-`RM*;VLqBiO7jlm@P~|q^-X&YWyXl)!tX(M*QTkF>`(w zP8dO$A1vv~4W{U)qIlS0E5|Jd*d$yt7BC zl(|<$Dp94gc`j?aODg3qUx7;W0ST3PACOWh^|T7&O1!m1TxG41&UYmajxs+#uiSyq zm{49Kq*Cv(Kpk}_k-n!ycal;k^}vw2Gd#e8qsJ(fLP|$;7j7vI_O)Gjr3H2r-Be`F zy9#b9<&Mnb8?UOQty7L1t?$b1llFS1#CKynkhp^5beXj6ZaJ{0>h1f+yRZoxBz_^X z;gq0P1P3(bhy=_SeQ>!zwA>3WYCF*_M*81d?iN$JrOpS^y;$^Zx#d+Uh(rp0;NmV^ zsB*z3{io8MEi)0Cq}~kD^g>Qlc#5O|Qi?9@!YwNk)Qp~IN_;gW>jU?uZ#Q-t;jjM8 zfp7l8<7BbzNnD*CMFYClmi!`1ZO^bDY?htHUpr6SY`k!oz2Fwx*ptkiyEnYqczfgN zjouIfwJ0RFb|^>bibv8sotM658ZZMj)o+70jxM@m5OTMS)ga4T0+l#(R|VQ_c8|MQJ!>8i-SjW4Jy%~RWv?FVh!(xbqMf+n3?1vBpA)u&+TI@Nl<(ZCQnvNTx!SQw7vnivWt3);9<^vNAC-7Vw zLf}AkLOXQLwgKZ5gqH2by6*>0^$KPlL-1qTaipn+9XWmwd9EKqKn*UK(T+VeME;TL z3=&eGWaS?HjnVqXD9I}0(2@Y7bNbx*3uoC}Dh#I&%_9d$F~Q^49I$Dl$Nb%F51mxAC9bg+U9P*ibXtamQG$XDP{si_ zkArP#rsta)V5+ylrh!~JM%-3i4Q7U8>dhrK6lKr@)fASHvGAyp8KFxJ(` z(L(T!RNt}ew(hodFOF5qvqC+xnoC`8NJr&W{0q1JFjJ-mRx;2;ZcFWBL3kp^1?AQb zR6jNX*RjI@D2?JM!g;Sp?Y!``OVE+Qs79wCO}?*!g0wx;$Lx^EaAMFrfop1d6xwdv zsx3`2K-D-Eq$>(tP`9z6gN87|ICk{dwIGxTBHL1Z)7!mt$skuFS(G+4Fu?K)~f17MQ7agxhaXY$iHE>ZOiVYyx2z{gNx3$Q2HGr+v*y5Cd*n27p!ma6+r@3C# z1~#ge0d9t2JFf1v4Fi;JtY*T!^H<+!d{~iv{{T?-z{l_{;2R8l5a}?#ebHZ3LC6*y#?w%YbIGqS-<`>ttf9*`YJzT-IH>iOBAp5`=G z6^b%wbxZ%D^MYSRe;`G>8Lq|2h1qHL#T*C4d>doO_QY0ntc7WO z-7t2Yw$nCk)9~#YI!6W~k3&JYEX#5|7uOsd-LMVNRHhr)5HXnGmq7%O*BG+zr5&0O zK>2|mhbq`3%ZLo!Xal0A>$bs+YFci-E3)s2DD2FBzTxbAv)i~>V6tm?aTvO`siLs! zt`GkURo5^r&uF_^m}BxY$8%e{vi7qT%@-l8f)tq0fvqf1M`B=x4bZRxQvq% z-0UsvEX%;i&~QKzfxjO*ni1-rXGRc$#CGUu5OjrY!^_xyg4-o1pdka3d8=wc(qi3l zbUy^e6M>b9KvDzK2fs3mV#jW~JKkF32imj-S?E*RFuyKxvfy8VyVDK=P#lJBT5VN@ z$XE+()3d?AM827nhAelZ-pXhd+3@K${af^=Byh^M&NWSU11kn2YX)H(JObNyJWv_v zQya0`CQET2PYvb50!cSy%W$&B<(tLD_)P|8iF8VW$Yv0Q55T;Wf%d(cp8M3ZO78vE+~C+ZZ4538<$?`Z!!Fl0Fe)F8)jtyBLk5NxZvP_ zJ76~=C-5OS06*MI(BKC5(o%+vQZmjmkeQShSBqTV(n2$GBh~Z_+t*P<+lKD>;MZ!7 z1L}sH7@RSM{uVt+2@p9`Lh$k17HBHNw|v_MtWDDlz~l$WUX*y+ZGkE5VB->|$Uu%+ zKhRa(u%f`WV0<0Zh+_Z*5(z;#X!Fp4n2XGMf`v;DEG^LkGAISE6b1)Wl^&Y57lOBo z0)~rm;O^?+utkCCUK7O@dK+t@jmVBGUs7s#tgW? zhHJ&9@53zeA>Qs_u9)1{om{S)Y%571l~aEvPrVe(QV|2f z2KzKz+@Wn0V%RpcZXiT!_Km% zttI>c|5r6#TX$R=bWaR%k)_*FtOjvAunnCmkxK>15&0qmQjvjH@aJS;mW0j;KR#B2 zAIahC{Q(v%gb7bFB@=y&K441`?bx#n72Gi`(!4k_eO%yn9M1~CWUH3R0z=y4GHJT= z&3@xA7OYedYLU|pbzRjULiTh6LJv^xK@2{g4s!t`g)QdJxNMc3JjrdHjE6$3)XvFX zjrIH_yyf7Lxm(C6bAnU{%1yw*wYp~Vp8jh0-6ACk++L0c`8Ymn~ zbzwX;2=?2_k_Wb5#v?<@hLZcnVni1&`!$2^rdNxF$2!Wb8iVOl1 zlZGWQh#b8gT!Z0g{7ScKTTyHWj_F03YJ0lgZigXg3k#-+qk_^{AN2ihv_`ODtO>Kq zUNIb#07Im{kMMrBiua!$bm+!ExVyYd#zjbM&hx-NG{{08bwwepO{Cde(-!1$8i?winNHYP- zk`}((aszZBH=v09ovJFDea#t%Da~#HJND zmnaSdsmoVJpkBN|sLTu*2M468b+!^y8T`pgvA)o4d}hb{eB;HMfpJ{W7xjoY6fr@hF^CfxUnK53S&R8z1V~h zqy8MjeJNFqK$tAcH~k2P4>(|gYP2;sb~MqZZT1H@acY&IBm=Y;nRxq>Ndj64?U$oj zs;TL*p_#U68wws6wqr+z9_yZAf&id* z=S+a;157#rklR@d_=Qxw{_(7(k_z-l3fgcB9+h`jOGRIU+ z-G<&^EZyn~&SEebMKO*%*jPXEp(!Xa+faQw)qm5F~)oh4*KU z>zb{)t_AuSg0;45`(|YM0Y;EE^504#Ms_bKi5C|N-1Rg7?Z%#^8%_wl8z8oh0dfsf z-Z3#=OxlzELV5|Qk~|bQ4J5F#5bbDXc$_9@^D$a}Wh{Ug87zAkm=Q>s4z3nR14xDe z+yK$G3(M<)*X#E>f!9qA$dLf3xx6j~vy^sB9GO|Rg223%&M;X9OFv7N1b4o@*7(w5 zVRf=?8fNUcy5WO*487R#!3YJeYKEXQ0$hcQhNERX8KXyM#QDr+rcdb^B6uoc&Tp2% z9!EC+$+p_I?&*fsj%^JzbldV{8&tIeZi^YRYNt1r^*J_sYIq+6JT1HP;8hN{^HZz*&vO$$sgC^QeO z(#zaa>h3#5(19=})MN0G98U$;!*v5!k3-DH@~vRp5f1xK%7m$d3WVbZM9moTDIZpzScHrQqhR5(w`vmfeMX2 z6pgzC(%xoZmaY$D6c`$@ZpSf%aF%8TnrUDWBluFf5k-s`y5o?zfmz8Eyb`zR$Acq& z>qIA>jLGx6^7+OG$|v!jrF7b0=^~IZ6Q+p+LgSbkm_j!UG|dG2ZjC>}qz>-;p780| zCV1qY-gZg;1O$*^&V5Y--?7csTD{7b!Wa+-Any6&02>wtVBt#8$7-z4(>S>!A(CkJ&#H}vGgSu_1o@;;hcV1+Hik1fZFaRWui zLzWD!QkDvyXxIja#MMl<9R$9OlSwrk2V!<3)+{}6=t<6rFnv6=V|?7u1rh6tHcbY0 z@Cb2yqY^G=H)peI2 zD-0yW%v!92$T*&<*^wRws_tS=hYPN%>69LLwR7$V8;2EH(=1Res8hG?;b{$qXNH!J zSrL{E{Dx2xMhTN!k|{vt=j+|)=5ou)lOvNV>z)A`kK3Qc+_aV z$_2!Oet)z~?t{3U90DQ%5tT>9h0Q-Hm?ge%5*mM$rYZ|ZTH!|u`zTAJ%2DltZxWi| za=V%lgI)1sH8!otv;)sJG>cGuMaVY+3)%~!9OV))6_meN6nqJorF{Q{`VX^2Z6$eI zBs-sX=z$|>hfe4@5Fj|AYsRtW_~5X+;EBX^`QtL5g6gfWcX}&1vSnZ@PH`*9zYNS$ zu6siDhZ3sUODWMopoVywPzXBR2(-3if`QN>bk!jwu{FPtf|}i4oTFO?sb&hQ6wFc) z176%ccE57U0r)QC0$C+2xU&#ExVmdvsuM%(Z{bFQ76srwLHF$lv(l4%-%Dv=qoFk-HkQ6r~g8N0evQ#8wsG&3Jgn) zLN$o-bU+Qs>o^| zIo{b*vTrM8-%#x^av%-|=Lr3M-88&5?omd#3}xtrMR98D$URYna2bG_i{er+OKHc1 z?h9k+?g`#!_Ht%gnQkf5bNJ6m{AXc$wmOg2j2y$j=tI>lUB_i16$ILH0uAP*sTD+` zzaI6L!B5LF4kZxkW*o}EEM+|t*0j!(3nZi4^sL6*S&n!W-|HLTB4x>k^SexG*t`0z zwrcsN0nxe|C3-FLN1N>tT{B;*X!BA5J zw;j2DXp?|oraZ{2Ky_d0v5uEH)rIXLh&r5hh`DtU?vO{C83F49-E6lt#|eUzDQRlo ziBt3#davhow}zcuWG4Z4KRGn}Q(p$nqbSlr@MaSN0tHMpKpR>K#=Q(Fu65# zmxmcWh&ndQ&~)&v4G%Pg=Ho7$2EK#=g5s#Q8@4MW*1|@4+jk8c+>xN&wnI&Cdoid9 z6J~O(K_u)MEMjFd>lFvkDxFm_ID49zwl}qSzNTSX2gtXoL(u7Jjupf~5C$Rm^ggYC zn|%21uVBxuF4(hl8`Cf?n3b516X02juJ7VvPg{$lUFh@&TUR$f8FCLt+1rFjKQu*Y z6XN|)6^u=Y`@>VzHD9@f{1@)G+Kaz>Pwt!TO%)ip%Qf(IA0V@D-h+u#alFeN-A_MF%Z0@Vm15(a!It(gaRg^ok1t&xGNQ8RO9V{KiU zkEMbi9@^kB$9@DD}hmVsfnFmql7`uk=w%tI(vNX_CF2v4lD*|gD`7rJ14&h{I?@>Xd*>){2 zioit%=h}xbDU4yZIe?h$T7dB`FndsSi=`oEaTC!1OK0nNpQGkO1Z%f_4?--|}i2H*zx_Se;r5|+2MPQqq(JDb{=ik2B_@E*Knyob!_K{SGjzEK}fo*%> z*~d1xw$R)KWf0QsR9seCW^r$aok~TPny`$GT{2>3m7J^&&^Ym)a!0+G%mlZP_Ijf z`-rSi75CegIG94!X+og{#^*zE zWZ2LZXN7yd&?__DV@@DyYsS0t56w*($-_{z$i$gyq>r~Dy=WZIr#2keK93adK!3M zB(b=bktc0SbPQG?v*9bqq`dq%PZKFeMvC56x7;hK*)nol9QhTog>%dMfwg&D?=%b(o*NK zZi%$@B&Oj09223Oo6;sdS3e(n@j67>xYFa=S5+cCm%mz-NSjttwEqf4dXoQmg(7WU zN!oWpt;p^J7^hZbZ7T`=PAC^?Z8uVSg6kox8BYQ}8H6zk=0cugdChvBVy=cA={}g& zu(Oer)qf*>3&Jd*RpiNN%G!(TJJy5+@cin|Ckn$at%EO4VOAH9tav(C7f=0EX-ze` zZI0LAS^0KyuB8kF@Z@j3lBY&qC|}O*O;(;JhA(-){_Jl@_P0X(I2tfRiDn)x6|R4 zm4TP6PK=TTCRtl?z|Y_Rfb)8@pcmxz@ukcmym?P)y*wR%>19FVbf&a%dhu{|{qw$P z!MAZG$IL5`-8fXO3#CnKQn`oP?Y-qC_l#88y+!%J1*_i^T4il((puaAkXGa8X(iS9 zNbLJ6s`HUr{UfsbkMhJ~p?p$HC2PA|V&#SV1ucz*{DjzwLVo7B%PQvc+M1T(CqBEZ z^(5L_egr^4c7zq0h4(!{y4{uIoH&a!s8EI3Vh<*2z{^D(oguxuqi>>y8Ea`*uf_`xxUAFw;uWfz5w zn?};csXoM#esy0qWS%)NWY@<_FB_|#O46n!gzVvrdOCNO0t?z@x0Y2;C~4C=^z43K zJ)Jvyfr*;zyaS}?V}gz2Pfke7*CkNK%&tp$66L2i6z#5Xngddcr#ZZT=NrSuaYcHt zLf+g8OJvg4xQtY=tMaoT$~6R?Kws}Z$JDp%9ESW7QFhKlqQzwp%2&ap2TBw+)w2U8 zkc4*^51617Nh`k#>+#vORnoRdOTmqk7p#}9RS_!Q&KIyV*FaV^o);!sd7gL&veu=- zBrkc-Q@~2#k%p(l5_m?1tN=GpMUtgXsgSiU*={Wy(jfyP61B57Y{XB{>M@q(D7!!r zNjO;`fmQbe1biozK*OmHovmZRo*84jts;Y zja*ppmzVxlP?;w1J)J8BrgTbgY|M)x&GAbT8)U6Z#IP{8b;9Ww%LW zC%Nr0FO)(lZyMl9fXIYWUO`+=6EBqSDpVBz|Lna9oE63KIL>3eKoAu{B?{xBa>(w^ zee80$>;Wj3fLCH9Ju^M9vX}dIITX}rzG}P;iO*OC@kH=8@xc3t5>LD@yixH; z!oR9#=DnGDNAC)JlmGAY_2WL?F{vU zq~ko@6miIOcBPK&n@i{omm23P%H)j2l7zF1jRS-?WBlCYf+Q`@o3U7~a;SlGQi7A` zreUUWRt@L0FCj_t4np~P&INV5K#a`ZIgVUI!Thh zi!lWwniU-?NSq5nlM5`yiQLu+PRx^s{50u2Z7Iis{bOmMNNN!}}|JabzkIa@

e&B*s0$l2R8)!6aVaL*ILhEiM)v7i-BX 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%0AY-D$pgP*LjSXtN3nEb+Xl>h${(M|95V6xQnX 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 G6HZ0A5^6dC literal 0 HcmV?d00001 diff --git a/vendor/launchpad.net/goyaml/.bzrignore b/vendor/launchpad.net/goyaml/.bzrignore new file mode 100644 index 0000000..52c98ab --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzrignore @@ -0,0 +1,14 @@ +[568].out +_* +*.cgo*.* + +yaml-*/stamp-h1 +yaml-*/Makefile +yaml-*/*/Makefile +yaml-*/libtool +yaml-*/config* +yaml-*/*/*.lo +yaml-*/*/*.la +yaml-*/*/.libs +yaml-*/*/.deps +yaml-*/tests/* diff --git a/vendor/launchpad.net/goyaml/.lbox b/vendor/launchpad.net/goyaml/.lbox new file mode 100644 index 0000000..90ebc09 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.lbox @@ -0,0 +1 @@ +propose -cr -for=lp:goyaml diff --git a/vendor/launchpad.net/goyaml/.lbox.check b/vendor/launchpad.net/goyaml/.lbox.check new file mode 100755 index 0000000..b4211c2 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.lbox.check @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e + +BADFMT=`find * -name '*.go' | xargs gofmt -l` +if [ -n "$BADFMT" ]; then + BADFMT=`echo "$BADFMT" | sed "s/^/ /"` + echo -e "gofmt is sad:\n\n$BADFMT" + exit 1 +fi + +VERSION=`go version | awk '{print $3}'` +if [ $VERSION == 'devel' ]; then + go tool vet \ + -methods \ + -printf \ + -rangeloops \ + -printfuncs 'ErrorContextf:1,notFoundf:0,badReqErrorf:0,Commitf:0,Snapshotf:0,Debugf:0' \ + . +fi diff --git a/vendor/launchpad.net/goyaml/LICENSE b/vendor/launchpad.net/goyaml/LICENSE new file mode 100644 index 0000000..53320c3 --- /dev/null +++ b/vendor/launchpad.net/goyaml/LICENSE @@ -0,0 +1,185 @@ +This software is licensed under the LGPLv3, included below. + +As a special exception to the GNU Lesser General Public License version 3 +("LGPL3"), the copyright holders of this Library give you permission to +convey to a third party a Combined Work that links statically or dynamically +to this Library without providing any Minimal Corresponding Source or +Minimal Application Code as set out in 4d or providing the installation +information set out in section 4e, provided that you comply with the other +provisions of LGPL3 and provided that you meet, for the Application the +terms and conditions of the license(s) which apply to the Application. + +Except as stated in this special exception, the provisions of LGPL3 will +continue to comply in full to this Library. If you modify this Library, you +may apply this exception to your version of this Library, but you are not +obliged to do so. If you do not wish to do so, delete this exception +statement from your version. This exception does not (and cannot) modify any +license terms which apply to the Application, with which you must still +comply. + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/vendor/launchpad.net/goyaml/LICENSE.libyaml b/vendor/launchpad.net/goyaml/LICENSE.libyaml new file mode 100644 index 0000000..050ced2 --- /dev/null +++ b/vendor/launchpad.net/goyaml/LICENSE.libyaml @@ -0,0 +1,19 @@ +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/launchpad.net/goyaml/Makefile b/vendor/launchpad.net/goyaml/Makefile new file mode 100644 index 0000000..873d53b --- /dev/null +++ b/vendor/launchpad.net/goyaml/Makefile @@ -0,0 +1,39 @@ +include $(GOROOT)/src/Make.inc + +YAML=yaml-0.1.3 +LIBYAML=$(PWD)/$(YAML)/src/.libs/libyaml.a + +TARG=launchpad.net/goyaml + +GOFILES=\ + goyaml.go\ + resolve.go\ + +CGOFILES=\ + decode.go\ + encode.go\ + +CGO_OFILES+=\ + helpers.o\ + api.o\ + scanner.o\ + reader.o\ + parser.o\ + writer.o\ + emitter.o\ + +GOFMT=gofmt + +BADFMT:=$(shell $(GOFMT) -l $(GOFILES) $(CGOFILES) $(wildcard *_test.go)) + +all: package +gofmt: $(BADFMT) + @for F in $(BADFMT); do $(GOFMT) -w $$F && echo $$F; done + +include $(GOROOT)/src/Make.pkg + +ifneq ($(BADFMT),) +ifneq ($(MAKECMDGOALS),gofmt) +$(warning WARNING: make gofmt: $(BADFMT)) +endif +endif diff --git a/vendor/launchpad.net/goyaml/apic.go b/vendor/launchpad.net/goyaml/apic.go new file mode 100644 index 0000000..29be91d --- /dev/null +++ b/vendor/launchpad.net/goyaml/apic.go @@ -0,0 +1,742 @@ +package goyaml + +import ( + "io" + "os" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// File read handler. +func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_file.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_file_read_handler + parser.input_file = file +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) bool { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + } + return true +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// File write handler. +func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_file.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_file_write_handler + emitter.output_file = file +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +//// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } + return true +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } + return true +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, implicit bool) bool { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } + return true +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } + return true +} + +///* +// * Create ALIAS. +// */ +// +//YAML_DECLARE(int) +//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) +//{ +// mark yaml_mark_t = { 0, 0, 0 } +// anchor_copy *yaml_char_t = NULL +// +// assert(event) // Non-NULL event object is expected. +// assert(anchor) // Non-NULL anchor is expected. +// +// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 +// +// anchor_copy = yaml_strdup(anchor) +// if (!anchor_copy) +// return 0 +// +// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) +// +// return 1 +//} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } + return true +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compliler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/vendor/launchpad.net/goyaml/decode.go b/vendor/launchpad.net/goyaml/decode.go new file mode 100644 index 0000000..6586be4 --- /dev/null +++ b/vendor/launchpad.net/goyaml/decode.go @@ -0,0 +1,473 @@ +package goyaml + +import ( + "reflect" + "strconv" +) + +const ( + documentNode = 1 << iota + mappingNode + sequenceNode + scalarNode + aliasNode +) + +type node struct { + kind int + line, column int + tag string + value string + implicit bool + children []*node + anchors map[string]*node +} + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *node +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("Failed to initialize YAML emitter") + } + + if len(b) == 0 { + b = []byte{'\n'} + } + + yaml_parser_set_input_string(&p.parser, b) + + p.skip() + if p.event.typ != yaml_STREAM_START_EVENT { + panic("Expected stream start event, got " + strconv.Itoa(int(p.event.typ))) + } + p.skip() + return &p +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +func (p *parser) skip() { + if p.event.typ != yaml_NO_EVENT { + if p.event.typ == yaml_STREAM_END_EVENT { + panic("Attempted to go past the end of stream. Corrupted value?") + } + yaml_event_delete(&p.event) + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + } else if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "Unknown problem parsing YAML content" + } + panic(where + msg) +} + +func (p *parser) anchor(n *node, anchor []byte) { + if anchor != nil { + p.doc.anchors[string(anchor)] = n + } +} + +func (p *parser) parse() *node { + switch p.event.typ { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + default: + panic("Attempted to parse unknown event: " + + strconv.Itoa(int(p.event.typ))) + } + panic("Unreachable") +} + +func (p *parser) node(kind int) *node { + return &node{ + kind: kind, + line: p.event.start_mark.line, + column: p.event.start_mark.column, + } +} + +func (p *parser) document() *node { + n := p.node(documentNode) + n.anchors = make(map[string]*node) + p.doc = n + p.skip() + n.children = append(n.children, p.parse()) + if p.event.typ != yaml_DOCUMENT_END_EVENT { + panic("Expected end of document event but got " + + strconv.Itoa(int(p.event.typ))) + } + p.skip() + return n +} + +func (p *parser) alias() *node { + n := p.node(aliasNode) + n.value = string(p.event.anchor) + p.skip() + return n +} + +func (p *parser) scalar() *node { + n := p.node(scalarNode) + n.value = string(p.event.value) + n.tag = string(p.event.tag) + n.implicit = p.event.implicit + p.anchor(n, p.event.anchor) + p.skip() + return n +} + +func (p *parser) sequence() *node { + n := p.node(sequenceNode) + p.anchor(n, p.event.anchor) + p.skip() + for p.event.typ != yaml_SEQUENCE_END_EVENT { + n.children = append(n.children, p.parse()) + } + p.skip() + return n +} + +func (p *parser) mapping() *node { + n := p.node(mappingNode) + p.anchor(n, p.event.anchor) + p.skip() + for p.event.typ != yaml_MAPPING_END_EVENT { + n.children = append(n.children, p.parse(), p.parse()) + } + p.skip() + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *node + aliases map[string]bool +} + +func newDecoder() *decoder { + d := &decoder{} + d.aliases = make(map[string]bool) + return d +} + +// d.setter deals with setters and pointer dereferencing and initialization. +// +// It's a slightly convoluted case to handle properly: +// +// - nil pointers should be initialized, unless being set to nil +// - we don't know at this point yet what's the value to SetYAML() with. +// - we can't separate pointer deref/init and setter checking, because +// a setter may be found while going down a pointer chain. +// +// Thus, here is how it takes care of it: +// +// - out is provided as a pointer, so that it can be replaced. +// - when looking at a non-setter ptr, *out=ptr.Elem(), unless tag=!!null +// - when a setter is found, *out=interface{}, and a set() function is +// returned to call SetYAML() with the value of *out once it's defined. +// +func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()) { + again := true + for again { + again = false + setter, _ := (*out).Interface().(Setter) + if tag != "!!null" || setter != nil { + if pv := (*out); pv.Kind() == reflect.Ptr { + if pv.IsNil() { + *out = reflect.New(pv.Type().Elem()).Elem() + pv.Set((*out).Addr()) + } else { + *out = pv.Elem() + } + setter, _ = pv.Interface().(Setter) + again = true + } + } + if setter != nil { + var arg interface{} + *out = reflect.ValueOf(&arg).Elem() + return func() { + *good = setter.SetYAML(tag, arg) + } + } + } + return nil +} + +func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { + switch n.kind { + case documentNode: + good = d.document(n, out) + case scalarNode: + good = d.scalar(n, out) + case aliasNode: + good = d.alias(n, out) + case mappingNode: + good = d.mapping(n, out) + case sequenceNode: + good = d.sequence(n, out) + default: + panic("Internal error: unknown node kind: " + strconv.Itoa(n.kind)) + } + return +} + +func (d *decoder) document(n *node, out reflect.Value) (good bool) { + if len(n.children) == 1 { + d.doc = n + d.unmarshal(n.children[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *node, out reflect.Value) (good bool) { + an, ok := d.doc.anchors[n.value] + if !ok { + panic("Unknown anchor '" + n.value + "' referenced") + } + if d.aliases[n.value] { + panic("Anchor '" + n.value + "' value contains itself") + } + d.aliases[n.value] = true + good = d.unmarshal(an, out) + delete(d.aliases, n.value) + return good +} + +func (d *decoder) scalar(n *node, out reflect.Value) (good bool) { + var tag string + var resolved interface{} + if n.tag == "" && !n.implicit { + resolved = n.value + } else { + tag, resolved = resolve(n.tag, n.value) + if set := d.setter(tag, &out, &good); set != nil { + defer set() + } + } + switch out.Kind() { + case reflect.String: + if resolved != nil { + out.SetString(n.value) + good = true + } + case reflect.Interface: + if resolved == nil { + out.Set(reflect.Zero(out.Type())) + } else { + out.Set(reflect.ValueOf(resolved)) + } + good = true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch resolved := resolved.(type) { + case int: + if !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } + case int64: + if !out.OverflowInt(resolved) { + out.SetInt(resolved) + good = true + } + case float64: + if resolved < 1<<63-1 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 { + out.SetUint(uint64(resolved)) + good = true + } + case int64: + if resolved >= 0 { + out.SetUint(uint64(resolved)) + good = true + } + case float64: + if resolved < 1<<64-1 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + good = true + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + good = true + case int64: + out.SetFloat(float64(resolved)) + good = true + case float64: + out.SetFloat(resolved) + good = true + } + case reflect.Ptr: + switch resolved.(type) { + case nil: + out.Set(reflect.Zero(out.Type())) + good = true + default: + if out.Type().Elem() == reflect.TypeOf(resolved) { + elem := reflect.New(out.Type().Elem()) + elem.Elem().Set(reflect.ValueOf(resolved)) + out.Set(elem) + good = true + } + } + } + return good +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { + if set := d.setter("!!seq", &out, &good); set != nil { + defer set() + } + var iface reflect.Value + if out.Kind() == reflect.Interface { + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, 0)) + } + + if out.Kind() != reflect.Slice { + return false + } + et := out.Type().Elem() + + l := len(n.children) + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.children[i], e); ok { + out.Set(reflect.Append(out, e)) + } + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { + if set := d.setter("!!map", &out, &good); set != nil { + defer set() + } + if out.Kind() == reflect.Struct { + return d.mappingStruct(n, out) + } + + if out.Kind() == reflect.Interface { + // No type hints. Will have to use a generic map. + iface := out + out = settableValueOf(make(map[interface{}]interface{})) + iface.Set(out) + } + + if out.Kind() != reflect.Map { + return false + } + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + } + l := len(n.children) + for i := 0; i < l; i += 2 { + k := reflect.New(kt).Elem() + if d.unmarshal(n.children[i], k) { + e := reflect.New(et).Elem() + if d.unmarshal(n.children[i+1], e) { + out.SetMapIndex(k, e) + } + } + } + return true +} + +func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + name := settableValueOf("") + l := len(n.children) + for i := 0; i < l; i += 2 { + if !d.unmarshal(n.children[i], name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = out.FieldByIndex(info.Inline) + } + d.unmarshal(n.children[i+1], field) + } + } + return true +} diff --git a/vendor/launchpad.net/goyaml/decode_test.go b/vendor/launchpad.net/goyaml/decode_test.go new file mode 100644 index 0000000..83696b5 --- /dev/null +++ b/vendor/launchpad.net/goyaml/decode_test.go @@ -0,0 +1,519 @@ +package goyaml_test + +import ( + . "launchpad.net/gocheck" + "launchpad.net/goyaml" + "math" + "reflect" +) + +var unmarshalIntTest = 123 + +var unmarshalTests = []struct { + data string + value interface{} +}{ + { + "", + &struct{}{}, + }, { + "{}", &struct{}{}, + }, { + "v: hi", + map[string]string{"v": "hi"}, + }, { + "v: hi", map[string]interface{}{"v": "hi"}, + }, { + "v: true", + map[string]string{"v": "true"}, + }, { + "v: true", + map[string]interface{}{"v": true}, + }, { + "v: 10", + map[string]interface{}{"v": 10}, + }, { + "v: 0b10", + map[string]interface{}{"v": 2}, + }, { + "v: 0xA", + map[string]interface{}{"v": 10}, + }, { + "v: 4294967296", + map[string]int64{"v": 4294967296}, + }, { + "v: 0.1", + map[string]interface{}{"v": 0.1}, + }, { + "v: .1", + map[string]interface{}{"v": 0.1}, + }, { + "v: .Inf", + map[string]interface{}{"v": math.Inf(+1)}, + }, { + "v: -.Inf", + map[string]interface{}{"v": math.Inf(-1)}, + }, { + "v: -10", + map[string]interface{}{"v": -10}, + }, { + "v: -.1", + map[string]interface{}{"v": -0.1}, + }, + + // Simple values. + { + "123", + &unmarshalIntTest, + }, + + // Floats from spec + { + "canonical: 6.8523e+5", + map[string]interface{}{"canonical": 6.8523e+5}, + }, { + "expo: 685.230_15e+03", + map[string]interface{}{"expo": 685.23015e+03}, + }, { + "fixed: 685_230.15", + map[string]interface{}{"fixed": 685230.15}, + }, { + "neginf: -.inf", + map[string]interface{}{"neginf": math.Inf(-1)}, + }, { + "fixed: 685_230.15", + map[string]float64{"fixed": 685230.15}, + }, + //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported + //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails. + + // Bools from spec + { + "canonical: y", + map[string]interface{}{"canonical": true}, + }, { + "answer: NO", + map[string]interface{}{"answer": false}, + }, { + "logical: True", + map[string]interface{}{"logical": true}, + }, { + "option: on", + map[string]interface{}{"option": true}, + }, { + "option: on", + map[string]bool{"option": true}, + }, + // Ints from spec + { + "canonical: 685230", + map[string]interface{}{"canonical": 685230}, + }, { + "decimal: +685_230", + map[string]interface{}{"decimal": 685230}, + }, { + "octal: 02472256", + map[string]interface{}{"octal": 685230}, + }, { + "hexa: 0x_0A_74_AE", + map[string]interface{}{"hexa": 685230}, + }, { + "bin: 0b1010_0111_0100_1010_1110", + map[string]interface{}{"bin": 685230}, + }, { + "bin: -0b101010", + map[string]interface{}{"bin": -42}, + }, { + "decimal: +685_230", + map[string]int{"decimal": 685230}, + }, + + //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported + + // Nulls from spec + { + "empty:", + map[string]interface{}{"empty": nil}, + }, { + "canonical: ~", + map[string]interface{}{"canonical": nil}, + }, { + "english: null", + map[string]interface{}{"english": nil}, + }, { + "~: null key", + map[interface{}]string{nil: "null key"}, + }, { + "empty:", + map[string]*bool{"empty": nil}, + }, + + // Flow sequence + { + "seq: [A,B]", + map[string]interface{}{"seq": []interface{}{"A", "B"}}, + }, { + "seq: [A,B,C,]", + map[string][]string{"seq": []string{"A", "B", "C"}}, + }, { + "seq: [A,1,C]", + map[string][]string{"seq": []string{"A", "1", "C"}}, + }, { + "seq: [A,1,C]", + map[string][]int{"seq": []int{1}}, + }, { + "seq: [A,1,C]", + map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, + }, + // Block sequence + { + "seq:\n - A\n - B", + map[string]interface{}{"seq": []interface{}{"A", "B"}}, + }, { + "seq:\n - A\n - B\n - C", + map[string][]string{"seq": []string{"A", "B", "C"}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string][]string{"seq": []string{"A", "1", "C"}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string][]int{"seq": []int{1}}, + }, { + "seq:\n - A\n - 1\n - C", + map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, + }, + + // Literal block scalar + { + "scalar: | # Comment\n\n literal\n\n \ttext\n\n", + map[string]string{"scalar": "\nliteral\n\n\ttext\n"}, + }, + + // Folded block scalar + { + "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n", + map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"}, + }, + + // Map inside interface with no type hints. + { + "a: {b: c}", + map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, + }, + + // Structs and type conversions. + { + "hello: world", + &struct{ Hello string }{"world"}, + }, { + "a: {b: c}", + &struct{ A struct{ B string } }{struct{ B string }{"c"}}, + }, { + "a: {b: c}", + &struct{ A *struct{ B string } }{&struct{ B string }{"c"}}, + }, { + "a: {b: c}", + &struct{ A map[string]string }{map[string]string{"b": "c"}}, + }, { + "a: {b: c}", + &struct{ A *map[string]string }{&map[string]string{"b": "c"}}, + }, { + "a:", + &struct{ A map[string]string }{}, + }, { + "a: 1", + &struct{ A int }{1}, + }, { + "a: 1", + &struct{ A float64 }{1}, + }, { + "a: 1.0", + &struct{ A int }{1}, + }, { + "a: 1.0", + &struct{ A uint }{1}, + }, { + "a: [1, 2]", + &struct{ A []int }{[]int{1, 2}}, + }, { + "a: 1", + &struct{ B int }{0}, + }, { + "a: 1", + &struct { + B int "a" + }{1}, + }, { + "a: y", + &struct{ A bool }{true}, + }, + + // Some cross type conversions + { + "v: 42", + map[string]uint{"v": 42}, + }, { + "v: -42", + map[string]uint{}, + }, { + "v: 4294967296", + map[string]uint64{"v": 4294967296}, + }, { + "v: -4294967296", + map[string]uint64{}, + }, + + // Overflow cases. + { + "v: 4294967297", + map[string]int32{}, + }, { + "v: 128", + map[string]int8{}, + }, + + // Quoted values. + { + "'1': '\"2\"'", + map[interface{}]interface{}{"1": "\"2\""}, + }, { + "v:\n- A\n- 'B\n\n C'\n", + map[string][]string{"v": []string{"A", "B\nC"}}, + }, + + // Explicit tags. + { + "v: !!float '1.1'", + map[string]interface{}{"v": 1.1}, + }, { + "v: !!null ''", + map[string]interface{}{"v": nil}, + }, { + "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'", + map[string]interface{}{"v": 1}, + }, + + // Anchors and aliases. + { + "a: &x 1\nb: &y 2\nc: *x\nd: *y\n", + &struct{ A, B, C, D int }{1, 2, 1, 2}, + }, { + "a: &a {c: 1}\nb: *a", + &struct { + A, B struct { + C int + } + }{struct{ C int }{1}, struct{ C int }{1}}, + }, { + "a: &a [1, 2]\nb: *a", + &struct{ B []int }{[]int{1, 2}}, + }, + + // Bug #1133337 + { + "foo: ''", + map[string]*string{"foo": new(string)}, + }, { + "foo: null", + map[string]string{}, + }, + + // Ignored field + { + "a: 1\nb: 2\n", + &struct { + A int + B int "-" + }{1, 0}, + }, + + // Bug #1191981 + { + "" + + "%YAML 1.1\n" + + "--- !!str\n" + + `"Generic line break (no glyph)\n\` + "\n" + + ` Generic line break (glyphed)\n\` + "\n" + + ` Line separator\u2028\` + "\n" + + ` Paragraph separator\u2029"` + "\n", + "" + + "Generic line break (no glyph)\n" + + "Generic line break (glyphed)\n" + + "Line separator\u2028Paragraph separator\u2029", + }, + + // Struct inlining + { + "a: 1\nb: 2\nc: 3\n", + &struct { + A int + C inlineB `yaml:",inline"` + }{1, inlineB{2, inlineC{3}}}, + }, +} + +type inlineB struct { + B int + inlineC `yaml:",inline"` +} + +type inlineC struct { + C int +} + +func (s *S) TestUnmarshal(c *C) { + for i, item := range unmarshalTests { + t := reflect.ValueOf(item.value).Type() + var value interface{} + switch t.Kind() { + case reflect.Map: + value = reflect.MakeMap(t).Interface() + case reflect.String: + t := reflect.ValueOf(item.value).Type() + v := reflect.New(t) + value = v.Interface() + default: + pt := reflect.ValueOf(item.value).Type() + pv := reflect.New(pt.Elem()) + value = pv.Interface() + } + err := goyaml.Unmarshal([]byte(item.data), value) + c.Assert(err, IsNil, Commentf("Item #%d", i)) + if t.Kind() == reflect.String { + c.Assert(*value.(*string), Equals, item.value, Commentf("Item #%d", i)) + } else { + c.Assert(value, DeepEquals, item.value, Commentf("Item #%d", i)) + } + } +} + +func (s *S) TestUnmarshalNaN(c *C) { + value := map[string]interface{}{} + err := goyaml.Unmarshal([]byte("notanum: .NaN"), &value) + c.Assert(err, IsNil) + c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true) +} + +var unmarshalErrorTests = []struct { + data, error string +}{ + {"v: !!float 'error'", "YAML error: Can't decode !!str 'error' as a !!float"}, + {"v: [A,", "YAML error: line 1: did not find expected node content"}, + {"v:\n- [A,", "YAML error: line 2: did not find expected node content"}, + {"a: *b\n", "YAML error: Unknown anchor 'b' referenced"}, + {"a: &a\n b: *a\n", "YAML error: Anchor 'a' value contains itself"}, + {"value: -", "YAML error: block sequence entries are not allowed in this context"}, +} + +func (s *S) TestUnmarshalErrors(c *C) { + for _, item := range unmarshalErrorTests { + var value interface{} + err := goyaml.Unmarshal([]byte(item.data), &value) + c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) + } +} + +var setterTests = []struct { + data, tag string + value interface{} +}{ + {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}}, + {"_: [1,A]", "!!seq", []interface{}{1, "A"}}, + {"_: 10", "!!int", 10}, + {"_: null", "!!null", nil}, + {"_: !!foo 'BAR!'", "!!foo", "BAR!"}, +} + +var setterResult = map[int]bool{} + +type typeWithSetter struct { + tag string + value interface{} +} + +func (o *typeWithSetter) SetYAML(tag string, value interface{}) (ok bool) { + o.tag = tag + o.value = value + if i, ok := value.(int); ok { + if result, ok := setterResult[i]; ok { + return result + } + } + return true +} + +type typeWithSetterField struct { + Field *typeWithSetter "_" +} + +func (s *S) TestUnmarshalWithSetter(c *C) { + for _, item := range setterTests { + obj := &typeWithSetterField{} + err := goyaml.Unmarshal([]byte(item.data), obj) + c.Assert(err, IsNil) + c.Assert(obj.Field, NotNil, + Commentf("Pointer not initialized (%#v)", item.value)) + c.Assert(obj.Field.tag, Equals, item.tag) + c.Assert(obj.Field.value, DeepEquals, item.value) + } +} + +func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { + obj := &typeWithSetter{} + err := goyaml.Unmarshal([]byte(setterTests[0].data), obj) + c.Assert(err, IsNil) + c.Assert(obj.tag, Equals, setterTests[0].tag) + value, ok := obj.value.(map[interface{}]interface{}) + c.Assert(ok, Equals, true) + c.Assert(value["_"], DeepEquals, setterTests[0].value) +} + +func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) { + setterResult[2] = false + setterResult[4] = false + defer func() { + delete(setterResult, 2) + delete(setterResult, 4) + }() + + m := map[string]*typeWithSetter{} + data := "{abc: 1, def: 2, ghi: 3, jkl: 4}" + err := goyaml.Unmarshal([]byte(data), m) + c.Assert(err, IsNil) + c.Assert(m["abc"], NotNil) + c.Assert(m["def"], IsNil) + c.Assert(m["ghi"], NotNil) + c.Assert(m["jkl"], IsNil) + + c.Assert(m["abc"].value, Equals, 1) + c.Assert(m["ghi"].value, Equals, 3) +} + +//var data []byte +//func init() { +// var err error +// data, err = ioutil.ReadFile("/tmp/file.yaml") +// if err != nil { +// panic(err) +// } +//} +// +//func (s *S) BenchmarkUnmarshal(c *C) { +// var err error +// for i := 0; i < c.N; i++ { +// var v map[string]interface{} +// err = goyaml.Unmarshal(data, &v) +// } +// if err != nil { +// panic(err) +// } +//} +// +//func (s *S) BenchmarkMarshal(c *C) { +// var v map[string]interface{} +// goyaml.Unmarshal(data, &v) +// c.ResetTimer() +// for i := 0; i < c.N; i++ { +// goyaml.Marshal(&v) +// } +//} diff --git a/vendor/launchpad.net/goyaml/emitterc.go b/vendor/launchpad.net/goyaml/emitterc.go new file mode 100644 index 0000000..49c7f46 --- /dev/null +++ b/vendor/launchpad.net/goyaml/emitterc.go @@ -0,0 +1,1682 @@ +package goyaml + +import ( + "bytes" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + emitter.column = 0 + emitter.line++ + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + emitter.column = 0 + emitter.line++ + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + emitter.indent += emitter.best_indent + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + return yaml_emitter_emit_node(emitter, event, true, false, false, false) +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS") + } + return false +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an achor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + } + return true + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceeded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceeded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[0]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceeded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceeded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + emitter.indention = true + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + emitter.whitespace = false + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} diff --git a/vendor/launchpad.net/goyaml/encode.go b/vendor/launchpad.net/goyaml/encode.go new file mode 100644 index 0000000..b228a10 --- /dev/null +++ b/vendor/launchpad.net/goyaml/encode.go @@ -0,0 +1,221 @@ +package goyaml + +import ( + "reflect" + "sort" + "strconv" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool +} + +func newEncoder() (e *encoder) { + e = &encoder{} + e.must(yaml_emitter_initialize(&e.emitter)) + yaml_emitter_set_output_string(&e.emitter, &e.out) + e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)) + e.emit() + e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true)) + e.emit() + return e +} + +func (e *encoder) finish() { + e.must(yaml_document_end_event_initialize(&e.event, true)) + e.emit() + e.emitter.open_ended = false + e.must(yaml_stream_end_event_initialize(&e.event)) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT { + e.must(false) + } +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "Unknown problem generating YAML content" + } + panic(msg) + } +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + var value interface{} + if getter, ok := in.Interface().(Getter); ok { + tag, value = getter.GetYAML() + if value == nil { + e.nilv() + return + } + in = reflect.ValueOf(value) + } + switch in.Kind() { + case reflect.Interface: + if in.IsNil() { + e.nilv() + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + if in.IsNil() { + e.nilv() + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice: + e.slicev(tag, in) + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + e.intv(tag, in) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("Can't marshal type yet: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = in.FieldByIndex(info.Inline) + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + f() + e.must(yaml_mapping_end_event_initialize(&e.event)) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + if rtag, _ := resolve("", s); rtag != "!!str" { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else { + style = yaml_PLAIN_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // FIXME: Handle 64 bits here. + s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { + implicit := tag == "" + if !implicit { + style = yaml_PLAIN_SCALAR_STYLE + } + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.emit() +} diff --git a/vendor/launchpad.net/goyaml/encode_test.go b/vendor/launchpad.net/goyaml/encode_test.go new file mode 100644 index 0000000..2887466 --- /dev/null +++ b/vendor/launchpad.net/goyaml/encode_test.go @@ -0,0 +1,379 @@ +package goyaml_test + +import ( + "fmt" + . "launchpad.net/gocheck" + "launchpad.net/goyaml" + "math" + "strconv" + "strings" +) + +var marshalIntTest = 123 + +var marshalTests = []struct { + value interface{} + data string +}{ + { + &struct{}{}, + "{}\n", + }, { + map[string]string{"v": "hi"}, + "v: hi\n", + }, { + map[string]interface{}{"v": "hi"}, + "v: hi\n", + }, { + map[string]string{"v": "true"}, + "v: \"true\"\n", + }, { + map[string]string{"v": "false"}, + "v: \"false\"\n", + }, { + map[string]interface{}{"v": true}, + "v: true\n", + }, { + map[string]interface{}{"v": false}, + "v: false\n", + }, { + map[string]interface{}{"v": 10}, + "v: 10\n", + }, { + map[string]interface{}{"v": -10}, + "v: -10\n", + }, { + map[string]uint{"v": 42}, + "v: 42\n", + }, { + map[string]interface{}{"v": int64(4294967296)}, + "v: 4294967296\n", + }, { + map[string]int64{"v": int64(4294967296)}, + "v: 4294967296\n", + }, { + map[string]uint64{"v": 4294967296}, + "v: 4294967296\n", + }, { + map[string]interface{}{"v": "10"}, + "v: \"10\"\n", + }, { + map[string]interface{}{"v": 0.1}, + "v: 0.1\n", + }, { + map[string]interface{}{"v": float64(0.1)}, + "v: 0.1\n", + }, { + map[string]interface{}{"v": -0.1}, + "v: -0.1\n", + }, { + map[string]interface{}{"v": math.Inf(+1)}, + "v: .inf\n", + }, { + map[string]interface{}{"v": math.Inf(-1)}, + "v: -.inf\n", + }, { + map[string]interface{}{"v": math.NaN()}, + "v: .nan\n", + }, { + map[string]interface{}{"v": nil}, + "v: null\n", + }, { + map[string]interface{}{"v": ""}, + "v: \"\"\n", + }, { + map[string][]string{"v": []string{"A", "B"}}, + "v:\n- A\n- B\n", + }, { + map[string][]string{"v": []string{"A", "B\nC"}}, + "v:\n- A\n- 'B\n\n C'\n", + }, { + map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}}, + "v:\n- A\n- 1\n- B:\n - 2\n - 3\n", + }, { + map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, + "a:\n b: c\n", + }, { + map[string]interface{}{"a": "-"}, + "a: '-'\n", + }, + + // Simple values. + { + &marshalIntTest, + "123\n", + }, + + // Structures + { + &struct{ Hello string }{"world"}, + "hello: world\n", + }, { + &struct { + A struct { + B string + } + }{struct{ B string }{"c"}}, + "a:\n b: c\n", + }, { + &struct { + A *struct { + B string + } + }{&struct{ B string }{"c"}}, + "a:\n b: c\n", + }, { + &struct { + A *struct { + B string + } + }{}, + "a: null\n", + }, { + &struct{ A int }{1}, + "a: 1\n", + }, { + &struct{ A []int }{[]int{1, 2}}, + "a:\n- 1\n- 2\n", + }, { + &struct { + B int "a" + }{1}, + "a: 1\n", + }, { + &struct{ A bool }{true}, + "a: true\n", + }, + + // Conditional flag + { + &struct { + A int "a,omitempty" + B int "b,omitempty" + }{1, 0}, + "a: 1\n", + }, { + &struct { + A int "a,omitempty" + B int "b,omitempty" + }{0, 0}, + "{}\n", + }, { + &struct { + A *struct{ X int } "a,omitempty" + B int "b,omitempty" + }{nil, 0}, + "{}\n", + }, + + // Flow flag + { + &struct { + A []int "a,flow" + }{[]int{1, 2}}, + "a: [1, 2]\n", + }, { + &struct { + A map[string]string "a,flow" + }{map[string]string{"b": "c", "d": "e"}}, + "a: {b: c, d: e}\n", + }, { + &struct { + A struct { + B, D string + } "a,flow" + }{struct{ B, D string }{"c", "e"}}, + "a: {b: c, d: e}\n", + }, + + // Unexported field + { + &struct { + u int + A int + }{0, 1}, + "a: 1\n", + }, + + // Ignored field + { + &struct { + A int + B int "-" + }{1, 2}, + "a: 1\n", + }, + + // Struct inlining + { + &struct { + A int + C inlineB `yaml:",inline"` + }{1, inlineB{2, inlineC{3}}}, + "a: 1\nb: 2\nc: 3\n", + }, +} + +func (s *S) TestMarshal(c *C) { + for _, item := range marshalTests { + data, err := goyaml.Marshal(item.value) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, item.data) + } +} + +var marshalErrorTests = []struct { + value interface{} + error string +}{ + { + &struct { + B int + inlineB ",inline" + }{1, inlineB{2, inlineC{3}}}, + `Duplicated key 'b' in struct struct \{ B int; .*`, + }, +} + +func (s *S) TestMarshalErrors(c *C) { + for _, item := range marshalErrorTests { + _, err := goyaml.Marshal(item.value) + c.Assert(err, ErrorMatches, item.error) + } +} + +var marshalTaggedIfaceTest interface{} = &struct{ A string }{"B"} + +var getterTests = []struct { + data, tag string + value interface{} +}{ + {"_:\n hi: there\n", "", map[interface{}]interface{}{"hi": "there"}}, + {"_:\n- 1\n- A\n", "", []interface{}{1, "A"}}, + {"_: 10\n", "", 10}, + {"_: null\n", "", nil}, + {"_: !foo BAR!\n", "!foo", "BAR!"}, + {"_: !foo 1\n", "!foo", "1"}, + {"_: !foo '\"1\"'\n", "!foo", "\"1\""}, + {"_: !foo 1.1\n", "!foo", 1.1}, + {"_: !foo 1\n", "!foo", 1}, + {"_: !foo 1\n", "!foo", uint(1)}, + {"_: !foo true\n", "!foo", true}, + {"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}}, + {"_: !foo\n A: B\n", "!foo", map[string]string{"A": "B"}}, + {"_: !foo\n a: B\n", "!foo", &marshalTaggedIfaceTest}, +} + +func (s *S) TestMarshalTypeCache(c *C) { + var data []byte + var err error + func() { + type T struct{ A int } + data, err = goyaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + func() { + type T struct{ B int } + data, err = goyaml.Marshal(&T{}) + c.Assert(err, IsNil) + }() + c.Assert(string(data), Equals, "b: 0\n") +} + +type typeWithGetter struct { + tag string + value interface{} +} + +func (o typeWithGetter) GetYAML() (tag string, value interface{}) { + return o.tag, o.value +} + +type typeWithGetterField struct { + Field typeWithGetter "_" +} + +func (s *S) TestMashalWithGetter(c *C) { + for _, item := range getterTests { + obj := &typeWithGetterField{} + obj.Field.tag = item.tag + obj.Field.value = item.value + data, err := goyaml.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, string(item.data)) + } +} + +func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) { + obj := &typeWithGetter{} + obj.tag = "" + obj.value = map[string]string{"hello": "world!"} + data, err := goyaml.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, "hello: world!\n") +} + +func (s *S) TestSortedOutput(c *C) { + order := []interface{}{ + false, + true, + 1, + uint(1), + 1.0, + 1.1, + 1.2, + 2, + uint(2), + 2.0, + 2.1, + "", + ".1", + ".2", + ".a", + "1", + "2", + "a!10", + "a/2", + "a/10", + "a~10", + "ab/1", + "b/1", + "b/01", + "b/2", + "b/02", + "b/3", + "b/03", + "b1", + "b01", + "b3", + "c2.10", + "c10.2", + "d1", + "d12", + "d12a", + } + m := make(map[interface{}]int) + for _, k := range order { + m[k] = 1 + } + data, err := goyaml.Marshal(m) + c.Assert(err, IsNil) + out := "\n" + string(data) + last := 0 + for i, k := range order { + repr := fmt.Sprint(k) + if s, ok := k.(string); ok { + if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil { + repr = `"` + repr + `"` + } + } + index := strings.Index(out, "\n"+repr+":") + if index == -1 { + c.Fatalf("%#v is not in the output: %#v", k, out) + } + if index < last { + c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out) + } + last = index + } +} diff --git a/vendor/launchpad.net/goyaml/goyaml.go b/vendor/launchpad.net/goyaml/goyaml.go new file mode 100644 index 0000000..6bbce6d --- /dev/null +++ b/vendor/launchpad.net/goyaml/goyaml.go @@ -0,0 +1,307 @@ +// Package goyaml implements YAML support for the Go language. +// +// WARNING: You are using an out of date import path. Please update your code and import the following instead: +// +// gonuts.org/v1/yaml +// +// The package name has changed from "yaml" from "goyaml", but the package API has not changed. +// +package goyaml + +import ( + "errors" + "fmt" + "reflect" + "runtime" + "strings" + "sync" +) + +func handleErr(err *error) { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } else if _, ok := r.(*reflect.ValueError); ok { + panic(r) + } else if _, ok := r.(externalPanic); ok { + panic(r) + } else if s, ok := r.(string); ok { + *err = errors.New("YAML error: " + s) + } else if e, ok := r.(error); ok { + *err = e + } else { + panic(r) + } + } +} + +// Objects implementing the goyaml.Setter interface will receive the YAML +// tag and value via the SetYAML method during unmarshaling, rather than +// being implicitly assigned by the goyaml machinery. If setting the value +// works, the method should return true. If it returns false, the given +// value will be omitted from maps and slices. +type Setter interface { + SetYAML(tag string, value interface{}) bool +} + +// Objects implementing the goyaml.Getter interface will get the GetYAML() +// method called when goyaml is requested to marshal the given value, and +// the result of this method will be marshaled in place of the actual object. +type Getter interface { + GetYAML() (tag string, value interface{}) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the object pointed by out. +// +// Maps, pointers to structs and ints, etc, may all be used as out values. +// If an internal pointer within a struct is not initialized, goyaml +// will initialize it if necessary for unmarshalling the provided data, +// but the struct provided as out must not be a nil pointer. +// +// The type of the decoded values and the type of out will be considered, +// and Unmarshal() will do the best possible job to unmarshal values +// appropriately. It is NOT considered an error, though, to skip values +// because they are not available in the decoded YAML, or if they are not +// compatible with the out value. To ensure something was properly +// unmarshaled use a map or compare against the previous value for the +// field (usually the zero value). +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and will be unmarshalled using the field +// name lowercased by default. When custom field names are desired, the +// tag value may be used to tweak the name. Everything before the first +// comma in the field tag will be used as the name. The values following +// the comma are used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var T t +// goyaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +// +func Unmarshal(in []byte, out interface{}) (err error) { + defer handleErr(&err) + d := newDecoder() + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + d.unmarshal(node, reflect.ValueOf(out)) + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps, pointers to structs and ints, etc, may all be used as the in value. +// +// In the case of struct values, only exported fields will be serialized. +// The lowercased field name is used as the key for each exported field, +// but this behavior may be changed using the respective field tag. +// The tag may also contain flags to tweak the marshalling behavior for +// the field. Conflicting names result in a runtime error. The tag format +// accepted is: +// +// `(...) yaml:"[][,[,]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Does not apply to zero valued structs. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps. +// +// inline Inline the struct it's applied to, so its fields +// are processed as if they were part of the outer +// struct. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int "a,omitempty" +// B int +// } +// goyaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// goyaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshal("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from gobson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex + +type externalPanic string + +func (e externalPanic) String() string { + return string(e) +} + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st) + panic(externalPanic(msg)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + //case reflect.Map: + // if inlineMap >= 0 { + // return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + // } + // if field.Type.Key() != reflect.TypeOf("") { + // return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + // } + // inlineMap = info.Num + case reflect.Struct: + sinfo, err := getStructInfo(field.Type) + if err != nil { + return nil, err + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + default: + //panic("Option ,inline needs a struct value or map field") + panic("Option ,inline needs a struct value field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{fieldsMap, fieldsList, inlineMap} + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +func isZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + } + return false +} diff --git a/vendor/launchpad.net/goyaml/parserc.go b/vendor/launchpad.net/goyaml/parserc.go new file mode 100644 index 0000000..0fdfa4e --- /dev/null +++ b/vendor/launchpad.net/goyaml/parserc.go @@ -0,0 +1,1096 @@ +package goyaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + return &parser.tokens[parser.tokens_head] + } + return nil +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } + return false +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// * +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected ", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** +// +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// ************* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + return true +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// block_node ::= ALIAS +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// flow_node ::= ALIAS +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// ************************* +// block_content ::= block_collection | flow_collection | SCALAR +// ****** +// flow_content ::= flow_collection | SCALAR +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* +// +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +// +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// +// +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true +} + +// +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * *** * +// +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * ***** * +// +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/vendor/launchpad.net/goyaml/readerc.go b/vendor/launchpad.net/goyaml/readerc.go new file mode 100644 index 0000000..c732935 --- /dev/null +++ b/vendor/launchpad.net/goyaml/readerc.go @@ -0,0 +1,391 @@ +package goyaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + high, low = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + } + buffer_len += width + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/vendor/launchpad.net/goyaml/resolve.go b/vendor/launchpad.net/goyaml/resolve.go new file mode 100644 index 0000000..a31a533 --- /dev/null +++ b/vendor/launchpad.net/goyaml/resolve.go @@ -0,0 +1,155 @@ +package goyaml + +import ( + "math" + "strconv" + "strings" +) + +// TODO: merge, timestamps, base 60 floats, omap. + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + t[int('<')] = '<' // Merge + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, "!!bool", []string{"y", "Y", "yes", "Yes", "YES"}}, + {true, "!!bool", []string{"true", "True", "TRUE"}}, + {true, "!!bool", []string{"on", "On", "ON"}}, + {false, "!!bool", []string{"n", "N", "no", "No", "NO"}}, + {false, "!!bool", []string{"false", "False", "FALSE"}}, + {false, "!!bool", []string{"off", "Off", "OFF"}}, + {nil, "!!null", []string{"~", "null", "Null", "NULL"}}, + {math.NaN(), "!!float", []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), "!!float", []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), "!!float", []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), "!!float", []string{"-.inf", "-.Inf", "-.INF"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + if strings.HasPrefix(tag, longTagPrefix) { + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", "!!str", "!!bool", "!!int", "!!float", "!!null": + return true + } + return false +} + +func resolve(tag string, in string) (rtag string, out interface{}) { + tag = shortTag(tag) + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + if tag != "" && tag != rtag { + panic("Can't decode " + rtag + " '" + in + "' as a " + tag) + } + }() + + if in == "" { + return "!!null", nil + } + + c := resolveTable[in[0]] + if c == 0 { + // It's a string for sure. Nothing to do. + return "!!str", in + } + + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + switch c { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return "!!float", floatv + } + // XXX Handle base 60 floats here (WTF!) + + case 'D', 'S': + // Int, float, or timestamp. + for i := 0; i != len(in); i++ { + if in[i] == '_' { + in = strings.Replace(in, "_", "", -1) + break + } + } + intv, err := strconv.ParseInt(in, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return "!!int", int(intv) + } else { + return "!!int", intv + } + } + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return "!!float", floatv + } + if strings.HasPrefix(in, "0b") { + intv, err := strconv.ParseInt(in[2:], 2, 64) + if err == nil { + return "!!int", int(intv) + } + } else if strings.HasPrefix(in, "-0b") { + intv, err := strconv.ParseInt(in[3:], 2, 64) + if err == nil { + return "!!int", -int(intv) + } + } + // XXX Handle timestamps here. + + case '<': + // XXX Handle merge (<<) here. + + default: + panic("resolveTable item not yet handled: " + + string([]byte{c}) + " (with " + in + ")") + } + return "!!str", in +} diff --git a/vendor/launchpad.net/goyaml/scannerc.go b/vendor/launchpad.net/goyaml/scannerc.go new file mode 100644 index 0000000..943a597 --- /dev/null +++ b/vendor/launchpad.net/goyaml/scannerc.go @@ -0,0 +1,2710 @@ +package goyaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet") +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + // Check if we really need to fetch more tokens. + need_more_tokens := false + + if parser.tokens_head == len(parser.tokens) { + // Queue is empty. + need_more_tokens = true + } else { + // Check if any potential simple key may occupy the head position. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + if simple_key.possible && simple_key.token_number == parser.tokens_parsed { + need_more_tokens = true + break + } + } + } + + // We are finished. + if !need_more_tokens { + break + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // Remove obsolete potential simple keys. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +// Check the list of potential simple keys and remove the positions that +// cannot contain simple keys anymore. +func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { + // Check for a potential simple key for each flow level. + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + + // The specification requires that a simple key + // + // - is limited to a single line, + // - is shorter than 1024 characters. + if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { + + // Check if the potential simple key to be removed is required. + if simple_key.required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + } + } + return true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // A simple key is required only when it is the first token in the current + // line. Therefore it is always allowed. But we add a check anyway. + if required && !parser.simple_key_allowed { + panic("should not happen") + } + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + } + simple_key.mark = parser.mark + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + return true +} + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // Increase the flow level. + parser.flow_level++ + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] + } + return true +} + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each intendation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + // Loop through the intendation levels in the stack. + for parser.indent > column { + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if simple_key.possible { + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found uknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +// +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && !(s[0] == '!' && s[1] == 0) { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the tag is non-empty. + if len(s) == 0 { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the intendation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an intendation indicator equal to 0") + return false + } + + // Get the intendation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an intendation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the intendation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following intendation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan intendation spaces and line breaks for a block scalar. Determine the +// intendation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the intendation spaces and line breaks. + max_indent := 0 + for { + // Eat the intendation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the intendation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an intendation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". + if parser.flow_level > 0 && + parser.buffer[parser.buffer_pos] == ':' && + !is_blankz(parser.buffer, parser.buffer_pos+1) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found unexpected ':'") + return false + } + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab character that abuse intendation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violate intendation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check intendation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} diff --git a/vendor/launchpad.net/goyaml/sorter.go b/vendor/launchpad.net/goyaml/sorter.go new file mode 100644 index 0000000..e1ee85f --- /dev/null +++ b/vendor/launchpad.net/goyaml/sorter.go @@ -0,0 +1,104 @@ +package goyaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + return bl + } + var ai, bi int + var an, bn int64 + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/vendor/launchpad.net/goyaml/suite_test.go b/vendor/launchpad.net/goyaml/suite_test.go new file mode 100644 index 0000000..963ab0b --- /dev/null +++ b/vendor/launchpad.net/goyaml/suite_test.go @@ -0,0 +1,12 @@ +package goyaml_test + +import ( + . "launchpad.net/gocheck" + "testing" +) + +func Test(t *testing.T) { TestingT(t) } + +type S struct{} + +var _ = Suite(&S{}) diff --git a/vendor/launchpad.net/goyaml/writerc.go b/vendor/launchpad.net/goyaml/writerc.go new file mode 100644 index 0000000..4809bfb --- /dev/null +++ b/vendor/launchpad.net/goyaml/writerc.go @@ -0,0 +1,89 @@ +package goyaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + // If the output encoding is UTF-8, we don't need to recode the buffer. + if emitter.encoding == yaml_UTF8_ENCODING { + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true + } + + // Recode the buffer into the raw buffer. + var low, high int + if emitter.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + high, low = 1, 0 + } + + pos := 0 + for pos < emitter.buffer_pos { + // See the "reader.c" code for more details on UTF-8 encoding. Note + // that we assume that the buffer contains a valid UTF-8 sequence. + + // Read the next UTF-8 character. + octet := emitter.buffer[pos] + + var w int + var value rune + switch { + case octet&0x80 == 0x00: + w, value = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, value = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, value = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, value = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = emitter.buffer[pos+k] + value = (value << 6) + (rune(octet) & 0x3F) + } + pos += w + + // Write the character. + if value < 0x10000 { + var b [2]byte + b[high] = byte(value >> 8) + b[low] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1]) + } else { + // Write the character using a surrogate pair (check "reader.c"). + var b [4]byte + value -= 0x10000 + b[high] = byte(0xD8 + (value >> 18)) + b[low] = byte((value >> 10) & 0xFF) + b[high+2] = byte(0xDC + ((value >> 8) & 0xFF)) + b[low+2] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3]) + } + } + + // Write the raw buffer. + if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + emitter.raw_buffer = emitter.raw_buffer[:0] + return true +} diff --git a/vendor/launchpad.net/goyaml/yamlh.go b/vendor/launchpad.net/goyaml/yamlh.go new file mode 100644 index 0000000..1fea365 --- /dev/null +++ b/vendor/launchpad.net/goyaml/yamlh.go @@ -0,0 +1,712 @@ +package goyaml + +import ( + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota + + yaml_PLAIN_SCALAR_STYLE // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. +) + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// yaml_parser_set_input(). +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occured. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_file io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// yaml_emitter_set_output(). +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +// +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_file io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/vendor/launchpad.net/goyaml/yamlprivateh.go b/vendor/launchpad.net/goyaml/yamlprivateh.go new file mode 100644 index 0000000..1c0b23d --- /dev/null +++ b/vendor/launchpad.net/goyaml/yamlprivateh.go @@ -0,0 +1,173 @@ +package goyaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} From 2878bb123b54d34cd05f7746f33700c37a1db642 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Thu, 7 Nov 2013 14:28:54 -0500 Subject: [PATCH 2/9] the All listing is broken --- dbutil/dbutil.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dbutil/dbutil.go b/dbutil/dbutil.go index db39361..f8ae072 100644 --- a/dbutil/dbutil.go +++ b/dbutil/dbutil.go @@ -110,9 +110,9 @@ pass -1 for all files func (u Util) GetFiles(limit int) (files []types.File, err error) { //files = []types.File{} if limit == -1 { - err = u.Gfs.Find(nil).Sort("-metadata.timestamp").Limit(limit).All(&files) - } else { err = u.Gfs.Find(nil).Sort("-metadata.timestamp").All(&files) + } else { + err = u.Gfs.Find(nil).Sort("-metadata.timestamp").Limit(limit).All(&files) } return files, err } From 69de1a14b0e79f2bad92faca58ba105b6e7df5a4 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Fri, 10 Mar 2017 12:56:41 -0500 Subject: [PATCH 3/9] Dockerfile: updates --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index ca702dc..50556bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM fedora -RUN dnf install -y golang -RUN mkdir -p /usr/local/src/github.com/vbatts/ -ENV GOPATH=/usr/local -ADD ./ /usr/local/src/github.com/vbatts/imgsrv/ -RUN go install github.com/vbatts/imgsrv +ENV GOPATH /usr/local EXPOSE 7777 +RUN dnf install -y golang git && \ + go get github.com/vbatts/imgsrv && \ + rm -rf /usr/local/src /usr/local/pkg && \ + dnf remove -y golang git ENTRYPOINT ["/usr/local/bin/imgsrv"] From 044385dad759e26169407f9fed23275f7526a62f Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Fri, 10 Mar 2017 13:11:12 -0500 Subject: [PATCH 4/9] vendor: remove this Vendoring is really making things complicated Signed-off-by: Vincent Batts --- glide.lock | 18 - glide.yaml | 8 - vendor/github.com/gorilla/context | 1 - vendor/github.com/gorilla/mux | 1 - vendor/github.com/vbatts/go-httplog | 1 - vendor/labix.org/v2/mgo/.bzr/README | 3 - vendor/labix.org/v2/mgo/.bzr/branch-format | 1 - .../labix.org/v2/mgo/.bzr/branch/branch.conf | 1 - vendor/labix.org/v2/mgo/.bzr/branch/format | 1 - .../v2/mgo/.bzr/branch/last-revision | 1 - .../labix.org/v2/mgo/.bzr/checkout/conflicts | 1 - .../labix.org/v2/mgo/.bzr/checkout/dirstate | Bin 12463 -> 0 bytes vendor/labix.org/v2/mgo/.bzr/checkout/format | 1 - vendor/labix.org/v2/mgo/.bzr/checkout/views | 0 .../labix.org/v2/mgo/.bzr/repository/format | 1 - .../3e6c1cf43ea6d1aa3348e4f5d16312f2.cix | Bin 15169 -> 0 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.iix | Bin 14209 -> 0 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.rix | Bin 14328 -> 0 bytes .../3e6c1cf43ea6d1aa3348e4f5d16312f2.six | 5 - .../3e6c1cf43ea6d1aa3348e4f5d16312f2.tix | Bin 42010 -> 0 bytes .../v2/mgo/.bzr/repository/pack-names | 6 - .../3e6c1cf43ea6d1aa3348e4f5d16312f2.pack | Bin 459533 -> 0 bytes vendor/labix.org/v2/mgo/.bzrignore | 2 - vendor/labix.org/v2/mgo/LICENSE | 25 - vendor/labix.org/v2/mgo/Makefile | 5 - vendor/labix.org/v2/mgo/auth.go | 412 -- vendor/labix.org/v2/mgo/auth_test.go | 935 ----- vendor/labix.org/v2/mgo/bson/LICENSE | 25 - vendor/labix.org/v2/mgo/bson/bson.go | 682 ---- vendor/labix.org/v2/mgo/bson/bson_test.go | 1466 ------- vendor/labix.org/v2/mgo/bson/decode.go | 795 ---- vendor/labix.org/v2/mgo/bson/encode.go | 462 --- vendor/labix.org/v2/mgo/bulk.go | 71 - vendor/labix.org/v2/mgo/bulk_test.go | 89 - vendor/labix.org/v2/mgo/cluster.go | 616 --- vendor/labix.org/v2/mgo/cluster_test.go | 1559 -------- vendor/labix.org/v2/mgo/doc.go | 31 - vendor/labix.org/v2/mgo/export_test.go | 42 - vendor/labix.org/v2/mgo/gridfs.go | 732 ---- vendor/labix.org/v2/mgo/gridfs_test.go | 644 --- vendor/labix.org/v2/mgo/log.go | 133 - vendor/labix.org/v2/mgo/queue.go | 91 - vendor/labix.org/v2/mgo/queue_test.go | 104 - vendor/labix.org/v2/mgo/raceoff.go | 6 - vendor/labix.org/v2/mgo/raceon.go | 5 - vendor/labix.org/v2/mgo/saslimpl.go | 11 - vendor/labix.org/v2/mgo/saslstub.go | 11 - vendor/labix.org/v2/mgo/server.go | 444 --- vendor/labix.org/v2/mgo/session.go | 3517 ----------------- vendor/labix.org/v2/mgo/session_test.go | 3260 --------------- vendor/labix.org/v2/mgo/socket.go | 673 ---- vendor/labix.org/v2/mgo/stats.go | 147 - vendor/labix.org/v2/mgo/suite_test.go | 240 -- vendor/labix.org/v2/mgo/testdb/dropall.js | 47 - vendor/labix.org/v2/mgo/testdb/init.js | 103 - vendor/labix.org/v2/mgo/testdb/setup.sh | 54 - .../labix.org/v2/mgo/testdb/supervisord.conf | 62 - vendor/labix.org/v2/mgo/testdb/wait.js | 58 - vendor/labix.org/v2/mgo/txn/chaos.go | 68 - vendor/labix.org/v2/mgo/txn/debug.go | 108 - vendor/labix.org/v2/mgo/txn/flusher.go | 996 ----- vendor/labix.org/v2/mgo/txn/mgo_test.go | 101 - vendor/labix.org/v2/mgo/txn/sim_test.go | 389 -- vendor/labix.org/v2/mgo/txn/tarjan.go | 96 - vendor/labix.org/v2/mgo/txn/tarjan_test.go | 44 - vendor/labix.org/v2/mgo/txn/txn.go | 518 --- vendor/labix.org/v2/mgo/txn/txn_test.go | 521 --- vendor/launchpad.net/goyaml/.bzr/README | 3 - .../launchpad.net/goyaml/.bzr/branch-format | 1 - .../goyaml/.bzr/branch/branch.conf | 1 - .../launchpad.net/goyaml/.bzr/branch/format | 1 - .../goyaml/.bzr/branch/last-revision | 1 - .../goyaml/.bzr/checkout/conflicts | 1 - .../goyaml/.bzr/checkout/dirstate | Bin 5692 -> 0 bytes .../launchpad.net/goyaml/.bzr/checkout/format | 1 - .../launchpad.net/goyaml/.bzr/checkout/views | 0 .../goyaml/.bzr/repository/format | 1 - .../dfefc85269662e7e438e0069b6349695.cix | Bin 3749 -> 0 bytes .../dfefc85269662e7e438e0069b6349695.iix | Bin 3344 -> 0 bytes .../dfefc85269662e7e438e0069b6349695.rix | Bin 3430 -> 0 bytes .../dfefc85269662e7e438e0069b6349695.six | 5 - .../dfefc85269662e7e438e0069b6349695.tix | Bin 18126 -> 0 bytes .../goyaml/.bzr/repository/pack-names | 6 - .../dfefc85269662e7e438e0069b6349695.pack | Bin 583825 -> 0 bytes vendor/launchpad.net/goyaml/.bzrignore | 14 - vendor/launchpad.net/goyaml/.lbox | 1 - vendor/launchpad.net/goyaml/.lbox.check | 20 - vendor/launchpad.net/goyaml/LICENSE | 185 - vendor/launchpad.net/goyaml/LICENSE.libyaml | 19 - vendor/launchpad.net/goyaml/Makefile | 39 - vendor/launchpad.net/goyaml/apic.go | 742 ---- vendor/launchpad.net/goyaml/decode.go | 473 --- vendor/launchpad.net/goyaml/decode_test.go | 519 --- vendor/launchpad.net/goyaml/emitterc.go | 1682 -------- vendor/launchpad.net/goyaml/encode.go | 221 -- vendor/launchpad.net/goyaml/encode_test.go | 379 -- vendor/launchpad.net/goyaml/goyaml.go | 307 -- vendor/launchpad.net/goyaml/parserc.go | 1096 ----- vendor/launchpad.net/goyaml/readerc.go | 391 -- vendor/launchpad.net/goyaml/resolve.go | 155 - vendor/launchpad.net/goyaml/scannerc.go | 2710 ------------- vendor/launchpad.net/goyaml/sorter.go | 104 - vendor/launchpad.net/goyaml/suite_test.go | 12 - vendor/launchpad.net/goyaml/writerc.go | 89 - vendor/launchpad.net/goyaml/yamlh.go | 712 ---- vendor/launchpad.net/goyaml/yamlprivateh.go | 173 - 106 files changed, 30514 deletions(-) delete mode 100644 glide.lock delete mode 100644 glide.yaml delete mode 160000 vendor/github.com/gorilla/context delete mode 160000 vendor/github.com/gorilla/mux delete mode 160000 vendor/github.com/vbatts/go-httplog delete mode 100644 vendor/labix.org/v2/mgo/.bzr/README delete mode 100644 vendor/labix.org/v2/mgo/.bzr/branch-format delete mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/branch.conf delete mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/format delete mode 100644 vendor/labix.org/v2/mgo/.bzr/branch/last-revision delete mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/conflicts delete mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/dirstate delete mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/format delete mode 100644 vendor/labix.org/v2/mgo/.bzr/checkout/views delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/format delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.rix delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.six delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.tix delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/pack-names delete mode 100644 vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack delete mode 100644 vendor/labix.org/v2/mgo/.bzrignore delete mode 100644 vendor/labix.org/v2/mgo/LICENSE delete mode 100644 vendor/labix.org/v2/mgo/Makefile delete mode 100644 vendor/labix.org/v2/mgo/auth.go delete mode 100644 vendor/labix.org/v2/mgo/auth_test.go delete mode 100644 vendor/labix.org/v2/mgo/bson/LICENSE delete mode 100644 vendor/labix.org/v2/mgo/bson/bson.go delete mode 100644 vendor/labix.org/v2/mgo/bson/bson_test.go delete mode 100644 vendor/labix.org/v2/mgo/bson/decode.go delete mode 100644 vendor/labix.org/v2/mgo/bson/encode.go delete mode 100644 vendor/labix.org/v2/mgo/bulk.go delete mode 100644 vendor/labix.org/v2/mgo/bulk_test.go delete mode 100644 vendor/labix.org/v2/mgo/cluster.go delete mode 100644 vendor/labix.org/v2/mgo/cluster_test.go delete mode 100644 vendor/labix.org/v2/mgo/doc.go delete mode 100644 vendor/labix.org/v2/mgo/export_test.go delete mode 100644 vendor/labix.org/v2/mgo/gridfs.go delete mode 100644 vendor/labix.org/v2/mgo/gridfs_test.go delete mode 100644 vendor/labix.org/v2/mgo/log.go delete mode 100644 vendor/labix.org/v2/mgo/queue.go delete mode 100644 vendor/labix.org/v2/mgo/queue_test.go delete mode 100644 vendor/labix.org/v2/mgo/raceoff.go delete mode 100644 vendor/labix.org/v2/mgo/raceon.go delete mode 100644 vendor/labix.org/v2/mgo/saslimpl.go delete mode 100644 vendor/labix.org/v2/mgo/saslstub.go delete mode 100644 vendor/labix.org/v2/mgo/server.go delete mode 100644 vendor/labix.org/v2/mgo/session.go delete mode 100644 vendor/labix.org/v2/mgo/session_test.go delete mode 100644 vendor/labix.org/v2/mgo/socket.go delete mode 100644 vendor/labix.org/v2/mgo/stats.go delete mode 100644 vendor/labix.org/v2/mgo/suite_test.go delete mode 100644 vendor/labix.org/v2/mgo/testdb/dropall.js delete mode 100644 vendor/labix.org/v2/mgo/testdb/init.js delete mode 100755 vendor/labix.org/v2/mgo/testdb/setup.sh delete mode 100644 vendor/labix.org/v2/mgo/testdb/supervisord.conf delete mode 100644 vendor/labix.org/v2/mgo/testdb/wait.js delete mode 100644 vendor/labix.org/v2/mgo/txn/chaos.go delete mode 100644 vendor/labix.org/v2/mgo/txn/debug.go delete mode 100644 vendor/labix.org/v2/mgo/txn/flusher.go delete mode 100644 vendor/labix.org/v2/mgo/txn/mgo_test.go delete mode 100644 vendor/labix.org/v2/mgo/txn/sim_test.go delete mode 100644 vendor/labix.org/v2/mgo/txn/tarjan.go delete mode 100644 vendor/labix.org/v2/mgo/txn/tarjan_test.go delete mode 100644 vendor/labix.org/v2/mgo/txn/txn.go delete mode 100644 vendor/labix.org/v2/mgo/txn/txn_test.go delete mode 100644 vendor/launchpad.net/goyaml/.bzr/README delete mode 100644 vendor/launchpad.net/goyaml/.bzr/branch-format delete mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/branch.conf delete mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/format delete mode 100644 vendor/launchpad.net/goyaml/.bzr/branch/last-revision delete mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/conflicts delete mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/dirstate delete mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/format delete mode 100644 vendor/launchpad.net/goyaml/.bzr/checkout/views delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/format delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.cix delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.iix delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.six delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.tix delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/pack-names delete mode 100644 vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack delete mode 100644 vendor/launchpad.net/goyaml/.bzrignore delete mode 100644 vendor/launchpad.net/goyaml/.lbox delete mode 100755 vendor/launchpad.net/goyaml/.lbox.check delete mode 100644 vendor/launchpad.net/goyaml/LICENSE delete mode 100644 vendor/launchpad.net/goyaml/LICENSE.libyaml delete mode 100644 vendor/launchpad.net/goyaml/Makefile delete mode 100644 vendor/launchpad.net/goyaml/apic.go delete mode 100644 vendor/launchpad.net/goyaml/decode.go delete mode 100644 vendor/launchpad.net/goyaml/decode_test.go delete mode 100644 vendor/launchpad.net/goyaml/emitterc.go delete mode 100644 vendor/launchpad.net/goyaml/encode.go delete mode 100644 vendor/launchpad.net/goyaml/encode_test.go delete mode 100644 vendor/launchpad.net/goyaml/goyaml.go delete mode 100644 vendor/launchpad.net/goyaml/parserc.go delete mode 100644 vendor/launchpad.net/goyaml/readerc.go delete mode 100644 vendor/launchpad.net/goyaml/resolve.go delete mode 100644 vendor/launchpad.net/goyaml/scannerc.go delete mode 100644 vendor/launchpad.net/goyaml/sorter.go delete mode 100644 vendor/launchpad.net/goyaml/suite_test.go delete mode 100644 vendor/launchpad.net/goyaml/writerc.go delete mode 100644 vendor/launchpad.net/goyaml/yamlh.go delete mode 100644 vendor/launchpad.net/goyaml/yamlprivateh.go diff --git a/glide.lock b/glide.lock deleted file mode 100644 index e468e90..0000000 --- a/glide.lock +++ /dev/null @@ -1,18 +0,0 @@ -hash: e99d6e208d9806cd3133aaf20912a1e3ece517fc36c3ad1e67631bc2ba7b4009 -updated: 2017-02-06T12:03:37.357927455-05:00 -imports: -- name: github.com/gorilla/context - version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 -- name: github.com/gorilla/mux - version: 392c28fe23e1c45ddba891b0320b3b5df220beea -- name: github.com/vbatts/go-httplog - version: becd5526f5dcce33a513c4c0ef2c70c761ca66e0 -- name: labix.org/v2/mgo - version: "287" - subpackages: - - bson -- name: labix.org/v2/mgo/sasl - version: "" -- name: launchpad.net/goyaml - version: "51" -testImports: [] diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index b130ad5..0000000 --- a/glide.yaml +++ /dev/null @@ -1,8 +0,0 @@ -package: github.com/vbatts/imgsrv -import: -- package: github.com/gorilla/mux -- package: github.com/vbatts/go-httplog -- package: labix.org/v2/mgo - subpackages: - - bson -- package: launchpad.net/goyaml diff --git a/vendor/github.com/gorilla/context b/vendor/github.com/gorilla/context deleted file mode 160000 index 08b5f42..0000000 --- a/vendor/github.com/gorilla/context +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 diff --git a/vendor/github.com/gorilla/mux b/vendor/github.com/gorilla/mux deleted file mode 160000 index 392c28f..0000000 --- a/vendor/github.com/gorilla/mux +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 392c28fe23e1c45ddba891b0320b3b5df220beea diff --git a/vendor/github.com/vbatts/go-httplog b/vendor/github.com/vbatts/go-httplog deleted file mode 160000 index becd552..0000000 --- a/vendor/github.com/vbatts/go-httplog +++ /dev/null @@ -1 +0,0 @@ -Subproject commit becd5526f5dcce33a513c4c0ef2c70c761ca66e0 diff --git a/vendor/labix.org/v2/mgo/.bzr/README b/vendor/labix.org/v2/mgo/.bzr/README deleted file mode 100644 index f82dc1c..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/README +++ /dev/null @@ -1,3 +0,0 @@ -This is a Bazaar control directory. -Do not change any files in this directory. -See http://bazaar.canonical.com/ for more information about Bazaar. diff --git a/vendor/labix.org/v2/mgo/.bzr/branch-format b/vendor/labix.org/v2/mgo/.bzr/branch-format deleted file mode 100644 index 9eb09b7..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/branch-format +++ /dev/null @@ -1 +0,0 @@ -Bazaar-NG meta directory, format 1 diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf b/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf deleted file mode 100644 index 6e3d0e2..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/branch/branch.conf +++ /dev/null @@ -1 +0,0 @@ -parent_location = http://bazaar.launchpad.net/~niemeyer/mgo/v2/ diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/format b/vendor/labix.org/v2/mgo/.bzr/branch/format deleted file mode 100644 index dc392f4..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/branch/format +++ /dev/null @@ -1 +0,0 @@ -Bazaar Branch Format 7 (needs bzr 1.6) diff --git a/vendor/labix.org/v2/mgo/.bzr/branch/last-revision b/vendor/labix.org/v2/mgo/.bzr/branch/last-revision deleted file mode 100644 index b04b872..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/branch/last-revision +++ /dev/null @@ -1 +0,0 @@ -287 gustavo@niemeyer.net-20140701140051-90be2tvk93pcczzi diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts b/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts deleted file mode 100644 index 0dc2d3a..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/checkout/conflicts +++ /dev/null @@ -1 +0,0 @@ -BZR conflict list format 1 diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/dirstate b/vendor/labix.org/v2/mgo/.bzr/checkout/dirstate deleted file mode 100644 index ce83042d9f2844ee62ea9e14c921ce0bb95868a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12463 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 N_^v1&Z1a`i{~zhb>`VXv diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/format b/vendor/labix.org/v2/mgo/.bzr/checkout/format deleted file mode 100644 index e0261c7..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/checkout/format +++ /dev/null @@ -1 +0,0 @@ -Bazaar Working Tree Format 6 (bzr 1.14) diff --git a/vendor/labix.org/v2/mgo/.bzr/checkout/views b/vendor/labix.org/v2/mgo/.bzr/checkout/views deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/format b/vendor/labix.org/v2/mgo/.bzr/repository/format deleted file mode 100644 index b200528..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/repository/format +++ /dev/null @@ -1 +0,0 @@ -Bazaar repository format 2a (needs bzr 1.16 or later) diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix b/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.cix deleted file mode 100644 index 426a58daad887b08323830269729e13483232177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15169 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 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix b/vendor/labix.org/v2/mgo/.bzr/repository/indices/3e6c1cf43ea6d1aa3348e4f5d16312f2.iix deleted file mode 100644 index 42ad105e8281e2d06ed9b64d9ecbaedf824479b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14209 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 hgM*XQ8FW_yHSY3@P=xP^3U`E8gNQMM8k!gyR0? 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 diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/pack-names b/vendor/labix.org/v2/mgo/.bzr/repository/pack-names deleted file mode 100644 index 68b65e7..0000000 --- a/vendor/labix.org/v2/mgo/.bzr/repository/pack-names +++ /dev/null @@ -1,6 +0,0 @@ -B+Tree Graph Index 2 -node_ref_lists=0 -key_elements=1 -len=1 -row_lengths=1 -xœ ı€0ÀÔ™‚ò`R8 /ÊÂÂÆíõŠ{Þ;Î+<«„-¬T · w¡Ù7LÀÉ¥@…A¹MúC£ƒ 6ëÕOx \ No newline at end of file diff --git a/vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack b/vendor/labix.org/v2/mgo/.bzr/repository/packs/3e6c1cf43ea6d1aa3348e4f5d16312f2.pack deleted file mode 100644 index 3421040f86793d6639e04c0e7d9976a3a9a8bf04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459533 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�akJWhJ*sP9Y9JA)<%w0T8fymI5)xhK*MBO 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

ST^lyD*#?|*(6y1at!09@76h3jC4@X{>TrU#L9 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%0A9X$WKK|9gb-jb9;RH?>h5(C`pox;fx4VB3^ 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�j=7wafYDmV!OpC@r3=wKUAW(t8 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≈~kow)X6tN#6+ORfU#{6M8@EUUnksRHl*H}CF( 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

e&B*s0$l2R8)!6aVaL*ILhEiM)v7i-BX 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%0AY-D$pgP*LjSXtN3nEb+Xl>h${(M|95V6xQnX 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 G6HZ0A5^6dC diff --git a/vendor/launchpad.net/goyaml/.bzrignore b/vendor/launchpad.net/goyaml/.bzrignore deleted file mode 100644 index 52c98ab..0000000 --- a/vendor/launchpad.net/goyaml/.bzrignore +++ /dev/null @@ -1,14 +0,0 @@ -[568].out -_* -*.cgo*.* - -yaml-*/stamp-h1 -yaml-*/Makefile -yaml-*/*/Makefile -yaml-*/libtool -yaml-*/config* -yaml-*/*/*.lo -yaml-*/*/*.la -yaml-*/*/.libs -yaml-*/*/.deps -yaml-*/tests/* diff --git a/vendor/launchpad.net/goyaml/.lbox b/vendor/launchpad.net/goyaml/.lbox deleted file mode 100644 index 90ebc09..0000000 --- a/vendor/launchpad.net/goyaml/.lbox +++ /dev/null @@ -1 +0,0 @@ -propose -cr -for=lp:goyaml diff --git a/vendor/launchpad.net/goyaml/.lbox.check b/vendor/launchpad.net/goyaml/.lbox.check deleted file mode 100755 index b4211c2..0000000 --- a/vendor/launchpad.net/goyaml/.lbox.check +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -set -e - -BADFMT=`find * -name '*.go' | xargs gofmt -l` -if [ -n "$BADFMT" ]; then - BADFMT=`echo "$BADFMT" | sed "s/^/ /"` - echo -e "gofmt is sad:\n\n$BADFMT" - exit 1 -fi - -VERSION=`go version | awk '{print $3}'` -if [ $VERSION == 'devel' ]; then - go tool vet \ - -methods \ - -printf \ - -rangeloops \ - -printfuncs 'ErrorContextf:1,notFoundf:0,badReqErrorf:0,Commitf:0,Snapshotf:0,Debugf:0' \ - . -fi diff --git a/vendor/launchpad.net/goyaml/LICENSE b/vendor/launchpad.net/goyaml/LICENSE deleted file mode 100644 index 53320c3..0000000 --- a/vendor/launchpad.net/goyaml/LICENSE +++ /dev/null @@ -1,185 +0,0 @@ -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/launchpad.net/goyaml/LICENSE.libyaml b/vendor/launchpad.net/goyaml/LICENSE.libyaml deleted file mode 100644 index 050ced2..0000000 --- a/vendor/launchpad.net/goyaml/LICENSE.libyaml +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006 Kirill Simonov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/launchpad.net/goyaml/Makefile b/vendor/launchpad.net/goyaml/Makefile deleted file mode 100644 index 873d53b..0000000 --- a/vendor/launchpad.net/goyaml/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -include $(GOROOT)/src/Make.inc - -YAML=yaml-0.1.3 -LIBYAML=$(PWD)/$(YAML)/src/.libs/libyaml.a - -TARG=launchpad.net/goyaml - -GOFILES=\ - goyaml.go\ - resolve.go\ - -CGOFILES=\ - decode.go\ - encode.go\ - -CGO_OFILES+=\ - helpers.o\ - api.o\ - scanner.o\ - reader.o\ - parser.o\ - writer.o\ - emitter.o\ - -GOFMT=gofmt - -BADFMT:=$(shell $(GOFMT) -l $(GOFILES) $(CGOFILES) $(wildcard *_test.go)) - -all: package -gofmt: $(BADFMT) - @for F in $(BADFMT); do $(GOFMT) -w $$F && echo $$F; done - -include $(GOROOT)/src/Make.pkg - -ifneq ($(BADFMT),) -ifneq ($(MAKECMDGOALS),gofmt) -$(warning WARNING: make gofmt: $(BADFMT)) -endif -endif diff --git a/vendor/launchpad.net/goyaml/apic.go b/vendor/launchpad.net/goyaml/apic.go deleted file mode 100644 index 29be91d..0000000 --- a/vendor/launchpad.net/goyaml/apic.go +++ /dev/null @@ -1,742 +0,0 @@ -package goyaml - -import ( - "io" - "os" -) - -func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { - //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) - - // Check if we can move the queue at the beginning of the buffer. - if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { - if parser.tokens_head != len(parser.tokens) { - copy(parser.tokens, parser.tokens[parser.tokens_head:]) - } - parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] - parser.tokens_head = 0 - } - parser.tokens = append(parser.tokens, *token) - if pos < 0 { - return - } - copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) - parser.tokens[parser.tokens_head+pos] = *token -} - -// Create a new parser object. -func yaml_parser_initialize(parser *yaml_parser_t) bool { - *parser = yaml_parser_t{ - raw_buffer: make([]byte, 0, input_raw_buffer_size), - buffer: make([]byte, 0, input_buffer_size), - } - return true -} - -// Destroy a parser object. -func yaml_parser_delete(parser *yaml_parser_t) { - *parser = yaml_parser_t{} -} - -// String read handler. -func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - if parser.input_pos == len(parser.input) { - return 0, io.EOF - } - n = copy(buffer, parser.input[parser.input_pos:]) - parser.input_pos += n - return n, nil -} - -// File read handler. -func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - return parser.input_file.Read(buffer) -} - -// Set a string input. -func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_string_read_handler - parser.input = input - parser.input_pos = 0 -} - -// Set a file input. -func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_file_read_handler - parser.input_file = file -} - -// Set the source encoding. -func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { - if parser.encoding != yaml_ANY_ENCODING { - panic("must set the encoding only once") - } - parser.encoding = encoding -} - -// Create a new emitter object. -func yaml_emitter_initialize(emitter *yaml_emitter_t) bool { - *emitter = yaml_emitter_t{ - buffer: make([]byte, output_buffer_size), - raw_buffer: make([]byte, 0, output_raw_buffer_size), - states: make([]yaml_emitter_state_t, 0, initial_stack_size), - events: make([]yaml_event_t, 0, initial_queue_size), - } - return true -} - -// Destroy an emitter object. -func yaml_emitter_delete(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{} -} - -// String write handler. -func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - *emitter.output_buffer = append(*emitter.output_buffer, buffer...) - return nil -} - -// File write handler. -func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - _, err := emitter.output_file.Write(buffer) - return err -} - -// Set a string output. -func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_string_write_handler - emitter.output_buffer = output_buffer -} - -// Set a file output. -func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_file_write_handler - emitter.output_file = file -} - -// Set the output encoding. -func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { - if emitter.encoding != yaml_ANY_ENCODING { - panic("must set the output encoding only once") - } - emitter.encoding = encoding -} - -// Set the canonical output style. -func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { - emitter.canonical = canonical -} - -//// Set the indentation increment. -func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { - if indent < 2 || indent > 9 { - indent = 2 - } - emitter.best_indent = indent -} - -// Set the preferred line width. -func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { - if width < 0 { - width = -1 - } - emitter.best_width = width -} - -// Set if unescaped non-ASCII characters are allowed. -func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { - emitter.unicode = unicode -} - -// Set the preferred line break character. -func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { - emitter.line_break = line_break -} - -///* -// * Destroy a token object. -// */ -// -//YAML_DECLARE(void) -//yaml_token_delete(yaml_token_t *token) -//{ -// assert(token); // Non-NULL token object expected. -// -// switch (token.type) -// { -// case YAML_TAG_DIRECTIVE_TOKEN: -// yaml_free(token.data.tag_directive.handle); -// yaml_free(token.data.tag_directive.prefix); -// break; -// -// case YAML_ALIAS_TOKEN: -// yaml_free(token.data.alias.value); -// break; -// -// case YAML_ANCHOR_TOKEN: -// yaml_free(token.data.anchor.value); -// break; -// -// case YAML_TAG_TOKEN: -// yaml_free(token.data.tag.handle); -// yaml_free(token.data.tag.suffix); -// break; -// -// case YAML_SCALAR_TOKEN: -// yaml_free(token.data.scalar.value); -// break; -// -// default: -// break; -// } -// -// memset(token, 0, sizeof(yaml_token_t)); -//} -// -///* -// * Check if a string is a valid UTF-8 sequence. -// * -// * Check 'reader.c' for more details on UTF-8 encoding. -// */ -// -//static int -//yaml_check_utf8(yaml_char_t *start, size_t length) -//{ -// yaml_char_t *end = start+length; -// yaml_char_t *pointer = start; -// -// while (pointer < end) { -// unsigned char octet; -// unsigned int width; -// unsigned int value; -// size_t k; -// -// octet = pointer[0]; -// width = (octet & 0x80) == 0x00 ? 1 : -// (octet & 0xE0) == 0xC0 ? 2 : -// (octet & 0xF0) == 0xE0 ? 3 : -// (octet & 0xF8) == 0xF0 ? 4 : 0; -// value = (octet & 0x80) == 0x00 ? octet & 0x7F : -// (octet & 0xE0) == 0xC0 ? octet & 0x1F : -// (octet & 0xF0) == 0xE0 ? octet & 0x0F : -// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; -// if (!width) return 0; -// if (pointer+width > end) return 0; -// for (k = 1; k < width; k ++) { -// octet = pointer[k]; -// if ((octet & 0xC0) != 0x80) return 0; -// value = (value << 6) + (octet & 0x3F); -// } -// if (!((width == 1) || -// (width == 2 && value >= 0x80) || -// (width == 3 && value >= 0x800) || -// (width == 4 && value >= 0x10000))) return 0; -// -// pointer += width; -// } -// -// return 1; -//} -// - -// Create STREAM-START. -func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool { - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - encoding: encoding, - } - return true -} - -// Create STREAM-END. -func yaml_stream_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - } - return true -} - -// Create DOCUMENT-START. -func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t, - tag_directives []yaml_tag_directive_t, implicit bool) bool { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: implicit, - } - return true -} - -// Create DOCUMENT-END. -func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - implicit: implicit, - } - return true -} - -///* -// * Create ALIAS. -// */ -// -//YAML_DECLARE(int) -//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) -//{ -// mark yaml_mark_t = { 0, 0, 0 } -// anchor_copy *yaml_char_t = NULL -// -// assert(event) // Non-NULL event object is expected. -// assert(anchor) // Non-NULL anchor is expected. -// -// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 -// -// anchor_copy = yaml_strdup(anchor) -// if (!anchor_copy) -// return 0 -// -// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) -// -// return 1 -//} - -// Create SCALAR. -func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - anchor: anchor, - tag: tag, - value: value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-START. -func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-END. -func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - } - return true -} - -// Create MAPPING-START. -func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool { - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } - return true -} - -// Create MAPPING-END. -func yaml_mapping_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - } - return true -} - -// Destroy an event object. -func yaml_event_delete(event *yaml_event_t) { - *event = yaml_event_t{} -} - -///* -// * Create a document object. -// */ -// -//YAML_DECLARE(int) -//yaml_document_initialize(document *yaml_document_t, -// version_directive *yaml_version_directive_t, -// tag_directives_start *yaml_tag_directive_t, -// tag_directives_end *yaml_tag_directive_t, -// start_implicit int, end_implicit int) -//{ -// struct { -// error yaml_error_type_t -// } context -// struct { -// start *yaml_node_t -// end *yaml_node_t -// top *yaml_node_t -// } nodes = { NULL, NULL, NULL } -// version_directive_copy *yaml_version_directive_t = NULL -// struct { -// start *yaml_tag_directive_t -// end *yaml_tag_directive_t -// top *yaml_tag_directive_t -// } tag_directives_copy = { NULL, NULL, NULL } -// value yaml_tag_directive_t = { NULL, NULL } -// mark yaml_mark_t = { 0, 0, 0 } -// -// assert(document) // Non-NULL document object is expected. -// assert((tag_directives_start && tag_directives_end) || -// (tag_directives_start == tag_directives_end)) -// // Valid tag directives are expected. -// -// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error -// -// if (version_directive) { -// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) -// if (!version_directive_copy) goto error -// version_directive_copy.major = version_directive.major -// version_directive_copy.minor = version_directive.minor -// } -// -// if (tag_directives_start != tag_directives_end) { -// tag_directive *yaml_tag_directive_t -// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) -// goto error -// for (tag_directive = tag_directives_start -// tag_directive != tag_directives_end; tag_directive ++) { -// assert(tag_directive.handle) -// assert(tag_directive.prefix) -// if (!yaml_check_utf8(tag_directive.handle, -// strlen((char *)tag_directive.handle))) -// goto error -// if (!yaml_check_utf8(tag_directive.prefix, -// strlen((char *)tag_directive.prefix))) -// goto error -// value.handle = yaml_strdup(tag_directive.handle) -// value.prefix = yaml_strdup(tag_directive.prefix) -// if (!value.handle || !value.prefix) goto error -// if (!PUSH(&context, tag_directives_copy, value)) -// goto error -// value.handle = NULL -// value.prefix = NULL -// } -// } -// -// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, -// tag_directives_copy.start, tag_directives_copy.top, -// start_implicit, end_implicit, mark, mark) -// -// return 1 -// -//error: -// STACK_DEL(&context, nodes) -// yaml_free(version_directive_copy) -// while (!STACK_EMPTY(&context, tag_directives_copy)) { -// value yaml_tag_directive_t = POP(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// } -// STACK_DEL(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// -// return 0 -//} -// -///* -// * Destroy a document object. -// */ -// -//YAML_DECLARE(void) -//yaml_document_delete(document *yaml_document_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// tag_directive *yaml_tag_directive_t -// -// context.error = YAML_NO_ERROR // Eliminate a compliler warning. -// -// assert(document) // Non-NULL document object is expected. -// -// while (!STACK_EMPTY(&context, document.nodes)) { -// node yaml_node_t = POP(&context, document.nodes) -// yaml_free(node.tag) -// switch (node.type) { -// case YAML_SCALAR_NODE: -// yaml_free(node.data.scalar.value) -// break -// case YAML_SEQUENCE_NODE: -// STACK_DEL(&context, node.data.sequence.items) -// break -// case YAML_MAPPING_NODE: -// STACK_DEL(&context, node.data.mapping.pairs) -// break -// default: -// assert(0) // Should not happen. -// } -// } -// STACK_DEL(&context, document.nodes) -// -// yaml_free(document.version_directive) -// for (tag_directive = document.tag_directives.start -// tag_directive != document.tag_directives.end -// tag_directive++) { -// yaml_free(tag_directive.handle) -// yaml_free(tag_directive.prefix) -// } -// yaml_free(document.tag_directives.start) -// -// memset(document, 0, sizeof(yaml_document_t)) -//} -// -///** -// * Get a document node. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_node(document *yaml_document_t, index int) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (index > 0 && document.nodes.start + index <= document.nodes.top) { -// return document.nodes.start + index - 1 -// } -// return NULL -//} -// -///** -// * Get the root object. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_root_node(document *yaml_document_t) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (document.nodes.top != document.nodes.start) { -// return document.nodes.start -// } -// return NULL -//} -// -///* -// * Add a scalar node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_scalar(document *yaml_document_t, -// tag *yaml_char_t, value *yaml_char_t, length int, -// style yaml_scalar_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// value_copy *yaml_char_t = NULL -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// assert(value) // Non-NULL value is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (length < 0) { -// length = strlen((char *)value) -// } -// -// if (!yaml_check_utf8(value, length)) goto error -// value_copy = yaml_malloc(length+1) -// if (!value_copy) goto error -// memcpy(value_copy, value, length) -// value_copy[length] = '\0' -// -// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// yaml_free(tag_copy) -// yaml_free(value_copy) -// -// return 0 -//} -// -///* -// * Add a sequence node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_sequence(document *yaml_document_t, -// tag *yaml_char_t, style yaml_sequence_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_item_t -// end *yaml_node_item_t -// top *yaml_node_item_t -// } items = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error -// -// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, items) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Add a mapping node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_mapping(document *yaml_document_t, -// tag *yaml_char_t, style yaml_mapping_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_pair_t -// end *yaml_node_pair_t -// top *yaml_node_pair_t -// } pairs = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error -// -// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, pairs) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Append an item to a sequence node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_sequence_item(document *yaml_document_t, -// sequence int, item int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// assert(document) // Non-NULL document is required. -// assert(sequence > 0 -// && document.nodes.start + sequence <= document.nodes.top) -// // Valid sequence id is required. -// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) -// // A sequence node is required. -// assert(item > 0 && document.nodes.start + item <= document.nodes.top) -// // Valid item id is required. -// -// if (!PUSH(&context, -// document.nodes.start[sequence-1].data.sequence.items, item)) -// return 0 -// -// return 1 -//} -// -///* -// * Append a pair of a key and a value to a mapping node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_mapping_pair(document *yaml_document_t, -// mapping int, key int, value int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// pair yaml_node_pair_t -// -// assert(document) // Non-NULL document is required. -// assert(mapping > 0 -// && document.nodes.start + mapping <= document.nodes.top) -// // Valid mapping id is required. -// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) -// // A mapping node is required. -// assert(key > 0 && document.nodes.start + key <= document.nodes.top) -// // Valid key id is required. -// assert(value > 0 && document.nodes.start + value <= document.nodes.top) -// // Valid value id is required. -// -// pair.key = key -// pair.value = value -// -// if (!PUSH(&context, -// document.nodes.start[mapping-1].data.mapping.pairs, pair)) -// return 0 -// -// return 1 -//} -// -// diff --git a/vendor/launchpad.net/goyaml/decode.go b/vendor/launchpad.net/goyaml/decode.go deleted file mode 100644 index 6586be4..0000000 --- a/vendor/launchpad.net/goyaml/decode.go +++ /dev/null @@ -1,473 +0,0 @@ -package goyaml - -import ( - "reflect" - "strconv" -) - -const ( - documentNode = 1 << iota - mappingNode - sequenceNode - scalarNode - aliasNode -) - -type node struct { - kind int - line, column int - tag string - value string - implicit bool - children []*node - anchors map[string]*node -} - -// ---------------------------------------------------------------------------- -// Parser, produces a node tree out of a libyaml event stream. - -type parser struct { - parser yaml_parser_t - event yaml_event_t - doc *node -} - -func newParser(b []byte) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("Failed to initialize YAML emitter") - } - - if len(b) == 0 { - b = []byte{'\n'} - } - - yaml_parser_set_input_string(&p.parser, b) - - p.skip() - if p.event.typ != yaml_STREAM_START_EVENT { - panic("Expected stream start event, got " + strconv.Itoa(int(p.event.typ))) - } - p.skip() - return &p -} - -func (p *parser) destroy() { - if p.event.typ != yaml_NO_EVENT { - yaml_event_delete(&p.event) - } - yaml_parser_delete(&p.parser) -} - -func (p *parser) skip() { - if p.event.typ != yaml_NO_EVENT { - if p.event.typ == yaml_STREAM_END_EVENT { - panic("Attempted to go past the end of stream. Corrupted value?") - } - yaml_event_delete(&p.event) - } - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } -} - -func (p *parser) fail() { - var where string - var line int - if p.parser.problem_mark.line != 0 { - line = p.parser.problem_mark.line - } else if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line - } - if line != 0 { - where = "line " + strconv.Itoa(line) + ": " - } - var msg string - if len(p.parser.problem) > 0 { - msg = p.parser.problem - } else { - msg = "Unknown problem parsing YAML content" - } - panic(where + msg) -} - -func (p *parser) anchor(n *node, anchor []byte) { - if anchor != nil { - p.doc.anchors[string(anchor)] = n - } -} - -func (p *parser) parse() *node { - switch p.event.typ { - case yaml_SCALAR_EVENT: - return p.scalar() - case yaml_ALIAS_EVENT: - return p.alias() - case yaml_MAPPING_START_EVENT: - return p.mapping() - case yaml_SEQUENCE_START_EVENT: - return p.sequence() - case yaml_DOCUMENT_START_EVENT: - return p.document() - case yaml_STREAM_END_EVENT: - // Happens when attempting to decode an empty buffer. - return nil - default: - panic("Attempted to parse unknown event: " + - strconv.Itoa(int(p.event.typ))) - } - panic("Unreachable") -} - -func (p *parser) node(kind int) *node { - return &node{ - kind: kind, - line: p.event.start_mark.line, - column: p.event.start_mark.column, - } -} - -func (p *parser) document() *node { - n := p.node(documentNode) - n.anchors = make(map[string]*node) - p.doc = n - p.skip() - n.children = append(n.children, p.parse()) - if p.event.typ != yaml_DOCUMENT_END_EVENT { - panic("Expected end of document event but got " + - strconv.Itoa(int(p.event.typ))) - } - p.skip() - return n -} - -func (p *parser) alias() *node { - n := p.node(aliasNode) - n.value = string(p.event.anchor) - p.skip() - return n -} - -func (p *parser) scalar() *node { - n := p.node(scalarNode) - n.value = string(p.event.value) - n.tag = string(p.event.tag) - n.implicit = p.event.implicit - p.anchor(n, p.event.anchor) - p.skip() - return n -} - -func (p *parser) sequence() *node { - n := p.node(sequenceNode) - p.anchor(n, p.event.anchor) - p.skip() - for p.event.typ != yaml_SEQUENCE_END_EVENT { - n.children = append(n.children, p.parse()) - } - p.skip() - return n -} - -func (p *parser) mapping() *node { - n := p.node(mappingNode) - p.anchor(n, p.event.anchor) - p.skip() - for p.event.typ != yaml_MAPPING_END_EVENT { - n.children = append(n.children, p.parse(), p.parse()) - } - p.skip() - return n -} - -// ---------------------------------------------------------------------------- -// Decoder, unmarshals a node into a provided value. - -type decoder struct { - doc *node - aliases map[string]bool -} - -func newDecoder() *decoder { - d := &decoder{} - d.aliases = make(map[string]bool) - return d -} - -// d.setter deals with setters and pointer dereferencing and initialization. -// -// It's a slightly convoluted case to handle properly: -// -// - nil pointers should be initialized, unless being set to nil -// - we don't know at this point yet what's the value to SetYAML() with. -// - we can't separate pointer deref/init and setter checking, because -// a setter may be found while going down a pointer chain. -// -// Thus, here is how it takes care of it: -// -// - out is provided as a pointer, so that it can be replaced. -// - when looking at a non-setter ptr, *out=ptr.Elem(), unless tag=!!null -// - when a setter is found, *out=interface{}, and a set() function is -// returned to call SetYAML() with the value of *out once it's defined. -// -func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()) { - again := true - for again { - again = false - setter, _ := (*out).Interface().(Setter) - if tag != "!!null" || setter != nil { - if pv := (*out); pv.Kind() == reflect.Ptr { - if pv.IsNil() { - *out = reflect.New(pv.Type().Elem()).Elem() - pv.Set((*out).Addr()) - } else { - *out = pv.Elem() - } - setter, _ = pv.Interface().(Setter) - again = true - } - } - if setter != nil { - var arg interface{} - *out = reflect.ValueOf(&arg).Elem() - return func() { - *good = setter.SetYAML(tag, arg) - } - } - } - return nil -} - -func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { - switch n.kind { - case documentNode: - good = d.document(n, out) - case scalarNode: - good = d.scalar(n, out) - case aliasNode: - good = d.alias(n, out) - case mappingNode: - good = d.mapping(n, out) - case sequenceNode: - good = d.sequence(n, out) - default: - panic("Internal error: unknown node kind: " + strconv.Itoa(n.kind)) - } - return -} - -func (d *decoder) document(n *node, out reflect.Value) (good bool) { - if len(n.children) == 1 { - d.doc = n - d.unmarshal(n.children[0], out) - return true - } - return false -} - -func (d *decoder) alias(n *node, out reflect.Value) (good bool) { - an, ok := d.doc.anchors[n.value] - if !ok { - panic("Unknown anchor '" + n.value + "' referenced") - } - if d.aliases[n.value] { - panic("Anchor '" + n.value + "' value contains itself") - } - d.aliases[n.value] = true - good = d.unmarshal(an, out) - delete(d.aliases, n.value) - return good -} - -func (d *decoder) scalar(n *node, out reflect.Value) (good bool) { - var tag string - var resolved interface{} - if n.tag == "" && !n.implicit { - resolved = n.value - } else { - tag, resolved = resolve(n.tag, n.value) - if set := d.setter(tag, &out, &good); set != nil { - defer set() - } - } - switch out.Kind() { - case reflect.String: - if resolved != nil { - out.SetString(n.value) - good = true - } - case reflect.Interface: - if resolved == nil { - out.Set(reflect.Zero(out.Type())) - } else { - out.Set(reflect.ValueOf(resolved)) - } - good = true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch resolved := resolved.(type) { - case int: - if !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - good = true - } - case int64: - if !out.OverflowInt(resolved) { - out.SetInt(resolved) - good = true - } - case float64: - if resolved < 1<<63-1 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - good = true - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch resolved := resolved.(type) { - case int: - if resolved >= 0 { - out.SetUint(uint64(resolved)) - good = true - } - case int64: - if resolved >= 0 { - out.SetUint(uint64(resolved)) - good = true - } - case float64: - if resolved < 1<<64-1 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - good = true - } - } - case reflect.Bool: - switch resolved := resolved.(type) { - case bool: - out.SetBool(resolved) - good = true - } - case reflect.Float32, reflect.Float64: - switch resolved := resolved.(type) { - case int: - out.SetFloat(float64(resolved)) - good = true - case int64: - out.SetFloat(float64(resolved)) - good = true - case float64: - out.SetFloat(resolved) - good = true - } - case reflect.Ptr: - switch resolved.(type) { - case nil: - out.Set(reflect.Zero(out.Type())) - good = true - default: - if out.Type().Elem() == reflect.TypeOf(resolved) { - elem := reflect.New(out.Type().Elem()) - elem.Elem().Set(reflect.ValueOf(resolved)) - out.Set(elem) - good = true - } - } - } - return good -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { - if set := d.setter("!!seq", &out, &good); set != nil { - defer set() - } - var iface reflect.Value - if out.Kind() == reflect.Interface { - // No type hints. Will have to use a generic sequence. - iface = out - out = settableValueOf(make([]interface{}, 0)) - } - - if out.Kind() != reflect.Slice { - return false - } - et := out.Type().Elem() - - l := len(n.children) - for i := 0; i < l; i++ { - e := reflect.New(et).Elem() - if ok := d.unmarshal(n.children[i], e); ok { - out.Set(reflect.Append(out, e)) - } - } - if iface.IsValid() { - iface.Set(out) - } - return true -} - -func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { - if set := d.setter("!!map", &out, &good); set != nil { - defer set() - } - if out.Kind() == reflect.Struct { - return d.mappingStruct(n, out) - } - - if out.Kind() == reflect.Interface { - // No type hints. Will have to use a generic map. - iface := out - out = settableValueOf(make(map[interface{}]interface{})) - iface.Set(out) - } - - if out.Kind() != reflect.Map { - return false - } - outt := out.Type() - kt := outt.Key() - et := outt.Elem() - - if out.IsNil() { - out.Set(reflect.MakeMap(outt)) - } - l := len(n.children) - for i := 0; i < l; i += 2 { - k := reflect.New(kt).Elem() - if d.unmarshal(n.children[i], k) { - e := reflect.New(et).Elem() - if d.unmarshal(n.children[i+1], e) { - out.SetMapIndex(k, e) - } - } - } - return true -} - -func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - name := settableValueOf("") - l := len(n.children) - for i := 0; i < l; i += 2 { - if !d.unmarshal(n.children[i], name) { - continue - } - if info, ok := sinfo.FieldsMap[name.String()]; ok { - var field reflect.Value - if info.Inline == nil { - field = out.Field(info.Num) - } else { - field = out.FieldByIndex(info.Inline) - } - d.unmarshal(n.children[i+1], field) - } - } - return true -} diff --git a/vendor/launchpad.net/goyaml/decode_test.go b/vendor/launchpad.net/goyaml/decode_test.go deleted file mode 100644 index 83696b5..0000000 --- a/vendor/launchpad.net/goyaml/decode_test.go +++ /dev/null @@ -1,519 +0,0 @@ -package goyaml_test - -import ( - . "launchpad.net/gocheck" - "launchpad.net/goyaml" - "math" - "reflect" -) - -var unmarshalIntTest = 123 - -var unmarshalTests = []struct { - data string - value interface{} -}{ - { - "", - &struct{}{}, - }, { - "{}", &struct{}{}, - }, { - "v: hi", - map[string]string{"v": "hi"}, - }, { - "v: hi", map[string]interface{}{"v": "hi"}, - }, { - "v: true", - map[string]string{"v": "true"}, - }, { - "v: true", - map[string]interface{}{"v": true}, - }, { - "v: 10", - map[string]interface{}{"v": 10}, - }, { - "v: 0b10", - map[string]interface{}{"v": 2}, - }, { - "v: 0xA", - map[string]interface{}{"v": 10}, - }, { - "v: 4294967296", - map[string]int64{"v": 4294967296}, - }, { - "v: 0.1", - map[string]interface{}{"v": 0.1}, - }, { - "v: .1", - map[string]interface{}{"v": 0.1}, - }, { - "v: .Inf", - map[string]interface{}{"v": math.Inf(+1)}, - }, { - "v: -.Inf", - map[string]interface{}{"v": math.Inf(-1)}, - }, { - "v: -10", - map[string]interface{}{"v": -10}, - }, { - "v: -.1", - map[string]interface{}{"v": -0.1}, - }, - - // Simple values. - { - "123", - &unmarshalIntTest, - }, - - // Floats from spec - { - "canonical: 6.8523e+5", - map[string]interface{}{"canonical": 6.8523e+5}, - }, { - "expo: 685.230_15e+03", - map[string]interface{}{"expo": 685.23015e+03}, - }, { - "fixed: 685_230.15", - map[string]interface{}{"fixed": 685230.15}, - }, { - "neginf: -.inf", - map[string]interface{}{"neginf": math.Inf(-1)}, - }, { - "fixed: 685_230.15", - map[string]float64{"fixed": 685230.15}, - }, - //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported - //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails. - - // Bools from spec - { - "canonical: y", - map[string]interface{}{"canonical": true}, - }, { - "answer: NO", - map[string]interface{}{"answer": false}, - }, { - "logical: True", - map[string]interface{}{"logical": true}, - }, { - "option: on", - map[string]interface{}{"option": true}, - }, { - "option: on", - map[string]bool{"option": true}, - }, - // Ints from spec - { - "canonical: 685230", - map[string]interface{}{"canonical": 685230}, - }, { - "decimal: +685_230", - map[string]interface{}{"decimal": 685230}, - }, { - "octal: 02472256", - map[string]interface{}{"octal": 685230}, - }, { - "hexa: 0x_0A_74_AE", - map[string]interface{}{"hexa": 685230}, - }, { - "bin: 0b1010_0111_0100_1010_1110", - map[string]interface{}{"bin": 685230}, - }, { - "bin: -0b101010", - map[string]interface{}{"bin": -42}, - }, { - "decimal: +685_230", - map[string]int{"decimal": 685230}, - }, - - //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported - - // Nulls from spec - { - "empty:", - map[string]interface{}{"empty": nil}, - }, { - "canonical: ~", - map[string]interface{}{"canonical": nil}, - }, { - "english: null", - map[string]interface{}{"english": nil}, - }, { - "~: null key", - map[interface{}]string{nil: "null key"}, - }, { - "empty:", - map[string]*bool{"empty": nil}, - }, - - // Flow sequence - { - "seq: [A,B]", - map[string]interface{}{"seq": []interface{}{"A", "B"}}, - }, { - "seq: [A,B,C,]", - map[string][]string{"seq": []string{"A", "B", "C"}}, - }, { - "seq: [A,1,C]", - map[string][]string{"seq": []string{"A", "1", "C"}}, - }, { - "seq: [A,1,C]", - map[string][]int{"seq": []int{1}}, - }, { - "seq: [A,1,C]", - map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, - }, - // Block sequence - { - "seq:\n - A\n - B", - map[string]interface{}{"seq": []interface{}{"A", "B"}}, - }, { - "seq:\n - A\n - B\n - C", - map[string][]string{"seq": []string{"A", "B", "C"}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string][]string{"seq": []string{"A", "1", "C"}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string][]int{"seq": []int{1}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, - }, - - // Literal block scalar - { - "scalar: | # Comment\n\n literal\n\n \ttext\n\n", - map[string]string{"scalar": "\nliteral\n\n\ttext\n"}, - }, - - // Folded block scalar - { - "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n", - map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"}, - }, - - // Map inside interface with no type hints. - { - "a: {b: c}", - map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, - }, - - // Structs and type conversions. - { - "hello: world", - &struct{ Hello string }{"world"}, - }, { - "a: {b: c}", - &struct{ A struct{ B string } }{struct{ B string }{"c"}}, - }, { - "a: {b: c}", - &struct{ A *struct{ B string } }{&struct{ B string }{"c"}}, - }, { - "a: {b: c}", - &struct{ A map[string]string }{map[string]string{"b": "c"}}, - }, { - "a: {b: c}", - &struct{ A *map[string]string }{&map[string]string{"b": "c"}}, - }, { - "a:", - &struct{ A map[string]string }{}, - }, { - "a: 1", - &struct{ A int }{1}, - }, { - "a: 1", - &struct{ A float64 }{1}, - }, { - "a: 1.0", - &struct{ A int }{1}, - }, { - "a: 1.0", - &struct{ A uint }{1}, - }, { - "a: [1, 2]", - &struct{ A []int }{[]int{1, 2}}, - }, { - "a: 1", - &struct{ B int }{0}, - }, { - "a: 1", - &struct { - B int "a" - }{1}, - }, { - "a: y", - &struct{ A bool }{true}, - }, - - // Some cross type conversions - { - "v: 42", - map[string]uint{"v": 42}, - }, { - "v: -42", - map[string]uint{}, - }, { - "v: 4294967296", - map[string]uint64{"v": 4294967296}, - }, { - "v: -4294967296", - map[string]uint64{}, - }, - - // Overflow cases. - { - "v: 4294967297", - map[string]int32{}, - }, { - "v: 128", - map[string]int8{}, - }, - - // Quoted values. - { - "'1': '\"2\"'", - map[interface{}]interface{}{"1": "\"2\""}, - }, { - "v:\n- A\n- 'B\n\n C'\n", - map[string][]string{"v": []string{"A", "B\nC"}}, - }, - - // Explicit tags. - { - "v: !!float '1.1'", - map[string]interface{}{"v": 1.1}, - }, { - "v: !!null ''", - map[string]interface{}{"v": nil}, - }, { - "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'", - map[string]interface{}{"v": 1}, - }, - - // Anchors and aliases. - { - "a: &x 1\nb: &y 2\nc: *x\nd: *y\n", - &struct{ A, B, C, D int }{1, 2, 1, 2}, - }, { - "a: &a {c: 1}\nb: *a", - &struct { - A, B struct { - C int - } - }{struct{ C int }{1}, struct{ C int }{1}}, - }, { - "a: &a [1, 2]\nb: *a", - &struct{ B []int }{[]int{1, 2}}, - }, - - // Bug #1133337 - { - "foo: ''", - map[string]*string{"foo": new(string)}, - }, { - "foo: null", - map[string]string{}, - }, - - // Ignored field - { - "a: 1\nb: 2\n", - &struct { - A int - B int "-" - }{1, 0}, - }, - - // Bug #1191981 - { - "" + - "%YAML 1.1\n" + - "--- !!str\n" + - `"Generic line break (no glyph)\n\` + "\n" + - ` Generic line break (glyphed)\n\` + "\n" + - ` Line separator\u2028\` + "\n" + - ` Paragraph separator\u2029"` + "\n", - "" + - "Generic line break (no glyph)\n" + - "Generic line break (glyphed)\n" + - "Line separator\u2028Paragraph separator\u2029", - }, - - // Struct inlining - { - "a: 1\nb: 2\nc: 3\n", - &struct { - A int - C inlineB `yaml:",inline"` - }{1, inlineB{2, inlineC{3}}}, - }, -} - -type inlineB struct { - B int - inlineC `yaml:",inline"` -} - -type inlineC struct { - C int -} - -func (s *S) TestUnmarshal(c *C) { - for i, item := range unmarshalTests { - t := reflect.ValueOf(item.value).Type() - var value interface{} - switch t.Kind() { - case reflect.Map: - value = reflect.MakeMap(t).Interface() - case reflect.String: - t := reflect.ValueOf(item.value).Type() - v := reflect.New(t) - value = v.Interface() - default: - pt := reflect.ValueOf(item.value).Type() - pv := reflect.New(pt.Elem()) - value = pv.Interface() - } - err := goyaml.Unmarshal([]byte(item.data), value) - c.Assert(err, IsNil, Commentf("Item #%d", i)) - if t.Kind() == reflect.String { - c.Assert(*value.(*string), Equals, item.value, Commentf("Item #%d", i)) - } else { - c.Assert(value, DeepEquals, item.value, Commentf("Item #%d", i)) - } - } -} - -func (s *S) TestUnmarshalNaN(c *C) { - value := map[string]interface{}{} - err := goyaml.Unmarshal([]byte("notanum: .NaN"), &value) - c.Assert(err, IsNil) - c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true) -} - -var unmarshalErrorTests = []struct { - data, error string -}{ - {"v: !!float 'error'", "YAML error: Can't decode !!str 'error' as a !!float"}, - {"v: [A,", "YAML error: line 1: did not find expected node content"}, - {"v:\n- [A,", "YAML error: line 2: did not find expected node content"}, - {"a: *b\n", "YAML error: Unknown anchor 'b' referenced"}, - {"a: &a\n b: *a\n", "YAML error: Anchor 'a' value contains itself"}, - {"value: -", "YAML error: block sequence entries are not allowed in this context"}, -} - -func (s *S) TestUnmarshalErrors(c *C) { - for _, item := range unmarshalErrorTests { - var value interface{} - err := goyaml.Unmarshal([]byte(item.data), &value) - c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) - } -} - -var setterTests = []struct { - data, tag string - value interface{} -}{ - {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}}, - {"_: [1,A]", "!!seq", []interface{}{1, "A"}}, - {"_: 10", "!!int", 10}, - {"_: null", "!!null", nil}, - {"_: !!foo 'BAR!'", "!!foo", "BAR!"}, -} - -var setterResult = map[int]bool{} - -type typeWithSetter struct { - tag string - value interface{} -} - -func (o *typeWithSetter) SetYAML(tag string, value interface{}) (ok bool) { - o.tag = tag - o.value = value - if i, ok := value.(int); ok { - if result, ok := setterResult[i]; ok { - return result - } - } - return true -} - -type typeWithSetterField struct { - Field *typeWithSetter "_" -} - -func (s *S) TestUnmarshalWithSetter(c *C) { - for _, item := range setterTests { - obj := &typeWithSetterField{} - err := goyaml.Unmarshal([]byte(item.data), obj) - c.Assert(err, IsNil) - c.Assert(obj.Field, NotNil, - Commentf("Pointer not initialized (%#v)", item.value)) - c.Assert(obj.Field.tag, Equals, item.tag) - c.Assert(obj.Field.value, DeepEquals, item.value) - } -} - -func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { - obj := &typeWithSetter{} - err := goyaml.Unmarshal([]byte(setterTests[0].data), obj) - c.Assert(err, IsNil) - c.Assert(obj.tag, Equals, setterTests[0].tag) - value, ok := obj.value.(map[interface{}]interface{}) - c.Assert(ok, Equals, true) - c.Assert(value["_"], DeepEquals, setterTests[0].value) -} - -func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) { - setterResult[2] = false - setterResult[4] = false - defer func() { - delete(setterResult, 2) - delete(setterResult, 4) - }() - - m := map[string]*typeWithSetter{} - data := "{abc: 1, def: 2, ghi: 3, jkl: 4}" - err := goyaml.Unmarshal([]byte(data), m) - c.Assert(err, IsNil) - c.Assert(m["abc"], NotNil) - c.Assert(m["def"], IsNil) - c.Assert(m["ghi"], NotNil) - c.Assert(m["jkl"], IsNil) - - c.Assert(m["abc"].value, Equals, 1) - c.Assert(m["ghi"].value, Equals, 3) -} - -//var data []byte -//func init() { -// var err error -// data, err = ioutil.ReadFile("/tmp/file.yaml") -// if err != nil { -// panic(err) -// } -//} -// -//func (s *S) BenchmarkUnmarshal(c *C) { -// var err error -// for i := 0; i < c.N; i++ { -// var v map[string]interface{} -// err = goyaml.Unmarshal(data, &v) -// } -// if err != nil { -// panic(err) -// } -//} -// -//func (s *S) BenchmarkMarshal(c *C) { -// var v map[string]interface{} -// goyaml.Unmarshal(data, &v) -// c.ResetTimer() -// for i := 0; i < c.N; i++ { -// goyaml.Marshal(&v) -// } -//} diff --git a/vendor/launchpad.net/goyaml/emitterc.go b/vendor/launchpad.net/goyaml/emitterc.go deleted file mode 100644 index 49c7f46..0000000 --- a/vendor/launchpad.net/goyaml/emitterc.go +++ /dev/null @@ -1,1682 +0,0 @@ -package goyaml - -import ( - "bytes" -) - -// Flush the buffer if needed. -func flush(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) { - return yaml_emitter_flush(emitter) - } - return true -} - -// Put a character to the output buffer. -func put(emitter *yaml_emitter_t, value byte) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - emitter.buffer[emitter.buffer_pos] = value - emitter.buffer_pos++ - emitter.column++ - return true -} - -// Put a line break to the output buffer. -func put_break(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - switch emitter.line_break { - case yaml_CR_BREAK: - emitter.buffer[emitter.buffer_pos] = '\r' - emitter.buffer_pos += 1 - case yaml_LN_BREAK: - emitter.buffer[emitter.buffer_pos] = '\n' - emitter.buffer_pos += 1 - case yaml_CRLN_BREAK: - emitter.buffer[emitter.buffer_pos+0] = '\r' - emitter.buffer[emitter.buffer_pos+1] = '\n' - emitter.buffer_pos += 2 - default: - panic("unknown line break setting") - } - emitter.column = 0 - emitter.line++ - return true -} - -// Copy a character from a string into buffer. -func write(emitter *yaml_emitter_t, s []byte, i *int) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - p := emitter.buffer_pos - w := width(s[*i]) - switch w { - case 4: - emitter.buffer[p+3] = s[*i+3] - fallthrough - case 3: - emitter.buffer[p+2] = s[*i+2] - fallthrough - case 2: - emitter.buffer[p+1] = s[*i+1] - fallthrough - case 1: - emitter.buffer[p+0] = s[*i+0] - default: - panic("unknown character width") - } - emitter.column++ - emitter.buffer_pos += w - *i += w - return true -} - -// Write a whole string into buffer. -func write_all(emitter *yaml_emitter_t, s []byte) bool { - for i := 0; i < len(s); { - if !write(emitter, s, &i) { - return false - } - } - return true -} - -// Copy a line break character from a string into buffer. -func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { - if s[*i] == '\n' { - if !put_break(emitter) { - return false - } - *i++ - } else { - if !write(emitter, s, i) { - return false - } - emitter.column = 0 - emitter.line++ - } - return true -} - -// Set an emitter error and return false. -func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_EMITTER_ERROR - emitter.problem = problem - return false -} - -// Emit an event. -func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.events = append(emitter.events, *event) - for !yaml_emitter_need_more_events(emitter) { - event := &emitter.events[emitter.events_head] - if !yaml_emitter_analyze_event(emitter, event) { - return false - } - if !yaml_emitter_state_machine(emitter, event) { - return false - } - yaml_event_delete(event) - emitter.events_head++ - } - return true -} - -// Check if we need to accumulate more events before emitting. -// -// We accumulate extra -// - 1 event for DOCUMENT-START -// - 2 events for SEQUENCE-START -// - 3 events for MAPPING-START -// -func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { - if emitter.events_head == len(emitter.events) { - return true - } - var accumulate int - switch emitter.events[emitter.events_head].typ { - case yaml_DOCUMENT_START_EVENT: - accumulate = 1 - break - case yaml_SEQUENCE_START_EVENT: - accumulate = 2 - break - case yaml_MAPPING_START_EVENT: - accumulate = 3 - break - default: - return false - } - if len(emitter.events)-emitter.events_head > accumulate { - return false - } - var level int - for i := emitter.events_head; i < len(emitter.events); i++ { - switch emitter.events[i].typ { - case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: - level++ - case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: - level-- - } - if level == 0 { - return false - } - } - return true -} - -// Append a directive to the directives stack. -func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { - for i := 0; i < len(emitter.tag_directives); i++ { - if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") - } - } - - // [Go] Do we actually need to copy this given garbage collection - // and the lack of deallocating destructors? - tag_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(tag_copy.handle, value.handle) - copy(tag_copy.prefix, value.prefix) - emitter.tag_directives = append(emitter.tag_directives, tag_copy) - return true -} - -// Increase the indentation level. -func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { - emitter.indents = append(emitter.indents, emitter.indent) - if emitter.indent < 0 { - if flow { - emitter.indent = emitter.best_indent - } else { - emitter.indent = 0 - } - } else if !indentless { - emitter.indent += emitter.best_indent - } - return true -} - -// State dispatcher. -func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { - switch emitter.state { - default: - case yaml_EMIT_STREAM_START_STATE: - return yaml_emitter_emit_stream_start(emitter, event) - - case yaml_EMIT_FIRST_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, true) - - case yaml_EMIT_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, false) - - case yaml_EMIT_DOCUMENT_CONTENT_STATE: - return yaml_emitter_emit_document_content(emitter, event) - - case yaml_EMIT_DOCUMENT_END_STATE: - return yaml_emitter_emit_document_end(emitter, event) - - case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, true) - - case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false) - - case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false) - - case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, false) - - case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, true) - - case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, false) - - case yaml_EMIT_END_STATE: - return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") - } - panic("invalid emitter state") -} - -// Expect STREAM-START. -func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_STREAM_START_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") - } - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = event.encoding - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = yaml_UTF8_ENCODING - } - } - if emitter.best_indent < 2 || emitter.best_indent > 9 { - emitter.best_indent = 2 - } - if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { - emitter.best_width = 80 - } - if emitter.best_width < 0 { - emitter.best_width = 1<<31 - 1 - } - if emitter.line_break == yaml_ANY_BREAK { - emitter.line_break = yaml_LN_BREAK - } - - emitter.indent = -1 - emitter.line = 0 - emitter.column = 0 - emitter.whitespace = true - emitter.indention = true - - if emitter.encoding != yaml_UTF8_ENCODING { - if !yaml_emitter_write_bom(emitter) { - return false - } - } - emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE - return true -} - -// Expect DOCUMENT-START or STREAM-END. -func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - - if event.typ == yaml_DOCUMENT_START_EVENT { - - if event.version_directive != nil { - if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { - return false - } - } - - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { - return false - } - if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { - return false - } - } - - for i := 0; i < len(default_tag_directives); i++ { - tag_directive := &default_tag_directives[i] - if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { - return false - } - } - - implicit := event.implicit - if !first || emitter.canonical { - implicit = false - } - - if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if event.version_directive != nil { - implicit = false - if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if len(event.tag_directives) > 0 { - implicit = false - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { - return false - } - if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if yaml_emitter_check_empty_document(emitter) { - implicit = false - } - if !implicit { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { - return false - } - if emitter.canonical { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE - return true - } - - if event.typ == yaml_STREAM_END_EVENT { - if emitter.open_ended { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_END_STATE - return true - } - - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") -} - -// Expect the root node. -func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) - return yaml_emitter_emit_node(emitter, event, true, false, false, false) -} - -// Expect DOCUMENT-END. -func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_DOCUMENT_END_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !event.implicit { - // [Go] Allocate the slice elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_DOCUMENT_START_STATE - emitter.tag_directives = emitter.tag_directives[:0] - return true -} - -// Expect a flow item node. -func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - - return true - } - - if !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) -} - -// Expect a flow key node. -func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_MAPPING_END_EVENT { - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - - if !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a flow value node. -func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block item node. -func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { - return false - } - } - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) -} - -// Expect a block key node. -func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, false) { - return false - } - } - if event.typ == yaml_MAPPING_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block value node. -func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a node. -func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, - root bool, sequence bool, mapping bool, simple_key bool) bool { - - emitter.root_context = root - emitter.sequence_context = sequence - emitter.mapping_context = mapping - emitter.simple_key_context = simple_key - - switch event.typ { - case yaml_ALIAS_EVENT: - return yaml_emitter_emit_alias(emitter, event) - case yaml_SCALAR_EVENT: - return yaml_emitter_emit_scalar(emitter, event) - case yaml_SEQUENCE_START_EVENT: - return yaml_emitter_emit_sequence_start(emitter, event) - case yaml_MAPPING_START_EVENT: - return yaml_emitter_emit_mapping_start(emitter, event) - default: - return yaml_emitter_set_emitter_error(emitter, - "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS") - } - return false -} - -// Expect ALIAS. -func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SCALAR. -func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_select_scalar_style(emitter, event) { - return false - } - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - if !yaml_emitter_process_scalar(emitter) { - return false - } - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SEQUENCE-START. -func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || - yaml_emitter_check_empty_sequence(emitter) { - emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE - } - return true -} - -// Expect MAPPING-START. -func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || - yaml_emitter_check_empty_mapping(emitter) { - emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE - } - return true -} - -// Check if the document content is an empty scalar. -func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { - return false // [Go] Huh? -} - -// Check if the next events represent an empty sequence. -func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT -} - -// Check if the next events represent an empty mapping. -func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT -} - -// Check if the next node can be expressed as a simple key. -func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { - length := 0 - switch emitter.events[emitter.events_head].typ { - case yaml_ALIAS_EVENT: - length += len(emitter.anchor_data.anchor) - case yaml_SCALAR_EVENT: - if emitter.scalar_data.multiline { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) + - len(emitter.scalar_data.value) - case yaml_SEQUENCE_START_EVENT: - if !yaml_emitter_check_empty_sequence(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - case yaml_MAPPING_START_EVENT: - if !yaml_emitter_check_empty_mapping(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - default: - return false - } - return length <= 128 -} - -// Determine an acceptable scalar style. -func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 - if no_tag && !event.implicit && !event.quoted_implicit { - return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") - } - - style := event.scalar_style() - if style == yaml_ANY_SCALAR_STYLE { - style = yaml_PLAIN_SCALAR_STYLE - } - if emitter.canonical { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - if emitter.simple_key_context && emitter.scalar_data.multiline { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - if style == yaml_PLAIN_SCALAR_STYLE { - if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || - emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if no_tag && !event.implicit { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { - if !emitter.scalar_data.single_quoted_allowed { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { - if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - - if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { - emitter.tag_data.handle = []byte{'!'} - } - emitter.scalar_data.style = style - return true -} - -// Write an achor. -func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { - if emitter.anchor_data.anchor == nil { - return true - } - c := []byte{'&'} - if emitter.anchor_data.alias { - c[0] = '*' - } - if !yaml_emitter_write_indicator(emitter, c, true, false, false) { - return false - } - return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) -} - -// Write a tag. -func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { - if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { - return true - } - if len(emitter.tag_data.handle) > 0 { - if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { - return false - } - if len(emitter.tag_data.suffix) > 0 { - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - } - } else { - // [Go] Allocate these slices elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { - return false - } - } - return true -} - -// Write a scalar. -func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { - switch emitter.scalar_data.style { - case yaml_PLAIN_SCALAR_STYLE: - return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_SINGLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_DOUBLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_LITERAL_SCALAR_STYLE: - return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) - - case yaml_FOLDED_SCALAR_STYLE: - return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) - } - panic("unknown scalar style") -} - -// Check if a %YAML directive is valid. -func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { - if version_directive.major != 1 || version_directive.minor != 1 { - return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") - } - return true -} - -// Check if a %TAG directive is valid. -func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { - handle := tag_directive.handle - prefix := tag_directive.prefix - if len(handle) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") - } - if handle[0] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") - } - if handle[len(handle)-1] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") - } - for i := 1; i < len(handle)-1; i += width(handle[i]) { - if !is_alpha(handle, i) { - return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") - } - } - if len(prefix) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") - } - return true -} - -// Check if an anchor is valid. -func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { - if len(anchor) == 0 { - problem := "anchor value must not be empty" - if alias { - problem = "alias value must not be empty" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - for i := 0; i < len(anchor); i += width(anchor[i]) { - if !is_alpha(anchor, i) { - problem := "anchor value must contain alphanumerical characters only" - if alias { - problem = "alias value must contain alphanumerical characters only" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - } - emitter.anchor_data.anchor = anchor - emitter.anchor_data.alias = alias - return true -} - -// Check if a tag is valid. -func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { - if len(tag) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") - } - for i := 0; i < len(emitter.tag_directives); i++ { - tag_directive := &emitter.tag_directives[i] - if bytes.HasPrefix(tag, tag_directive.prefix) { - emitter.tag_data.handle = tag_directive.handle - emitter.tag_data.suffix = tag[len(tag_directive.prefix):] - } - return true - } - emitter.tag_data.suffix = tag - return true -} - -// Check if a scalar is valid. -func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { - var ( - block_indicators = false - flow_indicators = false - line_breaks = false - special_characters = false - - leading_space = false - leading_break = false - trailing_space = false - trailing_break = false - break_space = false - space_break = false - - preceeded_by_whitespace = false - followed_by_whitespace = false - previous_space = false - previous_break = false - ) - - emitter.scalar_data.value = value - - if len(value) == 0 { - emitter.scalar_data.multiline = false - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = false - return true - } - - if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { - block_indicators = true - flow_indicators = true - } - - preceeded_by_whitespace = true - for i, w := 0, 0; i < len(value); i += w { - w = width(value[0]) - followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) - - if i == 0 { - switch value[i] { - case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': - flow_indicators = true - block_indicators = true - case '?', ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '-': - if followed_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } else { - switch value[i] { - case ',', '?', '[', ']', '{', '}': - flow_indicators = true - case ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '#': - if preceeded_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } - - if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { - special_characters = true - } - if is_space(value, i) { - if i == 0 { - leading_space = true - } - if i+width(value[i]) == len(value) { - trailing_space = true - } - if previous_break { - break_space = true - } - previous_space = true - previous_break = false - } else if is_break(value, i) { - line_breaks = true - if i == 0 { - leading_break = true - } - if i+width(value[i]) == len(value) { - trailing_break = true - } - if previous_space { - space_break = true - } - previous_space = false - previous_break = true - } else { - previous_space = false - previous_break = false - } - - // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. - preceeded_by_whitespace = is_blankz(value, i) - } - - emitter.scalar_data.multiline = line_breaks - emitter.scalar_data.flow_plain_allowed = true - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = true - - if leading_space || leading_break || trailing_space || trailing_break { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if trailing_space { - emitter.scalar_data.block_allowed = false - } - if break_space { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || special_characters { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - emitter.scalar_data.block_allowed = false - } - if line_breaks { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if flow_indicators { - emitter.scalar_data.flow_plain_allowed = false - } - if block_indicators { - emitter.scalar_data.block_plain_allowed = false - } - return true -} - -// Check if the event data is valid. -func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - emitter.anchor_data.anchor = nil - emitter.tag_data.handle = nil - emitter.tag_data.suffix = nil - emitter.scalar_data.value = nil - - switch event.typ { - case yaml_ALIAS_EVENT: - if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { - return false - } - - case yaml_SCALAR_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - if !yaml_emitter_analyze_scalar(emitter, event.value) { - return false - } - - case yaml_SEQUENCE_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - - case yaml_MAPPING_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - } - return true -} - -// Write the BOM character. -func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { - if !flush(emitter) { - return false - } - pos := emitter.buffer_pos - emitter.buffer[pos+0] = '\xEF' - emitter.buffer[pos+1] = '\xBB' - emitter.buffer[pos+2] = '\xBF' - emitter.buffer_pos += 3 - return true -} - -func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { - indent := emitter.indent - if indent < 0 { - indent = 0 - } - if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { - if !put_break(emitter) { - return false - } - } - for emitter.column < indent { - if !put(emitter, ' ') { - return false - } - } - emitter.whitespace = true - emitter.indention = true - return true -} - -func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, indicator) { - return false - } - emitter.whitespace = is_whitespace - emitter.indention = (emitter.indention && is_indention) - emitter.open_ended = false - return true -} - -func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - for i := 0; i < len(value); { - var must_write bool - switch value[i] { - case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': - must_write = true - default: - must_write = is_alpha(value, i) - } - if must_write { - if !write(emitter, value, &i) { - return false - } - } else { - w := width(value[i]) - for k := 0; k < w; k++ { - octet := value[i] - i++ - - c := octet >> 4 - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - - c = octet & 0x0f - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - } - } - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - - emitter.whitespace = false - emitter.indention = false - if emitter.root_context { - emitter.open_ended = true - } - - return true -} - -func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { - return false - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if value[i] == '\'' { - if !put(emitter, '\'') { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - spaces := false - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { - return false - } - - for i := 0; i < len(value); { - if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || - is_bom(value, i) || is_break(value, i) || - value[i] == '"' || value[i] == '\\' { - - octet := value[i] - - var w int - var v rune - switch { - case octet&0x80 == 0x00: - w, v = 1, rune(octet&0x7F) - case octet&0xE0 == 0xC0: - w, v = 2, rune(octet&0x1F) - case octet&0xF0 == 0xE0: - w, v = 3, rune(octet&0x0F) - case octet&0xF8 == 0xF0: - w, v = 4, rune(octet&0x07) - } - for k := 1; k < w; k++ { - octet = value[i+k] - v = (v << 6) + (rune(octet) & 0x3F) - } - i += w - - if !put(emitter, '\\') { - return false - } - - var ok bool - switch v { - case 0x00: - ok = put(emitter, '0') - case 0x07: - ok = put(emitter, 'a') - case 0x08: - ok = put(emitter, 'b') - case 0x09: - ok = put(emitter, 't') - case 0x0A: - ok = put(emitter, 'n') - case 0x0b: - ok = put(emitter, 'v') - case 0x0c: - ok = put(emitter, 'f') - case 0x0d: - ok = put(emitter, 'r') - case 0x1b: - ok = put(emitter, 'e') - case 0x22: - ok = put(emitter, '"') - case 0x5c: - ok = put(emitter, '\\') - case 0x85: - ok = put(emitter, 'N') - case 0xA0: - ok = put(emitter, '_') - case 0x2028: - ok = put(emitter, 'L') - case 0x2029: - ok = put(emitter, 'P') - default: - if v <= 0xFF { - ok = put(emitter, 'x') - w = 2 - } else if v <= 0xFFFF { - ok = put(emitter, 'u') - w = 4 - } else { - ok = put(emitter, 'U') - w = 8 - } - for k := (w - 1) * 4; ok && k >= 0; k -= 4 { - digit := byte((v >> uint(k)) & 0x0F) - if digit < 10 { - ok = put(emitter, digit+'0') - } else { - ok = put(emitter, digit+'A'-10) - } - } - } - if !ok { - return false - } - spaces = false - } else if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if is_space(value, i+1) { - if !put(emitter, '\\') { - return false - } - } - i += width(value[i]) - } else if !write(emitter, value, &i) { - return false - } - spaces = true - } else { - if !write(emitter, value, &i) { - return false - } - spaces = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { - if is_space(value, 0) || is_break(value, 0) { - indent_hint := []byte{'0' + byte(emitter.best_indent)} - if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { - return false - } - } - - emitter.open_ended = false - - var chomp_hint [1]byte - if len(value) == 0 { - chomp_hint[0] = '-' - } else { - i := len(value) - 1 - for value[i]&0xC0 == 0x80 { - i-- - } - if !is_break(value, i) { - chomp_hint[0] = '-' - } else if i == 0 { - chomp_hint[0] = '+' - emitter.open_ended = true - } else { - i-- - for value[i]&0xC0 == 0x80 { - i-- - } - if is_break(value, i) { - chomp_hint[0] = '+' - emitter.open_ended = true - } - } - } - if chomp_hint[0] != 0 { - if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { - return false - } - } - return true -} - -func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - if !put_break(emitter) { - return false - } - emitter.indention = true - emitter.whitespace = true - breaks := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - - return true -} - -func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - - if !put_break(emitter) { - return false - } - emitter.indention = true - emitter.whitespace = true - - breaks := true - leading_spaces := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !breaks && !leading_spaces && value[i] == '\n' { - k := 0 - for is_break(value, k) { - k += width(value[k]) - } - if !is_blankz(value, k) { - if !put_break(emitter) { - return false - } - } - } - if !write_break(emitter, value, &i) { - return false - } - emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - leading_spaces = is_blank(value, i) - } - if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - emitter.indention = false - breaks = false - } - } - return true -} diff --git a/vendor/launchpad.net/goyaml/encode.go b/vendor/launchpad.net/goyaml/encode.go deleted file mode 100644 index b228a10..0000000 --- a/vendor/launchpad.net/goyaml/encode.go +++ /dev/null @@ -1,221 +0,0 @@ -package goyaml - -import ( - "reflect" - "sort" - "strconv" -) - -type encoder struct { - emitter yaml_emitter_t - event yaml_event_t - out []byte - flow bool -} - -func newEncoder() (e *encoder) { - e = &encoder{} - e.must(yaml_emitter_initialize(&e.emitter)) - yaml_emitter_set_output_string(&e.emitter, &e.out) - e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)) - e.emit() - e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true)) - e.emit() - return e -} - -func (e *encoder) finish() { - e.must(yaml_document_end_event_initialize(&e.event, true)) - e.emit() - e.emitter.open_ended = false - e.must(yaml_stream_end_event_initialize(&e.event)) - e.emit() -} - -func (e *encoder) destroy() { - yaml_emitter_delete(&e.emitter) -} - -func (e *encoder) emit() { - // This will internally delete the e.event value. - if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT { - e.must(false) - } -} - -func (e *encoder) must(ok bool) { - if !ok { - msg := e.emitter.problem - if msg == "" { - msg = "Unknown problem generating YAML content" - } - panic(msg) - } -} - -func (e *encoder) marshal(tag string, in reflect.Value) { - var value interface{} - if getter, ok := in.Interface().(Getter); ok { - tag, value = getter.GetYAML() - if value == nil { - e.nilv() - return - } - in = reflect.ValueOf(value) - } - switch in.Kind() { - case reflect.Interface: - if in.IsNil() { - e.nilv() - } else { - e.marshal(tag, in.Elem()) - } - case reflect.Map: - e.mapv(tag, in) - case reflect.Ptr: - if in.IsNil() { - e.nilv() - } else { - e.marshal(tag, in.Elem()) - } - case reflect.Struct: - e.structv(tag, in) - case reflect.Slice: - e.slicev(tag, in) - case reflect.String: - e.stringv(tag, in) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - e.intv(tag, in) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.uintv(tag, in) - case reflect.Float32, reflect.Float64: - e.floatv(tag, in) - case reflect.Bool: - e.boolv(tag, in) - default: - panic("Can't marshal type yet: " + in.Type().String()) - } -} - -func (e *encoder) mapv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - keys := keyList(in.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - e.marshal("", k) - e.marshal("", in.MapIndex(k)) - } - }) -} - -func (e *encoder) structv(tag string, in reflect.Value) { - sinfo, err := getStructInfo(in.Type()) - if err != nil { - panic(err) - } - e.mappingv(tag, func() { - for _, info := range sinfo.FieldsList { - var value reflect.Value - if info.Inline == nil { - value = in.Field(info.Num) - } else { - value = in.FieldByIndex(info.Inline) - } - if info.OmitEmpty && isZero(value) { - continue - } - e.marshal("", reflect.ValueOf(info.Key)) - e.flow = info.Flow - e.marshal("", value) - } - }) -} - -func (e *encoder) mappingv(tag string, f func()) { - implicit := tag == "" - style := yaml_BLOCK_MAPPING_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_MAPPING_STYLE - } - e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - f() - e.must(yaml_mapping_end_event_initialize(&e.event)) - e.emit() -} - -func (e *encoder) slicev(tag string, in reflect.Value) { - implicit := tag == "" - style := yaml_BLOCK_SEQUENCE_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - n := in.Len() - for i := 0; i < n; i++ { - e.marshal("", in.Index(i)) - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.emit() -} - -func (e *encoder) stringv(tag string, in reflect.Value) { - var style yaml_scalar_style_t - s := in.String() - if rtag, _ := resolve("", s); rtag != "!!str" { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } else { - style = yaml_PLAIN_SCALAR_STYLE - } - e.emitScalar(s, "", tag, style) -} - -func (e *encoder) boolv(tag string, in reflect.Value) { - var s string - if in.Bool() { - s = "true" - } else { - s = "false" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) intv(tag string, in reflect.Value) { - s := strconv.FormatInt(in.Int(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) uintv(tag string, in reflect.Value) { - s := strconv.FormatUint(in.Uint(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) floatv(tag string, in reflect.Value) { - // FIXME: Handle 64 bits here. - s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32) - switch s { - case "+Inf": - s = ".inf" - case "-Inf": - s = "-.inf" - case "NaN": - s = ".nan" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) nilv() { - e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { - implicit := tag == "" - if !implicit { - style = yaml_PLAIN_SCALAR_STYLE - } - e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) - e.emit() -} diff --git a/vendor/launchpad.net/goyaml/encode_test.go b/vendor/launchpad.net/goyaml/encode_test.go deleted file mode 100644 index 2887466..0000000 --- a/vendor/launchpad.net/goyaml/encode_test.go +++ /dev/null @@ -1,379 +0,0 @@ -package goyaml_test - -import ( - "fmt" - . "launchpad.net/gocheck" - "launchpad.net/goyaml" - "math" - "strconv" - "strings" -) - -var marshalIntTest = 123 - -var marshalTests = []struct { - value interface{} - data string -}{ - { - &struct{}{}, - "{}\n", - }, { - map[string]string{"v": "hi"}, - "v: hi\n", - }, { - map[string]interface{}{"v": "hi"}, - "v: hi\n", - }, { - map[string]string{"v": "true"}, - "v: \"true\"\n", - }, { - map[string]string{"v": "false"}, - "v: \"false\"\n", - }, { - map[string]interface{}{"v": true}, - "v: true\n", - }, { - map[string]interface{}{"v": false}, - "v: false\n", - }, { - map[string]interface{}{"v": 10}, - "v: 10\n", - }, { - map[string]interface{}{"v": -10}, - "v: -10\n", - }, { - map[string]uint{"v": 42}, - "v: 42\n", - }, { - map[string]interface{}{"v": int64(4294967296)}, - "v: 4294967296\n", - }, { - map[string]int64{"v": int64(4294967296)}, - "v: 4294967296\n", - }, { - map[string]uint64{"v": 4294967296}, - "v: 4294967296\n", - }, { - map[string]interface{}{"v": "10"}, - "v: \"10\"\n", - }, { - map[string]interface{}{"v": 0.1}, - "v: 0.1\n", - }, { - map[string]interface{}{"v": float64(0.1)}, - "v: 0.1\n", - }, { - map[string]interface{}{"v": -0.1}, - "v: -0.1\n", - }, { - map[string]interface{}{"v": math.Inf(+1)}, - "v: .inf\n", - }, { - map[string]interface{}{"v": math.Inf(-1)}, - "v: -.inf\n", - }, { - map[string]interface{}{"v": math.NaN()}, - "v: .nan\n", - }, { - map[string]interface{}{"v": nil}, - "v: null\n", - }, { - map[string]interface{}{"v": ""}, - "v: \"\"\n", - }, { - map[string][]string{"v": []string{"A", "B"}}, - "v:\n- A\n- B\n", - }, { - map[string][]string{"v": []string{"A", "B\nC"}}, - "v:\n- A\n- 'B\n\n C'\n", - }, { - map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}}, - "v:\n- A\n- 1\n- B:\n - 2\n - 3\n", - }, { - map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, - "a:\n b: c\n", - }, { - map[string]interface{}{"a": "-"}, - "a: '-'\n", - }, - - // Simple values. - { - &marshalIntTest, - "123\n", - }, - - // Structures - { - &struct{ Hello string }{"world"}, - "hello: world\n", - }, { - &struct { - A struct { - B string - } - }{struct{ B string }{"c"}}, - "a:\n b: c\n", - }, { - &struct { - A *struct { - B string - } - }{&struct{ B string }{"c"}}, - "a:\n b: c\n", - }, { - &struct { - A *struct { - B string - } - }{}, - "a: null\n", - }, { - &struct{ A int }{1}, - "a: 1\n", - }, { - &struct{ A []int }{[]int{1, 2}}, - "a:\n- 1\n- 2\n", - }, { - &struct { - B int "a" - }{1}, - "a: 1\n", - }, { - &struct{ A bool }{true}, - "a: true\n", - }, - - // Conditional flag - { - &struct { - A int "a,omitempty" - B int "b,omitempty" - }{1, 0}, - "a: 1\n", - }, { - &struct { - A int "a,omitempty" - B int "b,omitempty" - }{0, 0}, - "{}\n", - }, { - &struct { - A *struct{ X int } "a,omitempty" - B int "b,omitempty" - }{nil, 0}, - "{}\n", - }, - - // Flow flag - { - &struct { - A []int "a,flow" - }{[]int{1, 2}}, - "a: [1, 2]\n", - }, { - &struct { - A map[string]string "a,flow" - }{map[string]string{"b": "c", "d": "e"}}, - "a: {b: c, d: e}\n", - }, { - &struct { - A struct { - B, D string - } "a,flow" - }{struct{ B, D string }{"c", "e"}}, - "a: {b: c, d: e}\n", - }, - - // Unexported field - { - &struct { - u int - A int - }{0, 1}, - "a: 1\n", - }, - - // Ignored field - { - &struct { - A int - B int "-" - }{1, 2}, - "a: 1\n", - }, - - // Struct inlining - { - &struct { - A int - C inlineB `yaml:",inline"` - }{1, inlineB{2, inlineC{3}}}, - "a: 1\nb: 2\nc: 3\n", - }, -} - -func (s *S) TestMarshal(c *C) { - for _, item := range marshalTests { - data, err := goyaml.Marshal(item.value) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data) - } -} - -var marshalErrorTests = []struct { - value interface{} - error string -}{ - { - &struct { - B int - inlineB ",inline" - }{1, inlineB{2, inlineC{3}}}, - `Duplicated key 'b' in struct struct \{ B int; .*`, - }, -} - -func (s *S) TestMarshalErrors(c *C) { - for _, item := range marshalErrorTests { - _, err := goyaml.Marshal(item.value) - c.Assert(err, ErrorMatches, item.error) - } -} - -var marshalTaggedIfaceTest interface{} = &struct{ A string }{"B"} - -var getterTests = []struct { - data, tag string - value interface{} -}{ - {"_:\n hi: there\n", "", map[interface{}]interface{}{"hi": "there"}}, - {"_:\n- 1\n- A\n", "", []interface{}{1, "A"}}, - {"_: 10\n", "", 10}, - {"_: null\n", "", nil}, - {"_: !foo BAR!\n", "!foo", "BAR!"}, - {"_: !foo 1\n", "!foo", "1"}, - {"_: !foo '\"1\"'\n", "!foo", "\"1\""}, - {"_: !foo 1.1\n", "!foo", 1.1}, - {"_: !foo 1\n", "!foo", 1}, - {"_: !foo 1\n", "!foo", uint(1)}, - {"_: !foo true\n", "!foo", true}, - {"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}}, - {"_: !foo\n A: B\n", "!foo", map[string]string{"A": "B"}}, - {"_: !foo\n a: B\n", "!foo", &marshalTaggedIfaceTest}, -} - -func (s *S) TestMarshalTypeCache(c *C) { - var data []byte - var err error - func() { - type T struct{ A int } - data, err = goyaml.Marshal(&T{}) - c.Assert(err, IsNil) - }() - func() { - type T struct{ B int } - data, err = goyaml.Marshal(&T{}) - c.Assert(err, IsNil) - }() - c.Assert(string(data), Equals, "b: 0\n") -} - -type typeWithGetter struct { - tag string - value interface{} -} - -func (o typeWithGetter) GetYAML() (tag string, value interface{}) { - return o.tag, o.value -} - -type typeWithGetterField struct { - Field typeWithGetter "_" -} - -func (s *S) TestMashalWithGetter(c *C) { - for _, item := range getterTests { - obj := &typeWithGetterField{} - obj.Field.tag = item.tag - obj.Field.value = item.value - data, err := goyaml.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, string(item.data)) - } -} - -func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) { - obj := &typeWithGetter{} - obj.tag = "" - obj.value = map[string]string{"hello": "world!"} - data, err := goyaml.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, "hello: world!\n") -} - -func (s *S) TestSortedOutput(c *C) { - order := []interface{}{ - false, - true, - 1, - uint(1), - 1.0, - 1.1, - 1.2, - 2, - uint(2), - 2.0, - 2.1, - "", - ".1", - ".2", - ".a", - "1", - "2", - "a!10", - "a/2", - "a/10", - "a~10", - "ab/1", - "b/1", - "b/01", - "b/2", - "b/02", - "b/3", - "b/03", - "b1", - "b01", - "b3", - "c2.10", - "c10.2", - "d1", - "d12", - "d12a", - } - m := make(map[interface{}]int) - for _, k := range order { - m[k] = 1 - } - data, err := goyaml.Marshal(m) - c.Assert(err, IsNil) - out := "\n" + string(data) - last := 0 - for i, k := range order { - repr := fmt.Sprint(k) - if s, ok := k.(string); ok { - if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil { - repr = `"` + repr + `"` - } - } - index := strings.Index(out, "\n"+repr+":") - if index == -1 { - c.Fatalf("%#v is not in the output: %#v", k, out) - } - if index < last { - c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out) - } - last = index - } -} diff --git a/vendor/launchpad.net/goyaml/goyaml.go b/vendor/launchpad.net/goyaml/goyaml.go deleted file mode 100644 index 6bbce6d..0000000 --- a/vendor/launchpad.net/goyaml/goyaml.go +++ /dev/null @@ -1,307 +0,0 @@ -// Package goyaml implements YAML support for the Go language. -// -// WARNING: You are using an out of date import path. Please update your code and import the following instead: -// -// gonuts.org/v1/yaml -// -// The package name has changed from "yaml" from "goyaml", but the package API has not changed. -// -package goyaml - -import ( - "errors" - "fmt" - "reflect" - "runtime" - "strings" - "sync" -) - -func handleErr(err *error) { - if r := recover(); r != nil { - if _, ok := r.(runtime.Error); ok { - panic(r) - } else if _, ok := r.(*reflect.ValueError); ok { - panic(r) - } else if _, ok := r.(externalPanic); ok { - panic(r) - } else if s, ok := r.(string); ok { - *err = errors.New("YAML error: " + s) - } else if e, ok := r.(error); ok { - *err = e - } else { - panic(r) - } - } -} - -// Objects implementing the goyaml.Setter interface will receive the YAML -// tag and value via the SetYAML method during unmarshaling, rather than -// being implicitly assigned by the goyaml machinery. If setting the value -// works, the method should return true. If it returns false, the given -// value will be omitted from maps and slices. -type Setter interface { - SetYAML(tag string, value interface{}) bool -} - -// Objects implementing the goyaml.Getter interface will get the GetYAML() -// method called when goyaml is requested to marshal the given value, and -// the result of this method will be marshaled in place of the actual object. -type Getter interface { - GetYAML() (tag string, value interface{}) -} - -// Unmarshal decodes the first document found within the in byte slice -// and assigns decoded values into the object pointed by out. -// -// Maps, pointers to structs and ints, etc, may all be used as out values. -// If an internal pointer within a struct is not initialized, goyaml -// will initialize it if necessary for unmarshalling the provided data, -// but the struct provided as out must not be a nil pointer. -// -// The type of the decoded values and the type of out will be considered, -// and Unmarshal() will do the best possible job to unmarshal values -// appropriately. It is NOT considered an error, though, to skip values -// because they are not available in the decoded YAML, or if they are not -// compatible with the out value. To ensure something was properly -// unmarshaled use a map or compare against the previous value for the -// field (usually the zero value). -// -// Struct fields are only unmarshalled if they are exported (have an -// upper case first letter), and will be unmarshalled using the field -// name lowercased by default. When custom field names are desired, the -// tag value may be used to tweak the name. Everything before the first -// comma in the field tag will be used as the name. The values following -// the comma are used to tweak the marshalling process (see Marshal). -// Conflicting names result in a runtime error. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// var T t -// goyaml.Unmarshal([]byte("a: 1\nb: 2"), &t) -// -// See the documentation of Marshal for the format of tags and a list of -// supported tag options. -// -func Unmarshal(in []byte, out interface{}) (err error) { - defer handleErr(&err) - d := newDecoder() - p := newParser(in) - defer p.destroy() - node := p.parse() - if node != nil { - d.unmarshal(node, reflect.ValueOf(out)) - } - return nil -} - -// Marshal serializes the value provided into a YAML document. The structure -// of the generated document will reflect the structure of the value itself. -// Maps, pointers to structs and ints, etc, may all be used as the in value. -// -// In the case of struct values, only exported fields will be serialized. -// The lowercased field name is used as the key for each exported field, -// but this behavior may be changed using the respective field tag. -// The tag may also contain flags to tweak the marshalling behavior for -// the field. Conflicting names result in a runtime error. The tag format -// accepted is: -// -// `(...) yaml:"[][,[,]]" (...)` -// -// The following flags are currently supported: -// -// omitempty Only include the field if it's not set to the zero -// value for the type or to empty slices or maps. -// Does not apply to zero valued structs. -// -// flow Marshal using a flow style (useful for structs, -// sequences and maps. -// -// inline Inline the struct it's applied to, so its fields -// are processed as if they were part of the outer -// struct. -// -// In addition, if the key is "-", the field is ignored. -// -// For example: -// -// type T struct { -// F int "a,omitempty" -// B int -// } -// goyaml.Marshal(&T{B: 2}) // Returns "b: 2\n" -// goyaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := newEncoder() - defer e.destroy() - e.marshal("", reflect.ValueOf(in)) - e.finish() - out = e.out - return -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -// The code in this section was copied from gobson. - -// structInfo holds details for the serialization of fields of -// a given struct. -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - - // InlineMap is the number of the field in the struct that - // contains an ,inline map, or -1 if there's none. - InlineMap int -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - Flow bool - - // Inline holds the field index if the field is part of an inlined struct. - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var fieldMapMutex sync.RWMutex - -type externalPanic string - -func (e externalPanic) String() string { - return string(e) -} - -func getStructInfo(st reflect.Type) (*structInfo, error) { - fieldMapMutex.RLock() - sinfo, found := structMap[st] - fieldMapMutex.RUnlock() - if found { - return sinfo, nil - } - - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("yaml") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "flow": - info.Flow = true - case "inline": - inline = true - default: - msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st) - panic(externalPanic(msg)) - } - } - tag = fields[0] - } - - if inline { - switch field.Type.Kind() { - //case reflect.Map: - // if inlineMap >= 0 { - // return nil, errors.New("Multiple ,inline maps in struct " + st.String()) - // } - // if field.Type.Key() != reflect.TypeOf("") { - // return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) - // } - // inlineMap = info.Num - case reflect.Struct: - sinfo, err := getStructInfo(field.Type) - if err != nil { - return nil, err - } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) - } - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - default: - //panic("Option ,inline needs a struct value or map field") - panic("Option ,inline needs a struct value field") - } - continue - } - - if tag != "" { - info.Key = tag - } else { - info.Key = strings.ToLower(field.Name) - } - - if _, found = fieldsMap[info.Key]; found { - msg := "Duplicated key '" + info.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - - sinfo = &structInfo{fieldsMap, fieldsList, inlineMap} - - fieldMapMutex.Lock() - structMap[st] = sinfo - fieldMapMutex.Unlock() - return sinfo, nil -} - -func isZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.String: - return len(v.String()) == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Bool: - return !v.Bool() - } - return false -} diff --git a/vendor/launchpad.net/goyaml/parserc.go b/vendor/launchpad.net/goyaml/parserc.go deleted file mode 100644 index 0fdfa4e..0000000 --- a/vendor/launchpad.net/goyaml/parserc.go +++ /dev/null @@ -1,1096 +0,0 @@ -package goyaml - -import ( - "bytes" -) - -// The parser implements the following grammar: -// -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// implicit_document ::= block_node DOCUMENT-END* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// block_node_or_indentless_sequence ::= -// ALIAS -// | properties (block_content | indentless_block_sequence)? -// | block_content -// | indentless_block_sequence -// block_node ::= ALIAS -// | properties block_content? -// | block_content -// flow_node ::= ALIAS -// | properties flow_content? -// | flow_content -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// block_content ::= block_collection | flow_collection | SCALAR -// flow_content ::= flow_collection | SCALAR -// block_collection ::= block_sequence | block_mapping -// flow_collection ::= flow_sequence | flow_mapping -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// block_mapping ::= BLOCK-MAPPING_START -// ((KEY block_node_or_indentless_sequence?)? -// (VALUE block_node_or_indentless_sequence?)?)* -// BLOCK-END -// flow_sequence ::= FLOW-SEQUENCE-START -// (flow_sequence_entry FLOW-ENTRY)* -// flow_sequence_entry? -// FLOW-SEQUENCE-END -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// flow_mapping ::= FLOW-MAPPING-START -// (flow_mapping_entry FLOW-ENTRY)* -// flow_mapping_entry? -// FLOW-MAPPING-END -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - -// Peek the next token in the token queue. -func peek_token(parser *yaml_parser_t) *yaml_token_t { - if parser.token_available || yaml_parser_fetch_more_tokens(parser) { - return &parser.tokens[parser.tokens_head] - } - return nil -} - -// Remove the next token from the queue (must be called after peek_token). -func skip_token(parser *yaml_parser_t) { - parser.token_available = false - parser.tokens_parsed++ - parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN - parser.tokens_head++ -} - -// Get the next event. -func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { - // Erase the event object. - *event = yaml_event_t{} - - // No events after the end of the stream or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { - return true - } - - // Generate the next event. - return yaml_parser_state_machine(parser, event) -} - -// Set parser error. -func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -// State dispatcher. -func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { - //trace("yaml_parser_state_machine", "state:", parser.state.String()) - - switch parser.state { - case yaml_PARSE_STREAM_START_STATE: - return yaml_parser_parse_stream_start(parser, event) - - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, true) - - case yaml_PARSE_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, false) - - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return yaml_parser_parse_document_content(parser, event) - - case yaml_PARSE_DOCUMENT_END_STATE: - return yaml_parser_parse_document_end(parser, event) - - case yaml_PARSE_BLOCK_NODE_STATE: - return yaml_parser_parse_node(parser, event, true, false) - - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return yaml_parser_parse_node(parser, event, true, true) - - case yaml_PARSE_FLOW_NODE_STATE: - return yaml_parser_parse_node(parser, event, false, false) - - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, true) - - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, false) - - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_indentless_sequence_entry(parser, event) - - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, true) - - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, false) - - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return yaml_parser_parse_block_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, true) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, false) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) - - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, true) - - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, true) - - default: - panic("invalid parser state") - } - return false -} - -// Parse the production: -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// ************ -func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_STREAM_START_TOKEN { - return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) - } - parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - encoding: token.encoding, - } - skip_token(parser) - return true -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// * -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// ************************* -func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { - - token := peek_token(parser) - if token == nil { - return false - } - - // Parse extra document end indicators. - if !implicit { - for token.typ == yaml_DOCUMENT_END_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && - token.typ != yaml_TAG_DIRECTIVE_TOKEN && - token.typ != yaml_DOCUMENT_START_TOKEN && - token.typ != yaml_STREAM_END_TOKEN { - // Parse an implicit document. - if !yaml_parser_process_directives(parser, nil, nil) { - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_BLOCK_NODE_STATE - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - } else if token.typ != yaml_STREAM_END_TOKEN { - // Parse an explicit document. - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - start_mark := token.start_mark - if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { - return false - } - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_DOCUMENT_START_TOKEN { - yaml_parser_set_parser_error(parser, - "did not find expected ", token.start_mark) - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE - end_mark := token.end_mark - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: false, - } - skip_token(parser) - - } else { - // Parse the stream end. - parser.state = yaml_PARSE_END_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - } - - return true -} - -// Parse the productions: -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// *********** -// -func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || - token.typ == yaml_TAG_DIRECTIVE_TOKEN || - token.typ == yaml_DOCUMENT_START_TOKEN || - token.typ == yaml_DOCUMENT_END_TOKEN || - token.typ == yaml_STREAM_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - return yaml_parser_process_empty_scalar(parser, event, - token.start_mark) - } - return yaml_parser_parse_node(parser, event, true, false) -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// ************* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// -func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - start_mark := token.start_mark - end_mark := token.start_mark - - implicit := true - if token.typ == yaml_DOCUMENT_END_TOKEN { - end_mark = token.end_mark - skip_token(parser) - implicit = false - } - - parser.tag_directives = parser.tag_directives[:0] - - parser.state = yaml_PARSE_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - start_mark: start_mark, - end_mark: end_mark, - implicit: implicit, - } - return true -} - -// Parse the productions: -// block_node_or_indentless_sequence ::= -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * -// block_node ::= ALIAS -// ***** -// | properties block_content? -// ********** * -// | block_content -// * -// flow_node ::= ALIAS -// ***** -// | properties flow_content? -// ********** * -// | flow_content -// * -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// ************************* -// block_content ::= block_collection | flow_collection | SCALAR -// ****** -// flow_content ::= flow_collection | SCALAR -// ****** -func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { - //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_ALIAS_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - anchor: token.value, - } - skip_token(parser) - return true - } - - start_mark := token.start_mark - end_mark := token.start_mark - - var tag_token bool - var tag_handle, tag_suffix, anchor []byte - var tag_mark yaml_mark_t - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - start_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } else if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - start_mark = token.start_mark - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - var tag []byte - if tag_token { - if len(tag_handle) == 0 { - tag = tag_suffix - tag_suffix = nil - } else { - for i := range parser.tag_directives { - if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { - tag = append([]byte(nil), parser.tag_directives[i].prefix...) - tag = append(tag, tag_suffix...) - break - } - } - if len(tag) == 0 { - yaml_parser_set_parser_error_context(parser, - "while parsing a node", start_mark, - "found undefined tag handle", tag_mark) - return false - } - } - } - - implicit := len(tag) == 0 - if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_SCALAR_TOKEN { - var plain_implicit, quoted_implicit bool - end_mark = token.end_mark - if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { - plain_implicit = true - } else if len(tag) == 0 { - quoted_implicit = true - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - value: token.value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(token.style), - } - skip_token(parser) - return true - } - if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { - // [Go] Some of the events below can be merged as they differ only on style. - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_FLOW_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - return true - } - if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), - } - return true - } - if len(anchor) > 0 || len(tag) > 0 { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - quoted_implicit: false, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true - } - - context := "while parsing a flow node" - if block { - context = "while parsing a block node" - } - yaml_parser_set_parser_error_context(parser, context, start_mark, - "did not find expected node content", token.start_mark) - return false -} - -// Parse the productions: -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// ******************** *********** * ********* -// -func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } else { - parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } - if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block collection", context_mark, - "did not find expected '-' indicator", token.start_mark) -} - -// Parse the productions: -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// *********** * -func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && - token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? - } - return true -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* -// -// BLOCK-END -// ********* -// -func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_KEY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } else { - parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } else if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block mapping", context_mark, - "did not find expected key", token.start_mark) -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// -// ((KEY block_node_or_indentless_sequence?)? -// -// (VALUE block_node_or_indentless_sequence?)?)* -// ***** * -// BLOCK-END -// -// -func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence ::= FLOW-SEQUENCE-START -// ******************* -// (flow_sequence_entry FLOW-ENTRY)* -// * ********** -// flow_sequence_entry? -// * -// FLOW-SEQUENCE-END -// ***************** -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow sequence", context_mark, - "did not find expected ',' or ']'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - implicit: true, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - skip_token(parser) - return true - } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true -} - -// -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// *** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - mark := token.end_mark - skip_token(parser) - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// ***** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? - } - return true -} - -// Parse the productions: -// flow_mapping ::= FLOW-MAPPING-START -// ****************** -// (flow_mapping_entry FLOW-ENTRY)* -// * ********** -// flow_mapping_entry? -// ****************** -// FLOW-MAPPING-END -// **************** -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * *** * -// -func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow mapping", context_mark, - "did not find expected ',' or '}'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } else { - parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - return true -} - -// Parse the productions: -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * ***** * -// -func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { - token := peek_token(parser) - if token == nil { - return false - } - if empty { - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Generate an empty scalar event. -func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: mark, - end_mark: mark, - value: nil, // Empty - implicit: true, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true -} - -var default_tag_directives = []yaml_tag_directive_t{ - {[]byte("!"), []byte("!")}, - {[]byte("!!"), []byte("tag:yaml.org,2002:")}, -} - -// Parse directives. -func yaml_parser_process_directives(parser *yaml_parser_t, - version_directive_ref **yaml_version_directive_t, - tag_directives_ref *[]yaml_tag_directive_t) bool { - - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - - token := peek_token(parser) - if token == nil { - return false - } - - for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { - if version_directive != nil { - yaml_parser_set_parser_error(parser, - "found duplicate %YAML directive", token.start_mark) - return false - } - if token.major != 1 || token.minor != 1 { - yaml_parser_set_parser_error(parser, - "found incompatible YAML document", token.start_mark) - return false - } - version_directive = &yaml_version_directive_t{ - major: token.major, - minor: token.minor, - } - } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { - value := yaml_tag_directive_t{ - handle: token.value, - prefix: token.prefix, - } - if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { - return false - } - tag_directives = append(tag_directives, value) - } - - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - - for i := range default_tag_directives { - if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { - return false - } - } - - if version_directive_ref != nil { - *version_directive_ref = version_directive - } - if tag_directives_ref != nil { - *tag_directives_ref = tag_directives - } - return true -} - -// Append a tag directive to the directives stack. -func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { - for i := range parser.tag_directives { - if bytes.Equal(value.handle, parser.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) - } - } - - // [Go] I suspect the copy is unnecessary. This was likely done - // because there was no way to track ownership of the data. - value_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(value_copy.handle, value.handle) - copy(value_copy.prefix, value.prefix) - parser.tag_directives = append(parser.tag_directives, value_copy) - return true -} diff --git a/vendor/launchpad.net/goyaml/readerc.go b/vendor/launchpad.net/goyaml/readerc.go deleted file mode 100644 index c732935..0000000 --- a/vendor/launchpad.net/goyaml/readerc.go +++ /dev/null @@ -1,391 +0,0 @@ -package goyaml - -import ( - "io" -) - -// Set the reader error and return 0. -func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { - parser.error = yaml_READER_ERROR - parser.problem = problem - parser.problem_offset = offset - parser.problem_value = value - return false -} - -// Byte order marks. -const ( - bom_UTF8 = "\xef\xbb\xbf" - bom_UTF16LE = "\xff\xfe" - bom_UTF16BE = "\xfe\xff" -) - -// Determine the input stream encoding by checking the BOM symbol. If no BOM is -// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. -func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { - // Ensure that we had enough bytes in the raw buffer. - for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { - if !yaml_parser_update_raw_buffer(parser) { - return false - } - } - - // Determine the encoding. - buf := parser.raw_buffer - pos := parser.raw_buffer_pos - avail := len(buf) - pos - if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { - parser.encoding = yaml_UTF16LE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { - parser.encoding = yaml_UTF16BE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { - parser.encoding = yaml_UTF8_ENCODING - parser.raw_buffer_pos += 3 - parser.offset += 3 - } else { - parser.encoding = yaml_UTF8_ENCODING - } - return true -} - -// Update the raw buffer. -func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { - size_read := 0 - - // Return if the raw buffer is full. - if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { - return true - } - - // Return on EOF. - if parser.eof { - return true - } - - // Move the remaining bytes in the raw buffer to the beginning. - if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { - copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) - } - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] - parser.raw_buffer_pos = 0 - - // Call the read handler to fill the buffer. - size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] - if err == io.EOF { - parser.eof = true - } else if err != nil { - return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) - } - return true -} - -// Ensure that the buffer contains at least `length` characters. -// Return true on success, false on failure. -// -// The length is supposed to be significantly less that the buffer size. -func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { - if parser.read_handler == nil { - panic("read handler must be set") - } - - // If the EOF flag is set and the raw buffer is empty, do nothing. - if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - return true - } - - // Return if the buffer contains enough characters. - if parser.unread >= length { - return true - } - - // Determine the input encoding if it is not known yet. - if parser.encoding == yaml_ANY_ENCODING { - if !yaml_parser_determine_encoding(parser) { - return false - } - } - - // Move the unread characters to the beginning of the buffer. - buffer_len := len(parser.buffer) - if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { - copy(parser.buffer, parser.buffer[parser.buffer_pos:]) - buffer_len -= parser.buffer_pos - parser.buffer_pos = 0 - } else if parser.buffer_pos == buffer_len { - buffer_len = 0 - parser.buffer_pos = 0 - } - - // Open the whole buffer for writing, and cut it before returning. - parser.buffer = parser.buffer[:cap(parser.buffer)] - - // Fill the buffer until it has enough characters. - first := true - for parser.unread < length { - - // Fill the raw buffer if necessary. - if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { - if !yaml_parser_update_raw_buffer(parser) { - parser.buffer = parser.buffer[:buffer_len] - return false - } - } - first = false - - // Decode the raw buffer. - inner: - for parser.raw_buffer_pos != len(parser.raw_buffer) { - var value rune - var width int - - raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos - - // Decode the next character. - switch parser.encoding { - case yaml_UTF8_ENCODING: - // Decode a UTF-8 character. Check RFC 3629 - // (http://www.ietf.org/rfc/rfc3629.txt) for more details. - // - // The following table (taken from the RFC) is used for - // decoding. - // - // Char. number range | UTF-8 octet sequence - // (hexadecimal) | (binary) - // --------------------+------------------------------------ - // 0000 0000-0000 007F | 0xxxxxxx - // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - // - // Additionally, the characters in the range 0xD800-0xDFFF - // are prohibited as they are reserved for use with UTF-16 - // surrogate pairs. - - // Determine the length of the UTF-8 sequence. - octet := parser.raw_buffer[parser.raw_buffer_pos] - switch { - case octet&0x80 == 0x00: - width = 1 - case octet&0xE0 == 0xC0: - width = 2 - case octet&0xF0 == 0xE0: - width = 3 - case octet&0xF8 == 0xF0: - width = 4 - default: - // The leading octet is invalid. - return yaml_parser_set_reader_error(parser, - "invalid leading UTF-8 octet", - parser.offset, int(octet)) - } - - // Check if the raw buffer contains an incomplete character. - if width > raw_unread { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-8 octet sequence", - parser.offset, -1) - } - break inner - } - - // Decode the leading octet. - switch { - case octet&0x80 == 0x00: - value = rune(octet & 0x7F) - case octet&0xE0 == 0xC0: - value = rune(octet & 0x1F) - case octet&0xF0 == 0xE0: - value = rune(octet & 0x0F) - case octet&0xF8 == 0xF0: - value = rune(octet & 0x07) - default: - value = 0 - } - - // Check and decode the trailing octets. - for k := 1; k < width; k++ { - octet = parser.raw_buffer[parser.raw_buffer_pos+k] - - // Check if the octet is valid. - if (octet & 0xC0) != 0x80 { - return yaml_parser_set_reader_error(parser, - "invalid trailing UTF-8 octet", - parser.offset+k, int(octet)) - } - - // Decode the octet. - value = (value << 6) + rune(octet&0x3F) - } - - // Check the length of the sequence against the value. - switch { - case width == 1: - case width == 2 && value >= 0x80: - case width == 3 && value >= 0x800: - case width == 4 && value >= 0x10000: - default: - return yaml_parser_set_reader_error(parser, - "invalid length of a UTF-8 sequence", - parser.offset, -1) - } - - // Check the range of the value. - if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { - return yaml_parser_set_reader_error(parser, - "invalid Unicode character", - parser.offset, int(value)) - } - - case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: - var low, high int - if parser.encoding == yaml_UTF16LE_ENCODING { - low, high = 0, 1 - } else { - high, low = 1, 0 - } - - // The UTF-16 encoding is not as simple as one might - // naively think. Check RFC 2781 - // (http://www.ietf.org/rfc/rfc2781.txt). - // - // Normally, two subsequent bytes describe a Unicode - // character. However a special technique (called a - // surrogate pair) is used for specifying character - // values larger than 0xFFFF. - // - // A surrogate pair consists of two pseudo-characters: - // high surrogate area (0xD800-0xDBFF) - // low surrogate area (0xDC00-0xDFFF) - // - // The following formulas are used for decoding - // and encoding characters using surrogate pairs: - // - // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) - // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) - // W1 = 110110yyyyyyyyyy - // W2 = 110111xxxxxxxxxx - // - // where U is the character value, W1 is the high surrogate - // area, W2 is the low surrogate area. - - // Check for incomplete UTF-16 character. - if raw_unread < 2 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 character", - parser.offset, -1) - } - break inner - } - - // Get the character. - value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) - - // Check for unexpected low surrogate area. - if value&0xFC00 == 0xDC00 { - return yaml_parser_set_reader_error(parser, - "unexpected low surrogate area", - parser.offset, int(value)) - } - - // Check for a high surrogate area. - if value&0xFC00 == 0xD800 { - width = 4 - - // Check for incomplete surrogate pair. - if raw_unread < 4 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 surrogate pair", - parser.offset, -1) - } - break inner - } - - // Get the next character. - value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) - - // Check for a low surrogate area. - if value2&0xFC00 != 0xDC00 { - return yaml_parser_set_reader_error(parser, - "expected low surrogate area", - parser.offset+2, int(value2)) - } - - // Generate the value of the surrogate pair. - value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) - } else { - width = 2 - } - - default: - panic("impossible") - } - - // Check if the character is in the allowed range: - // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) - // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) - // | [#x10000-#x10FFFF] (32 bit) - switch { - case value == 0x09: - case value == 0x0A: - case value == 0x0D: - case value >= 0x20 && value <= 0x7E: - case value == 0x85: - case value >= 0xA0 && value <= 0xD7FF: - case value >= 0xE000 && value <= 0xFFFD: - case value >= 0x10000 && value <= 0x10FFFF: - default: - return yaml_parser_set_reader_error(parser, - "control characters are not allowed", - parser.offset, int(value)) - } - - // Move the raw pointers. - parser.raw_buffer_pos += width - parser.offset += width - - // Finally put the character into the buffer. - if value <= 0x7F { - // 0000 0000-0000 007F . 0xxxxxxx - parser.buffer[buffer_len+0] = byte(value) - } else if value <= 0x7FF { - // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) - parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) - } else if value <= 0xFFFF { - // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) - } else { - // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) - } - buffer_len += width - - parser.unread++ - } - - // On EOF, put NUL into the buffer and return. - if parser.eof { - parser.buffer[buffer_len] = 0 - buffer_len++ - parser.unread++ - break - } - } - parser.buffer = parser.buffer[:buffer_len] - return true -} diff --git a/vendor/launchpad.net/goyaml/resolve.go b/vendor/launchpad.net/goyaml/resolve.go deleted file mode 100644 index a31a533..0000000 --- a/vendor/launchpad.net/goyaml/resolve.go +++ /dev/null @@ -1,155 +0,0 @@ -package goyaml - -import ( - "math" - "strconv" - "strings" -) - -// TODO: merge, timestamps, base 60 floats, omap. - -type resolveMapItem struct { - value interface{} - tag string -} - -var resolveTable = make([]byte, 256) -var resolveMap = make(map[string]resolveMapItem) - -func init() { - t := resolveTable - t[int('+')] = 'S' // Sign - t[int('-')] = 'S' - for _, c := range "0123456789" { - t[int(c)] = 'D' // Digit - } - for _, c := range "yYnNtTfFoO~" { - t[int(c)] = 'M' // In map - } - t[int('.')] = '.' // Float (potentially in map) - t[int('<')] = '<' // Merge - - var resolveMapList = []struct { - v interface{} - tag string - l []string - }{ - {true, "!!bool", []string{"y", "Y", "yes", "Yes", "YES"}}, - {true, "!!bool", []string{"true", "True", "TRUE"}}, - {true, "!!bool", []string{"on", "On", "ON"}}, - {false, "!!bool", []string{"n", "N", "no", "No", "NO"}}, - {false, "!!bool", []string{"false", "False", "FALSE"}}, - {false, "!!bool", []string{"off", "Off", "OFF"}}, - {nil, "!!null", []string{"~", "null", "Null", "NULL"}}, - {math.NaN(), "!!float", []string{".nan", ".NaN", ".NAN"}}, - {math.Inf(+1), "!!float", []string{".inf", ".Inf", ".INF"}}, - {math.Inf(+1), "!!float", []string{"+.inf", "+.Inf", "+.INF"}}, - {math.Inf(-1), "!!float", []string{"-.inf", "-.Inf", "-.INF"}}, - } - - m := resolveMap - for _, item := range resolveMapList { - for _, s := range item.l { - m[s] = resolveMapItem{item.v, item.tag} - } - } -} - -const longTagPrefix = "tag:yaml.org,2002:" - -func shortTag(tag string) string { - if strings.HasPrefix(tag, longTagPrefix) { - return "!!" + tag[len(longTagPrefix):] - } - return tag -} - -func resolvableTag(tag string) bool { - switch tag { - case "", "!!str", "!!bool", "!!int", "!!float", "!!null": - return true - } - return false -} - -func resolve(tag string, in string) (rtag string, out interface{}) { - tag = shortTag(tag) - if !resolvableTag(tag) { - return tag, in - } - - defer func() { - if tag != "" && tag != rtag { - panic("Can't decode " + rtag + " '" + in + "' as a " + tag) - } - }() - - if in == "" { - return "!!null", nil - } - - c := resolveTable[in[0]] - if c == 0 { - // It's a string for sure. Nothing to do. - return "!!str", in - } - - // Handle things we can lookup in a map. - if item, ok := resolveMap[in]; ok { - return item.tag, item.value - } - - switch c { - case 'M': - // We've already checked the map above. - - case '.': - // Not in the map, so maybe a normal float. - floatv, err := strconv.ParseFloat(in, 64) - if err == nil { - return "!!float", floatv - } - // XXX Handle base 60 floats here (WTF!) - - case 'D', 'S': - // Int, float, or timestamp. - for i := 0; i != len(in); i++ { - if in[i] == '_' { - in = strings.Replace(in, "_", "", -1) - break - } - } - intv, err := strconv.ParseInt(in, 0, 64) - if err == nil { - if intv == int64(int(intv)) { - return "!!int", int(intv) - } else { - return "!!int", intv - } - } - floatv, err := strconv.ParseFloat(in, 64) - if err == nil { - return "!!float", floatv - } - if strings.HasPrefix(in, "0b") { - intv, err := strconv.ParseInt(in[2:], 2, 64) - if err == nil { - return "!!int", int(intv) - } - } else if strings.HasPrefix(in, "-0b") { - intv, err := strconv.ParseInt(in[3:], 2, 64) - if err == nil { - return "!!int", -int(intv) - } - } - // XXX Handle timestamps here. - - case '<': - // XXX Handle merge (<<) here. - - default: - panic("resolveTable item not yet handled: " + - string([]byte{c}) + " (with " + in + ")") - } - return "!!str", in -} diff --git a/vendor/launchpad.net/goyaml/scannerc.go b/vendor/launchpad.net/goyaml/scannerc.go deleted file mode 100644 index 943a597..0000000 --- a/vendor/launchpad.net/goyaml/scannerc.go +++ /dev/null @@ -1,2710 +0,0 @@ -package goyaml - -import ( - "bytes" - "fmt" -) - -// Introduction -// ************ -// -// The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in -// some cases we are less restrictive that it requires. -// -// The process of transforming a YAML stream into a sequence of events is -// divided on two steps: Scanning and Parsing. -// -// The Scanner transforms the input stream into a sequence of tokens, while the -// parser transform the sequence of tokens produced by the Scanner into a -// sequence of parsing events. -// -// The Scanner is rather clever and complicated. The Parser, on the contrary, -// is a straightforward implementation of a recursive-descendant parser (or, -// LL(1) parser, as it is usually called). -// -// Actually there are two issues of Scanning that might be called "clever", the -// rest is quite straightforward. The issues are "block collection start" and -// "simple keys". Both issues are explained below in details. -// -// Here the Scanning step is explained and implemented. We start with the list -// of all the tokens produced by the Scanner together with short descriptions. -// -// Now, tokens: -// -// STREAM-START(encoding) # The stream start. -// STREAM-END # The stream end. -// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. -// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. -// DOCUMENT-START # '---' -// DOCUMENT-END # '...' -// BLOCK-SEQUENCE-START # Indentation increase denoting a block -// BLOCK-MAPPING-START # sequence or a block mapping. -// BLOCK-END # Indentation decrease. -// FLOW-SEQUENCE-START # '[' -// FLOW-SEQUENCE-END # ']' -// BLOCK-SEQUENCE-START # '{' -// BLOCK-SEQUENCE-END # '}' -// BLOCK-ENTRY # '-' -// FLOW-ENTRY # ',' -// KEY # '?' or nothing (simple keys). -// VALUE # ':' -// ALIAS(anchor) # '*anchor' -// ANCHOR(anchor) # '&anchor' -// TAG(handle,suffix) # '!handle!suffix' -// SCALAR(value,style) # A scalar. -// -// The following two tokens are "virtual" tokens denoting the beginning and the -// end of the stream: -// -// STREAM-START(encoding) -// STREAM-END -// -// We pass the information about the input stream encoding with the -// STREAM-START token. -// -// The next two tokens are responsible for tags: -// -// VERSION-DIRECTIVE(major,minor) -// TAG-DIRECTIVE(handle,prefix) -// -// Example: -// -// %YAML 1.1 -// %TAG ! !foo -// %TAG !yaml! tag:yaml.org,2002: -// --- -// -// The correspoding sequence of tokens: -// -// STREAM-START(utf-8) -// VERSION-DIRECTIVE(1,1) -// TAG-DIRECTIVE("!","!foo") -// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") -// DOCUMENT-START -// STREAM-END -// -// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole -// line. -// -// The document start and end indicators are represented by: -// -// DOCUMENT-START -// DOCUMENT-END -// -// Note that if a YAML stream contains an implicit document (without '---' -// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be -// produced. -// -// In the following examples, we present whole documents together with the -// produced tokens. -// -// 1. An implicit document: -// -// 'a scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// STREAM-END -// -// 2. An explicit document: -// -// --- -// 'a scalar' -// ... -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// SCALAR("a scalar",single-quoted) -// DOCUMENT-END -// STREAM-END -// -// 3. Several documents in a stream: -// -// 'a scalar' -// --- -// 'another scalar' -// --- -// 'yet another scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// DOCUMENT-START -// SCALAR("another scalar",single-quoted) -// DOCUMENT-START -// SCALAR("yet another scalar",single-quoted) -// STREAM-END -// -// We have already introduced the SCALAR token above. The following tokens are -// used to describe aliases, anchors, tag, and scalars: -// -// ALIAS(anchor) -// ANCHOR(anchor) -// TAG(handle,suffix) -// SCALAR(value,style) -// -// The following series of examples illustrate the usage of these tokens: -// -// 1. A recursive sequence: -// -// &A [ *A ] -// -// Tokens: -// -// STREAM-START(utf-8) -// ANCHOR("A") -// FLOW-SEQUENCE-START -// ALIAS("A") -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A tagged scalar: -// -// !!float "3.14" # A good approximation. -// -// Tokens: -// -// STREAM-START(utf-8) -// TAG("!!","float") -// SCALAR("3.14",double-quoted) -// STREAM-END -// -// 3. Various scalar styles: -// -// --- # Implicit empty plain scalars do not produce tokens. -// --- a plain scalar -// --- 'a single-quoted scalar' -// --- "a double-quoted scalar" -// --- |- -// a literal scalar -// --- >- -// a folded -// scalar -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// DOCUMENT-START -// SCALAR("a plain scalar",plain) -// DOCUMENT-START -// SCALAR("a single-quoted scalar",single-quoted) -// DOCUMENT-START -// SCALAR("a double-quoted scalar",double-quoted) -// DOCUMENT-START -// SCALAR("a literal scalar",literal) -// DOCUMENT-START -// SCALAR("a folded scalar",folded) -// STREAM-END -// -// Now it's time to review collection-related tokens. We will start with -// flow collections: -// -// FLOW-SEQUENCE-START -// FLOW-SEQUENCE-END -// FLOW-MAPPING-START -// FLOW-MAPPING-END -// FLOW-ENTRY -// KEY -// VALUE -// -// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and -// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' -// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the -// indicators '?' and ':', which are used for denoting mapping keys and values, -// are represented by the KEY and VALUE tokens. -// -// The following examples show flow collections: -// -// 1. A flow sequence: -// -// [item 1, item 2, item 3] -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-SEQUENCE-START -// SCALAR("item 1",plain) -// FLOW-ENTRY -// SCALAR("item 2",plain) -// FLOW-ENTRY -// SCALAR("item 3",plain) -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A flow mapping: -// -// { -// a simple key: a value, # Note that the KEY token is produced. -// ? a complex key: another value, -// } -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// FLOW-ENTRY -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// FLOW-ENTRY -// FLOW-MAPPING-END -// STREAM-END -// -// A simple key is a key which is not denoted by the '?' indicator. Note that -// the Scanner still produce the KEY token whenever it encounters a simple key. -// -// For scanning block collections, the following tokens are used (note that we -// repeat KEY and VALUE here): -// -// BLOCK-SEQUENCE-START -// BLOCK-MAPPING-START -// BLOCK-END -// BLOCK-ENTRY -// KEY -// VALUE -// -// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation -// increase that precedes a block collection (cf. the INDENT token in Python). -// The token BLOCK-END denote indentation decrease that ends a block collection -// (cf. the DEDENT token in Python). However YAML has some syntax pecularities -// that makes detections of these tokens more complex. -// -// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators -// '-', '?', and ':' correspondingly. -// -// The following examples show how the tokens BLOCK-SEQUENCE-START, -// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: -// -// 1. Block sequences: -// -// - item 1 -// - item 2 -// - -// - item 3.1 -// - item 3.2 -// - -// key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 3.1",plain) -// BLOCK-ENTRY -// SCALAR("item 3.2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Block mappings: -// -// a simple key: a value # The KEY token is produced here. -// ? a complex key -// : another value -// a mapping: -// key 1: value 1 -// key 2: value 2 -// a sequence: -// - item 1 -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// KEY -// SCALAR("a mapping",plain) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML does not always require to start a new block collection from a new -// line. If the current line contains only '-', '?', and ':' indicators, a new -// block collection may start at the current line. The following examples -// illustrate this case: -// -// 1. Collections in a sequence: -// -// - - item 1 -// - item 2 -// - key 1: value 1 -// key 2: value 2 -// - ? complex key -// : complex value -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("complex key") -// VALUE -// SCALAR("complex value") -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Collections in a mapping: -// -// ? a sequence -// : - item 1 -// - item 2 -// ? a mapping -// : key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// KEY -// SCALAR("a mapping",plain) -// VALUE -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML also permits non-indented sequences if they are included into a block -// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: -// -// key: -// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key",plain) -// VALUE -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// - -// Ensure that the buffer contains the required number of characters. -// Return true on success, false on failure (reader error or memory error). -func cache(parser *yaml_parser_t, length int) bool { - // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) - return parser.unread >= length || yaml_parser_update_buffer(parser, length) -} - -// Advance the buffer pointer. -func skip(parser *yaml_parser_t) { - parser.mark.index++ - parser.mark.column++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) -} - -func skip_line(parser *yaml_parser_t) { - if is_crlf(parser.buffer, parser.buffer_pos) { - parser.mark.index += 2 - parser.mark.column = 0 - parser.mark.line++ - parser.unread -= 2 - parser.buffer_pos += 2 - } else if is_break(parser.buffer, parser.buffer_pos) { - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) - } -} - -// Copy a character to a string buffer and advance pointers. -func read(parser *yaml_parser_t, s []byte) []byte { - w := width(parser.buffer[parser.buffer_pos]) - if w == 0 { - panic("invalid character sequence") - } - if len(s) == 0 { - s = make([]byte, 0, 32) - } - if w == 1 && len(s)+w <= cap(s) { - s = s[:len(s)+1] - s[len(s)-1] = parser.buffer[parser.buffer_pos] - parser.buffer_pos++ - } else { - s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) - parser.buffer_pos += w - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - return s -} - -// Copy a line break character to a string buffer and advance pointers. -func read_line(parser *yaml_parser_t, s []byte) []byte { - buf := parser.buffer - pos := parser.buffer_pos - switch { - case buf[pos] == '\r' && buf[pos+1] == '\n': - // CR LF . LF - s = append(s, '\n') - parser.buffer_pos += 2 - parser.mark.index++ - parser.unread-- - case buf[pos] == '\r' || buf[pos] == '\n': - // CR|LF . LF - s = append(s, '\n') - parser.buffer_pos += 1 - case buf[pos] == '\xC2' && buf[pos+1] == '\x85': - // NEL . LF - s = append(s, '\n') - parser.buffer_pos += 2 - case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): - // LS|PS . LS|PS - s = append(s, buf[parser.buffer_pos:pos+3]...) - parser.buffer_pos += 3 - default: - return s - } - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - return s -} - -// Get the next token. -func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { - // Erase the token object. - *token = yaml_token_t{} // [Go] Is this necessary? - - // No tokens after STREAM-END or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR { - return true - } - - // Ensure that the tokens queue contains enough tokens. - if !parser.token_available { - if !yaml_parser_fetch_more_tokens(parser) { - return false - } - } - - // Fetch the next token from the queue. - *token = parser.tokens[parser.tokens_head] - parser.tokens_head++ - parser.tokens_parsed++ - parser.token_available = false - - if token.typ == yaml_STREAM_END_TOKEN { - parser.stream_end_produced = true - } - return true -} - -// Set the scanner error and return false. -func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { - parser.error = yaml_SCANNER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = parser.mark - return false -} - -func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { - context := "while parsing a tag" - if directive { - context = "while parsing a %TAG directive" - } - return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet") -} - -func trace(args ...interface{}) func() { - pargs := append([]interface{}{"+++"}, args...) - fmt.Println(pargs...) - pargs = append([]interface{}{"---"}, args...) - return func() { fmt.Println(pargs...) } -} - -// Ensure that the tokens queue contains at least one token which can be -// returned to the Parser. -func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { - // While we need more tokens to fetch, do it. - for { - // Check if we really need to fetch more tokens. - need_more_tokens := false - - if parser.tokens_head == len(parser.tokens) { - // Queue is empty. - need_more_tokens = true - } else { - // Check if any potential simple key may occupy the head position. - if !yaml_parser_stale_simple_keys(parser) { - return false - } - - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] - if simple_key.possible && simple_key.token_number == parser.tokens_parsed { - need_more_tokens = true - break - } - } - } - - // We are finished. - if !need_more_tokens { - break - } - // Fetch the next token. - if !yaml_parser_fetch_next_token(parser) { - return false - } - } - - parser.token_available = true - return true -} - -// The dispatcher for token fetchers. -func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { - // Ensure that the buffer is initialized. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we just started scanning. Fetch STREAM-START then. - if !parser.stream_start_produced { - return yaml_parser_fetch_stream_start(parser) - } - - // Eat whitespaces and comments until we reach the next token. - if !yaml_parser_scan_to_next_token(parser) { - return false - } - - // Remove obsolete potential simple keys. - if !yaml_parser_stale_simple_keys(parser) { - return false - } - - // Check the indentation level against the current column. - if !yaml_parser_unroll_indent(parser, parser.mark.column) { - return false - } - - // Ensure that the buffer contains at least 4 characters. 4 is the length - // of the longest indicators ('--- ' and '... '). - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - // Is it the end of the stream? - if is_z(parser.buffer, parser.buffer_pos) { - return yaml_parser_fetch_stream_end(parser) - } - - // Is it a directive? - if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { - return yaml_parser_fetch_directive(parser) - } - - buf := parser.buffer - pos := parser.buffer_pos - - // Is it the document start indicator? - if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) - } - - // Is it the document end indicator? - if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) - } - - // Is it the flow sequence start indicator? - if buf[pos] == '[' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) - } - - // Is it the flow mapping start indicator? - if parser.buffer[parser.buffer_pos] == '{' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) - } - - // Is it the flow sequence end indicator? - if parser.buffer[parser.buffer_pos] == ']' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_SEQUENCE_END_TOKEN) - } - - // Is it the flow mapping end indicator? - if parser.buffer[parser.buffer_pos] == '}' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_MAPPING_END_TOKEN) - } - - // Is it the flow entry indicator? - if parser.buffer[parser.buffer_pos] == ',' { - return yaml_parser_fetch_flow_entry(parser) - } - - // Is it the block entry indicator? - if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { - return yaml_parser_fetch_block_entry(parser) - } - - // Is it the key indicator? - if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_key(parser) - } - - // Is it the value indicator? - if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_value(parser) - } - - // Is it an alias? - if parser.buffer[parser.buffer_pos] == '*' { - return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) - } - - // Is it an anchor? - if parser.buffer[parser.buffer_pos] == '&' { - return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) - } - - // Is it a tag? - if parser.buffer[parser.buffer_pos] == '!' { - return yaml_parser_fetch_tag(parser) - } - - // Is it a literal scalar? - if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, true) - } - - // Is it a folded scalar? - if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, false) - } - - // Is it a single-quoted scalar? - if parser.buffer[parser.buffer_pos] == '\'' { - return yaml_parser_fetch_flow_scalar(parser, true) - } - - // Is it a double-quoted scalar? - if parser.buffer[parser.buffer_pos] == '"' { - return yaml_parser_fetch_flow_scalar(parser, false) - } - - // Is it a plain scalar? - // - // A plain scalar may start with any non-blank characters except - // - // '-', '?', ':', ',', '[', ']', '{', '}', - // '#', '&', '*', '!', '|', '>', '\'', '\"', - // '%', '@', '`'. - // - // In the block context (and, for the '-' indicator, in the flow context - // too), it may also start with the characters - // - // '-', '?', ':' - // - // if it is followed by a non-space character. - // - // The last rule is more restrictive than the specification requires. - // [Go] Make this logic more reasonable. - //switch parser.buffer[parser.buffer_pos] { - //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': - //} - if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || - parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || - parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || - (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level == 0 && - (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && - !is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_plain_scalar(parser) - } - - // If we don't determine the token type so far, it is an error. - return yaml_parser_set_scanner_error(parser, - "while scanning for the next token", parser.mark, - "found character that cannot start any token") -} - -// Check the list of potential simple keys and remove the positions that -// cannot contain simple keys anymore. -func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { - // Check for a potential simple key for each flow level. - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] - - // The specification requires that a simple key - // - // - is limited to a single line, - // - is shorter than 1024 characters. - if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { - - // Check if the potential simple key to be removed is required. - if simple_key.required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", simple_key.mark, - "could not find expected ':'") - } - simple_key.possible = false - } - } - return true -} - -// Check if a simple key may start at the current position and add it if -// needed. -func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { - // A simple key is required at the current position if the scanner is in - // the block context and the current column coincides with the indentation - // level. - - required := parser.flow_level == 0 && parser.indent == parser.mark.column - - // A simple key is required only when it is the first token in the current - // line. Therefore it is always allowed. But we add a check anyway. - if required && !parser.simple_key_allowed { - panic("should not happen") - } - - // - // If the current position may start a simple key, save it. - // - if parser.simple_key_allowed { - simple_key := yaml_simple_key_t{ - possible: true, - required: required, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - } - simple_key.mark = parser.mark - - if !yaml_parser_remove_simple_key(parser) { - return false - } - parser.simple_keys[len(parser.simple_keys)-1] = simple_key - } - return true -} - -// Remove a potential simple key at the current flow level. -func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { - i := len(parser.simple_keys) - 1 - if parser.simple_keys[i].possible { - // If the key is required, it is an error. - if parser.simple_keys[i].required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", parser.simple_keys[i].mark, - "could not find expected ':'") - } - } - // Remove the key from the stack. - parser.simple_keys[i].possible = false - return true -} - -// Increase the flow level and resize the simple key list if needed. -func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - // Reset the simple key on the next level. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - // Increase the flow level. - parser.flow_level++ - return true -} - -// Decrease the flow level. -func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { - if parser.flow_level > 0 { - parser.flow_level-- - parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] - } - return true -} - -// Push the current indentation level to the stack and set the new level -// the current column is greater than the indentation level. In this case, -// append or insert the specified token into the token queue. -func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - if parser.indent < column { - // Push the current indentation level to the stack and set the new - // indentation level. - parser.indents = append(parser.indents, parser.indent) - parser.indent = column - - // Create a token and insert it into the queue. - token := yaml_token_t{ - typ: typ, - start_mark: mark, - end_mark: mark, - } - if number > -1 { - number -= parser.tokens_parsed - } - yaml_insert_token(parser, number, &token) - } - return true -} - -// Pop indentation levels from the indents stack until the current level -// becomes less or equal to the column. For each intendation level, append -// the BLOCK-END token. -func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - // Loop through the intendation levels in the stack. - for parser.indent > column { - // Create a token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - - // Pop the indentation level. - parser.indent = parser.indents[len(parser.indents)-1] - parser.indents = parser.indents[:len(parser.indents)-1] - } - return true -} - -// Initialize the scanner and produce the STREAM-START token. -func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { - - // Set the initial indentation. - parser.indent = -1 - - // Initialize the simple key stack. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - // A simple key is allowed at the beginning of the stream. - parser.simple_key_allowed = true - - // We have started. - parser.stream_start_produced = true - - // Create the STREAM-START token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_START_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - encoding: parser.encoding, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the STREAM-END token and shut down the scanner. -func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { - - // Force new line. - if parser.mark.column != 0 { - parser.mark.column = 0 - parser.mark.line++ - } - - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the STREAM-END token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. -func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. - token := yaml_token_t{} - if !yaml_parser_scan_directive(parser, &token) { - return false - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the DOCUMENT-START or DOCUMENT-END token. -func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Consume the token. - start_mark := parser.mark - - skip(parser) - skip(parser) - skip(parser) - - end_mark := parser.mark - - // Create the DOCUMENT-START or DOCUMENT-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. -func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // The indicators '[' and '{' may start a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // Increase the flow level. - if !yaml_parser_increase_flow_level(parser) { - return false - } - - // A simple key may follow the indicators '[' and '{'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. -func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset any potential simple key on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Decrease the flow level. - if !yaml_parser_decrease_flow_level(parser) { - return false - } - - // No simple keys after the indicators ']' and '}'. - parser.simple_key_allowed = false - - // Consume the token. - - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-ENTRY token. -func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after ','. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_FLOW_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the BLOCK-ENTRY token. -func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { - // Check if the scanner is in the block context. - if parser.flow_level == 0 { - // Check if we are allowed to start a new entry. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "block sequence entries are not allowed in this context") - } - // Add the BLOCK-SEQUENCE-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { - return false - } - } else { - // It is an error for the '-' indicator to occur in the flow context, - // but we let the Parser detect and report about it because the Parser - // is able to point to the context. - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '-'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the BLOCK-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the KEY token. -func yaml_parser_fetch_key(parser *yaml_parser_t) bool { - - // In the block context, additional checks are required. - if parser.flow_level == 0 { - // Check if we are allowed to start a new key (not nessesary simple). - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping keys are not allowed in this context") - } - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '?' in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the KEY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the VALUE token. -func yaml_parser_fetch_value(parser *yaml_parser_t) bool { - - simple_key := &parser.simple_keys[len(parser.simple_keys)-1] - - // Have we found a simple key? - if simple_key.possible { - // Create the KEY token and insert it into the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: simple_key.mark, - end_mark: simple_key.mark, - } - yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) - - // In the block context, we may need to add the BLOCK-MAPPING-START token. - if !yaml_parser_roll_indent(parser, simple_key.mark.column, - simple_key.token_number, - yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { - return false - } - - // Remove the simple key. - simple_key.possible = false - - // A simple key cannot follow another simple key. - parser.simple_key_allowed = false - - } else { - // The ':' indicator follows a complex key. - - // In the block context, extra checks are required. - if parser.flow_level == 0 { - - // Check if we are allowed to start a complex value. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping values are not allowed in this context") - } - - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Simple keys after ':' are allowed in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - } - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the VALUE token and append it to the queue. - token := yaml_token_t{ - typ: yaml_VALUE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the ALIAS or ANCHOR token. -func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // An anchor or an alias could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow an anchor or an alias. - parser.simple_key_allowed = false - - // Create the ALIAS or ANCHOR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_anchor(parser, &token, typ) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the TAG token. -func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { - // A tag could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a tag. - parser.simple_key_allowed = false - - // Create the TAG token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_tag(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. -func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { - // Remove any potential simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // A simple key may follow a block scalar. - parser.simple_key_allowed = true - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_block_scalar(parser, &token, literal) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. -func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_flow_scalar(parser, &token, single) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,plain) token. -func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_plain_scalar(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Eat whitespaces and comments until the next token is found. -func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { - - // Until the next token is not found. - for { - // Allow the BOM mark to start a line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { - skip(parser) - } - - // Eat whitespaces. - // Tabs are allowed: - // - in the flow context - // - in the block context, but not at the beginning of the line or - // after '-', '?', or ':' (complex value). - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Eat a comment until a line break. - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // If it is a line break, eat it. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - - // In the block context, a new line may start a simple key. - if parser.flow_level == 0 { - parser.simple_key_allowed = true - } - } else { - break // We have found a token. - } - } - - return true -} - -// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { - // Eat '%'. - start_mark := parser.mark - skip(parser) - - // Scan the directive name. - var name []byte - if !yaml_parser_scan_directive_name(parser, start_mark, &name) { - return false - } - - // Is it a YAML directive? - if bytes.Equal(name, []byte("YAML")) { - // Scan the VERSION directive value. - var major, minor int8 - if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { - return false - } - end_mark := parser.mark - - // Create a VERSION-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_VERSION_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - major: major, - minor: minor, - } - - // Is it a TAG directive? - } else if bytes.Equal(name, []byte("TAG")) { - // Scan the TAG directive value. - var handle, prefix []byte - if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { - return false - } - end_mark := parser.mark - - // Create a TAG-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_TAG_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - prefix: prefix, - } - - // Unknown directive. - } else { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found uknown directive name") - return false - } - - // Eat the rest of the line including any comments. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - return true -} - -// Scan the directive name. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^ -// -func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { - // Consume the directive name. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - var s []byte - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the name is empty. - if len(s) == 0 { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "could not find expected directive name") - return false - } - - // Check for an blank character after the name. - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unexpected non-alphabetical character") - return false - } - *name = s - return true -} - -// Scan the value of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^ -func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the major version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { - return false - } - - // Eat '.'. - if parser.buffer[parser.buffer_pos] != '.' { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected digit or '.' character") - } - - skip(parser) - - // Consume the minor version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { - return false - } - return true -} - -const max_number_length = 2 - -// Scan the version number of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^ -// %YAML 1.1 # a comment \n -// ^ -func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { - - // Repeat while the next character is digit. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var value, length int8 - for is_digit(parser.buffer, parser.buffer_pos) { - // Check if the number is too long. - length++ - if length > max_number_length { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "found extremely long version number") - } - value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the number was present. - if length == 0 { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected version number") - } - *number = value - return true -} - -// Scan the value of a TAG-DIRECTIVE token. -// -// Scope: -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { - var handle_value, prefix_value []byte - - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a handle. - if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { - return false - } - - // Expect a whitespace. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blank(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace") - return false - } - - // Eat whitespaces. - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a prefix. - if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { - return false - } - - // Expect a whitespace or line break. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace or line break") - return false - } - - *handle = handle_value - *prefix = prefix_value - return true -} - -func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { - var s []byte - - // Eat the indicator character. - start_mark := parser.mark - skip(parser) - - // Consume the value. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - end_mark := parser.mark - - /* - * Check if length of the anchor is greater than 0 and it is followed by - * a whitespace character or one of the indicators: - * - * '?', ':', ',', ']', '}', '%', '@', '`'. - */ - - if len(s) == 0 || - !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || - parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '`') { - context := "while scanning an alias" - if typ == yaml_ANCHOR_TOKEN { - context = "while scanning an anchor" - } - yaml_parser_set_scanner_error(parser, context, start_mark, - "did not find expected alphabetic or numeric character") - return false - } - - // Create a token. - *token = yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - value: s, - } - - return true -} - -/* - * Scan a TAG token. - */ - -func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { - var handle, suffix []byte - - start_mark := parser.mark - - // Check if the tag is in the canonical form. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - if parser.buffer[parser.buffer_pos+1] == '<' { - // Keep the handle as '' - - // Eat '!<' - skip(parser) - skip(parser) - - // Consume the tag value. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - - // Check for '>' and eat it. - if parser.buffer[parser.buffer_pos] != '>' { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find the expected '>'") - return false - } - - skip(parser) - } else { - // The tag has either the '!suffix' or the '!handle!suffix' form. - - // First, try to scan a handle. - if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { - return false - } - - // Check if it is, indeed, handle. - if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { - // Scan the suffix now. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - } else { - // It wasn't a handle after all. Scan the rest of the tag. - if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { - return false - } - - // Set the handle to '!'. - handle = []byte{'!'} - - // A special case: the '!' tag. Set the handle to '' and the - // suffix to '!'. - if len(suffix) == 0 { - handle, suffix = suffix, handle - } - } - } - - // Check the character which ends the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find expected whitespace or line break") - return false - } - - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_TAG_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - suffix: suffix, - } - return true -} - -// Scan a tag handle. -func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { - // Check the initial '!' character. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] != '!' { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - - var s []byte - - // Copy the '!' character. - s = read(parser, s) - - // Copy all subsequent alphabetical and numerical characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the trailing character is '!' and copy it. - if parser.buffer[parser.buffer_pos] == '!' { - s = read(parser, s) - } else { - // It's either the '!' tag or not really a tag handle. If it's a %TAG - // directive, it's an error. If it's a tag token, it must be a part of URI. - if directive && !(s[0] == '!' && s[1] == 0) { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - } - - *handle = s - return true -} - -// Scan a tag. -func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { - //size_t length = head ? strlen((char *)head) : 0 - var s []byte - - // Copy the head if needed. - // - // Note that we don't copy the leading '!' character. - if len(head) > 1 { - s = append(s, head[1:]...) - } - - // Scan the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // The set of characters that may appear in URI is as follows: - // - // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', - // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', - // '%'. - // [Go] Convert this into more reasonable logic. - for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || - parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || - parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || - parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || - parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || - parser.buffer[parser.buffer_pos] == '%' { - // Check if it is a URI-escape sequence. - if parser.buffer[parser.buffer_pos] == '%' { - if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { - return false - } - } else { - s = read(parser, s) - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the tag is non-empty. - if len(s) == 0 { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected tag URI") - return false - } - *uri = s - return true -} - -// Decode an URI-escape sequence corresponding to a single UTF-8 character. -func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { - - // Decode the required number of characters. - w := 1024 - for w > 0 { - // Check for a URI-escaped octet. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - - if !(parser.buffer[parser.buffer_pos] == '%' && - is_hex(parser.buffer, parser.buffer_pos+1) && - is_hex(parser.buffer, parser.buffer_pos+2)) { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find URI escaped octet") - } - - // Get the octet. - octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) - - // If it is the leading octet, determine the length of the UTF-8 sequence. - if w == 1024 { - w = width(octet) - if w == 0 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect leading UTF-8 octet") - } - } else { - // Check if the trailing octet is correct. - if octet&0xC0 != 0x80 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect trailing UTF-8 octet") - } - } - - // Copy the octet and move the pointers. - *s = append(*s, octet) - skip(parser) - skip(parser) - skip(parser) - w-- - } - return true -} - -// Scan a block scalar. -func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { - // Eat the indicator '|' or '>'. - start_mark := parser.mark - skip(parser) - - // Scan the additional block scalar indicators. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check for a chomping indicator. - var chomping, increment int - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - // Set the chomping method and eat the indicator. - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - - // Check for an indentation indicator. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_digit(parser.buffer, parser.buffer_pos) { - // Check that the intendation is greater than 0. - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an intendation indicator equal to 0") - return false - } - - // Get the intendation level and eat the indicator. - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - } - - } else if is_digit(parser.buffer, parser.buffer_pos) { - // Do the same as above, but in the opposite order. - - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an intendation indicator equal to 0") - return false - } - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - } - } - - // Eat whitespaces and comments to the end of the line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - end_mark := parser.mark - - // Set the intendation level if it was specified. - var indent int - if increment > 0 { - if parser.indent >= 0 { - indent = parser.indent + increment - } else { - indent = increment - } - } - - // Scan the leading line breaks and determine the indentation level if needed. - var s, leading_break, trailing_breaks []byte - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - - // Scan the block scalar content. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var leading_blank, trailing_blank bool - for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { - // We are at the beginning of a non-empty line. - - // Is it a trailing whitespace? - trailing_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Check if we need to fold the leading line break. - if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { - // Do we need to join the lines by space? - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } - } else { - s = append(s, leading_break...) - } - leading_break = leading_break[:0] - - // Append the remaining line breaks. - s = append(s, trailing_breaks...) - trailing_breaks = trailing_breaks[:0] - - // Is it a leading whitespace? - leading_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Consume the current line. - for !is_breakz(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - leading_break = read_line(parser, leading_break) - - // Eat the following intendation spaces and line breaks. - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - } - - // Chomp the tail. - if chomping != -1 { - s = append(s, leading_break...) - } - if chomping == 1 { - s = append(s, trailing_breaks...) - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_LITERAL_SCALAR_STYLE, - } - if !literal { - token.style = yaml_FOLDED_SCALAR_STYLE - } - return true -} - -// Scan intendation spaces and line breaks for a block scalar. Determine the -// intendation level if needed. -func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { - *end_mark = parser.mark - - // Eat the intendation spaces and line breaks. - max_indent := 0 - for { - // Eat the intendation spaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.mark.column > max_indent { - max_indent = parser.mark.column - } - - // Check for a tab character messing the intendation. - if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { - return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found a tab character where an intendation space is expected") - } - - // Have we found a non-empty line? - if !is_break(parser.buffer, parser.buffer_pos) { - break - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - // [Go] Should really be returning breaks instead. - *breaks = read_line(parser, *breaks) - *end_mark = parser.mark - } - - // Determine the indentation level if needed. - if *indent == 0 { - *indent = max_indent - if *indent < parser.indent+1 { - *indent = parser.indent + 1 - } - if *indent < 1 { - *indent = 1 - } - } - return true -} - -// Scan a quoted scalar. -func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { - // Eat the left quote. - start_mark := parser.mark - skip(parser) - - // Consume the content of the quoted scalar. - var s, leading_break, trailing_breaks, whitespaces []byte - for { - // Check that there are no document indicators at the beginning of the line. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected document indicator") - return false - } - - // Check for EOF. - if is_z(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected end of stream") - return false - } - - // Consume non-blank characters. - leading_blanks := false - for !is_blankz(parser.buffer, parser.buffer_pos) { - if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { - // Is is an escaped single quote. - s = append(s, '\'') - skip(parser) - skip(parser) - - } else if single && parser.buffer[parser.buffer_pos] == '\'' { - // It is a right single quote. - break - } else if !single && parser.buffer[parser.buffer_pos] == '"' { - // It is a right double quote. - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { - // It is an escaped line break. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - skip(parser) - skip_line(parser) - leading_blanks = true - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' { - // It is an escape sequence. - code_length := 0 - - // Check the escape character. - switch parser.buffer[parser.buffer_pos+1] { - case '0': - s = append(s, 0) - case 'a': - s = append(s, '\x07') - case 'b': - s = append(s, '\x08') - case 't', '\t': - s = append(s, '\x09') - case 'n': - s = append(s, '\x0A') - case 'v': - s = append(s, '\x0B') - case 'f': - s = append(s, '\x0C') - case 'r': - s = append(s, '\x0D') - case 'e': - s = append(s, '\x1B') - case ' ': - s = append(s, '\x20') - case '"': - s = append(s, '"') - case '\'': - s = append(s, '\'') - case '\\': - s = append(s, '\\') - case 'N': // NEL (#x85) - s = append(s, '\xC2') - s = append(s, '\x85') - case '_': // #xA0 - s = append(s, '\xC2') - s = append(s, '\xA0') - case 'L': // LS (#x2028) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA8') - case 'P': // PS (#x2029) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA9') - case 'x': - code_length = 2 - case 'u': - code_length = 4 - case 'U': - code_length = 8 - default: - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found unknown escape character") - return false - } - - skip(parser) - skip(parser) - - // Consume an arbitrary escape code. - if code_length > 0 { - var value int - - // Scan the character value. - if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { - return false - } - for k := 0; k < code_length; k++ { - if !is_hex(parser.buffer, parser.buffer_pos+k) { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "did not find expected hexdecimal number") - return false - } - value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) - } - - // Check the value and write the character. - if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found invalid Unicode character escape code") - return false - } - if value <= 0x7F { - s = append(s, byte(value)) - } else if value <= 0x7FF { - s = append(s, byte(0xC0+(value>>6))) - s = append(s, byte(0x80+(value&0x3F))) - } else if value <= 0xFFFF { - s = append(s, byte(0xE0+(value>>12))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } else { - s = append(s, byte(0xF0+(value>>18))) - s = append(s, byte(0x80+((value>>12)&0x3F))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } - - // Advance the pointer. - for k := 0; k < code_length; k++ { - skip(parser) - } - } - } else { - // It is a non-escaped non-blank character. - s = read(parser, s) - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - // Check if we are at the end of the scalar. - if single { - if parser.buffer[parser.buffer_pos] == '\'' { - break - } - } else { - if parser.buffer[parser.buffer_pos] == '"' { - break - } - } - - // Consume blank characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Join the whitespaces or fold line breaks. - if leading_blanks { - // Do we need to fold line breaks? - if len(leading_break) > 0 && leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Eat the right quote. - skip(parser) - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_SINGLE_QUOTED_SCALAR_STYLE, - } - if !single { - token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - return true -} - -// Scan a plain scalar. -func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { - - var s, leading_break, trailing_breaks, whitespaces []byte - var leading_blanks bool - var indent = parser.indent + 1 - - start_mark := parser.mark - end_mark := parser.mark - - // Consume the content of the plain scalar. - for { - // Check for a document indicator. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - break - } - - // Check for a comment. - if parser.buffer[parser.buffer_pos] == '#' { - break - } - - // Consume non-blank characters. - for !is_blankz(parser.buffer, parser.buffer_pos) { - - // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". - if parser.flow_level > 0 && - parser.buffer[parser.buffer_pos] == ':' && - !is_blankz(parser.buffer, parser.buffer_pos+1) { - yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found unexpected ':'") - return false - } - - // Check for indicators that may end a plain scalar. - if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level > 0 && - (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}')) { - break - } - - // Check if we need to join whitespaces and breaks. - if leading_blanks || len(whitespaces) > 0 { - if leading_blanks { - // Do we need to fold line breaks? - if leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - leading_blanks = false - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Copy the character. - s = read(parser, s) - - end_mark = parser.mark - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - // Is it the end? - if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { - break - } - - // Consume blank characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - - // Check for tab character that abuse intendation. - if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violate intendation") - return false - } - - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check intendation level. - if parser.flow_level == 0 && parser.mark.column < indent { - break - } - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_PLAIN_SCALAR_STYLE, - } - - // Note that we change the 'simple_key_allowed' flag. - if leading_blanks { - parser.simple_key_allowed = true - } - return true -} diff --git a/vendor/launchpad.net/goyaml/sorter.go b/vendor/launchpad.net/goyaml/sorter.go deleted file mode 100644 index e1ee85f..0000000 --- a/vendor/launchpad.net/goyaml/sorter.go +++ /dev/null @@ -1,104 +0,0 @@ -package goyaml - -import ( - "reflect" - "unicode" -) - -type keyList []reflect.Value - -func (l keyList) Len() int { return len(l) } -func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l keyList) Less(i, j int) bool { - a := l[i] - b := l[j] - ak := a.Kind() - bk := b.Kind() - for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { - a = a.Elem() - ak = a.Kind() - } - for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { - b = b.Elem() - bk = b.Kind() - } - af, aok := keyFloat(a) - bf, bok := keyFloat(b) - if aok && bok { - if af != bf { - return af < bf - } - if ak != bk { - return ak < bk - } - return numLess(a, b) - } - if ak != reflect.String || bk != reflect.String { - return ak < bk - } - ar, br := []rune(a.String()), []rune(b.String()) - for i := 0; i < len(ar) && i < len(br); i++ { - if ar[i] == br[i] { - continue - } - al := unicode.IsLetter(ar[i]) - bl := unicode.IsLetter(br[i]) - if al && bl { - return ar[i] < br[i] - } - if al || bl { - return bl - } - var ai, bi int - var an, bn int64 - for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { - an = an*10 + int64(ar[ai]-'0') - } - for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { - bn = bn*10 + int64(br[bi]-'0') - } - if an != bn { - return an < bn - } - if ai != bi { - return ai < bi - } - return ar[i] < br[i] - } - return len(ar) < len(br) -} - -// keyFloat returns a float value for v if it is a number/bool -// and whether it is a number/bool or not. -func keyFloat(v reflect.Value) (f float64, ok bool) { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()), true - case reflect.Float32, reflect.Float64: - return v.Float(), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return float64(v.Uint()), true - case reflect.Bool: - if v.Bool() { - return 1, true - } - return 0, true - } - return 0, false -} - -// numLess returns whether a < b. -// a and b must necessarily have the same kind. -func numLess(a, b reflect.Value) bool { - switch a.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return a.Int() < b.Int() - case reflect.Float32, reflect.Float64: - return a.Float() < b.Float() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return a.Uint() < b.Uint() - case reflect.Bool: - return !a.Bool() && b.Bool() - } - panic("not a number") -} diff --git a/vendor/launchpad.net/goyaml/suite_test.go b/vendor/launchpad.net/goyaml/suite_test.go deleted file mode 100644 index 963ab0b..0000000 --- a/vendor/launchpad.net/goyaml/suite_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package goyaml_test - -import ( - . "launchpad.net/gocheck" - "testing" -) - -func Test(t *testing.T) { TestingT(t) } - -type S struct{} - -var _ = Suite(&S{}) diff --git a/vendor/launchpad.net/goyaml/writerc.go b/vendor/launchpad.net/goyaml/writerc.go deleted file mode 100644 index 4809bfb..0000000 --- a/vendor/launchpad.net/goyaml/writerc.go +++ /dev/null @@ -1,89 +0,0 @@ -package goyaml - -// Set the writer error and return false. -func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_WRITER_ERROR - emitter.problem = problem - return false -} - -// Flush the output buffer. -func yaml_emitter_flush(emitter *yaml_emitter_t) bool { - if emitter.write_handler == nil { - panic("write handler not set") - } - - // Check if the buffer is empty. - if emitter.buffer_pos == 0 { - return true - } - - // If the output encoding is UTF-8, we don't need to recode the buffer. - if emitter.encoding == yaml_UTF8_ENCODING { - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - return true - } - - // Recode the buffer into the raw buffer. - var low, high int - if emitter.encoding == yaml_UTF16LE_ENCODING { - low, high = 0, 1 - } else { - high, low = 1, 0 - } - - pos := 0 - for pos < emitter.buffer_pos { - // See the "reader.c" code for more details on UTF-8 encoding. Note - // that we assume that the buffer contains a valid UTF-8 sequence. - - // Read the next UTF-8 character. - octet := emitter.buffer[pos] - - var w int - var value rune - switch { - case octet&0x80 == 0x00: - w, value = 1, rune(octet&0x7F) - case octet&0xE0 == 0xC0: - w, value = 2, rune(octet&0x1F) - case octet&0xF0 == 0xE0: - w, value = 3, rune(octet&0x0F) - case octet&0xF8 == 0xF0: - w, value = 4, rune(octet&0x07) - } - for k := 1; k < w; k++ { - octet = emitter.buffer[pos+k] - value = (value << 6) + (rune(octet) & 0x3F) - } - pos += w - - // Write the character. - if value < 0x10000 { - var b [2]byte - b[high] = byte(value >> 8) - b[low] = byte(value & 0xFF) - emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1]) - } else { - // Write the character using a surrogate pair (check "reader.c"). - var b [4]byte - value -= 0x10000 - b[high] = byte(0xD8 + (value >> 18)) - b[low] = byte((value >> 10) & 0xFF) - b[high+2] = byte(0xDC + ((value >> 8) & 0xFF)) - b[low+2] = byte(value & 0xFF) - emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3]) - } - } - - // Write the raw buffer. - if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - emitter.raw_buffer = emitter.raw_buffer[:0] - return true -} diff --git a/vendor/launchpad.net/goyaml/yamlh.go b/vendor/launchpad.net/goyaml/yamlh.go deleted file mode 100644 index 1fea365..0000000 --- a/vendor/launchpad.net/goyaml/yamlh.go +++ /dev/null @@ -1,712 +0,0 @@ -package goyaml - -import ( - "io" -) - -// The version directive data. -type yaml_version_directive_t struct { - major int8 // The major version number. - minor int8 // The minor version number. -} - -// The tag directive data. -type yaml_tag_directive_t struct { - handle []byte // The tag handle. - prefix []byte // The tag prefix. -} - -type yaml_encoding_t int - -// The stream encoding. -const ( - // Let the parser choose the encoding. - yaml_ANY_ENCODING yaml_encoding_t = iota - - yaml_UTF8_ENCODING // The default UTF-8 encoding. - yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. - yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. -) - -type yaml_break_t int - -// Line break types. -const ( - // Let the parser choose the break type. - yaml_ANY_BREAK yaml_break_t = iota - - yaml_CR_BREAK // Use CR for line breaks (Mac style). - yaml_LN_BREAK // Use LN for line breaks (Unix style). - yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). -) - -type yaml_error_type_t int - -// Many bad things could happen with the parser and emitter. -const ( - // No error is produced. - yaml_NO_ERROR yaml_error_type_t = iota - - yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. - yaml_READER_ERROR // Cannot read or decode the input stream. - yaml_SCANNER_ERROR // Cannot scan the input stream. - yaml_PARSER_ERROR // Cannot parse the input stream. - yaml_COMPOSER_ERROR // Cannot compose a YAML document. - yaml_WRITER_ERROR // Cannot write to the output stream. - yaml_EMITTER_ERROR // Cannot emit a YAML stream. -) - -// The pointer position. -type yaml_mark_t struct { - index int // The position index. - line int // The position line. - column int // The position column. -} - -// Node Styles - -type yaml_style_t int8 - -type yaml_scalar_style_t yaml_style_t - -// Scalar styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota - - yaml_PLAIN_SCALAR_STYLE // The plain scalar style. - yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. - yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. - yaml_LITERAL_SCALAR_STYLE // The literal scalar style. - yaml_FOLDED_SCALAR_STYLE // The folded scalar style. -) - -type yaml_sequence_style_t yaml_style_t - -// Sequence styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota - - yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. - yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. -) - -type yaml_mapping_style_t yaml_style_t - -// Mapping styles. -const ( - // Let the emitter choose the style. - yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota - - yaml_BLOCK_MAPPING_STYLE // The block mapping style. - yaml_FLOW_MAPPING_STYLE // The flow mapping style. -) - -// Tokens - -type yaml_token_type_t int - -// Token types. -const ( - // An empty token. - yaml_NO_TOKEN yaml_token_type_t = iota - - yaml_STREAM_START_TOKEN // A STREAM-START token. - yaml_STREAM_END_TOKEN // A STREAM-END token. - - yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. - yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. - yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. - yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. - - yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. - yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. - yaml_BLOCK_END_TOKEN // A BLOCK-END token. - - yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. - yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. - yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. - yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. - - yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. - yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. - yaml_KEY_TOKEN // A KEY token. - yaml_VALUE_TOKEN // A VALUE token. - - yaml_ALIAS_TOKEN // An ALIAS token. - yaml_ANCHOR_TOKEN // An ANCHOR token. - yaml_TAG_TOKEN // A TAG token. - yaml_SCALAR_TOKEN // A SCALAR token. -) - -func (tt yaml_token_type_t) String() string { - switch tt { - case yaml_NO_TOKEN: - return "yaml_NO_TOKEN" - case yaml_STREAM_START_TOKEN: - return "yaml_STREAM_START_TOKEN" - case yaml_STREAM_END_TOKEN: - return "yaml_STREAM_END_TOKEN" - case yaml_VERSION_DIRECTIVE_TOKEN: - return "yaml_VERSION_DIRECTIVE_TOKEN" - case yaml_TAG_DIRECTIVE_TOKEN: - return "yaml_TAG_DIRECTIVE_TOKEN" - case yaml_DOCUMENT_START_TOKEN: - return "yaml_DOCUMENT_START_TOKEN" - case yaml_DOCUMENT_END_TOKEN: - return "yaml_DOCUMENT_END_TOKEN" - case yaml_BLOCK_SEQUENCE_START_TOKEN: - return "yaml_BLOCK_SEQUENCE_START_TOKEN" - case yaml_BLOCK_MAPPING_START_TOKEN: - return "yaml_BLOCK_MAPPING_START_TOKEN" - case yaml_BLOCK_END_TOKEN: - return "yaml_BLOCK_END_TOKEN" - case yaml_FLOW_SEQUENCE_START_TOKEN: - return "yaml_FLOW_SEQUENCE_START_TOKEN" - case yaml_FLOW_SEQUENCE_END_TOKEN: - return "yaml_FLOW_SEQUENCE_END_TOKEN" - case yaml_FLOW_MAPPING_START_TOKEN: - return "yaml_FLOW_MAPPING_START_TOKEN" - case yaml_FLOW_MAPPING_END_TOKEN: - return "yaml_FLOW_MAPPING_END_TOKEN" - case yaml_BLOCK_ENTRY_TOKEN: - return "yaml_BLOCK_ENTRY_TOKEN" - case yaml_FLOW_ENTRY_TOKEN: - return "yaml_FLOW_ENTRY_TOKEN" - case yaml_KEY_TOKEN: - return "yaml_KEY_TOKEN" - case yaml_VALUE_TOKEN: - return "yaml_VALUE_TOKEN" - case yaml_ALIAS_TOKEN: - return "yaml_ALIAS_TOKEN" - case yaml_ANCHOR_TOKEN: - return "yaml_ANCHOR_TOKEN" - case yaml_TAG_TOKEN: - return "yaml_TAG_TOKEN" - case yaml_SCALAR_TOKEN: - return "yaml_SCALAR_TOKEN" - } - return "" -} - -// The token structure. -type yaml_token_t struct { - // The token type. - typ yaml_token_type_t - - // The start/end of the token. - start_mark, end_mark yaml_mark_t - - // The stream encoding (for yaml_STREAM_START_TOKEN). - encoding yaml_encoding_t - - // The alias/anchor/scalar value or tag/tag directive handle - // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). - value []byte - - // The tag suffix (for yaml_TAG_TOKEN). - suffix []byte - - // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). - prefix []byte - - // The scalar style (for yaml_SCALAR_TOKEN). - style yaml_scalar_style_t - - // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). - major, minor int8 -} - -// Events - -type yaml_event_type_t int8 - -// Event types. -const ( - // An empty event. - yaml_NO_EVENT yaml_event_type_t = iota - - yaml_STREAM_START_EVENT // A STREAM-START event. - yaml_STREAM_END_EVENT // A STREAM-END event. - yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. - yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. - yaml_ALIAS_EVENT // An ALIAS event. - yaml_SCALAR_EVENT // A SCALAR event. - yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. - yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. - yaml_MAPPING_START_EVENT // A MAPPING-START event. - yaml_MAPPING_END_EVENT // A MAPPING-END event. -) - -// The event structure. -type yaml_event_t struct { - - // The event type. - typ yaml_event_type_t - - // The start and end of the event. - start_mark, end_mark yaml_mark_t - - // The document encoding (for yaml_STREAM_START_EVENT). - encoding yaml_encoding_t - - // The version directive (for yaml_DOCUMENT_START_EVENT). - version_directive *yaml_version_directive_t - - // The list of tag directives (for yaml_DOCUMENT_START_EVENT). - tag_directives []yaml_tag_directive_t - - // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). - anchor []byte - - // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - tag []byte - - // The scalar value (for yaml_SCALAR_EVENT). - value []byte - - // Is the document start/end indicator implicit, or the tag optional? - // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). - implicit bool - - // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). - quoted_implicit bool - - // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - style yaml_style_t -} - -func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } -func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } -func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } - -// Nodes - -const ( - yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. - yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. - yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. - yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. - yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. - yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. - - yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. - yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. - - yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. - yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. - yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. -) - -type yaml_node_type_t int - -// Node types. -const ( - // An empty node. - yaml_NO_NODE yaml_node_type_t = iota - - yaml_SCALAR_NODE // A scalar node. - yaml_SEQUENCE_NODE // A sequence node. - yaml_MAPPING_NODE // A mapping node. -) - -// An element of a sequence node. -type yaml_node_item_t int - -// An element of a mapping node. -type yaml_node_pair_t struct { - key int // The key of the element. - value int // The value of the element. -} - -// The node structure. -type yaml_node_t struct { - typ yaml_node_type_t // The node type. - tag []byte // The node tag. - - // The node data. - - // The scalar parameters (for yaml_SCALAR_NODE). - scalar struct { - value []byte // The scalar value. - length int // The length of the scalar value. - style yaml_scalar_style_t // The scalar style. - } - - // The sequence parameters (for YAML_SEQUENCE_NODE). - sequence struct { - items_data []yaml_node_item_t // The stack of sequence items. - style yaml_sequence_style_t // The sequence style. - } - - // The mapping parameters (for yaml_MAPPING_NODE). - mapping struct { - pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). - pairs_start *yaml_node_pair_t // The beginning of the stack. - pairs_end *yaml_node_pair_t // The end of the stack. - pairs_top *yaml_node_pair_t // The top of the stack. - style yaml_mapping_style_t // The mapping style. - } - - start_mark yaml_mark_t // The beginning of the node. - end_mark yaml_mark_t // The end of the node. - -} - -// The document structure. -type yaml_document_t struct { - - // The document nodes. - nodes []yaml_node_t - - // The version directive. - version_directive *yaml_version_directive_t - - // The list of tag directives. - tag_directives_data []yaml_tag_directive_t - tag_directives_start int // The beginning of the tag directives list. - tag_directives_end int // The end of the tag directives list. - - start_implicit int // Is the document start indicator implicit? - end_implicit int // Is the document end indicator implicit? - - // The start/end of the document. - start_mark, end_mark yaml_mark_t -} - -// The prototype of a read handler. -// -// The read handler is called when the parser needs to read more bytes from the -// source. The handler should write not more than size bytes to the buffer. -// The number of written bytes should be set to the size_read variable. -// -// [in,out] data A pointer to an application data specified by -// yaml_parser_set_input(). -// [out] buffer The buffer to write the data from the source. -// [in] size The size of the buffer. -// [out] size_read The actual number of bytes read from the source. -// -// On success, the handler should return 1. If the handler failed, -// the returned value should be 0. On EOF, the handler should set the -// size_read to 0 and return 1. -type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) - -// This structure holds information about a potential simple key. -type yaml_simple_key_t struct { - possible bool // Is a simple key possible? - required bool // Is a simple key required? - token_number int // The number of the token. - mark yaml_mark_t // The position mark. -} - -// The states of the parser. -type yaml_parser_state_t int - -const ( - yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota - - yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. - yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. - yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. - yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. - yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. - yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. - yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. - yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. - yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. - yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. - yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. - yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. - yaml_PARSE_END_STATE // Expect nothing. -) - -func (ps yaml_parser_state_t) String() string { - switch ps { - case yaml_PARSE_STREAM_START_STATE: - return "yaml_PARSE_STREAM_START_STATE" - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_START_STATE: - return "yaml_PARSE_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return "yaml_PARSE_DOCUMENT_CONTENT_STATE" - case yaml_PARSE_DOCUMENT_END_STATE: - return "yaml_PARSE_DOCUMENT_END_STATE" - case yaml_PARSE_BLOCK_NODE_STATE: - return "yaml_PARSE_BLOCK_NODE_STATE" - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" - case yaml_PARSE_FLOW_NODE_STATE: - return "yaml_PARSE_FLOW_NODE_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" - case yaml_PARSE_END_STATE: - return "yaml_PARSE_END_STATE" - } - return "" -} - -// This structure holds aliases data. -type yaml_alias_data_t struct { - anchor []byte // The anchor. - index int // The node id. - mark yaml_mark_t // The anchor mark. -} - -// The parser structure. -// -// All members are internal. Manage the structure using the -// yaml_parser_ family of functions. -type yaml_parser_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - - problem string // Error description. - - // The byte about which the problem occured. - problem_offset int - problem_value int - problem_mark yaml_mark_t - - // The error context. - context string - context_mark yaml_mark_t - - // Reader stuff - - read_handler yaml_read_handler_t // Read handler. - - input_file io.Reader // File input data. - input []byte // String input data. - input_pos int - - eof bool // EOF flag - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - unread int // The number of unread characters in the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The input encoding. - - offset int // The offset of the current position (in bytes). - mark yaml_mark_t // The mark of the current position. - - // Scanner stuff - - stream_start_produced bool // Have we started to scan the input stream? - stream_end_produced bool // Have we reached the end of the input stream? - - flow_level int // The number of unclosed '[' and '{' indicators. - - tokens []yaml_token_t // The tokens queue. - tokens_head int // The head of the tokens queue. - tokens_parsed int // The number of tokens fetched from the queue. - token_available bool // Does the tokens queue contain a token ready for dequeueing. - - indent int // The current indentation level. - indents []int // The indentation levels stack. - - simple_key_allowed bool // May a simple key occur at the current position? - simple_keys []yaml_simple_key_t // The stack of simple keys. - - // Parser stuff - - state yaml_parser_state_t // The current parser state. - states []yaml_parser_state_t // The parser states stack. - marks []yaml_mark_t // The stack of marks. - tag_directives []yaml_tag_directive_t // The list of TAG directives. - - // Dumper stuff - - aliases []yaml_alias_data_t // The alias data. - - document *yaml_document_t // The currently parsed document. -} - -// Emitter Definitions - -// The prototype of a write handler. -// -// The write handler is called when the emitter needs to flush the accumulated -// characters to the output. The handler should write @a size bytes of the -// @a buffer to the output. -// -// @param[in,out] data A pointer to an application data specified by -// yaml_emitter_set_output(). -// @param[in] buffer The buffer with bytes to be written. -// @param[in] size The size of the buffer. -// -// @returns On success, the handler should return @c 1. If the handler failed, -// the returned value should be @c 0. -// -type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error - -type yaml_emitter_state_t int - -// The emitter states. -const ( - // Expect STREAM-START. - yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota - - yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. - yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. - yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. - yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. - yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. - yaml_EMIT_END_STATE // Expect nothing. -) - -// The emitter structure. -// -// All members are internal. Manage the structure using the @c yaml_emitter_ -// family of functions. -type yaml_emitter_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - problem string // Error description. - - // Writer stuff - - write_handler yaml_write_handler_t // Write handler. - - output_buffer *[]byte // String output data. - output_file io.Writer // File output data. - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The stream encoding. - - // Emitter stuff - - canonical bool // If the output is in the canonical style? - best_indent int // The number of indentation spaces. - best_width int // The preferred width of the output lines. - unicode bool // Allow unescaped non-ASCII characters? - line_break yaml_break_t // The preferred line break. - - state yaml_emitter_state_t // The current emitter state. - states []yaml_emitter_state_t // The stack of states. - - events []yaml_event_t // The event queue. - events_head int // The head of the event queue. - - indents []int // The stack of indentation levels. - - tag_directives []yaml_tag_directive_t // The list of tag directives. - - indent int // The current indentation level. - - flow_level int // The current flow level. - - root_context bool // Is it the document root context? - sequence_context bool // Is it a sequence context? - mapping_context bool // Is it a mapping context? - simple_key_context bool // Is it a simple mapping key context? - - line int // The current line. - column int // The current column. - whitespace bool // If the last character was a whitespace? - indention bool // If the last character was an indentation character (' ', '-', '?', ':')? - open_ended bool // If an explicit document end is required? - - // Anchor analysis. - anchor_data struct { - anchor []byte // The anchor value. - alias bool // Is it an alias? - } - - // Tag analysis. - tag_data struct { - handle []byte // The tag handle. - suffix []byte // The tag suffix. - } - - // Scalar analysis. - scalar_data struct { - value []byte // The scalar value. - multiline bool // Does the scalar contain line breaks? - flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? - block_plain_allowed bool // Can the scalar be expressed in the block plain style? - single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? - block_allowed bool // Can the scalar be expressed in the literal or folded styles? - style yaml_scalar_style_t // The output style. - } - - // Dumper stuff - - opened bool // If the stream was already opened? - closed bool // If the stream was already closed? - - // The information associated with the document nodes. - anchors *struct { - references int // The number of references. - anchor int // The anchor id. - serialized bool // If the node has been emitted? - } - - last_anchor_id int // The last assigned anchor id. - - document *yaml_document_t // The currently emitted document. -} diff --git a/vendor/launchpad.net/goyaml/yamlprivateh.go b/vendor/launchpad.net/goyaml/yamlprivateh.go deleted file mode 100644 index 1c0b23d..0000000 --- a/vendor/launchpad.net/goyaml/yamlprivateh.go +++ /dev/null @@ -1,173 +0,0 @@ -package goyaml - -const ( - // The size of the input raw buffer. - input_raw_buffer_size = 512 - - // The size of the input buffer. - // It should be possible to decode the whole raw buffer. - input_buffer_size = input_raw_buffer_size * 3 - - // The size of the output buffer. - output_buffer_size = 128 - - // The size of the output raw buffer. - // It should be possible to encode the whole output buffer. - output_raw_buffer_size = (output_buffer_size*2 + 2) - - // The size of other stacks and queues. - initial_stack_size = 16 - initial_queue_size = 16 - initial_string_size = 16 -) - -// Check if the character at the specified position is an alphabetical -// character, a digit, '_', or '-'. -func is_alpha(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' -} - -// Check if the character at the specified position is a digit. -func is_digit(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' -} - -// Get the value of a digit. -func as_digit(b []byte, i int) int { - return int(b[i]) - '0' -} - -// Check if the character at the specified position is a hex-digit. -func is_hex(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' -} - -// Get the value of a hex-digit. -func as_hex(b []byte, i int) int { - bi := b[i] - if bi >= 'A' && bi <= 'F' { - return int(bi) - 'A' + 10 - } - if bi >= 'a' && bi <= 'f' { - return int(bi) - 'a' + 10 - } - return int(bi) - '0' -} - -// Check if the character is ASCII. -func is_ascii(b []byte, i int) bool { - return b[i] <= 0x7F -} - -// Check if the character at the start of the buffer can be printed unescaped. -func is_printable(b []byte, i int) bool { - return ((b[i] == 0x0A) || // . == #x0A - (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E - (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF - (b[i] > 0xC2 && b[i] < 0xED) || - (b[i] == 0xED && b[i+1] < 0xA0) || - (b[i] == 0xEE) || - (b[i] == 0xEF && // #xE000 <= . <= #xFFFD - !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF - !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) -} - -// Check if the character at the specified position is NUL. -func is_z(b []byte, i int) bool { - return b[i] == 0x00 -} - -// Check if the beginning of the buffer is a BOM. -func is_bom(b []byte, i int) bool { - return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF -} - -// Check if the character at the specified position is space. -func is_space(b []byte, i int) bool { - return b[i] == ' ' -} - -// Check if the character at the specified position is tab. -func is_tab(b []byte, i int) bool { - return b[i] == '\t' -} - -// Check if the character at the specified position is blank (space or tab). -func is_blank(b []byte, i int) bool { - //return is_space(b, i) || is_tab(b, i) - return b[i] == ' ' || b[i] == '\t' -} - -// Check if the character at the specified position is a line break. -func is_break(b []byte, i int) bool { - return (b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) -} - -func is_crlf(b []byte, i int) bool { - return b[i] == '\r' && b[i+1] == '\n' -} - -// Check if the character is a line break or NUL. -func is_breakz(b []byte, i int) bool { - //return is_break(b, i) || is_z(b, i) - return ( // is_break: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - // is_z: - b[i] == 0) -} - -// Check if the character is a line break, space, or NUL. -func is_spacez(b []byte, i int) bool { - //return is_space(b, i) || is_breakz(b, i) - return ( // is_space: - b[i] == ' ' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Check if the character is a line break, space, tab, or NUL. -func is_blankz(b []byte, i int) bool { - //return is_blank(b, i) || is_breakz(b, i) - return ( // is_blank: - b[i] == ' ' || b[i] == '\t' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Determine the width of the character. -func width(b byte) int { - // Don't replace these by a switch without first - // confirming that it is being inlined. - if b&0x80 == 0x00 { - return 1 - } - if b&0xE0 == 0xC0 { - return 2 - } - if b&0xF0 == 0xE0 { - return 3 - } - if b&0xF8 == 0xF0 { - return 4 - } - return 0 - -} From 4b75c608194753cb366493eee1ecd7d15c6cb8d7 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Fri, 10 Mar 2017 14:08:38 -0500 Subject: [PATCH 5/9] Dockerfile: builds an image from master Signed-off-by: Vincent Batts --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 50556bc..6cfbafe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM fedora ENV GOPATH /usr/local EXPOSE 7777 -RUN dnf install -y golang git && \ +RUN dnf install -y golang git bzr && \ go get github.com/vbatts/imgsrv && \ rm -rf /usr/local/src /usr/local/pkg && \ - dnf remove -y golang git + dnf remove -y golang git bzr ENTRYPOINT ["/usr/local/bin/imgsrv"] From e3593e4992ffd33a51e7b928a59b27392c60eb03 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Fri, 10 Mar 2017 15:41:17 -0500 Subject: [PATCH 6/9] Dockerfile: introduce environment variables Signed-off-by: Vincent Batts --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6cfbafe..e26fed6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,4 +5,7 @@ RUN dnf install -y golang git bzr && \ go get github.com/vbatts/imgsrv && \ rm -rf /usr/local/src /usr/local/pkg && \ dnf remove -y golang git bzr -ENTRYPOINT ["/usr/local/bin/imgsrv"] +ENV MONGO_DB filesrv +ENV MONGO_HOST 127.0.0.1 +ENV MONGO_PORT 27017 +ENTRYPOINT /usr/local/bin/imgsrv -server -mongo-host=$MONGO_HOST:$MONGO_PORT -mongo-db=$MONGO_DB -mongo-username=$MONGO_USER -mongo-password=$MONGO_PASSWORD From 51e270e2c55c07ca638c911c895fdcb770182ddf Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Fri, 10 Mar 2017 15:47:23 -0500 Subject: [PATCH 7/9] README: there are more deps Let folks find that out on their own Signed-off-by: Vincent Batts --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index a13f07f..412db6f 100644 --- a/README.md +++ b/README.md @@ -51,15 +51,6 @@ then you can drop that flag out, for quicker lolzing: 2013/02/12 13:00:29 New Image!: http://hurp.til.derp.com:7777/f/lolz.gif -Dependencies ------------- - - go get launchpad.net/goyaml - go get labix.org/v2/mgo - -and put this imgsrv in your GOPATH, -since it references itself. - Building -------- From d3761001a93986fc7c2f2dbc64cc4ce40f196aea Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Wed, 22 Mar 2017 14:11:49 -0400 Subject: [PATCH 8/9] Dockerfile: use the openshift variables Signed-off-by: Vincent Batts --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index e26fed6..9f9cbd5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN dnf install -y golang git bzr && \ go get github.com/vbatts/imgsrv && \ rm -rf /usr/local/src /usr/local/pkg && \ dnf remove -y golang git bzr -ENV MONGO_DB filesrv -ENV MONGO_HOST 127.0.0.1 -ENV MONGO_PORT 27017 -ENTRYPOINT /usr/local/bin/imgsrv -server -mongo-host=$MONGO_HOST:$MONGO_PORT -mongo-db=$MONGO_DB -mongo-username=$MONGO_USER -mongo-password=$MONGO_PASSWORD +ENV MONGODB_DATABASE filesrv +ENV MONGODB_SERVICE_HOST 127.0.0.1 +ENV MONGODB_SERVICE_PORT 27017 +ENTRYPOINT /usr/local/bin/imgsrv -server -mongo-host=$MONGODB_SERVICE_HOST:$MONGODB_SERVICE_PORT -mongo-db=$MONGODB_DATABASE -mongo-username=$MONGODB_USER -mongo-password=$MONGODB_PASSWORD From 0edeff0e16c1a141d60eb41f9baf83681b9ed2fe Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Wed, 22 Mar 2017 15:40:40 -0400 Subject: [PATCH 9/9] Dockerfile: reorg, and use the shared env variables Signed-off-by: Vincent Batts --- Dockerfile | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9f9cbd5..1caf262 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,16 @@ FROM fedora -ENV GOPATH /usr/local EXPOSE 7777 +ENV GOPATH /usr/local +ENV MONGODB_DATABASE filesrv +ENV MONGODB_SERVICE_HOST 127.0.0.1 +ENV MONGODB_SERVICE_PORT 27017 RUN dnf install -y golang git bzr && \ go get github.com/vbatts/imgsrv && \ rm -rf /usr/local/src /usr/local/pkg && \ dnf remove -y golang git bzr -ENV MONGODB_DATABASE filesrv -ENV MONGODB_SERVICE_HOST 127.0.0.1 -ENV MONGODB_SERVICE_PORT 27017 -ENTRYPOINT /usr/local/bin/imgsrv -server -mongo-host=$MONGODB_SERVICE_HOST:$MONGODB_SERVICE_PORT -mongo-db=$MONGODB_DATABASE -mongo-username=$MONGODB_USER -mongo-password=$MONGODB_PASSWORD +ENTRYPOINT /usr/local/bin/imgsrv \ + -server \ + -mongo-host=$MONGODB_SERVICE_HOST:$MONGODB_SERVICE_PORT \ + -mongo-db=$MONGODB_DATABASE \ + -mongo-username=$DATABASE_USER \ + -mongo-password=$DATABASE_PASSWORD

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%0AE(?|1sL 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 f^0ALQZ_B^; - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/labix.org/v2/mgo/Makefile b/vendor/labix.org/v2/mgo/Makefile deleted file mode 100644 index 51bee73..0000000 --- a/vendor/labix.org/v2/mgo/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -startdb: - @testdb/setup.sh start - -stopdb: - @testdb/setup.sh stop diff --git a/vendor/labix.org/v2/mgo/auth.go b/vendor/labix.org/v2/mgo/auth.go deleted file mode 100644 index 7f3ba8c..0000000 --- a/vendor/labix.org/v2/mgo/auth.go +++ /dev/null @@ -1,412 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "crypto/md5" - "encoding/hex" - "errors" - "fmt" - "labix.org/v2/mgo/bson" - "sync" -) - -type authCmd struct { - Authenticate int - - Nonce string - User string - Key string -} - -type startSaslCmd struct { - StartSASL int `bson:"startSasl"` -} - -type authResult struct { - ErrMsg string - Ok bool -} - -type getNonceCmd struct { - GetNonce int -} - -type getNonceResult struct { - Nonce string - Err string "$err" - Code int -} - -type logoutCmd struct { - Logout int -} - -type saslCmd struct { - Start int `bson:"saslStart,omitempty"` - Continue int `bson:"saslContinue,omitempty"` - ConversationId int `bson:"conversationId,omitempty"` - Mechanism string `bson:"mechanism,omitempty"` - Payload []byte -} - -type saslResult struct { - Ok bool `bson:"ok"` - NotOk bool `bson:"code"` // Server <= 2.3.2 returns ok=1 & code>0 on errors (WTF?) - Done bool - - ConversationId int `bson:"conversationId"` - Payload []byte - ErrMsg string -} - -type saslStepper interface { - Step(serverData []byte) (clientData []byte, done bool, err error) - Close() -} - -func (socket *mongoSocket) getNonce() (nonce string, err error) { - socket.Lock() - for socket.cachedNonce == "" && socket.dead == nil { - debugf("Socket %p to %s: waiting for nonce", socket, socket.addr) - socket.gotNonce.Wait() - } - if socket.cachedNonce == "mongos" { - socket.Unlock() - return "", errors.New("Can't authenticate with mongos; see http://j.mp/mongos-auth") - } - debugf("Socket %p to %s: got nonce", socket, socket.addr) - nonce, err = socket.cachedNonce, socket.dead - socket.cachedNonce = "" - socket.Unlock() - if err != nil { - nonce = "" - } - return -} - -func (socket *mongoSocket) resetNonce() { - debugf("Socket %p to %s: requesting a new nonce", socket, socket.addr) - op := &queryOp{} - op.query = &getNonceCmd{GetNonce: 1} - op.collection = "admin.$cmd" - op.limit = -1 - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - if err != nil { - socket.kill(errors.New("getNonce: "+err.Error()), true) - return - } - result := &getNonceResult{} - err = bson.Unmarshal(docData, &result) - if err != nil { - socket.kill(errors.New("Failed to unmarshal nonce: "+err.Error()), true) - return - } - debugf("Socket %p to %s: nonce unmarshalled: %#v", socket, socket.addr, result) - if result.Code == 13390 { - // mongos doesn't yet support auth (see http://j.mp/mongos-auth) - result.Nonce = "mongos" - } else if result.Nonce == "" { - var msg string - if result.Err != "" { - msg = fmt.Sprintf("Got an empty nonce: %s (%d)", result.Err, result.Code) - } else { - msg = "Got an empty nonce" - } - socket.kill(errors.New(msg), true) - return - } - socket.Lock() - if socket.cachedNonce != "" { - socket.Unlock() - panic("resetNonce: nonce already cached") - } - socket.cachedNonce = result.Nonce - socket.gotNonce.Signal() - socket.Unlock() - } - err := socket.Query(op) - if err != nil { - socket.kill(errors.New("resetNonce: "+err.Error()), true) - } -} - -func (socket *mongoSocket) Login(cred Credential) error { - socket.Lock() - for _, sockCred := range socket.creds { - if sockCred == cred { - debugf("Socket %p to %s: login: db=%q user=%q (already logged in)", socket, socket.addr, cred.Source, cred.Username) - socket.Unlock() - return nil - } - } - if socket.dropLogout(cred) { - debugf("Socket %p to %s: login: db=%q user=%q (cached)", socket, socket.addr, cred.Source, cred.Username) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - } - socket.Unlock() - - debugf("Socket %p to %s: login: db=%q user=%q", socket, socket.addr, cred.Source, cred.Username) - - var err error - switch cred.Mechanism { - case "", "MONGO-CR": - err = socket.loginClassic(cred) - case "PLAIN": - err = socket.loginPlain(cred) - case "MONGO-X509": - err = fmt.Errorf("unsupported authentication mechanism: %s", cred.Mechanism) - default: - // Try SASL for everything else, if it is available. - err = socket.loginSASL(cred) - } - - if err != nil { - debugf("Socket %p to %s: login error: %s", socket, socket.addr, err) - } else { - debugf("Socket %p to %s: login successful", socket, socket.addr) - } - return err -} - -func (socket *mongoSocket) loginClassic(cred Credential) error { - // Note that this only works properly because this function is - // synchronous, which means the nonce won't get reset while we're - // using it and any other login requests will block waiting for a - // new nonce provided in the defer call below. - nonce, err := socket.getNonce() - if err != nil { - return err - } - defer socket.resetNonce() - - psum := md5.New() - psum.Write([]byte(cred.Username + ":mongo:" + cred.Password)) - - ksum := md5.New() - ksum.Write([]byte(nonce + cred.Username)) - ksum.Write([]byte(hex.EncodeToString(psum.Sum(nil)))) - - key := hex.EncodeToString(ksum.Sum(nil)) - - cmd := authCmd{Authenticate: 1, User: cred.Username, Nonce: nonce, Key: key} - res := authResult{} - return socket.loginRun(cred.Source, &cmd, &res, func() error { - if !res.Ok { - return errors.New(res.ErrMsg) - } - socket.Lock() - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - }) -} - -func (socket *mongoSocket) loginPlain(cred Credential) error { - cmd := saslCmd{Start: 1, Mechanism: "PLAIN", Payload: []byte("\x00" + cred.Username + "\x00" + cred.Password)} - res := authResult{} - return socket.loginRun(cred.Source, &cmd, &res, func() error { - if !res.Ok { - return errors.New(res.ErrMsg) - } - socket.Lock() - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - }) -} - -func (socket *mongoSocket) loginSASL(cred Credential) error { - sasl, err := saslNew(cred, socket.Server().Addr) - if err != nil { - return err - } - defer sasl.Close() - - // The goal of this logic is to carry a locked socket until the - // local SASL step confirms the auth is valid; the socket needs to be - // locked so that concurrent action doesn't leave the socket in an - // auth state that doesn't reflect the operations that took place. - // As a simple case, imagine inverting login=>logout to logout=>login. - // - // The logic below works because the lock func isn't called concurrently. - locked := false - lock := func(b bool) { - if locked != b { - locked = b - if b { - socket.Lock() - } else { - socket.Unlock() - } - } - } - - lock(true) - defer lock(false) - - start := 1 - cmd := saslCmd{} - res := saslResult{} - for { - payload, done, err := sasl.Step(res.Payload) - if err != nil { - return err - } - if done && res.Done { - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - break - } - lock(false) - - cmd = saslCmd{ - Start: start, - Continue: 1 - start, - ConversationId: res.ConversationId, - Mechanism: cred.Mechanism, - Payload: payload, - } - start = 0 - err = socket.loginRun(cred.Source, &cmd, &res, func() error { - // See the comment on lock for why this is necessary. - lock(true) - if !res.Ok || res.NotOk { - return fmt.Errorf("server returned error on SASL authentication step: %s", res.ErrMsg) - } - return nil - }) - if err != nil { - return err - } - if done && res.Done { - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - break - } - } - - return nil -} - -func (socket *mongoSocket) loginRun(db string, query, result interface{}, f func() error) error { - var mutex sync.Mutex - var replyErr error - mutex.Lock() - - op := queryOp{} - op.query = query - op.collection = db + ".$cmd" - op.limit = -1 - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - defer mutex.Unlock() - - if err != nil { - replyErr = err - return - } - - err = bson.Unmarshal(docData, result) - if err != nil { - replyErr = err - } else { - // Must handle this within the read loop for the socket, so - // that concurrent login requests are properly ordered. - replyErr = f() - } - } - - err := socket.Query(&op) - if err != nil { - return err - } - mutex.Lock() // Wait. - return replyErr -} - -func (socket *mongoSocket) Logout(db string) { - socket.Lock() - cred, found := socket.dropAuth(db) - if found { - debugf("Socket %p to %s: logout: db=%q (flagged)", socket, socket.addr, db) - socket.logout = append(socket.logout, cred) - } - socket.Unlock() -} - -func (socket *mongoSocket) LogoutAll() { - socket.Lock() - if l := len(socket.creds); l > 0 { - debugf("Socket %p to %s: logout all (flagged %d)", socket, socket.addr, l) - socket.logout = append(socket.logout, socket.creds...) - socket.creds = socket.creds[0:0] - } - socket.Unlock() -} - -func (socket *mongoSocket) flushLogout() (ops []interface{}) { - socket.Lock() - if l := len(socket.logout); l > 0 { - debugf("Socket %p to %s: logout all (flushing %d)", socket, socket.addr, l) - for i := 0; i != l; i++ { - op := queryOp{} - op.query = &logoutCmd{1} - op.collection = socket.logout[i].Source + ".$cmd" - op.limit = -1 - ops = append(ops, &op) - } - socket.logout = socket.logout[0:0] - } - socket.Unlock() - return -} - -func (socket *mongoSocket) dropAuth(db string) (cred Credential, found bool) { - for i, sockCred := range socket.creds { - if sockCred.Source == db { - copy(socket.creds[i:], socket.creds[i+1:]) - socket.creds = socket.creds[:len(socket.creds)-1] - return sockCred, true - } - } - return cred, false -} - -func (socket *mongoSocket) dropLogout(cred Credential) (found bool) { - for i, sockCred := range socket.logout { - if sockCred == cred { - copy(socket.logout[i:], socket.logout[i+1:]) - socket.logout = socket.logout[:len(socket.logout)-1] - return true - } - } - return false -} diff --git a/vendor/labix.org/v2/mgo/auth_test.go b/vendor/labix.org/v2/mgo/auth_test.go deleted file mode 100644 index 07080ca..0000000 --- a/vendor/labix.org/v2/mgo/auth_test.go +++ /dev/null @@ -1,935 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "flag" - "fmt" - "labix.org/v2/mgo" - . "launchpad.net/gocheck" - "net/url" - "sync" - "time" -) - -func (s *S) TestAuthLoginDatabase(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - admindb := session.DB("admin") - - err = admindb.Login("root", "wrong") - c.Assert(err, ErrorMatches, "auth fail(s|ed)") - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - } -} - -func (s *S) TestAuthLoginSession(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - cred := mgo.Credential{ - Username: "root", - Password: "wrong", - } - err = session.Login(&cred) - c.Assert(err, ErrorMatches, "auth fail(s|ed)") - - cred.Password = "rapadura" - - err = session.Login(&cred) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - } -} - -func (s *S) TestAuthLoginLogout(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - // Must have dropped auth from the session too. - session = session.Copy() - defer session.Close() - - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - } -} - -func (s *S) TestAuthLoginLogoutAll(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session.LogoutAll() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - // Must have dropped auth from the session too. - session = session.Copy() - defer session.Close() - - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") -} - -func (s *S) TestAuthUpsertUserErrors(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - err = mydb.UpsertUser(&mgo.User{}) - c.Assert(err, ErrorMatches, "user has no Username") - - err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", UserSource: "source"}) - c.Assert(err, ErrorMatches, "user has both Password/PasswordHash and UserSource set") - - err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", OtherDBRoles: map[string][]mgo.Role{"db": nil}}) - c.Assert(err, ErrorMatches, "user with OtherDBRoles is only supported in admin database") -} - -func (s *S) TestAuthUpsertUser(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - ruser := &mgo.User{ - Username: "myruser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleRead}, - } - rwuser := &mgo.User{ - Username: "myrwuser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleReadWrite}, - } - - err = mydb.UpsertUser(ruser) - c.Assert(err, IsNil) - err = mydb.UpsertUser(rwuser) - c.Assert(err, IsNil) - - err = mydb.Login("myruser", "mypass") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = mydb.Login("myrwuser", "mypass") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - myotherdb := session.DB("myotherdb") - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Test UserSource. - rwuserother := &mgo.User{ - Username: "myrwuser", - UserSource: "mydb", - Roles: []mgo.Role{mgo.RoleRead}, - } - - err = myotherdb.UpsertUser(rwuserother) - if s.versionAtLeast(2, 6) { - c.Assert(err, ErrorMatches, `MongoDB 2.6\+ does not support the UserSource setting`) - return - } - c.Assert(err, IsNil) - - admindb.Logout() - - // Test indirection via UserSource: we can't write to it, because - // the roles for myrwuser are different there. - othercoll := myotherdb.C("myothercoll") - err = othercoll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // Reading works, though. - err = othercoll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - - // Can't login directly into the database using UserSource, though. - err = myotherdb.Login("myrwuser", "mypass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)") -} - -func (s *S) TestAuthUpsertUserOtherDBRoles(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - ruser := &mgo.User{ - Username: "myruser", - Password: "mypass", - OtherDBRoles: map[string][]mgo.Role{"mydb": []mgo.Role{mgo.RoleRead}}, - } - - err = admindb.UpsertUser(ruser) - c.Assert(err, IsNil) - defer admindb.RemoveUser("myruser") - - admindb.Logout() - err = admindb.Login("myruser", "mypass") - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = coll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthUpsertUserUpdates(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - // Insert a user that can read. - user := &mgo.User{ - Username: "myruser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleRead}, - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Now update the user password. - user = &mgo.User{ - Username: "myruser", - Password: "mynewpass", - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Login with the new user. - usession, err := mgo.Dial("myruser:mynewpass@localhost:40002/mydb") - c.Assert(err, IsNil) - defer usession.Close() - - // Can read, but not write. - err = usession.DB("mydb").C("mycoll").Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // Update the user role. - user = &mgo.User{ - Username: "myruser", - Roles: []mgo.Role{mgo.RoleReadWrite}, - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Dial again to ensure the password hasn't changed. - usession, err = mgo.Dial("myruser:mynewpass@localhost:40002/mydb") - c.Assert(err, IsNil) - defer usession.Close() - - // Now it can write. - err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthAddUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myruser", "mypass", true) - c.Assert(err, IsNil) - err = mydb.AddUser("mywuser", "mypass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myruser", "mypass") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = mydb.Login("mywuser", "mypass") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthAddUserReplaces(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "myoldpass", false) - c.Assert(err, IsNil) - err = mydb.AddUser("myuser", "mynewpass", true) - c.Assert(err, IsNil) - - admindb.Logout() - - err = mydb.Login("myuser", "myoldpass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)") - err = mydb.Login("myuser", "mynewpass") - c.Assert(err, IsNil) - - // ReadOnly flag was changed too. - err = mydb.C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") -} - -func (s *S) TestAuthRemoveUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", true) - c.Assert(err, IsNil) - err = mydb.RemoveUser("myuser") - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)") -} - -func (s *S) TestAuthLoginTwiceDoesNothing(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - oldStats := mgo.GetStats() - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) -} - -func (s *S) TestAuthLoginLogoutLoginDoesNothing(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - oldStats := mgo.GetStats() - - admindb.Logout() - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) -} - -func (s *S) TestAuthLoginSwitchUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - err = admindb.Login("reader", "rapadura") - c.Assert(err, IsNil) - - // Can't write. - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // But can read. - result := struct{ N int }{} - err = coll.Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestAuthLoginChangePassword(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "myoldpass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "myoldpass") - c.Assert(err, IsNil) - - err = mydb.AddUser("myuser", "mynewpass", true) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mynewpass") - c.Assert(err, IsNil) - - admindb.Logout() - - // The second login must be in effect, which means read-only. - err = mydb.C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") -} - -func (s *S) TestAuthLoginCachingWithSessionRefresh(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session.Refresh() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithSessionCopy(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.Copy() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithSessionClone(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.Clone() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithNewSession(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.New() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized for .*") -} - -func (s *S) TestAuthLoginCachingAcrossPool(c *C) { - // Logins are cached even when the conenction goes back - // into the pool. - - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Add another user to test the logout case at the same time. - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Logout root explicitly, to test both cases. - admindb.Logout() - - // Give socket back to pool. - session.Refresh() - - // Brand new session, should use socket from the pool. - other := session.New() - defer other.Close() - - oldStats := mgo.GetStats() - - err = other.DB("admin").Login("root", "rapadura") - c.Assert(err, IsNil) - err = other.DB("mydb").Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Both logins were cached, so no ops. - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) - - // And they actually worked. - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - other.DB("admin").Logout() - - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingAcrossPoolWithLogout(c *C) { - // Now verify that logouts are properly flushed if they - // are not revalidated after leaving the pool. - - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Add another user to test the logout case at the same time. - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", true) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Just some data to query later. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - // Give socket back to pool. - session.Refresh() - - // Brand new session, should use socket from the pool. - other := session.New() - defer other.Close() - - oldStats := mgo.GetStats() - - err = other.DB("mydb").Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Login was cached, so no ops. - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) - - // Can't write, since root has been implicitly logged out - // when the collection went into the pool, and not revalidated. - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // But can read due to the revalidated myuser login. - result := struct{ N int }{} - err = other.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestAuthEventual(c *C) { - // Eventual sessions don't keep sockets around, so they are - // an interesting test case. - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - var wg sync.WaitGroup - wg.Add(20) - - for i := 0; i != 10; i++ { - go func() { - defer wg.Done() - var result struct{ N int } - err := session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) - }() - } - - for i := 0; i != 10; i++ { - go func() { - defer wg.Done() - err := session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - }() - } - - wg.Wait() -} - -func (s *S) TestAuthURL(c *C) { - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") - c.Assert(err, IsNil) - defer session.Close() - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthURLWrongCredentials(c *C) { - session, err := mgo.Dial("mongodb://root:wrong@localhost:40002/") - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "auth fail(s|ed)") - c.Assert(session, IsNil) -} - -func (s *S) TestAuthURLWithNewSession(c *C) { - // When authentication is in the URL, the new session will - // actually carry it on as well, even if logged out explicitly. - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") - c.Assert(err, IsNil) - defer session.Close() - - session.DB("admin").Logout() - - // Do it twice to ensure it passes the needed data on. - session = session.New() - defer session.Close() - session = session.New() - defer session.Close() - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthURLWithDatabase(c *C) { - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - mydb := session.DB("mydb") - err = mydb.AddUser("myruser", "mypass", true) - c.Assert(err, IsNil) - - // Test once with database, and once with source. - for i := 0; i < 2; i++ { - var url string - if i == 0 { - url = "mongodb://myruser:mypass@localhost:40002/mydb" - } else { - url = "mongodb://myruser:mypass@localhost:40002/admin?authSource=mydb" - } - usession, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer usession.Close() - - ucoll := usession.DB("mydb").C("mycoll") - err = ucoll.FindId(0).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - err = ucoll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - } -} - -func (s *S) TestDefaultDatabase(c *C) { - tests := []struct{ url, db string }{ - {"mongodb://root:rapadura@localhost:40002", "test"}, - {"mongodb://root:rapadura@localhost:40002/admin", "admin"}, - {"mongodb://localhost:40001", "test"}, - {"mongodb://localhost:40001/", "test"}, - {"mongodb://localhost:40001/mydb", "mydb"}, - } - - for _, test := range tests { - session, err := mgo.Dial(test.url) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("test: %#v", test) - c.Assert(session.DB("").Name, Equals, test.db) - - scopy := session.Copy() - c.Check(scopy.DB("").Name, Equals, test.db) - scopy.Close() - } -} - -func (s *S) TestAuthDirect(c *C) { - // Direct connections must work to the master and slaves. - for _, port := range []string{"40031", "40032", "40033"} { - url := fmt.Sprintf("mongodb://root:rapadura@localhost:%s/?connect=direct", port) - session, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - var result struct{} - err = session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - } -} - -func (s *S) TestAuthDirectWithLogin(c *C) { - // Direct connections must work to the master and slaves. - for _, port := range []string{"40031", "40032", "40033"} { - url := fmt.Sprintf("mongodb://localhost:%s/?connect=direct", port) - session, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - session.SetSyncTimeout(3 * time.Second) - - err = session.DB("admin").Login("root", "rapadura") - c.Assert(err, IsNil) - - var result struct{} - err = session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - } -} - -var ( - plainFlag = flag.String("plain", "", "Host to test PLAIN authentication against (depends on custom environment)") - plainUser = "einstein" - plainPass = "password" -) - -func (s *S) TestAuthPlainCred(c *C) { - if *plainFlag == "" { - c.Skip("no -plain") - } - cred := &mgo.Credential{ - Username: plainUser, - Password: plainPass, - Source: "$external", - Mechanism: "PLAIN", - } - c.Logf("Connecting to %s...", *plainFlag) - session, err := mgo.Dial(*plainFlag) - c.Assert(err, IsNil) - defer session.Close() - - records := session.DB("records").C("records") - - c.Logf("Connected! Testing the need for authentication...") - err = records.Find(nil).One(nil) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - c.Logf("Connected! Testing the need for authentication...") - err = records.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthPlainURL(c *C) { - if *plainFlag == "" { - c.Skip("no -plain") - } - c.Logf("Connecting to %s...", *plainFlag) - session, err := mgo.Dial(fmt.Sprintf("%s:%s@%s?authMechanism=PLAIN", url.QueryEscape(plainUser), url.QueryEscape(plainPass), *plainFlag)) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Connected! Testing the need for authentication...") - err = session.DB("records").C("records").Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -var ( - kerberosFlag = flag.Bool("kerberos", false, "Test Kerberos authentication (depends on custom environment)") - kerberosHost = "mmscustmongo.10gen.me" - kerberosUser = "mmsagent/mmscustagent.10gen.me@10GEN.ME" -) - -func (s *S) TestAuthKerberosCred(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - cred := &mgo.Credential{ - Username: kerberosUser, - Mechanism: "GSSAPI", - } - c.Logf("Connecting to %s...", kerberosHost) - session, err := mgo.Dial(kerberosHost) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Connected! Testing the need for authentication...") - names, err := session.DatabaseNames() - c.Assert(err, ErrorMatches, "unauthorized") - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - names, err = session.DatabaseNames() - c.Assert(err, IsNil) - c.Assert(len(names) > 0, Equals, true) -} - -func (s *S) TestAuthKerberosURL(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - c.Logf("Connecting to %s...", kerberosHost) - session, err := mgo.Dial(url.QueryEscape(kerberosUser) + "@" + kerberosHost + "?authMechanism=GSSAPI") - c.Assert(err, IsNil) - defer session.Close() - names, err := session.DatabaseNames() - c.Assert(err, IsNil) - c.Assert(len(names) > 0, Equals, true) -} diff --git a/vendor/labix.org/v2/mgo/bson/LICENSE b/vendor/labix.org/v2/mgo/bson/LICENSE deleted file mode 100644 index 8903260..0000000 --- a/vendor/labix.org/v2/mgo/bson/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSON library for Go - -Copyright (c) 2010-2012 - Gustavo Niemeyer - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/labix.org/v2/mgo/bson/bson.go b/vendor/labix.org/v2/mgo/bson/bson.go deleted file mode 100644 index 3ebfd84..0000000 --- a/vendor/labix.org/v2/mgo/bson/bson.go +++ /dev/null @@ -1,682 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Package bson is an implementation of the BSON specification for Go: -// -// http://bsonspec.org -// -// It was created as part of the mgo MongoDB driver for Go, but is standalone -// and may be used on its own without the driver. -package bson - -import ( - "crypto/md5" - "crypto/rand" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "os" - "reflect" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" -) - -// -------------------------------------------------------------------------- -// The public API. - -// A value implementing the bson.Getter interface will have its GetBSON -// method called when the given value has to be marshalled, and the result -// of this method will be marshaled in place of the actual object. -// -// If GetBSON returns return a non-nil error, the marshalling procedure -// will stop and error out with the provided value. -type Getter interface { - GetBSON() (interface{}, error) -} - -// A value implementing the bson.Setter interface will receive the BSON -// value via the SetBSON method during unmarshaling, and the object -// itself will not be changed as usual. -// -// If setting the value works, the method should return nil or alternatively -// bson.SetZero to set the respective field to its zero value (nil for -// pointer types). If SetBSON returns a value of type bson.TypeError, the -// BSON value will be omitted from a map or slice being decoded and the -// unmarshalling will continue. If it returns any other non-nil error, the -// unmarshalling procedure will stop and error out with the provided value. -// -// This interface is generally useful in pointer receivers, since the method -// will want to change the receiver. A type field that implements the Setter -// interface doesn't have to be a pointer, though. -// -// Unlike the usual behavior, unmarshalling onto a value that implements a -// Setter interface will NOT reset the value to its zero state. This allows -// the value to decide by itself how to be unmarshalled. -// -// For example: -// -// type MyString string -// -// func (s *MyString) SetBSON(raw bson.Raw) error { -// return raw.Unmarshal(s) -// } -// -type Setter interface { - SetBSON(raw Raw) error -} - -// SetZero may be returned from a SetBSON method to have the value set to -// its respective zero value. When used in pointer values, this will set the -// field to nil rather than to the pre-allocated value. -var SetZero = errors.New("set to zero") - -// M is a convenient alias for a map[string]interface{} map, useful for -// dealing with BSON in a native way. For instance: -// -// bson.M{"a": 1, "b": true} -// -// There's no special handling for this type in addition to what's done anyway -// for an equivalent map type. Elements in the map will be dumped in an -// undefined ordered. See also the bson.D type for an ordered alternative. -type M map[string]interface{} - -// D represents a BSON document containing ordered elements. For example: -// -// bson.D{{"a", 1}, {"b", true}} -// -// In some situations, such as when creating indexes for MongoDB, the order in -// which the elements are defined is important. If the order is not important, -// using a map is generally more comfortable. See bson.M and bson.RawD. -type D []DocElem - -// See the D type. -type DocElem struct { - Name string - Value interface{} -} - -// Map returns a map out of the ordered element name/value pairs in d. -func (d D) Map() (m M) { - m = make(M, len(d)) - for _, item := range d { - m[item.Name] = item.Value - } - return m -} - -// The Raw type represents raw unprocessed BSON documents and elements. -// Kind is the kind of element as defined per the BSON specification, and -// Data is the raw unprocessed data for the respective element. -// Using this type it is possible to unmarshal or marshal values partially. -// -// Relevant documentation: -// -// http://bsonspec.org/#/specification -// -type Raw struct { - Kind byte - Data []byte -} - -// RawD represents a BSON document containing raw unprocessed elements. -// This low-level representation may be useful when lazily processing -// documents of uncertain content, or when manipulating the raw content -// documents in general. -type RawD []RawDocElem - -// See the RawD type. -type RawDocElem struct { - Name string - Value Raw -} - -// ObjectId is a unique ID identifying a BSON value. It must be exactly 12 bytes -// long. MongoDB objects by default have such a property set in their "_id" -// property. -// -// http://www.mongodb.org/display/DOCS/Object+IDs -type ObjectId string - -// ObjectIdHex returns an ObjectId from the provided hex representation. -// Calling this function with an invalid hex representation will -// cause a runtime panic. See the IsObjectIdHex function. -func ObjectIdHex(s string) ObjectId { - d, err := hex.DecodeString(s) - if err != nil || len(d) != 12 { - panic(fmt.Sprintf("Invalid input to ObjectIdHex: %q", s)) - } - return ObjectId(d) -} - -// IsObjectIdHex returns whether s is a valid hex representation of -// an ObjectId. See the ObjectIdHex function. -func IsObjectIdHex(s string) bool { - if len(s) != 24 { - return false - } - _, err := hex.DecodeString(s) - return err == nil -} - -// objectIdCounter is atomically incremented when generating a new ObjectId -// using NewObjectId() function. It's used as a counter part of an id. -var objectIdCounter uint32 = 0 - -// machineId stores machine id generated once and used in subsequent calls -// to NewObjectId function. -var machineId = readMachineId() - -// readMachineId generates machine id and puts it into the machineId global -// variable. If this function fails to get the hostname, it will cause -// a runtime error. -func readMachineId() []byte { - var sum [3]byte - id := sum[:] - hostname, err1 := os.Hostname() - if err1 != nil { - _, err2 := io.ReadFull(rand.Reader, id) - if err2 != nil { - panic(fmt.Errorf("cannot get hostname: %v; %v", err1, err2)) - } - return id - } - hw := md5.New() - hw.Write([]byte(hostname)) - copy(id, hw.Sum(nil)) - return id -} - -// NewObjectId returns a new unique ObjectId. -func NewObjectId() ObjectId { - var b [12]byte - // Timestamp, 4 bytes, big endian - binary.BigEndian.PutUint32(b[:], uint32(time.Now().Unix())) - // Machine, first 3 bytes of md5(hostname) - b[4] = machineId[0] - b[5] = machineId[1] - b[6] = machineId[2] - // Pid, 2 bytes, specs don't specify endianness, but we use big endian. - pid := os.Getpid() - b[7] = byte(pid >> 8) - b[8] = byte(pid) - // Increment, 3 bytes, big endian - i := atomic.AddUint32(&objectIdCounter, 1) - b[9] = byte(i >> 16) - b[10] = byte(i >> 8) - b[11] = byte(i) - return ObjectId(b[:]) -} - -// NewObjectIdWithTime returns a dummy ObjectId with the timestamp part filled -// with the provided number of seconds from epoch UTC, and all other parts -// filled with zeroes. It's not safe to insert a document with an id generated -// by this method, it is useful only for queries to find documents with ids -// generated before or after the specified timestamp. -func NewObjectIdWithTime(t time.Time) ObjectId { - var b [12]byte - binary.BigEndian.PutUint32(b[:4], uint32(t.Unix())) - return ObjectId(string(b[:])) -} - -// String returns a hex string representation of the id. -// Example: ObjectIdHex("4d88e15b60f486e428412dc9"). -func (id ObjectId) String() string { - return fmt.Sprintf(`ObjectIdHex("%x")`, string(id)) -} - -// Hex returns a hex representation of the ObjectId. -func (id ObjectId) Hex() string { - return hex.EncodeToString([]byte(id)) -} - -// MarshalJSON turns a bson.ObjectId into a json.Marshaller. -func (id ObjectId) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%x"`, string(id))), nil -} - -// UnmarshalJSON turns *bson.ObjectId into a json.Unmarshaller. -func (id *ObjectId) UnmarshalJSON(data []byte) error { - if len(data) != 26 || data[0] != '"' || data[25] != '"' { - return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s", string(data))) - } - var buf [12]byte - _, err := hex.Decode(buf[:], data[1:25]) - if err != nil { - return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s (%s)", string(data), err)) - } - *id = ObjectId(string(buf[:])) - return nil -} - -// Valid returns true if id is valid. A valid id must contain exactly 12 bytes. -func (id ObjectId) Valid() bool { - return len(id) == 12 -} - -// byteSlice returns byte slice of id from start to end. -// Calling this function with an invalid id will cause a runtime panic. -func (id ObjectId) byteSlice(start, end int) []byte { - if len(id) != 12 { - panic(fmt.Sprintf("Invalid ObjectId: %q", string(id))) - } - return []byte(string(id)[start:end]) -} - -// Time returns the timestamp part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Time() time.Time { - // First 4 bytes of ObjectId is 32-bit big-endian seconds from epoch. - secs := int64(binary.BigEndian.Uint32(id.byteSlice(0, 4))) - return time.Unix(secs, 0) -} - -// Machine returns the 3-byte machine id part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Machine() []byte { - return id.byteSlice(4, 7) -} - -// Pid returns the process id part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Pid() uint16 { - return binary.BigEndian.Uint16(id.byteSlice(7, 9)) -} - -// Counter returns the incrementing value part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Counter() int32 { - b := id.byteSlice(9, 12) - // Counter is stored as big-endian 3-byte value - return int32(uint32(b[0])<<16 | uint32(b[1])<<8 | uint32(b[2])) -} - -// The Symbol type is similar to a string and is used in languages with a -// distinct symbol type. -type Symbol string - -// Now returns the current time with millisecond precision. MongoDB stores -// timestamps with the same precision, so a Time returned from this method -// will not change after a roundtrip to the database. That's the only reason -// why this function exists. Using the time.Now function also works fine -// otherwise. -func Now() time.Time { - return time.Unix(0, time.Now().UnixNano()/1e6*1e6) -} - -// MongoTimestamp is a special internal type used by MongoDB that for some -// strange reason has its own datatype defined in BSON. -type MongoTimestamp int64 - -type orderKey int64 - -// MaxKey is a special value that compares higher than all other possible BSON -// values in a MongoDB database. -var MaxKey = orderKey(1<<63 - 1) - -// MinKey is a special value that compares lower than all other possible BSON -// values in a MongoDB database. -var MinKey = orderKey(-1 << 63) - -type undefined struct{} - -// Undefined represents the undefined BSON value. -var Undefined undefined - -// Binary is a representation for non-standard binary values. Any kind should -// work, but the following are known as of this writing: -// -// 0x00 - Generic. This is decoded as []byte(data), not Binary{0x00, data}. -// 0x01 - Function (!?) -// 0x02 - Obsolete generic. -// 0x03 - UUID -// 0x05 - MD5 -// 0x80 - User defined. -// -type Binary struct { - Kind byte - Data []byte -} - -// RegEx represents a regular expression. The Options field may contain -// individual characters defining the way in which the pattern should be -// applied, and must be sorted. Valid options as of this writing are 'i' for -// case insensitive matching, 'm' for multi-line matching, 'x' for verbose -// mode, 'l' to make \w, \W, and similar be locale-dependent, 's' for dot-all -// mode (a '.' matches everything), and 'u' to make \w, \W, and similar match -// unicode. The value of the Options parameter is not verified before being -// marshaled into the BSON format. -type RegEx struct { - Pattern string - Options string -} - -// JavaScript is a type that holds JavaScript code. If Scope is non-nil, it -// will be marshaled as a mapping from identifiers to values that may be -// used when evaluating the provided Code. -type JavaScript struct { - Code string - Scope interface{} -} - -const initialBufferSize = 64 - -func handleErr(err *error) { - if r := recover(); r != nil { - if _, ok := r.(runtime.Error); ok { - panic(r) - } else if _, ok := r.(externalPanic); ok { - panic(r) - } else if s, ok := r.(string); ok { - *err = errors.New(s) - } else if e, ok := r.(error); ok { - *err = e - } else { - panic(r) - } - } -} - -// Marshal serializes the in value, which may be a map or a struct value. -// In the case of struct values, only exported fields will be serialized. -// The lowercased field name is used as the key for each exported field, -// but this behavior may be changed using the respective field tag. -// The tag may also contain flags to tweak the marshalling behavior for -// the field. The tag formats accepted are: -// -// "[][,[,]]" -// -// `(...) bson:"[][,[,]]" (...)` -// -// The following flags are currently supported: -// -// omitempty Only include the field if it's not set to the zero -// value for the type or to empty slices or maps. -// -// minsize Marshal an int64 value as an int32, if that's feasible -// while preserving the numeric value. -// -// inline Inline the field, which must be a struct or a map, -// causing all of its fields or keys to be processed as if -// they were part of the outer struct. For maps, keys must -// not conflict with the bson keys of other struct fields. -// -// Some examples: -// -// type T struct { -// A bool -// B int "myb" -// C string "myc,omitempty" -// D string `bson:",omitempty" json:"jsonkey"` -// E int64 ",minsize" -// F int64 "myf,omitempty,minsize" -// } -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := &encoder{make([]byte, 0, initialBufferSize)} - e.addDoc(reflect.ValueOf(in)) - return e.out, nil -} - -// Unmarshal deserializes data from in into the out value. The out value -// must be a map, a pointer to a struct, or a pointer to a bson.D value. -// The lowercased field name is used as the key for each exported field, -// but this behavior may be changed using the respective field tag. -// The tag may also contain flags to tweak the marshalling behavior for -// the field. The tag formats accepted are: -// -// "[][,[,]]" -// -// `(...) bson:"[][,[,]]" (...)` -// -// The following flags are currently supported during unmarshal (see the -// Marshal method for other flags): -// -// inline Inline the field, which must be a struct or a map. -// Inlined structs are handled as if its fields were part -// of the outer struct. An inlined map causes keys that do -// not match any other struct field to be inserted in the -// map rather than being discarded as usual. -// -// The target field or element types of out may not necessarily match -// the BSON values of the provided data. The following conversions are -// made automatically: -// -// - Numeric types are converted if at least the integer part of the -// value would be preserved correctly -// - Bools are converted to numeric types as 1 or 0 -// - Numeric types are converted to bools as true if not 0 or false otherwise -// - Binary and string BSON data is converted to a string, array or byte slice -// -// If the value would not fit the type and cannot be converted, it's -// silently skipped. -// -// Pointer values are initialized when necessary. -func Unmarshal(in []byte, out interface{}) (err error) { - defer handleErr(&err) - v := reflect.ValueOf(out) - switch v.Kind() { - case reflect.Map, reflect.Ptr: - d := newDecoder(in) - d.readDocTo(v) - case reflect.Struct: - return errors.New("Unmarshal can't deal with struct values. Use a pointer.") - default: - return errors.New("Unmarshal needs a map or a pointer to a struct.") - } - return nil -} - -// Unmarshal deserializes raw into the out value. If the out value type -// is not compatible with raw, a *bson.TypeError is returned. -// -// See the Unmarshal function documentation for more details on the -// unmarshalling process. -func (raw Raw) Unmarshal(out interface{}) (err error) { - defer handleErr(&err) - v := reflect.ValueOf(out) - switch v.Kind() { - case reflect.Ptr: - v = v.Elem() - fallthrough - case reflect.Map: - d := newDecoder(raw.Data) - good := d.readElemTo(v, raw.Kind) - if !good { - return &TypeError{v.Type(), raw.Kind} - } - case reflect.Struct: - return errors.New("Raw Unmarshal can't deal with struct values. Use a pointer.") - default: - return errors.New("Raw Unmarshal needs a map or a valid pointer.") - } - return nil -} - -type TypeError struct { - Type reflect.Type - Kind byte -} - -func (e *TypeError) Error() string { - return fmt.Sprintf("BSON kind 0x%02x isn't compatible with type %s", e.Kind, e.Type.String()) -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - InlineMap int - Zero reflect.Value -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - MinSize bool - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var structMapMutex sync.RWMutex - -type externalPanic string - -func (e externalPanic) String() string { - return string(e) -} - -func getStructInfo(st reflect.Type) (*structInfo, error) { - structMapMutex.RLock() - sinfo, found := structMap[st] - structMapMutex.RUnlock() - if found { - return sinfo, nil - } - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("bson") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - // XXX Drop this after a few releases. - if s := strings.Index(tag, "/"); s >= 0 { - recommend := tag[:s] - for _, c := range tag[s+1:] { - switch c { - case 'c': - recommend += ",omitempty" - case 's': - recommend += ",minsize" - default: - msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", string([]byte{uint8(c)}), tag, st) - panic(externalPanic(msg)) - } - } - msg := fmt.Sprintf("Replace tag %q in field %s of type %s by %q", tag, field.Name, st, recommend) - panic(externalPanic(msg)) - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "minsize": - info.MinSize = true - case "inline": - inline = true - default: - msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st) - panic(externalPanic(msg)) - } - } - tag = fields[0] - } - - if inline { - switch field.Type.Kind() { - case reflect.Map: - if inlineMap >= 0 { - return nil, errors.New("Multiple ,inline maps in struct " + st.String()) - } - if field.Type.Key() != reflect.TypeOf("") { - return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) - } - inlineMap = info.Num - case reflect.Struct: - sinfo, err := getStructInfo(field.Type) - if err != nil { - return nil, err - } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) - } - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - default: - panic("Option ,inline needs a struct value or map field") - } - continue - } - - if tag != "" { - info.Key = tag - } else { - info.Key = strings.ToLower(field.Name) - } - - if _, found = fieldsMap[info.Key]; found { - msg := "Duplicated key '" + info.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - sinfo = &structInfo{ - fieldsMap, - fieldsList, - inlineMap, - reflect.New(st).Elem(), - } - structMapMutex.Lock() - structMap[st] = sinfo - structMapMutex.Unlock() - return sinfo, nil -} diff --git a/vendor/labix.org/v2/mgo/bson/bson_test.go b/vendor/labix.org/v2/mgo/bson/bson_test.go deleted file mode 100644 index 1263e97..0000000 --- a/vendor/labix.org/v2/mgo/bson/bson_test.go +++ /dev/null @@ -1,1466 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// gobson - BSON library for Go. - -package bson_test - -import ( - "encoding/binary" - "encoding/json" - "errors" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" - "net/url" - "reflect" - "testing" - "time" -) - -func TestAll(t *testing.T) { - TestingT(t) -} - -type S struct{} - -var _ = Suite(&S{}) - -// Wrap up the document elements contained in data, prepending the int32 -// length of the data, and appending the '\x00' value closing the document. -func wrapInDoc(data string) string { - result := make([]byte, len(data)+5) - binary.LittleEndian.PutUint32(result, uint32(len(result))) - copy(result[4:], []byte(data)) - return string(result) -} - -func makeZeroDoc(value interface{}) (zero interface{}) { - v := reflect.ValueOf(value) - t := v.Type() - switch t.Kind() { - case reflect.Map: - mv := reflect.MakeMap(t) - zero = mv.Interface() - case reflect.Ptr: - pv := reflect.New(v.Type().Elem()) - zero = pv.Interface() - case reflect.Slice: - zero = reflect.New(t).Interface() - default: - panic("unsupported doc type") - } - return zero -} - -func testUnmarshal(c *C, data string, obj interface{}) { - zero := makeZeroDoc(obj) - err := bson.Unmarshal([]byte(data), zero) - c.Assert(err, IsNil) - c.Assert(zero, DeepEquals, obj) -} - -type testItemType struct { - obj interface{} - data string -} - -// -------------------------------------------------------------------------- -// Samples from bsonspec.org: - -var sampleItems = []testItemType{ - {bson.M{"hello": "world"}, - "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, - {bson.M{"BSON": []interface{}{"awesome", float64(5.05), 1986}}, - "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + - "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, -} - -func (s *S) TestMarshalSampleItems(c *C) { - for i, item := range sampleItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data, Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalSampleItems(c *C) { - for i, item := range sampleItems { - value := bson.M{} - err := bson.Unmarshal([]byte(item.data), value) - c.Assert(err, IsNil) - c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d", i)) - } -} - -// -------------------------------------------------------------------------- -// Every type, ordered by the type flag. These are not wrapped with the -// length and last \x00 from the document. wrapInDoc() computes them. -// Note that all of them should be supported as two-way conversions. - -var allItems = []testItemType{ - {bson.M{}, - ""}, - {bson.M{"_": float64(5.05)}, - "\x01_\x00333333\x14@"}, - {bson.M{"_": "yo"}, - "\x02_\x00\x03\x00\x00\x00yo\x00"}, - {bson.M{"_": bson.M{"a": true}}, - "\x03_\x00\x09\x00\x00\x00\x08a\x00\x01\x00"}, - {bson.M{"_": []interface{}{true, false}}, - "\x04_\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - {bson.M{"_": []byte("yo")}, - "\x05_\x00\x02\x00\x00\x00\x00yo"}, - {bson.M{"_": bson.Binary{0x80, []byte("udef")}}, - "\x05_\x00\x04\x00\x00\x00\x80udef"}, - {bson.M{"_": bson.Undefined}, // Obsolete, but still seen in the wild. - "\x06_\x00"}, - {bson.M{"_": bson.ObjectId("0123456789ab")}, - "\x07_\x000123456789ab"}, - {bson.M{"_": false}, - "\x08_\x00\x00"}, - {bson.M{"_": true}, - "\x08_\x00\x01"}, - {bson.M{"_": time.Unix(0, 258e6)}, // Note the NS <=> MS conversion. - "\x09_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": nil}, - "\x0A_\x00"}, - {bson.M{"_": bson.RegEx{"ab", "cd"}}, - "\x0B_\x00ab\x00cd\x00"}, - {bson.M{"_": bson.JavaScript{"code", nil}}, - "\x0D_\x00\x05\x00\x00\x00code\x00"}, - {bson.M{"_": bson.Symbol("sym")}, - "\x0E_\x00\x04\x00\x00\x00sym\x00"}, - {bson.M{"_": bson.JavaScript{"code", bson.M{"": nil}}}, - "\x0F_\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + - "\x07\x00\x00\x00\x0A\x00\x00"}, - {bson.M{"_": 258}, - "\x10_\x00\x02\x01\x00\x00"}, - {bson.M{"_": bson.MongoTimestamp(258)}, - "\x11_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": int64(258)}, - "\x12_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": int64(258 << 32)}, - "\x12_\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, - {bson.M{"_": bson.MaxKey}, - "\x7F_\x00"}, - {bson.M{"_": bson.MinKey}, - "\xFF_\x00"}, -} - -func (s *S) TestMarshalAllItems(c *C) { - for i, item := range allItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalAllItems(c *C) { - for i, item := range allItems { - value := bson.M{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), value) - c.Assert(err, IsNil) - c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawAllItems(c *C) { - for i, item := range allItems { - if len(item.data) == 0 { - continue - } - value := item.obj.(bson.M)["_"] - if value == nil { - continue - } - pv := reflect.New(reflect.ValueOf(value).Type()) - raw := bson.Raw{item.data[0], []byte(item.data[3:])} - c.Logf("Unmarshal raw: %#v, %#v", raw, pv.Interface()) - err := raw.Unmarshal(pv.Interface()) - c.Assert(err, IsNil) - c.Assert(pv.Elem().Interface(), DeepEquals, value, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawIncompatible(c *C) { - raw := bson.Raw{0x08, []byte{0x01}} // true - err := raw.Unmarshal(&struct{}{}) - c.Assert(err, ErrorMatches, "BSON kind 0x08 isn't compatible with type struct \\{\\}") -} - -func (s *S) TestUnmarshalZeroesStruct(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - type T struct{ A, B int } - v := T{A: 1} - err = bson.Unmarshal(data, &v) - c.Assert(err, IsNil) - c.Assert(v.A, Equals, 0) - c.Assert(v.B, Equals, 2) -} - -func (s *S) TestUnmarshalZeroesMap(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - m := bson.M{"a": 1} - err = bson.Unmarshal(data, &m) - c.Assert(err, IsNil) - c.Assert(m, DeepEquals, bson.M{"b": 2}) -} - -func (s *S) TestUnmarshalNonNilInterface(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - m := bson.M{"a": 1} - var i interface{} - i = m - err = bson.Unmarshal(data, &i) - c.Assert(err, IsNil) - c.Assert(i, DeepEquals, bson.M{"b": 2}) - c.Assert(m, DeepEquals, bson.M{"a": 1}) -} - -// -------------------------------------------------------------------------- -// Some one way marshaling operations which would unmarshal differently. - -var oneWayMarshalItems = []testItemType{ - // These are being passed as pointers, and will unmarshal as values. - {bson.M{"": &bson.Binary{0x02, []byte("old")}}, - "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - {bson.M{"": &bson.Binary{0x80, []byte("udef")}}, - "\x05\x00\x04\x00\x00\x00\x80udef"}, - {bson.M{"": &bson.RegEx{"ab", "cd"}}, - "\x0B\x00ab\x00cd\x00"}, - {bson.M{"": &bson.JavaScript{"code", nil}}, - "\x0D\x00\x05\x00\x00\x00code\x00"}, - {bson.M{"": &bson.JavaScript{"code", bson.M{"": nil}}}, - "\x0F\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + - "\x07\x00\x00\x00\x0A\x00\x00"}, - - // There's no float32 type in BSON. Will encode as a float64. - {bson.M{"": float32(5.05)}, - "\x01\x00\x00\x00\x00@33\x14@"}, - - // The array will be unmarshaled as a slice instead. - {bson.M{"": [2]bool{true, false}}, - "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - - // The typed slice will be unmarshaled as []interface{}. - {bson.M{"": []bool{true, false}}, - "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - - // Will unmarshal as a []byte. - {bson.M{"": bson.Binary{0x00, []byte("yo")}}, - "\x05\x00\x02\x00\x00\x00\x00yo"}, - {bson.M{"": bson.Binary{0x02, []byte("old")}}, - "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - - // No way to preserve the type information here. We might encode as a zero - // value, but this would mean that pointer values in structs wouldn't be - // able to correctly distinguish between unset and set to the zero value. - {bson.M{"": (*byte)(nil)}, - "\x0A\x00"}, - - // No int types smaller than int32 in BSON. Could encode this as a char, - // but it would still be ambiguous, take more, and be awkward in Go when - // loaded without typing information. - {bson.M{"": byte(8)}, - "\x10\x00\x08\x00\x00\x00"}, - - // There are no unsigned types in BSON. Will unmarshal as int32 or int64. - {bson.M{"": uint32(258)}, - "\x10\x00\x02\x01\x00\x00"}, - {bson.M{"": uint64(258)}, - "\x12\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"": uint64(258 << 32)}, - "\x12\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, - - // This will unmarshal as int. - {bson.M{"": int32(258)}, - "\x10\x00\x02\x01\x00\x00"}, - - // That's a special case. The unsigned value is too large for an int32, - // so an int64 is used instead. - {bson.M{"": uint32(1<<32 - 1)}, - "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, - {bson.M{"": uint(1<<32 - 1)}, - "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, -} - -func (s *S) TestOneWayMarshalItems(c *C) { - for i, item := range oneWayMarshalItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item %d", i)) - } -} - -// -------------------------------------------------------------------------- -// Two-way tests for user-defined structures using the samples -// from bsonspec.org. - -type specSample1 struct { - Hello string -} - -type specSample2 struct { - BSON []interface{} "BSON" -} - -var structSampleItems = []testItemType{ - {&specSample1{"world"}, - "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, - {&specSample2{[]interface{}{"awesome", float64(5.05), 1986}}, - "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + - "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, -} - -func (s *S) TestMarshalStructSampleItems(c *C) { - for i, item := range structSampleItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data, - Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalStructSampleItems(c *C) { - for _, item := range structSampleItems { - testUnmarshal(c, item.data, item.obj) - } -} - -func (s *S) Test64bitInt(c *C) { - var i int64 = (1 << 31) - if int(i) > 0 { - data, err := bson.Marshal(bson.M{"i": int(i)}) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc("\x12i\x00\x00\x00\x00\x80\x00\x00\x00\x00")) - - var result struct{ I int } - err = bson.Unmarshal(data, &result) - c.Assert(err, IsNil) - c.Assert(int64(result.I), Equals, i) - } -} - -// -------------------------------------------------------------------------- -// Generic two-way struct marshaling tests. - -var bytevar = byte(8) -var byteptr = &bytevar - -var structItems = []testItemType{ - {&struct{ Ptr *byte }{nil}, - "\x0Aptr\x00"}, - {&struct{ Ptr *byte }{&bytevar}, - "\x10ptr\x00\x08\x00\x00\x00"}, - {&struct{ Ptr **byte }{&byteptr}, - "\x10ptr\x00\x08\x00\x00\x00"}, - {&struct{ Byte byte }{8}, - "\x10byte\x00\x08\x00\x00\x00"}, - {&struct{ Byte byte }{0}, - "\x10byte\x00\x00\x00\x00\x00"}, - {&struct { - V byte "Tag" - }{8}, - "\x10Tag\x00\x08\x00\x00\x00"}, - {&struct { - V *struct { - Byte byte - } - }{&struct{ Byte byte }{8}}, - "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, - {&struct{ priv byte }{}, ""}, - - // The order of the dumped fields should be the same in the struct. - {&struct{ A, C, B, D, F, E *byte }{}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x0Ae\x00"}, - - {&struct{ V bson.Raw }{bson.Raw{0x03, []byte("\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00")}}, - "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, - {&struct{ V bson.Raw }{bson.Raw{0x10, []byte("\x00\x00\x00\x00")}}, - "\x10v\x00" + "\x00\x00\x00\x00"}, - - // Byte arrays. - {&struct{ V [2]byte }{[2]byte{'y', 'o'}}, - "\x05v\x00\x02\x00\x00\x00\x00yo"}, -} - -func (s *S) TestMarshalStructItems(c *C) { - for i, item := range structItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalStructItems(c *C) { - for _, item := range structItems { - testUnmarshal(c, wrapInDoc(item.data), item.obj) - } -} - -func (s *S) TestUnmarshalRawStructItems(c *C) { - for i, item := range structItems { - raw := bson.Raw{0x03, []byte(wrapInDoc(item.data))} - zero := makeZeroDoc(item.obj) - err := raw.Unmarshal(zero) - c.Assert(err, IsNil) - c.Assert(zero, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawNil(c *C) { - // Regression test: shouldn't try to nil out the pointer itself, - // as it's not settable. - raw := bson.Raw{0x0A, []byte{}} - err := raw.Unmarshal(&struct{}{}) - c.Assert(err, IsNil) -} - -// -------------------------------------------------------------------------- -// One-way marshaling tests. - -type dOnIface struct { - D interface{} -} - -type ignoreField struct { - Before string - Ignore string `bson:"-"` - After string -} - -var marshalItems = []testItemType{ - // Ordered document dump. Will unmarshal as a dictionary by default. - {bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, - {MyD{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, - {&dOnIface{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, - - {bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, - "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, - {MyRawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, - "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, - {&dOnIface{bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00"+"\x0Ac\x00"+"\x08b\x00\x01")}, - - {&ignoreField{"before", "ignore", "after"}, - "\x02before\x00\a\x00\x00\x00before\x00\x02after\x00\x06\x00\x00\x00after\x00"}, - - // Marshalling a Raw document does nothing. - {bson.Raw{0x03, []byte(wrapInDoc("anything"))}, - "anything"}, - {bson.Raw{Data: []byte(wrapInDoc("anything"))}, - "anything"}, -} - -func (s *S) TestMarshalOneWayItems(c *C) { - for _, item := range marshalItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data)) - } -} - -// -------------------------------------------------------------------------- -// One-way unmarshaling tests. - -var unmarshalItems = []testItemType{ - // Field is private. Should not attempt to unmarshal it. - {&struct{ priv byte }{}, - "\x10priv\x00\x08\x00\x00\x00"}, - - // Wrong casing. Field names are lowercased. - {&struct{ Byte byte }{}, - "\x10Byte\x00\x08\x00\x00\x00"}, - - // Ignore non-existing field. - {&struct{ Byte byte }{9}, - "\x10boot\x00\x08\x00\x00\x00" + "\x10byte\x00\x09\x00\x00\x00"}, - - // Do not unmarshal on ignored field. - {&ignoreField{"before", "", "after"}, - "\x02before\x00\a\x00\x00\x00before\x00" + - "\x02-\x00\a\x00\x00\x00ignore\x00" + - "\x02after\x00\x06\x00\x00\x00after\x00"}, - - // Ignore unsuitable types silently. - {map[string]string{"str": "s"}, - "\x02str\x00\x02\x00\x00\x00s\x00" + "\x10int\x00\x01\x00\x00\x00"}, - {map[string][]int{"array": []int{5, 9}}, - "\x04array\x00" + wrapInDoc("\x100\x00\x05\x00\x00\x00"+"\x021\x00\x02\x00\x00\x00s\x00"+"\x102\x00\x09\x00\x00\x00")}, - - // Wrong type. Shouldn't init pointer. - {&struct{ Str *byte }{}, - "\x02str\x00\x02\x00\x00\x00s\x00"}, - {&struct{ Str *struct{ Str string } }{}, - "\x02str\x00\x02\x00\x00\x00s\x00"}, - - // Ordered document. - {&struct{ bson.D }{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, - - // Raw document. - {&bson.Raw{0x03, []byte(wrapInDoc("\x10byte\x00\x08\x00\x00\x00"))}, - "\x10byte\x00\x08\x00\x00\x00"}, - - // RawD document. - {&struct{ bson.RawD }{bson.RawD{{"a", bson.Raw{0x0A, []byte{}}}, {"c", bson.Raw{0x0A, []byte{}}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, - "\x03rawd\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x08b\x00\x01")}, - - // Decode old binary. - {bson.M{"_": []byte("old")}, - "\x05_\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - - // Decode old binary without length. According to the spec, this shouldn't happen. - {bson.M{"_": []byte("old")}, - "\x05_\x00\x03\x00\x00\x00\x02old"}, -} - -func (s *S) TestUnmarshalOneWayItems(c *C) { - for _, item := range unmarshalItems { - testUnmarshal(c, wrapInDoc(item.data), item.obj) - } -} - -func (s *S) TestUnmarshalNilInStruct(c *C) { - // Nil is the default value, so we need to ensure it's indeed being set. - b := byte(1) - v := &struct{ Ptr *byte }{&b} - err := bson.Unmarshal([]byte(wrapInDoc("\x0Aptr\x00")), v) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, &struct{ Ptr *byte }{nil}) -} - -// -------------------------------------------------------------------------- -// Marshalling error cases. - -type structWithDupKeys struct { - Name byte - Other byte "name" // Tag should precede. -} - -var marshalErrorItems = []testItemType{ - {bson.M{"": uint64(1 << 63)}, - "BSON has no uint64 type, and value is too large to fit correctly in an int64"}, - {bson.M{"": bson.ObjectId("tooshort")}, - "ObjectIDs must be exactly 12 bytes long \\(got 8\\)"}, - {int64(123), - "Can't marshal int64 as a BSON document"}, - {bson.M{"": 1i}, - "Can't marshal complex128 in a BSON document"}, - {&structWithDupKeys{}, - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - {bson.Raw{0x0A, []byte{}}, - "Attempted to unmarshal Raw kind 10 as a document"}, - {&inlineCantPtr{&struct{ A, B int }{1, 2}}, - "Option ,inline needs a struct value or map field"}, - {&inlineDupName{1, struct{ A, B int }{2, 3}}, - "Duplicated key 'a' in struct bson_test.inlineDupName"}, - {&inlineDupMap{}, - "Multiple ,inline maps in struct bson_test.inlineDupMap"}, - {&inlineBadKeyMap{}, - "Option ,inline needs a map with string keys in struct bson_test.inlineBadKeyMap"}, - {&inlineMap{A: 1, M: map[string]interface{}{"a": 1}}, - `Can't have key "a" in inlined map; conflicts with struct field`}, -} - -func (s *S) TestMarshalErrorItems(c *C) { - for _, item := range marshalErrorItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, ErrorMatches, item.data) - c.Assert(data, IsNil) - } -} - -// -------------------------------------------------------------------------- -// Unmarshalling error cases. - -type unmarshalErrorType struct { - obj interface{} - data string - error string -} - -var unmarshalErrorItems = []unmarshalErrorType{ - // Tag name conflicts with existing parameter. - {&structWithDupKeys{}, - "\x10name\x00\x08\x00\x00\x00", - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - - // Non-string map key. - {map[int]interface{}{}, - "\x10name\x00\x08\x00\x00\x00", - "BSON map must have string keys. Got: map\\[int\\]interface \\{\\}"}, - - {nil, - "\xEEname\x00", - "Unknown element kind \\(0xEE\\)"}, - - {struct{ Name bool }{}, - "\x10name\x00\x08\x00\x00\x00", - "Unmarshal can't deal with struct values. Use a pointer."}, - - {123, - "\x10name\x00\x08\x00\x00\x00", - "Unmarshal needs a map or a pointer to a struct."}, -} - -func (s *S) TestUnmarshalErrorItems(c *C) { - for _, item := range unmarshalErrorItems { - data := []byte(wrapInDoc(item.data)) - var value interface{} - switch reflect.ValueOf(item.obj).Kind() { - case reflect.Map, reflect.Ptr: - value = makeZeroDoc(item.obj) - case reflect.Invalid: - value = bson.M{} - default: - value = item.obj - } - err := bson.Unmarshal(data, value) - c.Assert(err, ErrorMatches, item.error) - } -} - -type unmarshalRawErrorType struct { - obj interface{} - raw bson.Raw - error string -} - -var unmarshalRawErrorItems = []unmarshalRawErrorType{ - // Tag name conflicts with existing parameter. - {&structWithDupKeys{}, - bson.Raw{0x03, []byte("\x10byte\x00\x08\x00\x00\x00")}, - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - - {&struct{}{}, - bson.Raw{0xEE, []byte{}}, - "Unknown element kind \\(0xEE\\)"}, - - {struct{ Name bool }{}, - bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, - "Raw Unmarshal can't deal with struct values. Use a pointer."}, - - {123, - bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, - "Raw Unmarshal needs a map or a valid pointer."}, -} - -func (s *S) TestUnmarshalRawErrorItems(c *C) { - for i, item := range unmarshalRawErrorItems { - err := item.raw.Unmarshal(item.obj) - c.Assert(err, ErrorMatches, item.error, Commentf("Failed on item %d: %#v\n", i, item)) - } -} - -var corruptedData = []string{ - "\x04\x00\x00\x00\x00", // Shorter than minimum - "\x06\x00\x00\x00\x00", // Not enough data - "\x05\x00\x00", // Broken length - "\x05\x00\x00\x00\xff", // Corrupted termination - "\x0A\x00\x00\x00\x0Aooop\x00", // Unfinished C string - - // Array end past end of string (s[2]=0x07 is correct) - wrapInDoc("\x04\x00\x09\x00\x00\x00\x0A\x00\x00"), - - // Array end within string, but past acceptable. - wrapInDoc("\x04\x00\x08\x00\x00\x00\x0A\x00\x00"), - - // Document end within string, but past acceptable. - wrapInDoc("\x03\x00\x08\x00\x00\x00\x0A\x00\x00"), - - // String with corrupted end. - wrapInDoc("\x02\x00\x03\x00\x00\x00yo\xFF"), -} - -func (s *S) TestUnmarshalMapDocumentTooShort(c *C) { - for _, data := range corruptedData { - err := bson.Unmarshal([]byte(data), bson.M{}) - c.Assert(err, ErrorMatches, "Document is corrupted") - - err = bson.Unmarshal([]byte(data), &struct{}{}) - c.Assert(err, ErrorMatches, "Document is corrupted") - } -} - -// -------------------------------------------------------------------------- -// Setter test cases. - -var setterResult = map[string]error{} - -type setterType struct { - received interface{} -} - -func (o *setterType) SetBSON(raw bson.Raw) error { - err := raw.Unmarshal(&o.received) - if err != nil { - panic("The panic:" + err.Error()) - } - if s, ok := o.received.(string); ok { - if result, ok := setterResult[s]; ok { - return result - } - } - return nil -} - -type ptrSetterDoc struct { - Field *setterType "_" -} - -type valSetterDoc struct { - Field setterType "_" -} - -func (s *S) TestUnmarshalAllItemsWithPtrSetter(c *C) { - for _, item := range allItems { - for i := 0; i != 2; i++ { - var field *setterType - if i == 0 { - obj := &ptrSetterDoc{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) - c.Assert(err, IsNil) - field = obj.Field - } else { - obj := &valSetterDoc{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) - c.Assert(err, IsNil) - field = &obj.Field - } - if item.data == "" { - // Nothing to unmarshal. Should be untouched. - if i == 0 { - c.Assert(field, IsNil) - } else { - c.Assert(field.received, IsNil) - } - } else { - expected := item.obj.(bson.M)["_"] - c.Assert(field, NotNil, Commentf("Pointer not initialized (%#v)", expected)) - c.Assert(field.received, DeepEquals, expected) - } - } - } -} - -func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { - obj := &setterType{} - err := bson.Unmarshal([]byte(sampleItems[0].data), obj) - c.Assert(err, IsNil) - c.Assert(obj.received, DeepEquals, bson.M{"hello": "world"}) -} - -func (s *S) TestUnmarshalSetterOmits(c *C) { - setterResult["2"] = &bson.TypeError{} - setterResult["4"] = &bson.TypeError{} - defer func() { - delete(setterResult, "2") - delete(setterResult, "4") - }() - - m := map[string]*setterType{} - data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + - "\x02def\x00\x02\x00\x00\x002\x00" + - "\x02ghi\x00\x02\x00\x00\x003\x00" + - "\x02jkl\x00\x02\x00\x00\x004\x00") - err := bson.Unmarshal([]byte(data), m) - c.Assert(err, IsNil) - c.Assert(m["abc"], NotNil) - c.Assert(m["def"], IsNil) - c.Assert(m["ghi"], NotNil) - c.Assert(m["jkl"], IsNil) - - c.Assert(m["abc"].received, Equals, "1") - c.Assert(m["ghi"].received, Equals, "3") -} - -func (s *S) TestUnmarshalSetterErrors(c *C) { - boom := errors.New("BOOM") - setterResult["2"] = boom - defer delete(setterResult, "2") - - m := map[string]*setterType{} - data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + - "\x02def\x00\x02\x00\x00\x002\x00" + - "\x02ghi\x00\x02\x00\x00\x003\x00") - err := bson.Unmarshal([]byte(data), m) - c.Assert(err, Equals, boom) - c.Assert(m["abc"], NotNil) - c.Assert(m["def"], IsNil) - c.Assert(m["ghi"], IsNil) - - c.Assert(m["abc"].received, Equals, "1") -} - -func (s *S) TestDMap(c *C) { - d := bson.D{{"a", 1}, {"b", 2}} - c.Assert(d.Map(), DeepEquals, bson.M{"a": 1, "b": 2}) -} - -func (s *S) TestUnmarshalSetterSetZero(c *C) { - setterResult["foo"] = bson.SetZero - defer delete(setterResult, "field") - - data, err := bson.Marshal(bson.M{"field": "foo"}) - c.Assert(err, IsNil) - - m := map[string]*setterType{} - err = bson.Unmarshal([]byte(data), m) - c.Assert(err, IsNil) - - value, ok := m["field"] - c.Assert(ok, Equals, true) - c.Assert(value, IsNil) -} - -// -------------------------------------------------------------------------- -// Getter test cases. - -type typeWithGetter struct { - result interface{} - err error -} - -func (t *typeWithGetter) GetBSON() (interface{}, error) { - if t == nil { - return "", nil - } - return t.result, t.err -} - -type docWithGetterField struct { - Field *typeWithGetter "_" -} - -func (s *S) TestMarshalAllItemsWithGetter(c *C) { - for i, item := range allItems { - if item.data == "" { - continue - } - obj := &docWithGetterField{} - obj.Field = &typeWithGetter{result: item.obj.(bson.M)["_"]} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item #%d", i)) - } -} - -func (s *S) TestMarshalWholeDocumentWithGetter(c *C) { - obj := &typeWithGetter{result: sampleItems[0].obj} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, sampleItems[0].data) -} - -func (s *S) TestGetterErrors(c *C) { - e := errors.New("oops") - - obj1 := &docWithGetterField{} - obj1.Field = &typeWithGetter{sampleItems[0].obj, e} - data, err := bson.Marshal(obj1) - c.Assert(err, ErrorMatches, "oops") - c.Assert(data, IsNil) - - obj2 := &typeWithGetter{sampleItems[0].obj, e} - data, err = bson.Marshal(obj2) - c.Assert(err, ErrorMatches, "oops") - c.Assert(data, IsNil) -} - -type intGetter int64 - -func (t intGetter) GetBSON() (interface{}, error) { - return int64(t), nil -} - -type typeWithIntGetter struct { - V intGetter ",minsize" -} - -func (s *S) TestMarshalShortWithGetter(c *C) { - obj := typeWithIntGetter{42} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - m := bson.M{} - err = bson.Unmarshal(data, m) - c.Assert(err, IsNil) - c.Assert(m["v"], Equals, 42) -} - -func (s *S) TestMarshalWithGetterNil(c *C) { - obj := docWithGetterField{} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - m := bson.M{} - err = bson.Unmarshal(data, m) - c.Assert(err, IsNil) - c.Assert(m, DeepEquals, bson.M{"_": ""}) -} - -// -------------------------------------------------------------------------- -// Cross-type conversion tests. - -type crossTypeItem struct { - obj1 interface{} - obj2 interface{} -} - -type condStr struct { - V string ",omitempty" -} -type condStrNS struct { - V string `a:"A" bson:",omitempty" b:"B"` -} -type condBool struct { - V bool ",omitempty" -} -type condInt struct { - V int ",omitempty" -} -type condUInt struct { - V uint ",omitempty" -} -type condFloat struct { - V float64 ",omitempty" -} -type condIface struct { - V interface{} ",omitempty" -} -type condPtr struct { - V *bool ",omitempty" -} -type condSlice struct { - V []string ",omitempty" -} -type condMap struct { - V map[string]int ",omitempty" -} -type namedCondStr struct { - V string "myv,omitempty" -} -type condTime struct { - V time.Time ",omitempty" -} -type condStruct struct { - V struct{ A []int } ",omitempty" -} - -type shortInt struct { - V int64 ",minsize" -} -type shortUint struct { - V uint64 ",minsize" -} -type shortIface struct { - V interface{} ",minsize" -} -type shortPtr struct { - V *int64 ",minsize" -} -type shortNonEmptyInt struct { - V int64 ",minsize,omitempty" -} - -type inlineInt struct { - V struct{ A, B int } ",inline" -} -type inlineCantPtr struct { - V *struct{ A, B int } ",inline" -} -type inlineDupName struct { - A int - V struct{ A, B int } ",inline" -} -type inlineMap struct { - A int - M map[string]interface{} ",inline" -} -type inlineMapInt struct { - A int - M map[string]int ",inline" -} -type inlineMapMyM struct { - A int - M MyM ",inline" -} -type inlineDupMap struct { - M1 map[string]interface{} ",inline" - M2 map[string]interface{} ",inline" -} -type inlineBadKeyMap struct { - M map[int]int ",inline" -} - -type ( - MyString string - MyBytes []byte - MyBool bool - MyD []bson.DocElem - MyRawD []bson.RawDocElem - MyM map[string]interface{} -) - -var ( - truevar = true - falsevar = false - - int64var = int64(42) - int64ptr = &int64var - intvar = int(42) - intptr = &intvar -) - -func parseURL(s string) *url.URL { - u, err := url.Parse(s) - if err != nil { - panic(err) - } - return u -} - -// That's a pretty fun test. It will dump the first item, generate a zero -// value equivalent to the second one, load the dumped data onto it, and then -// verify that the resulting value is deep-equal to the untouched second value. -// Then, it will do the same in the *opposite* direction! -var twoWayCrossItems = []crossTypeItem{ - // int<=>int - {&struct{ I int }{42}, &struct{ I int8 }{42}}, - {&struct{ I int }{42}, &struct{ I int32 }{42}}, - {&struct{ I int }{42}, &struct{ I int64 }{42}}, - {&struct{ I int8 }{42}, &struct{ I int32 }{42}}, - {&struct{ I int8 }{42}, &struct{ I int64 }{42}}, - {&struct{ I int32 }{42}, &struct{ I int64 }{42}}, - - // uint<=>uint - {&struct{ I uint }{42}, &struct{ I uint8 }{42}}, - {&struct{ I uint }{42}, &struct{ I uint32 }{42}}, - {&struct{ I uint }{42}, &struct{ I uint64 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I uint32 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I uint64 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I uint64 }{42}}, - - // float32<=>float64 - {&struct{ I float32 }{42}, &struct{ I float64 }{42}}, - - // int<=>uint - {&struct{ I uint }{42}, &struct{ I int }{42}}, - {&struct{ I uint }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int64 }{42}}, - - // int <=> float - {&struct{ I int }{42}, &struct{ I float64 }{42}}, - - // int <=> bool - {&struct{ I int }{1}, &struct{ I bool }{true}}, - {&struct{ I int }{0}, &struct{ I bool }{false}}, - - // uint <=> float64 - {&struct{ I uint }{42}, &struct{ I float64 }{42}}, - - // uint <=> bool - {&struct{ I uint }{1}, &struct{ I bool }{true}}, - {&struct{ I uint }{0}, &struct{ I bool }{false}}, - - // float64 <=> bool - {&struct{ I float64 }{1}, &struct{ I bool }{true}}, - {&struct{ I float64 }{0}, &struct{ I bool }{false}}, - - // string <=> string and string <=> []byte - {&struct{ S []byte }{[]byte("abc")}, &struct{ S string }{"abc"}}, - {&struct{ S []byte }{[]byte("def")}, &struct{ S bson.Symbol }{"def"}}, - {&struct{ S string }{"ghi"}, &struct{ S bson.Symbol }{"ghi"}}, - - // map <=> struct - {&struct { - A struct { - B, C int - } - }{struct{ B, C int }{1, 2}}, - map[string]map[string]int{"a": map[string]int{"b": 1, "c": 2}}}, - - {&struct{ A bson.Symbol }{"abc"}, map[string]string{"a": "abc"}}, - {&struct{ A bson.Symbol }{"abc"}, map[string][]byte{"a": []byte("abc")}}, - {&struct{ A []byte }{[]byte("abc")}, map[string]string{"a": "abc"}}, - {&struct{ A uint }{42}, map[string]int{"a": 42}}, - {&struct{ A uint }{42}, map[string]float64{"a": 42}}, - {&struct{ A uint }{1}, map[string]bool{"a": true}}, - {&struct{ A int }{42}, map[string]uint{"a": 42}}, - {&struct{ A int }{42}, map[string]float64{"a": 42}}, - {&struct{ A int }{1}, map[string]bool{"a": true}}, - {&struct{ A float64 }{42}, map[string]float32{"a": 42}}, - {&struct{ A float64 }{42}, map[string]int{"a": 42}}, - {&struct{ A float64 }{42}, map[string]uint{"a": 42}}, - {&struct{ A float64 }{1}, map[string]bool{"a": true}}, - {&struct{ A bool }{true}, map[string]int{"a": 1}}, - {&struct{ A bool }{true}, map[string]uint{"a": 1}}, - {&struct{ A bool }{true}, map[string]float64{"a": 1}}, - {&struct{ A **byte }{&byteptr}, map[string]byte{"a": 8}}, - - // url.URL <=> string - {&struct{ URL *url.URL }{parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, - {&struct{ URL url.URL }{*parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, - - // Slices - {&struct{ S []int }{[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, - {&struct{ S *[]int }{&[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, - - // Conditionals - {&condBool{true}, map[string]bool{"v": true}}, - {&condBool{}, map[string]bool{}}, - {&condInt{1}, map[string]int{"v": 1}}, - {&condInt{}, map[string]int{}}, - {&condUInt{1}, map[string]uint{"v": 1}}, - {&condUInt{}, map[string]uint{}}, - {&condFloat{}, map[string]int{}}, - {&condStr{"yo"}, map[string]string{"v": "yo"}}, - {&condStr{}, map[string]string{}}, - {&condStrNS{"yo"}, map[string]string{"v": "yo"}}, - {&condStrNS{}, map[string]string{}}, - {&condSlice{[]string{"yo"}}, map[string][]string{"v": []string{"yo"}}}, - {&condSlice{}, map[string][]string{}}, - {&condMap{map[string]int{"k": 1}}, bson.M{"v": bson.M{"k": 1}}}, - {&condMap{}, map[string][]string{}}, - {&condIface{"yo"}, map[string]string{"v": "yo"}}, - {&condIface{""}, map[string]string{"v": ""}}, - {&condIface{}, map[string]string{}}, - {&condPtr{&truevar}, map[string]bool{"v": true}}, - {&condPtr{&falsevar}, map[string]bool{"v": false}}, - {&condPtr{}, map[string]string{}}, - - {&condTime{time.Unix(123456789, 123e6)}, map[string]time.Time{"v": time.Unix(123456789, 123e6)}}, - {&condTime{}, map[string]string{}}, - - {&condStruct{struct{ A []int }{[]int{1}}}, bson.M{"v": bson.M{"a": []interface{}{1}}}}, - {&condStruct{struct{ A []int }{}}, bson.M{}}, - - {&namedCondStr{"yo"}, map[string]string{"myv": "yo"}}, - {&namedCondStr{}, map[string]string{}}, - - {&shortInt{1}, map[string]interface{}{"v": 1}}, - {&shortInt{1 << 30}, map[string]interface{}{"v": 1 << 30}}, - {&shortInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortUint{1 << 30}, map[string]interface{}{"v": 1 << 30}}, - {&shortUint{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortIface{int64(1) << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortPtr{int64ptr}, map[string]interface{}{"v": intvar}}, - - {&shortNonEmptyInt{1}, map[string]interface{}{"v": 1}}, - {&shortNonEmptyInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortNonEmptyInt{}, map[string]interface{}{}}, - - {&inlineInt{struct{ A, B int }{1, 2}}, map[string]interface{}{"a": 1, "b": 2}}, - {&inlineMap{A: 1, M: map[string]interface{}{"b": 2}}, map[string]interface{}{"a": 1, "b": 2}}, - {&inlineMap{A: 1, M: nil}, map[string]interface{}{"a": 1}}, - {&inlineMapInt{A: 1, M: map[string]int{"b": 2}}, map[string]int{"a": 1, "b": 2}}, - {&inlineMapInt{A: 1, M: nil}, map[string]int{"a": 1}}, - {&inlineMapMyM{A: 1, M: MyM{"b": MyM{"c": 3}}}, map[string]interface{}{"a": 1, "b": map[string]interface{}{"c": 3}}}, - - // []byte <=> MyBytes - {&struct{ B MyBytes }{[]byte("abc")}, map[string]string{"b": "abc"}}, - {&struct{ B MyBytes }{[]byte{}}, map[string]string{"b": ""}}, - {&struct{ B MyBytes }{}, map[string]bool{}}, - {&struct{ B []byte }{[]byte("abc")}, map[string]MyBytes{"b": []byte("abc")}}, - - // bool <=> MyBool - {&struct{ B MyBool }{true}, map[string]bool{"b": true}}, - {&struct{ B MyBool }{}, map[string]bool{"b": false}}, - {&struct{ B MyBool }{}, map[string]string{}}, - {&struct{ B bool }{}, map[string]MyBool{"b": false}}, - - // arrays - {&struct{ V [2]int }{[...]int{1, 2}}, map[string][2]int{"v": [2]int{1, 2}}}, - - // zero time - {&struct{ V time.Time }{}, map[string]interface{}{"v": time.Time{}}}, - - // zero time + 1 second + 1 millisecond; overflows int64 as nanoseconds - {&struct{ V time.Time }{time.Unix(-62135596799, 1e6).Local()}, - map[string]interface{}{"v": time.Unix(-62135596799, 1e6).Local()}}, - - // bson.D <=> []DocElem - {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}}, - {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &MyD{{"a", MyD{{"b", 1}, {"c", 2}}}}}, - - // bson.RawD <=> []RawDocElem - {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, - {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &MyRawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, - - // bson.M <=> map - {bson.M{"a": bson.M{"b": 1, "c": 2}}, MyM{"a": MyM{"b": 1, "c": 2}}}, - {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[string]interface{}{"a": map[string]interface{}{"b": 1, "c": 2}}}, - - // bson.M <=> map[MyString] - {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[MyString]interface{}{"a": map[MyString]interface{}{"b": 1, "c": 2}}}, -} - -// Same thing, but only one way (obj1 => obj2). -var oneWayCrossItems = []crossTypeItem{ - // map <=> struct - {map[string]interface{}{"a": 1, "b": "2", "c": 3}, map[string]int{"a": 1, "c": 3}}, - - // inline map elides badly typed values - {map[string]interface{}{"a": 1, "b": "2", "c": 3}, &inlineMapInt{A: 1, M: map[string]int{"c": 3}}}, - - // Can't decode int into struct. - {bson.M{"a": bson.M{"b": 2}}, &struct{ A bool }{}}, - - // Would get decoded into a int32 too in the opposite direction. - {&shortIface{int64(1) << 30}, map[string]interface{}{"v": 1 << 30}}, -} - -func testCrossPair(c *C, dump interface{}, load interface{}) { - c.Logf("Dump: %#v", dump) - c.Logf("Load: %#v", load) - zero := makeZeroDoc(load) - data, err := bson.Marshal(dump) - c.Assert(err, IsNil) - c.Logf("Dumped: %#v", string(data)) - err = bson.Unmarshal(data, zero) - c.Assert(err, IsNil) - c.Logf("Loaded: %#v", zero) - c.Assert(zero, DeepEquals, load) -} - -func (s *S) TestTwoWayCrossPairs(c *C) { - for _, item := range twoWayCrossItems { - testCrossPair(c, item.obj1, item.obj2) - testCrossPair(c, item.obj2, item.obj1) - } -} - -func (s *S) TestOneWayCrossPairs(c *C) { - for _, item := range oneWayCrossItems { - testCrossPair(c, item.obj1, item.obj2) - } -} - -// -------------------------------------------------------------------------- -// ObjectId hex representation test. - -func (s *S) TestObjectIdHex(c *C) { - id := bson.ObjectIdHex("4d88e15b60f486e428412dc9") - c.Assert(id.String(), Equals, `ObjectIdHex("4d88e15b60f486e428412dc9")`) - c.Assert(id.Hex(), Equals, "4d88e15b60f486e428412dc9") -} - -func (s *S) TestIsObjectIdHex(c *C) { - test := []struct { - id string - valid bool - }{ - {"4d88e15b60f486e428412dc9", true}, - {"4d88e15b60f486e428412dc", false}, - {"4d88e15b60f486e428412dc9e", false}, - {"4d88e15b60f486e428412dcx", false}, - } - for _, t := range test { - c.Assert(bson.IsObjectIdHex(t.id), Equals, t.valid) - } -} - -// -------------------------------------------------------------------------- -// ObjectId parts extraction tests. - -type objectIdParts struct { - id bson.ObjectId - timestamp int64 - machine []byte - pid uint16 - counter int32 -} - -var objectIds = []objectIdParts{ - objectIdParts{ - bson.ObjectIdHex("4d88e15b60f486e428412dc9"), - 1300816219, - []byte{0x60, 0xf4, 0x86}, - 0xe428, - 4271561, - }, - objectIdParts{ - bson.ObjectIdHex("000000000000000000000000"), - 0, - []byte{0x00, 0x00, 0x00}, - 0x0000, - 0, - }, - objectIdParts{ - bson.ObjectIdHex("00000000aabbccddee000001"), - 0, - []byte{0xaa, 0xbb, 0xcc}, - 0xddee, - 1, - }, -} - -func (s *S) TestObjectIdPartsExtraction(c *C) { - for i, v := range objectIds { - t := time.Unix(v.timestamp, 0) - c.Assert(v.id.Time(), Equals, t, Commentf("#%d Wrong timestamp value", i)) - c.Assert(v.id.Machine(), DeepEquals, v.machine, Commentf("#%d Wrong machine id value", i)) - c.Assert(v.id.Pid(), Equals, v.pid, Commentf("#%d Wrong pid value", i)) - c.Assert(v.id.Counter(), Equals, v.counter, Commentf("#%d Wrong counter value", i)) - } -} - -func (s *S) TestNow(c *C) { - before := time.Now() - time.Sleep(1e6) - now := bson.Now() - time.Sleep(1e6) - after := time.Now() - c.Assert(now.After(before) && now.Before(after), Equals, true, Commentf("now=%s, before=%s, after=%s", now, before, after)) -} - -// -------------------------------------------------------------------------- -// ObjectId generation tests. - -func (s *S) TestNewObjectId(c *C) { - // Generate 10 ids - ids := make([]bson.ObjectId, 10) - for i := 0; i < 10; i++ { - ids[i] = bson.NewObjectId() - } - for i := 1; i < 10; i++ { - prevId := ids[i-1] - id := ids[i] - // Test for uniqueness among all other 9 generated ids - for j, tid := range ids { - if j != i { - c.Assert(id, Not(Equals), tid, Commentf("Generated ObjectId is not unique")) - } - } - // Check that timestamp was incremented and is within 30 seconds of the previous one - secs := id.Time().Sub(prevId.Time()).Seconds() - c.Assert((secs >= 0 && secs <= 30), Equals, true, Commentf("Wrong timestamp in generated ObjectId")) - // Check that machine ids are the same - c.Assert(id.Machine(), DeepEquals, prevId.Machine()) - // Check that pids are the same - c.Assert(id.Pid(), Equals, prevId.Pid()) - // Test for proper increment - delta := int(id.Counter() - prevId.Counter()) - c.Assert(delta, Equals, 1, Commentf("Wrong increment in generated ObjectId")) - } -} - -func (s *S) TestNewObjectIdWithTime(c *C) { - t := time.Unix(12345678, 0) - id := bson.NewObjectIdWithTime(t) - c.Assert(id.Time(), Equals, t) - c.Assert(id.Machine(), DeepEquals, []byte{0x00, 0x00, 0x00}) - c.Assert(int(id.Pid()), Equals, 0) - c.Assert(int(id.Counter()), Equals, 0) -} - -// -------------------------------------------------------------------------- -// ObjectId JSON marshalling. - -type jsonType struct { - Id *bson.ObjectId -} - -func (s *S) TestObjectIdJSONMarshaling(c *C) { - id := bson.ObjectIdHex("4d88e15b60f486e428412dc9") - v := jsonType{Id: &id} - data, err := json.Marshal(&v) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, `{"Id":"4d88e15b60f486e428412dc9"}`) -} - -func (s *S) TestObjectIdJSONUnmarshaling(c *C) { - data := []byte(`{"Id":"4d88e15b60f486e428412dc9"}`) - v := jsonType{} - err := json.Unmarshal(data, &v) - c.Assert(err, IsNil) - c.Assert(*v.Id, Equals, bson.ObjectIdHex("4d88e15b60f486e428412dc9")) -} - -func (s *S) TestObjectIdJSONUnmarshalingError(c *C) { - v := jsonType{} - err := json.Unmarshal([]byte(`{"Id":"4d88e15b60f486e428412dc9A"}`), &v) - c.Assert(err, ErrorMatches, `Invalid ObjectId in JSON: "4d88e15b60f486e428412dc9A"`) - err = json.Unmarshal([]byte(`{"Id":"4d88e15b60f486e428412dcZ"}`), &v) - c.Assert(err, ErrorMatches, `Invalid ObjectId in JSON: "4d88e15b60f486e428412dcZ" .*`) -} - -// -------------------------------------------------------------------------- -// Some simple benchmarks. - -type BenchT struct { - A, B, C, D, E, F string -} - -func BenchmarkUnmarhsalStruct(b *testing.B) { - v := BenchT{A: "A", D: "D", E: "E"} - data, err := bson.Marshal(&v) - if err != nil { - panic(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - err = bson.Unmarshal(data, &v) - } - if err != nil { - panic(err) - } -} - -func BenchmarkUnmarhsalMap(b *testing.B) { - m := bson.M{"a": "a", "d": "d", "e": "e"} - data, err := bson.Marshal(&m) - if err != nil { - panic(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - err = bson.Unmarshal(data, &m) - } - if err != nil { - panic(err) - } -} diff --git a/vendor/labix.org/v2/mgo/bson/decode.go b/vendor/labix.org/v2/mgo/bson/decode.go deleted file mode 100644 index 1ec034e..0000000 --- a/vendor/labix.org/v2/mgo/bson/decode.go +++ /dev/null @@ -1,795 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// gobson - BSON library for Go. - -package bson - -import ( - "fmt" - "math" - "net/url" - "reflect" - "sync" - "time" -) - -type decoder struct { - in []byte - i int - docType reflect.Type -} - -var typeM = reflect.TypeOf(M{}) - -func newDecoder(in []byte) *decoder { - return &decoder{in, 0, typeM} -} - -// -------------------------------------------------------------------------- -// Some helper functions. - -func corrupted() { - panic("Document is corrupted") -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -// -------------------------------------------------------------------------- -// Unmarshaling of documents. - -const ( - setterUnknown = iota - setterNone - setterType - setterAddr -) - -var setterStyle map[reflect.Type]int -var setterIface reflect.Type -var setterMutex sync.RWMutex - -func init() { - var iface Setter - setterIface = reflect.TypeOf(&iface).Elem() - setterStyle = make(map[reflect.Type]int) -} - -func getSetter(outt reflect.Type, out reflect.Value) Setter { - setterMutex.RLock() - style := setterStyle[outt] - setterMutex.RUnlock() - if style == setterNone { - return nil - } - if style == setterUnknown { - setterMutex.Lock() - defer setterMutex.Unlock() - if outt.Implements(setterIface) { - setterStyle[outt] = setterType - } else if reflect.PtrTo(outt).Implements(setterIface) { - setterStyle[outt] = setterAddr - } else { - setterStyle[outt] = setterNone - return nil - } - style = setterStyle[outt] - } - if style == setterAddr { - if !out.CanAddr() { - return nil - } - out = out.Addr() - } else if outt.Kind() == reflect.Ptr && out.IsNil() { - out.Set(reflect.New(outt.Elem())) - } - return out.Interface().(Setter) -} - -func clearMap(m reflect.Value) { - var none reflect.Value - for _, k := range m.MapKeys() { - m.SetMapIndex(k, none) - } -} - -func (d *decoder) readDocTo(out reflect.Value) { - var elemType reflect.Type - outt := out.Type() - outk := outt.Kind() - - for { - if outk == reflect.Ptr && out.IsNil() { - out.Set(reflect.New(outt.Elem())) - } - if setter := getSetter(outt, out); setter != nil { - var raw Raw - d.readDocTo(reflect.ValueOf(&raw)) - err := setter.SetBSON(raw) - if _, ok := err.(*TypeError); err != nil && !ok { - panic(err) - } - return - } - if outk == reflect.Ptr { - out = out.Elem() - outt = out.Type() - outk = out.Kind() - continue - } - break - } - - var fieldsMap map[string]fieldInfo - var inlineMap reflect.Value - start := d.i - - origout := out - if outk == reflect.Interface { - if d.docType.Kind() == reflect.Map { - mv := reflect.MakeMap(d.docType) - out.Set(mv) - out = mv - } else { - dv := reflect.New(d.docType).Elem() - out.Set(dv) - out = dv - } - outt = out.Type() - outk = outt.Kind() - } - - docType := d.docType - keyType := typeString - convertKey := false - switch outk { - case reflect.Map: - keyType = outt.Key() - if keyType.Kind() != reflect.String { - panic("BSON map must have string keys. Got: " + outt.String()) - } - if keyType != typeString { - convertKey = true - } - elemType = outt.Elem() - if elemType == typeIface { - d.docType = outt - } - if out.IsNil() { - out.Set(reflect.MakeMap(out.Type())) - } else if out.Len() > 0 { - clearMap(out) - } - case reflect.Struct: - if outt != typeRaw { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - fieldsMap = sinfo.FieldsMap - out.Set(sinfo.Zero) - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - if !inlineMap.IsNil() && inlineMap.Len() > 0 { - clearMap(inlineMap) - } - elemType = inlineMap.Type().Elem() - if elemType == typeIface { - d.docType = inlineMap.Type() - } - } - } - case reflect.Slice: - switch outt.Elem() { - case typeDocElem: - origout.Set(d.readDocElems(outt)) - return - case typeRawDocElem: - origout.Set(d.readRawDocElems(outt)) - return - } - fallthrough - default: - panic("Unsupported document type for unmarshalling: " + out.Type().String()) - } - - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - name := d.readCStr() - if d.i >= end { - corrupted() - } - - switch outk { - case reflect.Map: - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - k := reflect.ValueOf(name) - if convertKey { - k = k.Convert(keyType) - } - out.SetMapIndex(k, e) - } - case reflect.Struct: - if outt == typeRaw { - d.dropElem(kind) - } else { - if info, ok := fieldsMap[name]; ok { - if info.Inline == nil { - d.readElemTo(out.Field(info.Num), kind) - } else { - d.readElemTo(out.FieldByIndex(info.Inline), kind) - } - } else if inlineMap.IsValid() { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - inlineMap.SetMapIndex(reflect.ValueOf(name), e) - } - } else { - d.dropElem(kind) - } - } - case reflect.Slice: - } - - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } - d.docType = docType - - if outt == typeRaw { - out.Set(reflect.ValueOf(Raw{0x03, d.in[start:d.i]})) - } -} - -func (d *decoder) readArrayDocTo(out reflect.Value) { - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - i := 0 - l := out.Len() - for d.in[d.i] != '\x00' { - if i >= l { - panic("Length mismatch on array field") - } - kind := d.readByte() - for d.i < end && d.in[d.i] != '\x00' { - d.i++ - } - if d.i >= end { - corrupted() - } - d.i++ - d.readElemTo(out.Index(i), kind) - if d.i >= end { - corrupted() - } - i++ - } - if i != l { - panic("Length mismatch on array field") - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } -} - -func (d *decoder) readSliceDoc(t reflect.Type) interface{} { - tmp := make([]reflect.Value, 0, 8) - elemType := t.Elem() - - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - for d.i < end && d.in[d.i] != '\x00' { - d.i++ - } - if d.i >= end { - corrupted() - } - d.i++ - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - tmp = append(tmp, e) - } - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } - - n := len(tmp) - slice := reflect.MakeSlice(t, n, n) - for i := 0; i != n; i++ { - slice.Index(i).Set(tmp[i]) - } - return slice.Interface() -} - -var typeSlice = reflect.TypeOf([]interface{}{}) -var typeIface = typeSlice.Elem() - -func (d *decoder) readDocElems(typ reflect.Type) reflect.Value { - docType := d.docType - d.docType = typ - slice := make([]DocElem, 0, 8) - d.readDocWith(func(kind byte, name string) { - e := DocElem{Name: name} - v := reflect.ValueOf(&e.Value) - if d.readElemTo(v.Elem(), kind) { - slice = append(slice, e) - } - }) - slicev := reflect.New(typ).Elem() - slicev.Set(reflect.ValueOf(slice)) - d.docType = docType - return slicev -} - -func (d *decoder) readRawDocElems(typ reflect.Type) reflect.Value { - docType := d.docType - d.docType = typ - slice := make([]RawDocElem, 0, 8) - d.readDocWith(func(kind byte, name string) { - e := RawDocElem{Name: name} - v := reflect.ValueOf(&e.Value) - if d.readElemTo(v.Elem(), kind) { - slice = append(slice, e) - } - }) - slicev := reflect.New(typ).Elem() - slicev.Set(reflect.ValueOf(slice)) - d.docType = docType - return slicev -} - -func (d *decoder) readDocWith(f func(kind byte, name string)) { - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - name := d.readCStr() - if d.i >= end { - corrupted() - } - f(kind, name) - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } -} - -// -------------------------------------------------------------------------- -// Unmarshaling of individual elements within a document. - -var blackHole = settableValueOf(struct{}{}) - -func (d *decoder) dropElem(kind byte) { - d.readElemTo(blackHole, kind) -} - -// Attempt to decode an element from the document and put it into out. -// If the types are not compatible, the returned ok value will be -// false and out will be unchanged. -func (d *decoder) readElemTo(out reflect.Value, kind byte) (good bool) { - - start := d.i - - if kind == '\x03' { - // Special case for documents. Delegate to readDocTo(). - switch out.Kind() { - case reflect.Interface, reflect.Ptr, reflect.Struct, reflect.Map: - d.readDocTo(out) - default: - switch out.Interface().(type) { - case D: - out.Set(d.readDocElems(out.Type())) - case RawD: - out.Set(d.readRawDocElems(out.Type())) - default: - d.readDocTo(blackHole) - } - } - return true - } - - var in interface{} - - switch kind { - case 0x01: // Float64 - in = d.readFloat64() - case 0x02: // UTF-8 string - in = d.readStr() - case 0x03: // Document - panic("Can't happen. Handled above.") - case 0x04: // Array - outt := out.Type() - for outt.Kind() == reflect.Ptr { - outt = outt.Elem() - } - switch outt.Kind() { - case reflect.Array: - d.readArrayDocTo(out) - return true - case reflect.Slice: - in = d.readSliceDoc(outt) - default: - in = d.readSliceDoc(typeSlice) - } - case 0x05: // Binary - b := d.readBinary() - if b.Kind == 0x00 || b.Kind == 0x02 { - in = b.Data - } else { - in = b - } - case 0x06: // Undefined (obsolete, but still seen in the wild) - in = Undefined - case 0x07: // ObjectId - in = ObjectId(d.readBytes(12)) - case 0x08: // Bool - in = d.readBool() - case 0x09: // Timestamp - // MongoDB handles timestamps as milliseconds. - i := d.readInt64() - if i == -62135596800000 { - in = time.Time{} // In UTC for convenience. - } else { - in = time.Unix(i/1e3, i%1e3*1e6) - } - case 0x0A: // Nil - in = nil - case 0x0B: // RegEx - in = d.readRegEx() - case 0x0D: // JavaScript without scope - in = JavaScript{Code: d.readStr()} - case 0x0E: // Symbol - in = Symbol(d.readStr()) - case 0x0F: // JavaScript with scope - d.i += 4 // Skip length - js := JavaScript{d.readStr(), make(M)} - d.readDocTo(reflect.ValueOf(js.Scope)) - in = js - case 0x10: // Int32 - in = int(d.readInt32()) - case 0x11: // Mongo-specific timestamp - in = MongoTimestamp(d.readInt64()) - case 0x12: // Int64 - in = d.readInt64() - case 0x7F: // Max key - in = MaxKey - case 0xFF: // Min key - in = MinKey - default: - panic(fmt.Sprintf("Unknown element kind (0x%02X)", kind)) - } - - outt := out.Type() - - if outt == typeRaw { - out.Set(reflect.ValueOf(Raw{kind, d.in[start:d.i]})) - return true - } - - if setter := getSetter(outt, out); setter != nil { - err := setter.SetBSON(Raw{kind, d.in[start:d.i]}) - if err == SetZero { - out.Set(reflect.Zero(outt)) - return true - } - if err == nil { - return true - } - if _, ok := err.(*TypeError); !ok { - panic(err) - } - return false - } - - if in == nil { - out.Set(reflect.Zero(outt)) - return true - } - - outk := outt.Kind() - - // Dereference and initialize pointer if necessary. - first := true - for outk == reflect.Ptr { - if !out.IsNil() { - out = out.Elem() - } else { - elem := reflect.New(outt.Elem()) - if first { - // Only set if value is compatible. - first = false - defer func(out, elem reflect.Value) { - if good { - out.Set(elem) - } - }(out, elem) - } else { - out.Set(elem) - } - out = elem - } - outt = out.Type() - outk = outt.Kind() - } - - inv := reflect.ValueOf(in) - if outt == inv.Type() { - out.Set(inv) - return true - } - - switch outk { - case reflect.Interface: - out.Set(inv) - return true - case reflect.String: - switch inv.Kind() { - case reflect.String: - out.SetString(inv.String()) - return true - case reflect.Slice: - if b, ok := in.([]byte); ok { - out.SetString(string(b)) - return true - } - } - case reflect.Slice, reflect.Array: - // Remember, array (0x04) slices are built with the correct - // element type. If we are here, must be a cross BSON kind - // conversion (e.g. 0x05 unmarshalling on string). - if outt.Elem().Kind() != reflect.Uint8 { - break - } - switch inv.Kind() { - case reflect.String: - slice := []byte(inv.String()) - out.Set(reflect.ValueOf(slice)) - return true - case reflect.Slice: - switch outt.Kind() { - case reflect.Array: - reflect.Copy(out, inv) - case reflect.Slice: - out.SetBytes(inv.Bytes()) - } - return true - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch inv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetInt(inv.Int()) - return true - case reflect.Float32, reflect.Float64: - out.SetInt(int64(inv.Float())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetInt(1) - } else { - out.SetInt(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON?") - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch inv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetUint(uint64(inv.Int())) - return true - case reflect.Float32, reflect.Float64: - out.SetUint(uint64(inv.Float())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetUint(1) - } else { - out.SetUint(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON.") - } - case reflect.Float32, reflect.Float64: - switch inv.Kind() { - case reflect.Float32, reflect.Float64: - out.SetFloat(inv.Float()) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetFloat(float64(inv.Int())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetFloat(1) - } else { - out.SetFloat(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON?") - } - case reflect.Bool: - switch inv.Kind() { - case reflect.Bool: - out.SetBool(inv.Bool()) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetBool(inv.Int() != 0) - return true - case reflect.Float32, reflect.Float64: - out.SetBool(inv.Float() != 0) - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON?") - } - case reflect.Struct: - if outt == typeURL && inv.Kind() == reflect.String { - u, err := url.Parse(inv.String()) - if err != nil { - panic(err) - } - out.Set(reflect.ValueOf(u).Elem()) - return true - } - } - - return false -} - -// -------------------------------------------------------------------------- -// Parsers of basic types. - -func (d *decoder) readRegEx() RegEx { - re := RegEx{} - re.Pattern = d.readCStr() - re.Options = d.readCStr() - return re -} - -func (d *decoder) readBinary() Binary { - l := d.readInt32() - b := Binary{} - b.Kind = d.readByte() - b.Data = d.readBytes(l) - if b.Kind == 0x02 && len(b.Data) >= 4 { - // Weird obsolete format with redundant length. - b.Data = b.Data[4:] - } - return b -} - -func (d *decoder) readStr() string { - l := d.readInt32() - b := d.readBytes(l - 1) - if d.readByte() != '\x00' { - corrupted() - } - return string(b) -} - -func (d *decoder) readCStr() string { - start := d.i - end := start - l := len(d.in) - for ; end != l; end++ { - if d.in[end] == '\x00' { - break - } - } - d.i = end + 1 - if d.i > l { - corrupted() - } - return string(d.in[start:end]) -} - -func (d *decoder) readBool() bool { - if d.readByte() == 1 { - return true - } - return false -} - -func (d *decoder) readFloat64() float64 { - return math.Float64frombits(uint64(d.readInt64())) -} - -func (d *decoder) readInt32() int32 { - b := d.readBytes(4) - return int32((uint32(b[0]) << 0) | - (uint32(b[1]) << 8) | - (uint32(b[2]) << 16) | - (uint32(b[3]) << 24)) -} - -func (d *decoder) readInt64() int64 { - b := d.readBytes(8) - return int64((uint64(b[0]) << 0) | - (uint64(b[1]) << 8) | - (uint64(b[2]) << 16) | - (uint64(b[3]) << 24) | - (uint64(b[4]) << 32) | - (uint64(b[5]) << 40) | - (uint64(b[6]) << 48) | - (uint64(b[7]) << 56)) -} - -func (d *decoder) readByte() byte { - i := d.i - d.i++ - if d.i > len(d.in) { - corrupted() - } - return d.in[i] -} - -func (d *decoder) readBytes(length int32) []byte { - start := d.i - d.i += int(length) - if d.i > len(d.in) { - corrupted() - } - return d.in[start : start+int(length)] -} diff --git a/vendor/labix.org/v2/mgo/bson/encode.go b/vendor/labix.org/v2/mgo/bson/encode.go deleted file mode 100644 index 6ba383a..0000000 --- a/vendor/labix.org/v2/mgo/bson/encode.go +++ /dev/null @@ -1,462 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// gobson - BSON library for Go. - -package bson - -import ( - "fmt" - "math" - "net/url" - "reflect" - "strconv" - "time" -) - -// -------------------------------------------------------------------------- -// Some internal infrastructure. - -var ( - typeBinary = reflect.TypeOf(Binary{}) - typeObjectId = reflect.TypeOf(ObjectId("")) - typeSymbol = reflect.TypeOf(Symbol("")) - typeMongoTimestamp = reflect.TypeOf(MongoTimestamp(0)) - typeOrderKey = reflect.TypeOf(MinKey) - typeDocElem = reflect.TypeOf(DocElem{}) - typeRawDocElem = reflect.TypeOf(RawDocElem{}) - typeRaw = reflect.TypeOf(Raw{}) - typeURL = reflect.TypeOf(url.URL{}) - typeTime = reflect.TypeOf(time.Time{}) - typeString = reflect.TypeOf("") -) - -const itoaCacheSize = 32 - -var itoaCache []string - -func init() { - itoaCache = make([]string, itoaCacheSize) - for i := 0; i != itoaCacheSize; i++ { - itoaCache[i] = strconv.Itoa(i) - } -} - -func itoa(i int) string { - if i < itoaCacheSize { - return itoaCache[i] - } - return strconv.Itoa(i) -} - -// -------------------------------------------------------------------------- -// Marshaling of the document value itself. - -type encoder struct { - out []byte -} - -func (e *encoder) addDoc(v reflect.Value) { - for { - if vi, ok := v.Interface().(Getter); ok { - getv, err := vi.GetBSON() - if err != nil { - panic(err) - } - v = reflect.ValueOf(getv) - continue - } - if v.Kind() == reflect.Ptr { - v = v.Elem() - continue - } - break - } - - if v.Type() == typeRaw { - raw := v.Interface().(Raw) - if raw.Kind != 0x03 && raw.Kind != 0x00 { - panic("Attempted to unmarshal Raw kind " + strconv.Itoa(int(raw.Kind)) + " as a document") - } - e.addBytes(raw.Data...) - return - } - - start := e.reserveInt32() - - switch v.Kind() { - case reflect.Map: - e.addMap(v) - case reflect.Struct: - e.addStruct(v) - case reflect.Array, reflect.Slice: - e.addSlice(v) - default: - panic("Can't marshal " + v.Type().String() + " as a BSON document") - } - - e.addBytes(0) - e.setInt32(start, int32(len(e.out)-start)) -} - -func (e *encoder) addMap(v reflect.Value) { - for _, k := range v.MapKeys() { - e.addElem(k.String(), v.MapIndex(k), false) - } -} - -func (e *encoder) addStruct(v reflect.Value) { - sinfo, err := getStructInfo(v.Type()) - if err != nil { - panic(err) - } - var value reflect.Value - if sinfo.InlineMap >= 0 { - m := v.Field(sinfo.InlineMap) - if m.Len() > 0 { - for _, k := range m.MapKeys() { - ks := k.String() - if _, found := sinfo.FieldsMap[ks]; found { - panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", ks)) - } - e.addElem(ks, m.MapIndex(k), false) - } - } - } - for _, info := range sinfo.FieldsList { - if info.Inline == nil { - value = v.Field(info.Num) - } else { - value = v.FieldByIndex(info.Inline) - } - if info.OmitEmpty && isZero(value) { - continue - } - e.addElem(info.Key, value, info.MinSize) - } -} - -func isZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.String: - return len(v.String()) == 0 - case reflect.Ptr, reflect.Interface: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Struct: - if v.Type() == typeTime { - return v.Interface().(time.Time).IsZero() - } - for i := v.NumField()-1; i >= 0; i-- { - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} - -func (e *encoder) addSlice(v reflect.Value) { - vi := v.Interface() - if d, ok := vi.(D); ok { - for _, elem := range d { - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - if d, ok := vi.(RawD); ok { - for _, elem := range d { - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - l := v.Len() - et := v.Type().Elem() - if et == typeDocElem { - for i := 0; i < l; i++ { - elem := v.Index(i).Interface().(DocElem) - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - if et == typeRawDocElem { - for i := 0; i < l; i++ { - elem := v.Index(i).Interface().(RawDocElem) - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - for i := 0; i < l; i++ { - e.addElem(itoa(i), v.Index(i), false) - } -} - -// -------------------------------------------------------------------------- -// Marshaling of elements in a document. - -func (e *encoder) addElemName(kind byte, name string) { - e.addBytes(kind) - e.addBytes([]byte(name)...) - e.addBytes(0) -} - -func (e *encoder) addElem(name string, v reflect.Value, minSize bool) { - - if !v.IsValid() { - e.addElemName('\x0A', name) - return - } - - if getter, ok := v.Interface().(Getter); ok { - getv, err := getter.GetBSON() - if err != nil { - panic(err) - } - e.addElem(name, reflect.ValueOf(getv), minSize) - return - } - - switch v.Kind() { - - case reflect.Interface: - e.addElem(name, v.Elem(), minSize) - - case reflect.Ptr: - e.addElem(name, v.Elem(), minSize) - - case reflect.String: - s := v.String() - switch v.Type() { - case typeObjectId: - if len(s) != 12 { - panic("ObjectIDs must be exactly 12 bytes long (got " + - strconv.Itoa(len(s)) + ")") - } - e.addElemName('\x07', name) - e.addBytes([]byte(s)...) - case typeSymbol: - e.addElemName('\x0E', name) - e.addStr(s) - default: - e.addElemName('\x02', name) - e.addStr(s) - } - - case reflect.Float32, reflect.Float64: - e.addElemName('\x01', name) - e.addInt64(int64(math.Float64bits(v.Float()))) - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - u := v.Uint() - if int64(u) < 0 { - panic("BSON has no uint64 type, and value is too large to fit correctly in an int64") - } else if u <= math.MaxInt32 && (minSize || v.Kind() <= reflect.Uint32) { - e.addElemName('\x10', name) - e.addInt32(int32(u)) - } else { - e.addElemName('\x12', name) - e.addInt64(int64(u)) - } - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch v.Type() { - case typeMongoTimestamp: - e.addElemName('\x11', name) - e.addInt64(v.Int()) - - case typeOrderKey: - if v.Int() == int64(MaxKey) { - e.addElemName('\x7F', name) - } else { - e.addElemName('\xFF', name) - } - - default: - i := v.Int() - if (minSize || v.Type().Kind() != reflect.Int64) && i >= math.MinInt32 && i <= math.MaxInt32 { - // It fits into an int32, encode as such. - e.addElemName('\x10', name) - e.addInt32(int32(i)) - } else { - e.addElemName('\x12', name) - e.addInt64(i) - } - } - - case reflect.Bool: - e.addElemName('\x08', name) - if v.Bool() { - e.addBytes(1) - } else { - e.addBytes(0) - } - - case reflect.Map: - e.addElemName('\x03', name) - e.addDoc(v) - - case reflect.Slice: - vt := v.Type() - et := vt.Elem() - if et.Kind() == reflect.Uint8 { - e.addElemName('\x05', name) - e.addBinary('\x00', v.Bytes()) - } else if et == typeDocElem || et == typeRawDocElem { - e.addElemName('\x03', name) - e.addDoc(v) - } else { - e.addElemName('\x04', name) - e.addDoc(v) - } - - case reflect.Array: - et := v.Type().Elem() - if et.Kind() == reflect.Uint8 { - e.addElemName('\x05', name) - e.addBinary('\x00', v.Slice(0, v.Len()).Interface().([]byte)) - } else { - e.addElemName('\x04', name) - e.addDoc(v) - } - - case reflect.Struct: - switch s := v.Interface().(type) { - - case Raw: - kind := s.Kind - if kind == 0x00 { - kind = 0x03 - } - e.addElemName(kind, name) - e.addBytes(s.Data...) - - case Binary: - e.addElemName('\x05', name) - e.addBinary(s.Kind, s.Data) - - case RegEx: - e.addElemName('\x0B', name) - e.addCStr(s.Pattern) - e.addCStr(s.Options) - - case JavaScript: - if s.Scope == nil { - e.addElemName('\x0D', name) - e.addStr(s.Code) - } else { - e.addElemName('\x0F', name) - start := e.reserveInt32() - e.addStr(s.Code) - e.addDoc(reflect.ValueOf(s.Scope)) - e.setInt32(start, int32(len(e.out)-start)) - } - - case time.Time: - // MongoDB handles timestamps as milliseconds. - e.addElemName('\x09', name) - e.addInt64(s.Unix() * 1000 + int64(s.Nanosecond() / 1e6)) - - case url.URL: - e.addElemName('\x02', name) - e.addStr(s.String()) - - case undefined: - e.addElemName('\x06', name) - - default: - e.addElemName('\x03', name) - e.addDoc(v) - } - - default: - panic("Can't marshal " + v.Type().String() + " in a BSON document") - } -} - -// -------------------------------------------------------------------------- -// Marshaling of base types. - -func (e *encoder) addBinary(subtype byte, v []byte) { - if subtype == 0x02 { - // Wonder how that brilliant idea came to life. Obsolete, luckily. - e.addInt32(int32(len(v) + 4)) - e.addBytes(subtype) - e.addInt32(int32(len(v))) - } else { - e.addInt32(int32(len(v))) - e.addBytes(subtype) - } - e.addBytes(v...) -} - -func (e *encoder) addStr(v string) { - e.addInt32(int32(len(v) + 1)) - e.addCStr(v) -} - -func (e *encoder) addCStr(v string) { - e.addBytes([]byte(v)...) - e.addBytes(0) -} - -func (e *encoder) reserveInt32() (pos int) { - pos = len(e.out) - e.addBytes(0, 0, 0, 0) - return pos -} - -func (e *encoder) setInt32(pos int, v int32) { - e.out[pos+0] = byte(v) - e.out[pos+1] = byte(v >> 8) - e.out[pos+2] = byte(v >> 16) - e.out[pos+3] = byte(v >> 24) -} - -func (e *encoder) addInt32(v int32) { - u := uint32(v) - e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24)) -} - -func (e *encoder) addInt64(v int64) { - u := uint64(v) - e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24), - byte(u>>32), byte(u>>40), byte(u>>48), byte(u>>56)) -} - -func (e *encoder) addBytes(v ...byte) { - e.out = append(e.out, v...) -} diff --git a/vendor/labix.org/v2/mgo/bulk.go b/vendor/labix.org/v2/mgo/bulk.go deleted file mode 100644 index 5a9d37b..0000000 --- a/vendor/labix.org/v2/mgo/bulk.go +++ /dev/null @@ -1,71 +0,0 @@ -package mgo - -// Bulk represents an operation that can be prepared with several -// orthogonal changes before being delivered to the server. -// -// WARNING: This API is still experimental. -// -// Relevant documentation: -// -// http://blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api -// -type Bulk struct { - c *Collection - ordered bool - inserts []interface{} -} - -// BulkError holds an error returned from running a Bulk operation. -// -// TODO: This is private for the moment, until we understand exactly how -// to report these multi-errors in a useful and convenient way. -type bulkError struct { - err error -} - -// BulkResult holds the results for a bulk operation. -type BulkResult struct { - // Be conservative while we understand exactly how to report these - // results in a useful and convenient way, and also how to emulate - // them with prior servers. - private bool -} - -func (e *bulkError) Error() string { - return e.err.Error() -} - -// Bulk returns a value to prepare the execution of a bulk operation. -// -// WARNING: This API is still experimental. -// -func (c *Collection) Bulk() *Bulk { - return &Bulk{c: c, ordered: true} -} - -// Unordered puts the bulk operation in unordered mode. -// -// In unordered mode the indvidual operations may be sent -// out of order, which means latter operations may proceed -// even if prior ones have failed. -func (b *Bulk) Unordered() { - b.ordered = false -} - -// Insert queues up the provided documents for insertion. -func (b *Bulk) Insert(docs ...interface{}) { - b.inserts = append(b.inserts, docs...) -} - -// Run runs all the operations queued up. -func (b *Bulk) Run() (*BulkResult, error) { - op := &insertOp{b.c.FullName, b.inserts, 0} - if !b.ordered { - op.flags = 1 // ContinueOnError - } - _, err := b.c.writeQuery(op) - if err != nil { - return nil, &bulkError{err} - } - return &BulkResult{}, nil -} diff --git a/vendor/labix.org/v2/mgo/bulk_test.go b/vendor/labix.org/v2/mgo/bulk_test.go deleted file mode 100644 index f8abca8..0000000 --- a/vendor/labix.org/v2/mgo/bulk_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2014 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "labix.org/v2/mgo" - . "launchpad.net/gocheck" -) - -func (s *S) TestBulkInsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Insert(M{"n": 1}) - bulk.Insert(M{"n": 2}, M{"n": 3}) - r, err := bulk.Run() - c.Assert(err, IsNil) - c.Assert(r, FitsTypeOf, &mgo.BulkResult{}) - - type doc struct{ N int } - var res []doc - err = coll.Find(nil).Sort("n").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) -} - -func (s *S) TestBulkInsertError(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"n": 3}) - _, err = bulk.Run() - c.Assert(err, ErrorMatches, ".*duplicate key.*") - - type doc struct{ N int `_id` } - var res []doc - err = coll.Find(nil).Sort("_id").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}}) -} - -func (s *S) TestBulkInsertErrorUnordered(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Unordered() - bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"_id": 3}) - _, err = bulk.Run() - c.Assert(err, ErrorMatches, ".*duplicate key.*") - - type doc struct{ N int `_id` } - var res []doc - err = coll.Find(nil).Sort("_id").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) -} diff --git a/vendor/labix.org/v2/mgo/cluster.go b/vendor/labix.org/v2/mgo/cluster.go deleted file mode 100644 index b4ed5bf..0000000 --- a/vendor/labix.org/v2/mgo/cluster.go +++ /dev/null @@ -1,616 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "errors" - "labix.org/v2/mgo/bson" - "net" - "sync" - "time" -) - -// --------------------------------------------------------------------------- -// Mongo cluster encapsulation. -// -// A cluster enables the communication with one or more servers participating -// in a mongo cluster. This works with individual servers, a replica set, -// a replica pair, one or multiple mongos routers, etc. - -type mongoCluster struct { - sync.RWMutex - serverSynced sync.Cond - userSeeds []string - dynaSeeds []string - servers mongoServers - masters mongoServers - references int - syncing bool - direct bool - failFast bool - syncCount uint - cachedIndex map[string]bool - sync chan bool - dial dialer -} - -func newCluster(userSeeds []string, direct, failFast bool, dial dialer) *mongoCluster { - cluster := &mongoCluster{ - userSeeds: userSeeds, - references: 1, - direct: direct, - failFast: failFast, - dial: dial, - } - cluster.serverSynced.L = cluster.RWMutex.RLocker() - cluster.sync = make(chan bool, 1) - stats.cluster(+1) - go cluster.syncServersLoop() - return cluster -} - -// Acquire increases the reference count for the cluster. -func (cluster *mongoCluster) Acquire() { - cluster.Lock() - cluster.references++ - debugf("Cluster %p acquired (refs=%d)", cluster, cluster.references) - cluster.Unlock() -} - -// Release decreases the reference count for the cluster. Once -// it reaches zero, all servers will be closed. -func (cluster *mongoCluster) Release() { - cluster.Lock() - if cluster.references == 0 { - panic("cluster.Release() with references == 0") - } - cluster.references-- - debugf("Cluster %p released (refs=%d)", cluster, cluster.references) - if cluster.references == 0 { - for _, server := range cluster.servers.Slice() { - server.Close() - } - // Wake up the sync loop so it can die. - cluster.syncServers() - stats.cluster(-1) - } - cluster.Unlock() -} - -func (cluster *mongoCluster) LiveServers() (servers []string) { - cluster.RLock() - for _, serv := range cluster.servers.Slice() { - servers = append(servers, serv.Addr) - } - cluster.RUnlock() - return servers -} - -func (cluster *mongoCluster) removeServer(server *mongoServer) { - cluster.Lock() - cluster.masters.Remove(server) - other := cluster.servers.Remove(server) - cluster.Unlock() - if other != nil { - other.Close() - log("Removed server ", server.Addr, " from cluster.") - } - server.Close() -} - -type isMasterResult struct { - IsMaster bool - Secondary bool - Primary string - Hosts []string - Passives []string - Tags bson.D - Msg string -} - -func (cluster *mongoCluster) isMaster(socket *mongoSocket, result *isMasterResult) error { - // Monotonic let's it talk to a slave and still hold the socket. - session := newSession(Monotonic, cluster, 10*time.Second) - session.setSocket(socket) - err := session.Run("ismaster", result) - session.Close() - return err -} - -type possibleTimeout interface { - Timeout() bool -} - -var syncSocketTimeout = 5 * time.Second - -func (cluster *mongoCluster) syncServer(server *mongoServer) (info *mongoServerInfo, hosts []string, err error) { - var syncTimeout time.Duration - if raceDetector { - // This variable is only ever touched by tests. - globalMutex.Lock() - syncTimeout = syncSocketTimeout - globalMutex.Unlock() - } else { - syncTimeout = syncSocketTimeout - } - - addr := server.Addr - log("SYNC Processing ", addr, "...") - - // Retry a few times to avoid knocking a server down for a hiccup. - var result isMasterResult - var tryerr error - for retry := 0; ; retry++ { - if retry == 3 || retry == 1 && cluster.failFast { - return nil, nil, tryerr - } - if retry > 0 { - // Don't abuse the server needlessly if there's something actually wrong. - if err, ok := tryerr.(possibleTimeout); ok && err.Timeout() { - // Give a chance for waiters to timeout as well. - cluster.serverSynced.Broadcast() - } - time.Sleep(syncShortDelay) - } - - // It's not clear what would be a good timeout here. Is it - // better to wait longer or to retry? - socket, _, err := server.AcquireSocket(0, syncTimeout) - if err != nil { - tryerr = err - logf("SYNC Failed to get socket to %s: %v", addr, err) - continue - } - err = cluster.isMaster(socket, &result) - socket.Release() - if err != nil { - tryerr = err - logf("SYNC Command 'ismaster' to %s failed: %v", addr, err) - continue - } - debugf("SYNC Result of 'ismaster' from %s: %#v", addr, result) - break - } - - if result.IsMaster { - debugf("SYNC %s is a master.", addr) - // Made an incorrect assumption above, so fix stats. - stats.conn(-1, false) - stats.conn(+1, true) - } else if result.Secondary { - debugf("SYNC %s is a slave.", addr) - } else if cluster.direct { - logf("SYNC %s in unknown state. Pretending it's a slave due to direct connection.", addr) - } else { - logf("SYNC %s is neither a master nor a slave.", addr) - // Made an incorrect assumption above, so fix stats. - stats.conn(-1, false) - return nil, nil, errors.New(addr + " is not a master nor slave") - } - - info = &mongoServerInfo{ - Master: result.IsMaster, - Mongos: result.Msg == "isdbgrid", - Tags: result.Tags, - } - - hosts = make([]string, 0, 1+len(result.Hosts)+len(result.Passives)) - if result.Primary != "" { - // First in the list to speed up master discovery. - hosts = append(hosts, result.Primary) - } - hosts = append(hosts, result.Hosts...) - hosts = append(hosts, result.Passives...) - - debugf("SYNC %s knows about the following peers: %#v", addr, hosts) - return info, hosts, nil -} - -type syncKind bool - -const ( - completeSync syncKind = true - partialSync syncKind = false -) - -func (cluster *mongoCluster) addServer(server *mongoServer, info *mongoServerInfo, syncKind syncKind) { - cluster.Lock() - current := cluster.servers.Search(server.ResolvedAddr) - if current == nil { - if syncKind == partialSync { - cluster.Unlock() - server.Close() - log("SYNC Discarding unknown server ", server.Addr, " due to partial sync.") - return - } - cluster.servers.Add(server) - if info.Master { - cluster.masters.Add(server) - log("SYNC Adding ", server.Addr, " to cluster as a master.") - } else { - log("SYNC Adding ", server.Addr, " to cluster as a slave.") - } - } else { - if server != current { - panic("addServer attempting to add duplicated server") - } - if server.Info().Master != info.Master { - if info.Master { - log("SYNC Server ", server.Addr, " is now a master.") - cluster.masters.Add(server) - } else { - log("SYNC Server ", server.Addr, " is now a slave.") - cluster.masters.Remove(server) - } - } - } - server.SetInfo(info) - debugf("SYNC Broadcasting availability of server %s", server.Addr) - cluster.serverSynced.Broadcast() - cluster.Unlock() -} - -func (cluster *mongoCluster) getKnownAddrs() []string { - cluster.RLock() - max := len(cluster.userSeeds) + len(cluster.dynaSeeds) + cluster.servers.Len() - seen := make(map[string]bool, max) - known := make([]string, 0, max) - - add := func(addr string) { - if _, found := seen[addr]; !found { - seen[addr] = true - known = append(known, addr) - } - } - - for _, addr := range cluster.userSeeds { - add(addr) - } - for _, addr := range cluster.dynaSeeds { - add(addr) - } - for _, serv := range cluster.servers.Slice() { - add(serv.Addr) - } - cluster.RUnlock() - - return known -} - -// syncServers injects a value into the cluster.sync channel to force -// an iteration of the syncServersLoop function. -func (cluster *mongoCluster) syncServers() { - select { - case cluster.sync <- true: - default: - } -} - -// How long to wait for a checkup of the cluster topology if nothing -// else kicks a synchronization before that. -const syncServersDelay = 30 * time.Second -const syncShortDelay = 500 * time.Millisecond - -// syncServersLoop loops while the cluster is alive to keep its idea of -// the server topology up-to-date. It must be called just once from -// newCluster. The loop iterates once syncServersDelay has passed, or -// if somebody injects a value into the cluster.sync channel to force a -// synchronization. A loop iteration will contact all servers in -// parallel, ask them about known peers and their own role within the -// cluster, and then attempt to do the same with all the peers -// retrieved. -func (cluster *mongoCluster) syncServersLoop() { - for { - debugf("SYNC Cluster %p is starting a sync loop iteration.", cluster) - - cluster.Lock() - if cluster.references == 0 { - cluster.Unlock() - break - } - cluster.references++ // Keep alive while syncing. - direct := cluster.direct - cluster.Unlock() - - cluster.syncServersIteration(direct) - - // We just synchronized, so consume any outstanding requests. - select { - case <-cluster.sync: - default: - } - - cluster.Release() - - // Hold off before allowing another sync. No point in - // burning CPU looking for down servers. - if !cluster.failFast { - time.Sleep(syncShortDelay) - } - - cluster.Lock() - if cluster.references == 0 { - cluster.Unlock() - break - } - cluster.syncCount++ - // Poke all waiters so they have a chance to timeout or - // restart syncing if they wish to. - cluster.serverSynced.Broadcast() - // Check if we have to restart immediately either way. - restart := !direct && cluster.masters.Empty() || cluster.servers.Empty() - cluster.Unlock() - - if restart { - log("SYNC No masters found. Will synchronize again.") - time.Sleep(syncShortDelay) - continue - } - - debugf("SYNC Cluster %p waiting for next requested or scheduled sync.", cluster) - - // Hold off until somebody explicitly requests a synchronization - // or it's time to check for a cluster topology change again. - select { - case <-cluster.sync: - case <-time.After(syncServersDelay): - } - } - debugf("SYNC Cluster %p is stopping its sync loop.", cluster) -} - -func (cluster *mongoCluster) server(addr string, tcpaddr *net.TCPAddr) *mongoServer { - cluster.RLock() - server := cluster.servers.Search(tcpaddr.String()) - cluster.RUnlock() - if server != nil { - return server - } - return newServer(addr, tcpaddr, cluster.sync, cluster.dial) -} - -func resolveAddr(addr string) (*net.TCPAddr, error) { - tcpaddr, err := net.ResolveTCPAddr("tcp", addr) - if err != nil { - log("SYNC Failed to resolve ", addr, ": ", err.Error()) - return nil, err - } - if tcpaddr.String() != addr { - debug("SYNC Address ", addr, " resolved as ", tcpaddr.String()) - } - return tcpaddr, nil -} - -type pendingAdd struct { - server *mongoServer - info *mongoServerInfo -} - -func (cluster *mongoCluster) syncServersIteration(direct bool) { - log("SYNC Starting full topology synchronization...") - - var wg sync.WaitGroup - var m sync.Mutex - notYetAdded := make(map[string]pendingAdd) - addIfFound := make(map[string]bool) - seen := make(map[string]bool) - syncKind := partialSync - - var spawnSync func(addr string, byMaster bool) - spawnSync = func(addr string, byMaster bool) { - wg.Add(1) - go func() { - defer wg.Done() - - tcpaddr, err := resolveAddr(addr) - if err != nil { - log("SYNC Failed to start sync of ", addr, ": ", err.Error()) - return - } - resolvedAddr := tcpaddr.String() - - m.Lock() - if byMaster { - if pending, ok := notYetAdded[resolvedAddr]; ok { - delete(notYetAdded, resolvedAddr) - m.Unlock() - cluster.addServer(pending.server, pending.info, completeSync) - return - } - addIfFound[resolvedAddr] = true - } - if seen[resolvedAddr] { - m.Unlock() - return - } - seen[resolvedAddr] = true - m.Unlock() - - server := cluster.server(addr, tcpaddr) - info, hosts, err := cluster.syncServer(server) - if err != nil { - cluster.removeServer(server) - return - } - - m.Lock() - add := direct || info.Master || addIfFound[resolvedAddr] - if add { - syncKind = completeSync - } else { - notYetAdded[resolvedAddr] = pendingAdd{server, info} - } - m.Unlock() - if add { - cluster.addServer(server, info, completeSync) - } - if !direct { - for _, addr := range hosts { - spawnSync(addr, info.Master) - } - } - }() - } - - knownAddrs := cluster.getKnownAddrs() - for _, addr := range knownAddrs { - spawnSync(addr, false) - } - wg.Wait() - - if syncKind == completeSync { - logf("SYNC Synchronization was complete (got data from primary).") - for _, pending := range notYetAdded { - cluster.removeServer(pending.server) - } - } else { - logf("SYNC Synchronization was partial (cannot talk to primary).") - for _, pending := range notYetAdded { - cluster.addServer(pending.server, pending.info, partialSync) - } - } - - cluster.Lock() - ml := cluster.masters.Len() - logf("SYNC Synchronization completed: %d master(s) and %d slave(s) alive.", ml, cluster.servers.Len()-ml) - - // Update dynamic seeds, but only if we have any good servers. Otherwise, - // leave them alone for better chances of a successful sync in the future. - if syncKind == completeSync { - dynaSeeds := make([]string, cluster.servers.Len()) - for i, server := range cluster.servers.Slice() { - dynaSeeds[i] = server.Addr - } - cluster.dynaSeeds = dynaSeeds - debugf("SYNC New dynamic seeds: %#v\n", dynaSeeds) - } - cluster.Unlock() -} - -var socketsPerServer = 4096 - -// AcquireSocket returns a socket to a server in the cluster. If slaveOk is -// true, it will attempt to return a socket to a slave server. If it is -// false, the socket will necessarily be to a master server. -func (cluster *mongoCluster) AcquireSocket(slaveOk bool, syncTimeout time.Duration, socketTimeout time.Duration, serverTags []bson.D) (s *mongoSocket, err error) { - var started time.Time - var syncCount uint - warnedLimit := false - for { - cluster.RLock() - for { - ml := cluster.masters.Len() - sl := cluster.servers.Len() - debugf("Cluster has %d known masters and %d known slaves.", ml, sl-ml) - if ml > 0 || slaveOk && sl > 0 { - break - } - if started.IsZero() { - // Initialize after fast path above. - started = time.Now() - syncCount = cluster.syncCount - } else if syncTimeout != 0 && started.Before(time.Now().Add(-syncTimeout)) || cluster.failFast && cluster.syncCount != syncCount { - cluster.RUnlock() - return nil, errors.New("no reachable servers") - } - log("Waiting for servers to synchronize...") - cluster.syncServers() - - // Remember: this will release and reacquire the lock. - cluster.serverSynced.Wait() - } - - var server *mongoServer - if slaveOk { - server = cluster.servers.BestFit(serverTags) - } else { - server = cluster.masters.BestFit(nil) - } - cluster.RUnlock() - - if server == nil { - // Must have failed the requested tags. Sleep to avoid spinning. - time.Sleep(1e8) - continue - } - - s, abended, err := server.AcquireSocket(socketsPerServer, socketTimeout) - if err == errSocketLimit { - if !warnedLimit { - log("WARNING: Per-server connection limit reached.") - } - time.Sleep(1e8) - continue - } - if err != nil { - cluster.removeServer(server) - cluster.syncServers() - continue - } - if abended && !slaveOk { - var result isMasterResult - err := cluster.isMaster(s, &result) - if err != nil || !result.IsMaster { - logf("Cannot confirm server %s as master (%v)", server.Addr, err) - s.Release() - cluster.syncServers() - time.Sleep(1e8) - continue - } - } - return s, nil - } - panic("unreached") -} - -func (cluster *mongoCluster) CacheIndex(cacheKey string, exists bool) { - cluster.Lock() - if cluster.cachedIndex == nil { - cluster.cachedIndex = make(map[string]bool) - } - if exists { - cluster.cachedIndex[cacheKey] = true - } else { - delete(cluster.cachedIndex, cacheKey) - } - cluster.Unlock() -} - -func (cluster *mongoCluster) HasCachedIndex(cacheKey string) (result bool) { - cluster.RLock() - if cluster.cachedIndex != nil { - result = cluster.cachedIndex[cacheKey] - } - cluster.RUnlock() - return -} - -func (cluster *mongoCluster) ResetIndexCache() { - cluster.Lock() - cluster.cachedIndex = make(map[string]bool) - cluster.Unlock() -} diff --git a/vendor/labix.org/v2/mgo/cluster_test.go b/vendor/labix.org/v2/mgo/cluster_test.go deleted file mode 100644 index d6d2810..0000000 --- a/vendor/labix.org/v2/mgo/cluster_test.go +++ /dev/null @@ -1,1559 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "fmt" - "io" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" - "net" - "strings" - "sync" - "time" -) - -func (s *S) TestNewSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Do a dummy operation to wait for connection. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Tweak safety and query settings to ensure other has copied those. - session.SetSafe(nil) - session.SetBatch(-1) - other := session.New() - defer other.Close() - session.SetSafe(&mgo.Safe{}) - - // Clone was copied while session was unsafe, so no errors. - otherColl := other.DB("mydb").C("mycoll") - err = otherColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Original session was made safe again. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, NotNil) - - // With New(), each session has its own socket now. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 2) - - // Ensure query parameters were cloned. - err = otherColl.Insert(M{"_id": 2}) - c.Assert(err, IsNil) - - // Ping the database to ensure the nonce has been received already. - c.Assert(other.Ping(), IsNil) - - mgo.ResetStats() - - iter := otherColl.Find(M{}).Iter() - c.Assert(err, IsNil) - - m := M{} - ok := iter.Next(m) - c.Assert(ok, Equals, true) - err = iter.Close() - c.Assert(err, IsNil) - - // If Batch(-1) is in effect, a single document must have been received. - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 1) -} - -func (s *S) TestCloneSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Do a dummy operation to wait for connection. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Tweak safety and query settings to ensure clone is copying those. - session.SetSafe(nil) - session.SetBatch(-1) - clone := session.Clone() - defer clone.Close() - session.SetSafe(&mgo.Safe{}) - - // Clone was copied while session was unsafe, so no errors. - cloneColl := clone.DB("mydb").C("mycoll") - err = cloneColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Original session was made safe again. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, NotNil) - - // With Clone(), same socket is shared between sessions now. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 2) - - // Refreshing one of them should let the original socket go, - // while preserving the safety settings. - clone.Refresh() - err = cloneColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Must have used another connection now. - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 2) - c.Assert(stats.SocketRefs, Equals, 2) - - // Ensure query parameters were cloned. - err = cloneColl.Insert(M{"_id": 2}) - c.Assert(err, IsNil) - - // Ping the database to ensure the nonce has been received already. - c.Assert(clone.Ping(), IsNil) - - mgo.ResetStats() - - iter := cloneColl.Find(M{}).Iter() - c.Assert(err, IsNil) - - m := M{} - ok := iter.Next(m) - c.Assert(ok, Equals, true) - err = iter.Close() - c.Assert(err, IsNil) - - // If Batch(-1) is in effect, a single document must have been received. - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 1) -} - -func (s *S) TestSetModeStrong(c *C) { - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - session.SetMode(mgo.Strong, false) - - c.Assert(session.Mode(), Equals, mgo.Strong) - - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 1) - - session.SetMode(mgo.Strong, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeMonotonic(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - c.Assert(session.Mode(), Equals, mgo.Monotonic) - - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - result = M{} - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 2) - - session.SetMode(mgo.Monotonic, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeMonotonicAfterStrong(c *C) { - // Test that a strong session shifting to a monotonic - // one preserves the socket untouched. - - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - // Insert something to force a connection to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - session.SetMode(mgo.Monotonic, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Master socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // Confirm it's the master even though it's Monotonic by now. - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) -} - -func (s *S) TestSetModeStrongAfterMonotonic(c *C) { - // Test that shifting from Monotonic to Strong while - // using a slave socket will keep the socket reserved - // until the master socket is necessary, so that no - // switch over occurs unless it's actually necessary. - - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - // Ensure we're talking to a slave, and reserve the socket. - result := M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - // Switch to a Strong session. - session.SetMode(mgo.Strong, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Slave socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // But any operation will switch it to the master. - result = M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) -} - -func (s *S) TestSetModeMonotonicWriteOnIteration(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - c.Assert(session.Mode(), Equals, mgo.Monotonic) - - coll1 := session.DB("mydb").C("mycoll1") - coll2 := session.DB("mydb").C("mycoll2") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll1.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - // Release master so we can grab a slave again. - session.Refresh() - - // Wait until synchronization is done. - for { - n, err := coll1.Count() - c.Assert(err, IsNil) - if n == len(ns) { - break - } - } - - iter := coll1.Find(nil).Batch(2).Iter() - i := 0 - m := M{} - for iter.Next(&m) { - i++ - if i > 3 { - err := coll2.Insert(M{"n": 47 + i}) - c.Assert(err, IsNil) - } - } - c.Assert(i, Equals, len(ns)) -} - -func (s *S) TestSetModeEventual(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Eventual, false) - - c.Assert(session.Mode(), Equals, mgo.Eventual) - - result := M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - result = M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeEventualAfterStrong(c *C) { - // Test that a strong session shifting to an eventual - // one preserves the socket untouched. - - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - // Insert something to force a connection to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - session.SetMode(mgo.Eventual, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Master socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // Confirm it's the master even though it's Eventual by now. - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - session.SetMode(mgo.Eventual, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestPrimaryShutdownStrong(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With strong consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - // Increase the timeout since this may take quite a while. - session.SetSyncTimeout(3 * time.Minute) - - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), host) - - // Insert some data to confirm it's indeed a master. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) - c.Assert(err, IsNil) -} - -func (s *S) TestPrimaryHiccup(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Establish a few extra sessions to create spare sockets to - // the master. This increases a bit the chances of getting an - // incorrect cached socket. - var sessions []*mgo.Session - for i := 0; i < 20; i++ { - sessions = append(sessions, session.Copy()) - err = sessions[len(sessions)-1].Run("serverStatus", result) - c.Assert(err, IsNil) - } - for i := range sessions { - sessions[i].Close() - } - - // Kill the master, but bring it back immediatelly. - host := result.Host - s.Stop(host) - s.StartAll() - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With strong consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - // Increase the timeout since this may take quite a while. - session.SetSyncTimeout(3 * time.Minute) - - // Insert some data to confirm it's indeed a master. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) - c.Assert(err, IsNil) -} - -func (s *S) TestPrimaryShutdownMonotonic(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - // Insert something to force a switch to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait a bit for this to be synchronized to slaves. - time.Sleep(3 * time.Second) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With monotonic consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), host) -} - -func (s *S) TestPrimaryShutdownMonotonicWithSlave(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // Create new monotonic session with an explicit address to ensure - // a slave is synchronized before the master, otherwise a connection - // with the master may be used below for lack of other options. - var addr string - switch { - case strings.HasSuffix(ssresult.Host, ":40021"): - addr = "localhost:40022" - case strings.HasSuffix(ssresult.Host, ":40022"): - addr = "localhost:40021" - case strings.HasSuffix(ssresult.Host, ":40023"): - addr = "localhost:40021" - default: - c.Fatal("Unknown host: ", ssresult.Host) - } - - session, err = mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - // Check the address of the socket associated with the monotonic session. - c.Log("Running serverStatus and isMaster with monotonic session") - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - slave := ssresult.Host - c.Assert(imresult.IsMaster, Equals, false, Commentf("%s is not a slave", slave)) - - c.Assert(master, Not(Equals), slave) - - // Kill the master. - s.Stop(master) - - // Session must still be good, since we were talking to a slave. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - - c.Assert(ssresult.Host, Equals, slave, - Commentf("Monotonic session moved from %s to %s", slave, ssresult.Host)) - - // If we try to insert something, it'll have to hold until the new - // master is available to move the connection, and work correctly. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Must now be talking to the new master. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // ... which is not the old one, since it's still dead. - c.Assert(ssresult.Host, Not(Equals), master) -} - -func (s *S) TestPrimaryShutdownEventual(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - master := result.Host - - session.SetMode(mgo.Eventual, true) - - // Should connect to the master when needed. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait a bit for this to be synchronized to slaves. - time.Sleep(3 * time.Second) - - // Kill the master. - s.Stop(master) - - // Should still work, with the new master now. - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), master) -} - -func (s *S) TestPreserveSocketCountOnSync(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - stats := mgo.GetStats() - for stats.MasterConns+stats.SlaveConns != 3 { - stats = mgo.GetStats() - c.Log("Waiting for all connections to be established...") - time.Sleep(5e8) - } - - c.Assert(stats.SocketsAlive, Equals, 3) - - // Kill the master (with rs1, 'a' is always the master). - s.Stop("localhost:40011") - - // Wait for the logic to run for a bit and bring it back. - startedAll := make(chan bool) - go func() { - time.Sleep(5e9) - s.StartAll() - startedAll <- true - }() - - // Do not allow the test to return before the goroutine above is done. - defer func() { - <-startedAll - }() - - // Do an action to kick the resync logic in, and also to - // wait until the cluster recognizes the server is back. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, true) - - for i := 0; i != 20; i++ { - stats = mgo.GetStats() - if stats.SocketsAlive == 3 { - break - } - c.Logf("Waiting for 3 sockets alive, have %d", stats.SocketsAlive) - time.Sleep(5e8) - } - - // Ensure the number of sockets is preserved after syncing. - stats = mgo.GetStats() - c.Assert(stats.SocketsAlive, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 1) -} - -// Connect to the master of a deployment with a single server, -// run an insert, and then ensure the insert worked and that a -// single connection was established. -func (s *S) TestTopologySyncWithSingleMaster(c *C) { - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - - // One connection used for discovery. Master socket recycled for - // insert. Socket is reserved after insert. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 0) - c.Assert(stats.SocketsInUse, Equals, 1) - - // Refresh session and socket must be released. - session.Refresh() - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestTopologySyncWithSlaveSeed(c *C) { - // That's supposed to be a slave. Must run discovery - // and find out master to insert successfully. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, true) - - // One connection to each during discovery. Master - // socket recycled for insert. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - - // Only one socket reference alive, in the master socket owned - // by the above session. - c.Assert(stats.SocketsInUse, Equals, 1) - - // Refresh it, and it must be gone. - session.Refresh() - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSyncTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - s.Stop("localhost:40001") - - timeout := 3 * time.Second - session.SetSyncTimeout(timeout) - started := time.Now() - - // Do something. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestDialWithTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - timeout := 2 * time.Second - started := time.Now() - - // 40009 isn't used by the test servers. - session, err := mgo.DialWithTimeout("localhost:40009", timeout) - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(session, IsNil) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestSocketTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - s.Freeze("localhost:40001") - - timeout := 3 * time.Second - session.SetSocketTimeout(timeout) - started := time.Now() - - // Do something. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, ErrorMatches, ".*: i/o timeout") - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestSocketTimeoutOnDial(c *C) { - if *fast { - c.Skip("-fast") - } - - timeout := 1 * time.Second - - defer mgo.HackSyncSocketTimeout(timeout)() - - s.Freeze("localhost:40001") - - started := time.Now() - - session, err := mgo.DialWithTimeout("localhost:40001", timeout) - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(session, IsNil) - - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-20*time.Second)), Equals, true) -} - -func (s *S) TestSocketTimeoutOnInactiveSocket(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - timeout := 2 * time.Second - session.SetSocketTimeout(timeout) - - // Do something that relies on the timeout and works. - c.Assert(session.Ping(), IsNil) - - // Freeze and wait for the timeout to go by. - s.Freeze("localhost:40001") - time.Sleep(timeout + 500*time.Millisecond) - s.Thaw("localhost:40001") - - // Do something again. The timeout above should not have killed - // the socket as there was nothing to be done. - c.Assert(session.Ping(), IsNil) -} - -func (s *S) TestDirect(c *C) { - session, err := mgo.Dial("localhost:40012?connect=direct") - c.Assert(err, IsNil) - defer session.Close() - - // We know that server is a slave. - session.SetMode(mgo.Monotonic, true) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) - - stats := mgo.GetStats() - c.Assert(stats.SocketsAlive, Equals, 1) - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 1) - - // We've got no master, so it'll timeout. - session.SetSyncTimeout(5e8 * time.Nanosecond) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"test": 1}) - c.Assert(err, ErrorMatches, "no reachable servers") - - // Writing to the local database is okay. - coll = session.DB("local").C("mycoll") - defer coll.RemoveAll(nil) - id := bson.NewObjectId() - err = coll.Insert(M{"_id": id}) - c.Assert(err, IsNil) - - // Data was stored in the right server. - n, err := coll.Find(M{"_id": id}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) - - // Server hasn't changed. - result.Host = "" - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) -} - -func (s *S) TestDirectToUnknownStateMember(c *C) { - session, err := mgo.Dial("localhost:40041?connect=direct") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) - - // We've got no master, so it'll timeout. - session.SetSyncTimeout(5e8 * time.Nanosecond) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"test": 1}) - c.Assert(err, ErrorMatches, "no reachable servers") - - // Slave is still reachable. - result.Host = "" - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) -} - -func (s *S) TestFailFast(c *C) { - info := mgo.DialInfo{ - Addrs: []string{"localhost:99999"}, - Timeout: 5 * time.Second, - FailFast: true, - } - - started := time.Now() - - _, err := mgo.DialWithInfo(&info) - c.Assert(err, ErrorMatches, "no reachable servers") - - c.Assert(started.After(time.Now().Add(-time.Second)), Equals, true) -} - -type OpCounters struct { - Insert int - Query int - Update int - Delete int - GetMore int - Command int -} - -func getOpCounters(server string) (c *OpCounters, err error) { - session, err := mgo.Dial(server + "?connect=direct") - if err != nil { - return nil, err - } - defer session.Close() - session.SetMode(mgo.Monotonic, true) - result := struct{ OpCounters }{} - err = session.Run("serverStatus", &result) - return &result.OpCounters, err -} - -func (s *S) TestMonotonicSlaveOkFlagWithMongos(c *C) { - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // Collect op counters for everyone. - opc21a, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22a, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23a, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - // Do a SlaveOk query through MongoS - - mongos, err := mgo.Dial("localhost:40202") - c.Assert(err, IsNil) - defer mongos.Close() - - mongos.SetMode(mgo.Monotonic, true) - - coll := mongos.DB("mydb").C("mycoll") - result := &struct{}{} - for i := 0; i != 5; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - // Collect op counters for everyone again. - opc21b, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22b, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23b, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - masterPort := master[strings.Index(master, ":")+1:] - - var masterDelta, slaveDelta int - switch masterPort { - case "40021": - masterDelta = opc21b.Query - opc21a.Query - slaveDelta = (opc22b.Query - opc22a.Query) + (opc23b.Query - opc23a.Query) - case "40022": - masterDelta = opc22b.Query - opc22a.Query - slaveDelta = (opc21b.Query - opc21a.Query) + (opc23b.Query - opc23a.Query) - case "40023": - masterDelta = opc23b.Query - opc23a.Query - slaveDelta = (opc21b.Query - opc21a.Query) + (opc22b.Query - opc22a.Query) - default: - c.Fatal("Uh?") - } - - c.Check(masterDelta, Equals, 0) // Just the counting itself. - c.Check(slaveDelta, Equals, 5) // The counting for both, plus 5 queries above. -} - -func (s *S) TestRemovalOfClusterMember(c *C) { - if *fast { - c.Skip("-fast") - } - - master, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer master.Close() - - // Wait for cluster to fully sync up. - for i := 0; i < 10; i++ { - if len(master.LiveServers()) == 3 { - break - } - time.Sleep(5e8) - } - if len(master.LiveServers()) != 3 { - c.Fatalf("Test started with bad cluster state: %v", master.LiveServers()) - } - - result := &struct { - IsMaster bool - Me string - }{} - slave := master.Copy() - slave.SetMode(mgo.Monotonic, true) // Monotonic can hold a non-master socket persistently. - err = slave.Run("isMaster", result) - c.Assert(err, IsNil) - c.Assert(result.IsMaster, Equals, false) - slaveAddr := result.Me - - defer func() { - master.Refresh() - master.Run(bson.D{{"$eval", `rs.add("` + slaveAddr + `")`}}, nil) - master.Close() - slave.Close() - }() - - c.Logf("========== Removing slave: %s ==========", slaveAddr) - - master.Run(bson.D{{"$eval", `rs.remove("` + slaveAddr + `")`}}, nil) - err = master.Ping() - c.Assert(err, Equals, io.EOF) - - master.Refresh() - - // Give the cluster a moment to catch up by doing a roundtrip to the master. - err = master.Ping() - c.Assert(err, IsNil) - - time.Sleep(3e9) - - // This must fail since the slave has been taken off the cluster. - err = slave.Ping() - c.Assert(err, NotNil) - - for i := 0; i < 15; i++ { - if len(master.LiveServers()) == 2 { - break - } - time.Sleep(time.Second) - } - live := master.LiveServers() - if len(live) != 2 { - c.Errorf("Removed server still considered live: %#s", live) - } - - c.Log("========== Test succeeded. ==========") -} - -func (s *S) TestSocketLimit(c *C) { - if *fast { - c.Skip("-fast") - } - const socketLimit = 64 - restore := mgo.HackSocketsPerServer(socketLimit) - defer restore() - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - stats := mgo.GetStats() - for stats.MasterConns+stats.SlaveConns != 3 { - stats = mgo.GetStats() - c.Log("Waiting for all connections to be established...") - time.Sleep(5e8) - } - c.Assert(stats.SocketsAlive, Equals, 3) - - // Consume the whole limit for the master. - var master []*mgo.Session - for i := 0; i < socketLimit; i++ { - s := session.Copy() - defer s.Close() - err := s.Ping() - c.Assert(err, IsNil) - master = append(master, s) - } - - before := time.Now() - go func() { - time.Sleep(3e9) - master[0].Refresh() - }() - - // Now a single ping must block, since it would need another - // connection to the master, over the limit. Once the goroutine - // above releases its socket, it should move on. - session.Ping() - delay := time.Now().Sub(before) - c.Assert(delay > 3e9, Equals, true) - c.Assert(delay < 6e9, Equals, true) -} - -func (s *S) TestSetModeEventualIterBug(c *C) { - session1, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session1.Close() - - session1.SetMode(mgo.Eventual, false) - - coll1 := session1.DB("mydb").C("mycoll") - - const N = 100 - for i := 0; i < N; i++ { - err = coll1.Insert(M{"_id": i}) - c.Assert(err, IsNil) - } - - c.Logf("Waiting until secondary syncs") - for { - n, err := coll1.Count() - c.Assert(err, IsNil) - if n == N { - c.Logf("Found all") - break - } - } - - session2, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session2.Close() - - session2.SetMode(mgo.Eventual, false) - - coll2 := session2.DB("mydb").C("mycoll") - - i := 0 - iter := coll2.Find(nil).Batch(10).Iter() - var result struct{} - for iter.Next(&result) { - i++ - } - c.Assert(iter.Close(), Equals, nil) - c.Assert(i, Equals, N) -} - -func (s *S) TestCustomDialOld(c *C) { - dials := make(chan bool, 16) - dial := func(addr net.Addr) (net.Conn, error) { - tcpaddr, ok := addr.(*net.TCPAddr) - if !ok { - return nil, fmt.Errorf("unexpected address type: %T", addr) - } - dials <- true - return net.DialTCP("tcp", nil, tcpaddr) - } - info := mgo.DialInfo{ - Addrs: []string{"localhost:40012"}, - Dial: dial, - } - - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - defer session.Close() - - const N = 3 - for i := 0; i < N; i++ { - select { - case <-dials: - case <-time.After(5 * time.Second): - c.Fatalf("expected %d dials, got %d", N, i) - } - } - select { - case <-dials: - c.Fatalf("got more dials than expected") - case <-time.After(100 * time.Millisecond): - } -} - -func (s *S) TestCustomDialNew(c *C) { - dials := make(chan bool, 16) - dial := func(addr *mgo.ServerAddr) (net.Conn, error) { - dials <- true - if addr.TCPAddr().Port == 40012 { - c.Check(addr.String(), Equals, "localhost:40012") - } - return net.DialTCP("tcp", nil, addr.TCPAddr()) - } - info := mgo.DialInfo{ - Addrs: []string{"localhost:40012"}, - DialServer: dial, - } - - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - defer session.Close() - - const N = 3 - for i := 0; i < N; i++ { - select { - case <-dials: - case <-time.After(5 * time.Second): - c.Fatalf("expected %d dials, got %d", N, i) - } - } - select { - case <-dials: - c.Fatalf("got more dials than expected") - case <-time.After(100 * time.Millisecond): - } -} - -func (s *S) TestPrimaryShutdownOnAuthShard(c *C) { - if *fast { - c.Skip("-fast") - } - - // Dial the shard. - session, err := mgo.Dial("localhost:40203") - c.Assert(err, IsNil) - defer session.Close() - - // Login and insert something to make it more realistic. - session.DB("admin").Login("root", "rapadura") - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(bson.M{"n": 1}) - c.Assert(err, IsNil) - - // Dial the replica set to figure the master out. - rs, err := mgo.Dial("root:rapadura@localhost:40031") - c.Assert(err, IsNil) - defer rs.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = rs.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = rs.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // This won't work because the master just died. - err = coll.Insert(bson.M{"n": 2}) - c.Assert(err, NotNil) - - // Refresh session and wait for re-election. - session.Refresh() - for i := 0; i < 60; i++ { - err = coll.Insert(bson.M{"n": 3}) - if err == nil { - break - } - c.Logf("Waiting for replica set to elect a new master. Last error: %v", err) - time.Sleep(500 * time.Millisecond) - } - c.Assert(err, IsNil) - - count, err := coll.Count() - c.Assert(count > 1, Equals, true) -} - -func (s *S) TestNearestSecondary(c *C) { - defer mgo.HackPingDelay(3 * time.Second)() - - rs1a := "127.0.0.1:40011" - rs1b := "127.0.0.1:40012" - rs1c := "127.0.0.1:40013" - s.Freeze(rs1b) - - session, err := mgo.Dial(rs1a) - c.Assert(err, IsNil) - defer session.Close() - - // Wait for the sync up to run through the first couple of servers. - for len(session.LiveServers()) != 2 { - c.Log("Waiting for two servers to be alive...") - time.Sleep(100 * time.Millisecond) - } - - // Extra delay to ensure the third server gets penalized. - time.Sleep(500 * time.Millisecond) - - // Release third server. - s.Thaw(rs1b) - - // Wait for it to come up. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for all servers to be alive...") - time.Sleep(100 * time.Millisecond) - } - - session.SetMode(mgo.Monotonic, true) - var result struct{ Host string } - - // See which slave picks the line, several times to avoid chance. - for i := 0; i < 10; i++ { - session.Refresh() - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, hostPort(rs1c)) - } - - if *fast { - // Don't hold back for several seconds. - return - } - - // Now hold the other server for long enough to penalize it. - s.Freeze(rs1c) - time.Sleep(5 * time.Second) - s.Thaw(rs1c) - - // Wait for the ping to be processed. - time.Sleep(500 * time.Millisecond) - - // Repeating the test should now pick the former server consistently. - for i := 0; i < 10; i++ { - session.Refresh() - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, hostPort(rs1b)) - } -} - -func (s *S) TestConnectCloseConcurrency(c *C) { - restore := mgo.HackPingDelay(500 * time.Millisecond) - defer restore() - var wg sync.WaitGroup - const n = 500 - wg.Add(n) - for i := 0; i < n; i++ { - go func() { - defer wg.Done() - session, err := mgo.Dial("localhost:40001") - if err != nil { - c.Fatal(err) - } - time.Sleep(1) - session.Close() - }() - } - wg.Wait() -} - -func (s *S) TestSelectServers(c *C) { - if !s.versionAtLeast(2, 2) { - c.Skip("read preferences introduced in 2.2") - } - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Eventual, true) - - var result struct{ Host string } - - session.Refresh() - session.SelectServers(bson.D{{"rs1", "b"}}) - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, "40012") - - session.Refresh() - session.SelectServers(bson.D{{"rs1", "c"}}) - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, "40013") -} - -func (s *S) TestSelectServersWithMongos(c *C) { - if !s.versionAtLeast(2, 2) { - c.Skip("read preferences introduced in 2.2") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - var slave1, slave2 string - switch hostPort(master) { - case "40021": - slave1, slave2 = "b", "c" - case "40022": - slave1, slave2 = "a", "c" - case "40023": - slave1, slave2 = "a", "b" - } - - // Collect op counters for everyone. - opc21a, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22a, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23a, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - // Do a SlaveOk query through MongoS - mongos, err := mgo.Dial("localhost:40202") - c.Assert(err, IsNil) - defer mongos.Close() - - mongos.SetMode(mgo.Monotonic, true) - - mongos.Refresh() - mongos.SelectServers(bson.D{{"rs2", slave1}}) - coll := mongos.DB("mydb").C("mycoll") - result := &struct{}{} - for i := 0; i != 5; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - mongos.Refresh() - mongos.SelectServers(bson.D{{"rs2", slave2}}) - coll = mongos.DB("mydb").C("mycoll") - for i := 0; i != 7; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - // Collect op counters for everyone again. - opc21b, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22b, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23b, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - switch hostPort(master) { - case "40021": - c.Check(opc21b.Query-opc21a.Query, Equals, 0) - c.Check(opc22b.Query-opc22a.Query, Equals, 5) - c.Check(opc23b.Query-opc23a.Query, Equals, 7) - case "40022": - c.Check(opc21b.Query-opc21a.Query, Equals, 5) - c.Check(opc22b.Query-opc22a.Query, Equals, 0) - c.Check(opc23b.Query-opc23a.Query, Equals, 7) - case "40023": - c.Check(opc21b.Query-opc21a.Query, Equals, 5) - c.Check(opc22b.Query-opc22a.Query, Equals, 7) - c.Check(opc23b.Query-opc23a.Query, Equals, 0) - default: - c.Fatal("Uh?") - } -} diff --git a/vendor/labix.org/v2/mgo/doc.go b/vendor/labix.org/v2/mgo/doc.go deleted file mode 100644 index 9316c55..0000000 --- a/vendor/labix.org/v2/mgo/doc.go +++ /dev/null @@ -1,31 +0,0 @@ -// Package mgo offers a rich MongoDB driver for Go. -// -// Details about the mgo project (pronounced as "mango") are found -// in its web page: -// -// http://labix.org/mgo -// -// Usage of the driver revolves around the concept of sessions. To -// get started, obtain a session using the Dial function: -// -// session, err := mgo.Dial(url) -// -// This will establish one or more connections with the cluster of -// servers defined by the url parameter. From then on, the cluster -// may be queried with multiple consistency rules (see SetMode) and -// documents retrieved with statements such as: -// -// c := session.DB(database).C(collection) -// err := c.Find(query).One(&result) -// -// New sessions are typically created by calling session.Copy on the -// initial session obtained at dial time. These new sessions will share -// the same cluster information and connection cache, and may be easily -// handed into other methods and functions for organizing logic. -// Every session created must have its Close method called at the end -// of its life time, so its resources may be put back in the pool or -// collected, depending on the case. -// -// For more details, see the documentation for the types and methods. -// -package mgo diff --git a/vendor/labix.org/v2/mgo/export_test.go b/vendor/labix.org/v2/mgo/export_test.go deleted file mode 100644 index b6bfcbc..0000000 --- a/vendor/labix.org/v2/mgo/export_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package mgo - -import ( - "time" -) - -func HackSocketsPerServer(newLimit int) (restore func()) { - oldLimit := newLimit - restore = func() { - socketsPerServer = oldLimit - } - socketsPerServer = newLimit - return -} - -func HackPingDelay(newDelay time.Duration) (restore func()) { - globalMutex.Lock() - defer globalMutex.Unlock() - - oldDelay := pingDelay - restore = func() { - globalMutex.Lock() - pingDelay = oldDelay - globalMutex.Unlock() - } - pingDelay = newDelay - return -} - -func HackSyncSocketTimeout(newTimeout time.Duration) (restore func()) { - globalMutex.Lock() - defer globalMutex.Unlock() - - oldTimeout := syncSocketTimeout - restore = func() { - globalMutex.Lock() - syncSocketTimeout = oldTimeout - globalMutex.Unlock() - } - syncSocketTimeout = newTimeout - return -} diff --git a/vendor/labix.org/v2/mgo/gridfs.go b/vendor/labix.org/v2/mgo/gridfs.go deleted file mode 100644 index 312f8fb..0000000 --- a/vendor/labix.org/v2/mgo/gridfs.go +++ /dev/null @@ -1,732 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "crypto/md5" - "encoding/hex" - "errors" - "hash" - "io" - "labix.org/v2/mgo/bson" - "os" - "sync" - "time" -) - -type GridFS struct { - Files *Collection - Chunks *Collection -} - -type gfsFileMode int - -const ( - gfsClosed gfsFileMode = 0 - gfsReading gfsFileMode = 1 - gfsWriting gfsFileMode = 2 -) - -type GridFile struct { - m sync.Mutex - c sync.Cond - gfs *GridFS - mode gfsFileMode - err error - - chunk int - offset int64 - - wpending int - wbuf []byte - wsum hash.Hash - - rbuf []byte - rcache *gfsCachedChunk - - doc gfsFile -} - -type gfsFile struct { - Id interface{} "_id" - ChunkSize int "chunkSize" - UploadDate time.Time "uploadDate" - Length int64 ",minsize" - MD5 string - Filename string ",omitempty" - ContentType string "contentType,omitempty" - Metadata *bson.Raw ",omitempty" -} - -type gfsChunk struct { - Id interface{} "_id" - FilesId interface{} "files_id" - N int - Data []byte -} - -type gfsCachedChunk struct { - wait sync.Mutex - n int - data []byte - err error -} - -func newGridFS(db *Database, prefix string) *GridFS { - return &GridFS{db.C(prefix + ".files"), db.C(prefix + ".chunks")} -} - -func (gfs *GridFS) newFile() *GridFile { - file := &GridFile{gfs: gfs} - file.c.L = &file.m - //runtime.SetFinalizer(file, finalizeFile) - return file -} - -func finalizeFile(file *GridFile) { - file.Close() -} - -// Create creates a new file with the provided name in the GridFS. If the file -// name already exists, a new version will be inserted with an up-to-date -// uploadDate that will cause it to be atomically visible to the Open and -// OpenId methods. If the file name is not important, an empty name may be -// provided and the file Id used instead. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// A simple example inserting a new file: -// -// func check(err error) { -// if err != nil { -// panic(err.String()) -// } -// } -// file, err := db.GridFS("fs").Create("myfile.txt") -// check(err) -// n, err := file.Write([]byte("Hello world!") -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes written\n", n) -// -// The io.Writer interface is implemented by *GridFile and may be used to -// help on the file creation. For example: -// -// file, err := db.GridFS("fs").Create("myfile.txt") -// check(err) -// messages, err := os.Open("/var/log/messages") -// check(err) -// defer messages.Close() -// err = io.Copy(file, messages) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) Create(name string) (file *GridFile, err error) { - file = gfs.newFile() - file.mode = gfsWriting - file.wsum = md5.New() - file.doc = gfsFile{Id: bson.NewObjectId(), ChunkSize: 256 * 1024, Filename: name} - return -} - -// OpenId returns the file with the provided id, for reading. -// If the file isn't found, err will be set to mgo.ErrNotFound. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// The following example will print the first 8192 bytes from the file: -// -// func check(err error) { -// if err != nil { -// panic(err.String()) -// } -// } -// file, err := db.GridFS("fs").OpenId(objid) -// check(err) -// b := make([]byte, 8192) -// n, err := file.Read(b) -// check(err) -// fmt.Println(string(b)) -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes read\n", n) -// -// The io.Reader interface is implemented by *GridFile and may be used to -// deal with it. As an example, the following snippet will dump the whole -// file into the standard output: -// -// file, err := db.GridFS("fs").OpenId(objid) -// check(err) -// err = io.Copy(os.Stdout, file) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) OpenId(id interface{}) (file *GridFile, err error) { - var doc gfsFile - err = gfs.Files.Find(bson.M{"_id": id}).One(&doc) - if err != nil { - return - } - file = gfs.newFile() - file.mode = gfsReading - file.doc = doc - return -} - -// Open returns the most recently uploaded file with the provided -// name, for reading. If the file isn't found, err will be set -// to mgo.ErrNotFound. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// The following example will print the first 8192 bytes from the file: -// -// file, err := db.GridFS("fs").Open("myfile.txt") -// check(err) -// b := make([]byte, 8192) -// n, err := file.Read(b) -// check(err) -// fmt.Println(string(b)) -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes read\n", n) -// -// The io.Reader interface is implemented by *GridFile and may be used to -// deal with it. As an example, the following snippet will dump the whole -// file into the standard output: -// -// file, err := db.GridFS("fs").Open("myfile.txt") -// check(err) -// err = io.Copy(os.Stdout, file) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) Open(name string) (file *GridFile, err error) { - var doc gfsFile - err = gfs.Files.Find(bson.M{"filename": name}).Sort("-uploadDate").One(&doc) - if err != nil { - return - } - file = gfs.newFile() - file.mode = gfsReading - file.doc = doc - return -} - -// OpenNext opens the next file from iter for reading, sets *file to it, -// and returns true on the success case. If no more documents are available -// on iter or an error occurred, *file is set to nil and the result is false. -// Errors will be available via iter.Err(). -// -// The iter parameter must be an iterator on the GridFS files collection. -// Using the GridFS.Find method is an easy way to obtain such an iterator, -// but any iterator on the collection will work. -// -// If the provided *file is non-nil, OpenNext will close it before attempting -// to iterate to the next element. This means that in a loop one only -// has to worry about closing files when breaking out of the loop early -// (break, return, or panic). -// -// For example: -// -// gfs := db.GridFS("fs") -// query := gfs.Find(nil).Sort("filename") -// iter := query.Iter() -// var f *mgo.GridFile -// for gfs.OpenNext(iter, &f) { -// fmt.Printf("Filename: %s\n", f.Name()) -// } -// if iter.Close() != nil { -// panic(iter.Close()) -// } -// -func (gfs *GridFS) OpenNext(iter *Iter, file **GridFile) bool { - if *file != nil { - // Ignoring the error here shouldn't be a big deal - // as we're reading the file and the loop iteration - // for this file is finished. - _ = (*file).Close() - } - var doc gfsFile - if !iter.Next(&doc) { - *file = nil - return false - } - f := gfs.newFile() - f.mode = gfsReading - f.doc = doc - *file = f - return true -} - -// Find runs query on GridFS's files collection and returns -// the resulting Query. -// -// This logic: -// -// gfs := db.GridFS("fs") -// iter := gfs.Find(nil).Iter() -// -// Is equivalent to: -// -// files := db.C("fs" + ".files") -// iter := files.Find(nil).Iter() -// -func (gfs *GridFS) Find(query interface{}) *Query { - return gfs.Files.Find(query) -} - -// RemoveId deletes the file with the provided id from the GridFS. -func (gfs *GridFS) RemoveId(id interface{}) error { - err := gfs.Files.Remove(bson.M{"_id": id}) - if err != nil { - return err - } - _, err = gfs.Chunks.RemoveAll(bson.D{{"files_id", id}}) - return err -} - -type gfsDocId struct { - Id interface{} "_id" -} - -// Remove deletes all files with the provided name from the GridFS. -func (gfs *GridFS) Remove(name string) (err error) { - iter := gfs.Files.Find(bson.M{"filename": name}).Select(bson.M{"_id": 1}).Iter() - var doc gfsDocId - for iter.Next(&doc) { - if e := gfs.RemoveId(doc.Id); e != nil { - err = e - } - } - if err == nil { - err = iter.Close() - } - return err -} - -func (file *GridFile) assertMode(mode gfsFileMode) { - switch file.mode { - case mode: - return - case gfsWriting: - panic("GridFile is open for writing") - case gfsReading: - panic("GridFile is open for reading") - case gfsClosed: - panic("GridFile is closed") - default: - panic("internal error: missing GridFile mode") - } -} - -// SetChunkSize sets size of saved chunks. Once the file is written to, it -// will be split in blocks of that size and each block saved into an -// independent chunk document. The default chunk size is 256kb. -// -// It is a runtime error to call this function once the file has started -// being written to. -func (file *GridFile) SetChunkSize(bytes int) { - file.assertMode(gfsWriting) - debugf("GridFile %p: setting chunk size to %d", file, bytes) - file.m.Lock() - file.doc.ChunkSize = bytes - file.m.Unlock() -} - -// Id returns the current file Id. -func (file *GridFile) Id() interface{} { - return file.doc.Id -} - -// SetId changes the current file Id. -// -// It is a runtime error to call this function once the file has started -// being written to, or when the file is not open for writing. -func (file *GridFile) SetId(id interface{}) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.Id = id - file.m.Unlock() -} - -// Name returns the optional file name. An empty string will be returned -// in case it is unset. -func (file *GridFile) Name() string { - return file.doc.Filename -} - -// SetName changes the optional file name. An empty string may be used to -// unset it. -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetName(name string) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.Filename = name - file.m.Unlock() -} - -// ContentType returns the optional file content type. An empty string will be -// returned in case it is unset. -func (file *GridFile) ContentType() string { - return file.doc.ContentType -} - -// ContentType changes the optional file content type. An empty string may be -// used to unset it. -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetContentType(ctype string) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.ContentType = ctype - file.m.Unlock() -} - -// GetMeta unmarshals the optional "metadata" field associated with the -// file into the result parameter. The meaning of keys under that field -// is user-defined. For example: -// -// result := struct{ INode int }{} -// err = file.GetMeta(&result) -// if err != nil { -// panic(err.String()) -// } -// fmt.Printf("inode: %d\n", result.INode) -// -func (file *GridFile) GetMeta(result interface{}) (err error) { - file.m.Lock() - if file.doc.Metadata != nil { - err = bson.Unmarshal(file.doc.Metadata.Data, result) - } - file.m.Unlock() - return -} - -// SetMeta changes the optional "metadata" field associated with the -// file. The meaning of keys under that field is user-defined. -// For example: -// -// file.SetMeta(bson.M{"inode": inode}) -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetMeta(metadata interface{}) { - file.assertMode(gfsWriting) - data, err := bson.Marshal(metadata) - file.m.Lock() - if err != nil && file.err == nil { - file.err = err - } else { - file.doc.Metadata = &bson.Raw{Data: data} - } - file.m.Unlock() -} - -// Size returns the file size in bytes. -func (file *GridFile) Size() (bytes int64) { - file.m.Lock() - bytes = file.doc.Length - file.m.Unlock() - return -} - -// MD5 returns the file MD5 as a hex-encoded string. -func (file *GridFile) MD5() (md5 string) { - return file.doc.MD5 -} - -// UploadDate returns the file upload time. -func (file *GridFile) UploadDate() time.Time { - return file.doc.UploadDate -} - -// Close flushes any pending changes in case the file is being written -// to, waits for any background operations to finish, and closes the file. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -func (file *GridFile) Close() (err error) { - file.m.Lock() - defer file.m.Unlock() - if file.mode == gfsWriting { - if len(file.wbuf) > 0 && file.err == nil { - file.insertChunk(file.wbuf) - file.wbuf = file.wbuf[0:0] - } - file.completeWrite() - } else if file.mode == gfsReading && file.rcache != nil { - file.rcache.wait.Lock() - file.rcache = nil - } - file.mode = gfsClosed - debugf("GridFile %p: closed", file) - return file.err -} - -func (file *GridFile) completeWrite() { - for file.wpending > 0 { - debugf("GridFile %p: waiting for %d pending chunks to complete file write", file, file.wpending) - file.c.Wait() - } - if file.err != nil { - file.gfs.Chunks.RemoveAll(bson.D{{"files_id", file.doc.Id}}) - return - } - hexsum := hex.EncodeToString(file.wsum.Sum(nil)) - file.doc.UploadDate = bson.Now() - file.doc.MD5 = hexsum - file.err = file.gfs.Files.Insert(file.doc) - file.gfs.Chunks.EnsureIndexKey("files_id", "n") -} - -// Abort cancels an in-progress write, preventing the file from being -// automically created and ensuring previously written chunks are -// removed when the file is closed. -// -// It is a runtime error to call Abort when the file was not opened -// for writing. -func (file *GridFile) Abort() { - if file.mode != gfsWriting { - panic("file.Abort must be called on file opened for writing") - } - file.err = errors.New("write aborted") -} - -// Write writes the provided data to the file and returns the -// number of bytes written and an error in case something -// wrong happened. -// -// The file will internally cache the data so that all but the last -// chunk sent to the database have the size defined by SetChunkSize. -// This also means that errors may be deferred until a future call -// to Write or Close. -// -// The parameters and behavior of this function turn the file -// into an io.Writer. -func (file *GridFile) Write(data []byte) (n int, err error) { - file.assertMode(gfsWriting) - file.m.Lock() - debugf("GridFile %p: writing %d bytes", file, len(data)) - defer file.m.Unlock() - - if file.err != nil { - return 0, file.err - } - - n = len(data) - file.doc.Length += int64(n) - chunkSize := file.doc.ChunkSize - - if len(file.wbuf)+len(data) < chunkSize { - file.wbuf = append(file.wbuf, data...) - return - } - - // First, flush file.wbuf complementing with data. - if len(file.wbuf) > 0 { - missing := chunkSize - len(file.wbuf) - if missing > len(data) { - missing = len(data) - } - file.wbuf = append(file.wbuf, data[:missing]...) - data = data[missing:] - file.insertChunk(file.wbuf) - file.wbuf = file.wbuf[0:0] - } - - // Then, flush all chunks from data without copying. - for len(data) > chunkSize { - size := chunkSize - if size > len(data) { - size = len(data) - } - file.insertChunk(data[:size]) - data = data[size:] - } - - // And append the rest for a future call. - file.wbuf = append(file.wbuf, data...) - - return n, file.err -} - -func (file *GridFile) insertChunk(data []byte) { - n := file.chunk - file.chunk++ - debugf("GridFile %p: adding to checksum: %q", file, string(data)) - file.wsum.Write(data) - - for file.doc.ChunkSize*file.wpending >= 1024*1024 { - // Hold on.. we got a MB pending. - file.c.Wait() - if file.err != nil { - return - } - } - - file.wpending++ - - debugf("GridFile %p: inserting chunk %d with %d bytes", file, n, len(data)) - - // We may not own the memory of data, so rather than - // simply copying it, we'll marshal the document ahead of time. - data, err := bson.Marshal(gfsChunk{bson.NewObjectId(), file.doc.Id, n, data}) - if err != nil { - file.err = err - return - } - - go func() { - err := file.gfs.Chunks.Insert(bson.Raw{Data: data}) - file.m.Lock() - file.wpending-- - if err != nil && file.err == nil { - file.err = err - } - file.c.Broadcast() - file.m.Unlock() - }() -} - -// Seek sets the offset for the next Read or Write on file to -// offset, interpreted according to whence: 0 means relative to -// the origin of the file, 1 means relative to the current offset, -// and 2 means relative to the end. It returns the new offset and -// an error, if any. -func (file *GridFile) Seek(offset int64, whence int) (pos int64, err error) { - file.m.Lock() - debugf("GridFile %p: seeking for %s (whence=%d)", file, offset, whence) - defer file.m.Unlock() - switch whence { - case os.SEEK_SET: - case os.SEEK_CUR: - offset += file.offset - case os.SEEK_END: - offset += file.doc.Length - default: - panic("unsupported whence value") - } - if offset > file.doc.Length { - return file.offset, errors.New("seek past end of file") - } - chunk := int(offset / int64(file.doc.ChunkSize)) - if chunk+1 == file.chunk && offset >= file.offset { - file.rbuf = file.rbuf[int(offset-file.offset):] - file.offset = offset - return file.offset, nil - } - file.offset = offset - file.chunk = chunk - file.rbuf = nil - file.rbuf, err = file.getChunk() - if err == nil { - file.rbuf = file.rbuf[int(file.offset-int64(chunk)*int64(file.doc.ChunkSize)):] - } - return file.offset, err -} - -// Read reads into b the next available data from the file and -// returns the number of bytes written and an error in case -// something wrong happened. At the end of the file, n will -// be zero and err will be set to os.EOF. -// -// The parameters and behavior of this function turn the file -// into an io.Reader. -func (file *GridFile) Read(b []byte) (n int, err error) { - file.assertMode(gfsReading) - file.m.Lock() - debugf("GridFile %p: reading at offset %d into buffer of length %d", file, file.offset, len(b)) - defer file.m.Unlock() - if file.offset == file.doc.Length { - return 0, io.EOF - } - for err == nil { - i := copy(b, file.rbuf) - n += i - file.offset += int64(i) - file.rbuf = file.rbuf[i:] - if i == len(b) || file.offset == file.doc.Length { - break - } - b = b[i:] - file.rbuf, err = file.getChunk() - } - return n, err -} - -func (file *GridFile) getChunk() (data []byte, err error) { - cache := file.rcache - file.rcache = nil - if cache != nil && cache.n == file.chunk { - debugf("GridFile %p: Getting chunk %d from cache", file, file.chunk) - cache.wait.Lock() - data, err = cache.data, cache.err - } else { - debugf("GridFile %p: Fetching chunk %d", file, file.chunk) - var doc gfsChunk - err = file.gfs.Chunks.Find(bson.D{{"files_id", file.doc.Id}, {"n", file.chunk}}).One(&doc) - data = doc.Data - } - file.chunk++ - if int64(file.chunk)*int64(file.doc.ChunkSize) < file.doc.Length { - // Read the next one in background. - cache = &gfsCachedChunk{n: file.chunk} - cache.wait.Lock() - debugf("GridFile %p: Scheduling chunk %d for background caching", file, file.chunk) - // Clone the session to avoid having it closed in between. - chunks := file.gfs.Chunks - session := chunks.Database.Session.Clone() - go func(id interface{}, n int) { - defer session.Close() - chunks = chunks.With(session) - var doc gfsChunk - cache.err = chunks.Find(bson.D{{"files_id", id}, {"n", n}}).One(&doc) - cache.data = doc.Data - cache.wait.Unlock() - }(file.doc.Id, file.chunk) - file.rcache = cache - } - debugf("Returning err: %#v", err) - return -} diff --git a/vendor/labix.org/v2/mgo/gridfs_test.go b/vendor/labix.org/v2/mgo/gridfs_test.go deleted file mode 100644 index fbdd5b0..0000000 --- a/vendor/labix.org/v2/mgo/gridfs_test.go +++ /dev/null @@ -1,644 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "io" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" - "os" - "time" -) - -func (s *S) TestGridFSCreate(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - before := bson.Now() - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - - n, err := file.Write([]byte("some data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 9) - - err = file.Close() - c.Assert(err, IsNil) - - after := bson.Now() - - // Check the file information. - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - fileId, ok := result["_id"].(bson.ObjectId) - c.Assert(ok, Equals, true) - c.Assert(fileId.Valid(), Equals, true) - result["_id"] = "" - - ud, ok := result["uploadDate"].(time.Time) - c.Assert(ok, Equals, true) - c.Assert(ud.After(before) && ud.Before(after), Equals, true) - result["uploadDate"] = "" - - expected := M{ - "_id": "", - "length": 9, - "chunkSize": 262144, - "uploadDate": "", - "md5": "1e50210a0202497fb79bc38b6ade6c34", - } - c.Assert(result, DeepEquals, expected) - - // Check the chunk. - result = M{} - err = db.C("fs.chunks").Find(nil).One(result) - c.Assert(err, IsNil) - - chunkId, ok := result["_id"].(bson.ObjectId) - c.Assert(ok, Equals, true) - c.Assert(chunkId.Valid(), Equals, true) - result["_id"] = "" - - expected = M{ - "_id": "", - "files_id": fileId, - "n": 0, - "data": []byte("some data"), - } - c.Assert(result, DeepEquals, expected) - - // Check that an index was created. - indexes, err := db.C("fs.chunks").Indexes() - c.Assert(err, IsNil) - c.Assert(len(indexes), Equals, 2) - c.Assert(indexes[1].Key, DeepEquals, []string{"files_id", "n"}) -} - -func (s *S) TestGridFSFileDetails(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile1.txt") - c.Assert(err, IsNil) - - n, err := file.Write([]byte("some")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - - c.Assert(file.Size(), Equals, int64(4)) - - n, err = file.Write([]byte(" data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 5) - - c.Assert(file.Size(), Equals, int64(9)) - - id, _ := file.Id().(bson.ObjectId) - c.Assert(id.Valid(), Equals, true) - c.Assert(file.Name(), Equals, "myfile1.txt") - c.Assert(file.ContentType(), Equals, "") - - var info interface{} - err = file.GetMeta(&info) - c.Assert(err, IsNil) - c.Assert(info, IsNil) - - file.SetId("myid") - file.SetName("myfile2.txt") - file.SetContentType("text/plain") - file.SetMeta(M{"any": "thing"}) - - c.Assert(file.Id(), Equals, "myid") - c.Assert(file.Name(), Equals, "myfile2.txt") - c.Assert(file.ContentType(), Equals, "text/plain") - - err = file.GetMeta(&info) - c.Assert(err, IsNil) - c.Assert(info, DeepEquals, bson.M{"any": "thing"}) - - err = file.Close() - c.Assert(err, IsNil) - - c.Assert(file.MD5(), Equals, "1e50210a0202497fb79bc38b6ade6c34") - - ud := file.UploadDate() - now := time.Now() - c.Assert(ud.Before(now), Equals, true) - c.Assert(ud.After(now.Add(-3*time.Second)), Equals, true) - - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - result["uploadDate"] = "" - - expected := M{ - "_id": "myid", - "length": 9, - "chunkSize": 262144, - "uploadDate": "", - "md5": "1e50210a0202497fb79bc38b6ade6c34", - "filename": "myfile2.txt", - "contentType": "text/plain", - "metadata": M{"any": "thing"}, - } - c.Assert(result, DeepEquals, expected) -} - -func (s *S) TestGridFSCreateWithChunking(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("") - c.Assert(err, IsNil) - - file.SetChunkSize(5) - - // Smaller than the chunk size. - n, err := file.Write([]byte("abc")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - // Boundary in the middle. - n, err = file.Write([]byte("defg")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - - // Boundary at the end. - n, err = file.Write([]byte("hij")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - // Larger than the chunk size, with 3 chunks. - n, err = file.Write([]byte("klmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 12) - - err = file.Close() - c.Assert(err, IsNil) - - // Check the file information. - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - fileId, _ := result["_id"].(bson.ObjectId) - c.Assert(fileId.Valid(), Equals, true) - result["_id"] = "" - result["uploadDate"] = "" - - expected := M{ - "_id": "", - "length": 22, - "chunkSize": 5, - "uploadDate": "", - "md5": "44a66044834cbe55040089cabfc102d5", - } - c.Assert(result, DeepEquals, expected) - - // Check the chunks. - iter := db.C("fs.chunks").Find(nil).Sort("n").Iter() - dataChunks := []string{"abcde", "fghij", "klmno", "pqrst", "uv"} - for i := 0; ; i++ { - result = M{} - if !iter.Next(result) { - if i != 5 { - c.Fatalf("Expected 5 chunks, got %d", i) - } - break - } - c.Assert(iter.Close(), IsNil) - - result["_id"] = "" - - expected = M{ - "_id": "", - "files_id": fileId, - "n": i, - "data": []byte(dataChunks[i]), - } - c.Assert(result, DeepEquals, expected) - } -} - -func (s *S) TestGridFSAbort(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - - file.SetChunkSize(5) - - n, err := file.Write([]byte("some data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 9) - - var count int - for i := 0; i < 10; i++ { - count, err = db.C("fs.chunks").Count() - if count > 0 || err != nil { - break - } - } - c.Assert(err, IsNil) - c.Assert(count, Equals, 1) - - file.Abort() - - err = file.Close() - c.Assert(err, ErrorMatches, "write aborted") - - count, err = db.C("fs.chunks").Count() - c.Assert(err, IsNil) - c.Assert(count, Equals, 0) -} - -func (s *S) TestGridFSOpenNotFound(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.OpenId("non-existent") - c.Assert(err == mgo.ErrNotFound, Equals, true) - c.Assert(file, IsNil) - - file, err = gfs.Open("non-existent") - c.Assert(err == mgo.ErrNotFound, Equals, true) - c.Assert(file, IsNil) -} - -func (s *S) TestGridFSReadAll(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - b := make([]byte, 30) - n, err = file.Read(b) - c.Assert(n, Equals, 22) - c.Assert(err, IsNil) - - n, err = file.Read(b) - c.Assert(n, Equals, 0) - c.Assert(err == io.EOF, Equals, true) - - err = file.Close() - c.Assert(err, IsNil) -} - -func (s *S) TestGridFSReadChunking(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("") - c.Assert(err, IsNil) - - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - b := make([]byte, 30) - - // Smaller than the chunk size. - n, err = file.Read(b[:3]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - c.Assert(b[:3], DeepEquals, []byte("abc")) - - // Boundary in the middle. - n, err = file.Read(b[:4]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - c.Assert(b[:4], DeepEquals, []byte("defg")) - - // Boundary at the end. - n, err = file.Read(b[:3]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - c.Assert(b[:3], DeepEquals, []byte("hij")) - - // Larger than the chunk size, with 3 chunks. - n, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(n, Equals, 12) - c.Assert(b[:12], DeepEquals, []byte("klmnopqrstuv")) - - n, err = file.Read(b) - c.Assert(n, Equals, 0) - c.Assert(err == io.EOF, Equals, true) - - err = file.Close() - c.Assert(err, IsNil) -} - -func (s *S) TestGridFSOpen(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - file, err = gfs.Open("myfile.txt") - c.Assert(err, IsNil) - defer file.Close() - - var b [1]byte - - _, err = file.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "2") -} - -func (s *S) TestGridFSSeek(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - b := make([]byte, 5) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - o, err := file.Seek(3, os.SEEK_SET) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(3)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("defgh")) - - o, err = file.Seek(5, os.SEEK_CUR) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(13)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("nopqr")) - - o, err = file.Seek(-10, os.SEEK_END) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(12)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("mnopq")) - - o, err = file.Seek(8, os.SEEK_SET) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(8)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("ijklm")) - - // Trivial seek forward within same chunk. Already - // got the data, shouldn't touch the database. - sent := mgo.GetStats().SentOps - o, err = file.Seek(1, os.SEEK_CUR) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(14)) - c.Assert(mgo.GetStats().SentOps, Equals, sent) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("opqrs")) - - // Try seeking past end of file. - file.Seek(3, os.SEEK_SET) - o, err = file.Seek(23, os.SEEK_SET) - c.Assert(err, ErrorMatches, "seek past end of file") - c.Assert(o, Equals, int64(3)) -} - -func (s *S) TestGridFSRemoveId(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - id := file.Id() - file.Close() - - err = gfs.RemoveId(id) - c.Assert(err, IsNil) - - file, err = gfs.Open("myfile.txt") - c.Assert(err, IsNil) - defer file.Close() - - var b [1]byte - - _, err = file.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "1") - - n, err := db.C("fs.chunks").Find(M{"files_id": id}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 0) -} - -func (s *S) TestGridFSRemove(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - err = gfs.Remove("myfile.txt") - c.Assert(err, IsNil) - - _, err = gfs.Open("myfile.txt") - c.Assert(err == mgo.ErrNotFound, Equals, true) - - n, err := db.C("fs.chunks").Find(nil).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 0) -} - -func (s *S) TestGridFSOpenNext(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile1.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile2.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - var f *mgo.GridFile - var b [1]byte - - iter := gfs.Find(nil).Sort("-filename").Iter() - - ok := gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile2.txt") - - _, err = f.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "2") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile1.txt") - - _, err = f.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "1") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(f, IsNil) - - // Do it again with a more restrictive query to make sure - // it's actually taken into account. - iter = gfs.Find(bson.M{"filename": "myfile1.txt"}).Iter() - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile1.txt") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(f, IsNil) -} diff --git a/vendor/labix.org/v2/mgo/log.go b/vendor/labix.org/v2/mgo/log.go deleted file mode 100644 index 9abbe21..0000000 --- a/vendor/labix.org/v2/mgo/log.go +++ /dev/null @@ -1,133 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "fmt" - "sync" -) - -// --------------------------------------------------------------------------- -// Logging integration. - -// Avoid importing the log type information unnecessarily. There's a small cost -// associated with using an interface rather than the type. Depending on how -// often the logger is plugged in, it would be worth using the type instead. -type log_Logger interface { - Output(calldepth int, s string) error -} - -var ( - globalLogger log_Logger - globalDebug bool - globalMutex sync.Mutex -) - -// RACE WARNING: There are known data races when logging, which are manually -// silenced when the race detector is in use. These data races won't be -// observed in typical use, because logging is supposed to be set up once when -// the application starts. Having raceDetector as a constant, the compiler -// should elide the locks altogether in actual use. - -// Specify the *log.Logger object where log messages should be sent to. -func SetLogger(logger log_Logger) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - globalLogger = logger -} - -// Enable the delivery of debug messages to the logger. Only meaningful -// if a logger is also set. -func SetDebug(debug bool) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - globalDebug = debug -} - -func log(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprint(v...)) - } -} - -func logln(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprintln(v...)) - } -} - -func logf(format string, v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprintf(format, v...)) - } -} - -func debug(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprint(v...)) - } -} - -func debugln(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprintln(v...)) - } -} - -func debugf(format string, v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprintf(format, v...)) - } -} diff --git a/vendor/labix.org/v2/mgo/queue.go b/vendor/labix.org/v2/mgo/queue.go deleted file mode 100644 index e9245de..0000000 --- a/vendor/labix.org/v2/mgo/queue.go +++ /dev/null @@ -1,91 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -type queue struct { - elems []interface{} - nelems, popi, pushi int -} - -func (q *queue) Len() int { - return q.nelems -} - -func (q *queue) Push(elem interface{}) { - //debugf("Pushing(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) - if q.nelems == len(q.elems) { - q.expand() - } - q.elems[q.pushi] = elem - q.nelems++ - q.pushi = (q.pushi + 1) % len(q.elems) - //debugf(" Pushed(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) -} - -func (q *queue) Pop() (elem interface{}) { - //debugf("Popping(pushi=%d popi=%d cap=%d)\n", - // q.pushi, q.popi, len(q.elems)) - if q.nelems == 0 { - return nil - } - elem = q.elems[q.popi] - q.elems[q.popi] = nil // Help GC. - q.nelems-- - q.popi = (q.popi + 1) % len(q.elems) - //debugf(" Popped(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) - return elem -} - -func (q *queue) expand() { - curcap := len(q.elems) - var newcap int - if curcap == 0 { - newcap = 8 - } else if curcap < 1024 { - newcap = curcap * 2 - } else { - newcap = curcap + (curcap / 4) - } - elems := make([]interface{}, newcap) - - if q.popi == 0 { - copy(elems, q.elems) - q.pushi = curcap - } else { - newpopi := newcap - (curcap - q.popi) - copy(elems, q.elems[:q.popi]) - copy(elems[newpopi:], q.elems[q.popi:]) - q.popi = newpopi - } - for i := range q.elems { - q.elems[i] = nil // Help GC. - } - q.elems = elems -} diff --git a/vendor/labix.org/v2/mgo/queue_test.go b/vendor/labix.org/v2/mgo/queue_test.go deleted file mode 100644 index 38b0325..0000000 --- a/vendor/labix.org/v2/mgo/queue_test.go +++ /dev/null @@ -1,104 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "launchpad.net/gocheck" -) - -type QS struct{} - -var _ = gocheck.Suite(&QS{}) - -func (s *QS) TestSequentialGrowth(c *gocheck.C) { - q := queue{} - n := 2048 - for i := 0; i != n; i++ { - q.Push(i) - } - for i := 0; i != n; i++ { - c.Assert(q.Pop(), gocheck.Equals, i) - } -} - -var queueTestLists = [][]int{ - // {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - - // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} - {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, 8, 9, 10, 11}, - - // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} - {0, 1, 2, 3, -1, -1, 4, 5, 6, 7, 8, 9, 10, 11}, - - // {0, 1, 2, 3, 4, 5, 6, 7, 8} - {0, 1, 2, 3, 4, 5, 6, 7, 8, - -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8}, -} - -func (s *QS) TestQueueTestLists(c *gocheck.C) { - test := []int{} - testi := 0 - reset := func() { - test = test[0:0] - testi = 0 - } - push := func(i int) { - test = append(test, i) - } - pop := func() (i int) { - if testi == len(test) { - return -1 - } - i = test[testi] - testi++ - return - } - - for _, list := range queueTestLists { - reset() - q := queue{} - for _, n := range list { - if n == -1 { - c.Assert(q.Pop(), gocheck.Equals, pop(), - gocheck.Commentf("With list %#v", list)) - } else { - q.Push(n) - push(n) - } - } - - for n := pop(); n != -1; n = pop() { - c.Assert(q.Pop(), gocheck.Equals, n, - gocheck.Commentf("With list %#v", list)) - } - - c.Assert(q.Pop(), gocheck.Equals, nil, - gocheck.Commentf("With list %#v", list)) - } -} diff --git a/vendor/labix.org/v2/mgo/raceoff.go b/vendor/labix.org/v2/mgo/raceoff.go deleted file mode 100644 index 7470dd6..0000000 --- a/vendor/labix.org/v2/mgo/raceoff.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !race - -package mgo - -const raceDetector = false - diff --git a/vendor/labix.org/v2/mgo/raceon.go b/vendor/labix.org/v2/mgo/raceon.go deleted file mode 100644 index 737b08e..0000000 --- a/vendor/labix.org/v2/mgo/raceon.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build race - -package mgo - -const raceDetector = true diff --git a/vendor/labix.org/v2/mgo/saslimpl.go b/vendor/labix.org/v2/mgo/saslimpl.go deleted file mode 100644 index 3b255de..0000000 --- a/vendor/labix.org/v2/mgo/saslimpl.go +++ /dev/null @@ -1,11 +0,0 @@ -//+build sasl - -package mgo - -import ( - "labix.org/v2/mgo/sasl" -) - -func saslNew(cred Credential, host string) (saslStepper, error) { - return sasl.New(cred.Username, cred.Password, cred.Mechanism, cred.Service, host) -} diff --git a/vendor/labix.org/v2/mgo/saslstub.go b/vendor/labix.org/v2/mgo/saslstub.go deleted file mode 100644 index 6e9e309..0000000 --- a/vendor/labix.org/v2/mgo/saslstub.go +++ /dev/null @@ -1,11 +0,0 @@ -//+build !sasl - -package mgo - -import ( - "fmt" -) - -func saslNew(cred Credential, host string) (saslStepper, error) { - return nil, fmt.Errorf("SASL support not enabled during build (-tags sasl)") -} diff --git a/vendor/labix.org/v2/mgo/server.go b/vendor/labix.org/v2/mgo/server.go deleted file mode 100644 index d61f018..0000000 --- a/vendor/labix.org/v2/mgo/server.go +++ /dev/null @@ -1,444 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "errors" - "labix.org/v2/mgo/bson" - "net" - "sort" - "sync" - "time" -) - -// --------------------------------------------------------------------------- -// Mongo server encapsulation. - -type mongoServer struct { - sync.RWMutex - Addr string - ResolvedAddr string - tcpaddr *net.TCPAddr - unusedSockets []*mongoSocket - liveSockets []*mongoSocket - closed bool - abended bool - sync chan bool - dial dialer - pingValue time.Duration - pingIndex int - pingCount uint32 - pingWindow [6]time.Duration - info *mongoServerInfo -} - -type dialer struct { - old func(addr net.Addr) (net.Conn, error) - new func(addr *ServerAddr) (net.Conn, error) -} - -func (dial dialer) isSet() bool { - return dial.old != nil || dial.new != nil -} - -type mongoServerInfo struct { - Master bool - Mongos bool - Tags bson.D -} - -var defaultServerInfo mongoServerInfo - -func newServer(addr string, tcpaddr *net.TCPAddr, sync chan bool, dial dialer) *mongoServer { - server := &mongoServer{ - Addr: addr, - ResolvedAddr: tcpaddr.String(), - tcpaddr: tcpaddr, - sync: sync, - dial: dial, - info: &defaultServerInfo, - } - // Once so the server gets a ping value, then loop in background. - server.pinger(false) - go server.pinger(true) - return server -} - -var errSocketLimit = errors.New("per-server connection limit reached") -var errServerClosed = errors.New("server was closed") - -// AcquireSocket returns a socket for communicating with the server. -// This will attempt to reuse an old connection, if one is available. Otherwise, -// it will establish a new one. The returned socket is owned by the call site, -// and will return to the cache when the socket has its Release method called -// the same number of times as AcquireSocket + Acquire were called for it. -// If the limit argument is not zero, a socket will only be returned if the -// number of sockets in use for this server is under the provided limit. -func (server *mongoServer) AcquireSocket(limit int, timeout time.Duration) (socket *mongoSocket, abended bool, err error) { - for { - server.Lock() - abended = server.abended - if server.closed { - server.Unlock() - return nil, abended, errServerClosed - } - n := len(server.unusedSockets) - if limit > 0 && len(server.liveSockets)-n >= limit { - server.Unlock() - return nil, false, errSocketLimit - } - if n > 0 { - socket = server.unusedSockets[n-1] - server.unusedSockets[n-1] = nil // Help GC. - server.unusedSockets = server.unusedSockets[:n-1] - info := server.info - server.Unlock() - err = socket.InitialAcquire(info, timeout) - if err != nil { - continue - } - } else { - server.Unlock() - socket, err = server.Connect(timeout) - if err == nil { - server.Lock() - // We've waited for the Connect, see if we got - // closed in the meantime - if server.closed { - server.Unlock() - socket.Release() - socket.Close() - return nil, abended, errServerClosed - } - server.liveSockets = append(server.liveSockets, socket) - server.Unlock() - } - } - return - } - panic("unreachable") -} - -// Connect establishes a new connection to the server. This should -// generally be done through server.AcquireSocket(). -func (server *mongoServer) Connect(timeout time.Duration) (*mongoSocket, error) { - server.RLock() - master := server.info.Master - dial := server.dial - server.RUnlock() - - logf("Establishing new connection to %s (timeout=%s)...", server.Addr, timeout) - var conn net.Conn - var err error - switch { - case !dial.isSet(): - // Cannot do this because it lacks timeout support. :-( - //conn, err = net.DialTCP("tcp", nil, server.tcpaddr) - conn, err = net.DialTimeout("tcp", server.ResolvedAddr, timeout) - case dial.old != nil: - conn, err = dial.old(server.tcpaddr) - case dial.new != nil: - conn, err = dial.new(&ServerAddr{server.Addr, server.tcpaddr}) - default: - panic("dialer is set, but both dial.old and dial.new are nil") - } - if err != nil { - logf("Connection to %s failed: %v", server.Addr, err.Error()) - return nil, err - } - logf("Connection to %s established.", server.Addr) - - stats.conn(+1, master) - return newSocket(server, conn, timeout), nil -} - -// Close forces closing all sockets that are alive, whether -// they're currently in use or not. -func (server *mongoServer) Close() { - server.Lock() - server.closed = true - liveSockets := server.liveSockets - unusedSockets := server.unusedSockets - server.liveSockets = nil - server.unusedSockets = nil - server.Unlock() - logf("Connections to %s closing (%d live sockets).", server.Addr, len(liveSockets)) - for i, s := range liveSockets { - s.Close() - liveSockets[i] = nil - } - for i := range unusedSockets { - unusedSockets[i] = nil - } -} - -// RecycleSocket puts socket back into the unused cache. -func (server *mongoServer) RecycleSocket(socket *mongoSocket) { - server.Lock() - if !server.closed { - server.unusedSockets = append(server.unusedSockets, socket) - } - server.Unlock() -} - -func removeSocket(sockets []*mongoSocket, socket *mongoSocket) []*mongoSocket { - for i, s := range sockets { - if s == socket { - copy(sockets[i:], sockets[i+1:]) - n := len(sockets) - 1 - sockets[n] = nil - sockets = sockets[:n] - break - } - } - return sockets -} - -// AbendSocket notifies the server that the given socket has terminated -// abnormally, and thus should be discarded rather than cached. -func (server *mongoServer) AbendSocket(socket *mongoSocket) { - server.Lock() - server.abended = true - if server.closed { - server.Unlock() - return - } - server.liveSockets = removeSocket(server.liveSockets, socket) - server.unusedSockets = removeSocket(server.unusedSockets, socket) - server.Unlock() - // Maybe just a timeout, but suggest a cluster sync up just in case. - select { - case server.sync <- true: - default: - } -} - -func (server *mongoServer) SetInfo(info *mongoServerInfo) { - server.Lock() - server.info = info - server.Unlock() -} - -func (server *mongoServer) Info() *mongoServerInfo { - server.Lock() - info := server.info - server.Unlock() - return info -} - -func (server *mongoServer) hasTags(serverTags []bson.D) bool { -NextTagSet: - for _, tags := range serverTags { - NextReqTag: - for _, req := range tags { - for _, has := range server.info.Tags { - if req.Name == has.Name { - if req.Value == has.Value { - continue NextReqTag - } - continue NextTagSet - } - } - continue NextTagSet - } - return true - } - return false -} - -var pingDelay = 5 * time.Second - -func (server *mongoServer) pinger(loop bool) { - var delay time.Duration - if raceDetector { - // This variable is only ever touched by tests. - globalMutex.Lock() - delay = pingDelay - globalMutex.Unlock() - } else { - delay = pingDelay - } - op := queryOp{ - collection: "admin.$cmd", - query: bson.D{{"ping", 1}}, - flags: flagSlaveOk, - limit: -1, - } - for { - if loop { - time.Sleep(delay) - } - op := op - socket, _, err := server.AcquireSocket(0, 3 * delay) - if err == nil { - start := time.Now() - _, _ = socket.SimpleQuery(&op) - delay := time.Now().Sub(start) - - server.pingWindow[server.pingIndex] = delay - server.pingIndex = (server.pingIndex + 1) % len(server.pingWindow) - server.pingCount++ - var max time.Duration - for i := 0; i < len(server.pingWindow) && uint32(i) < server.pingCount; i++ { - if server.pingWindow[i] > max { - max = server.pingWindow[i] - } - } - socket.Release() - server.Lock() - if server.closed { - loop = false - } - server.pingValue = max - server.Unlock() - logf("Ping for %s is %d ms", server.Addr, max/time.Millisecond) - } else if err == errServerClosed { - return - } - if !loop { - return - } - } -} - -type mongoServerSlice []*mongoServer - -func (s mongoServerSlice) Len() int { - return len(s) -} - -func (s mongoServerSlice) Less(i, j int) bool { - return s[i].ResolvedAddr < s[j].ResolvedAddr -} - -func (s mongoServerSlice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s mongoServerSlice) Sort() { - sort.Sort(s) -} - -func (s mongoServerSlice) Search(resolvedAddr string) (i int, ok bool) { - n := len(s) - i = sort.Search(n, func(i int) bool { - return s[i].ResolvedAddr >= resolvedAddr - }) - return i, i != n && s[i].ResolvedAddr == resolvedAddr -} - -type mongoServers struct { - slice mongoServerSlice -} - -func (servers *mongoServers) Search(resolvedAddr string) (server *mongoServer) { - if i, ok := servers.slice.Search(resolvedAddr); ok { - return servers.slice[i] - } - return nil -} - -func (servers *mongoServers) Add(server *mongoServer) { - servers.slice = append(servers.slice, server) - servers.slice.Sort() -} - -func (servers *mongoServers) Remove(other *mongoServer) (server *mongoServer) { - if i, found := servers.slice.Search(other.ResolvedAddr); found { - server = servers.slice[i] - copy(servers.slice[i:], servers.slice[i+1:]) - n := len(servers.slice) - 1 - servers.slice[n] = nil // Help GC. - servers.slice = servers.slice[:n] - } - return -} - -func (servers *mongoServers) Slice() []*mongoServer { - return ([]*mongoServer)(servers.slice) -} - -func (servers *mongoServers) Get(i int) *mongoServer { - return servers.slice[i] -} - -func (servers *mongoServers) Len() int { - return len(servers.slice) -} - -func (servers *mongoServers) Empty() bool { - return len(servers.slice) == 0 -} - -// BestFit returns the best guess of what would be the most interesting -// server to perform operations on at this point in time. -func (servers *mongoServers) BestFit(serverTags []bson.D) *mongoServer { - var best *mongoServer - for _, next := range servers.slice { - if best == nil { - best = next - best.RLock() - if serverTags != nil && !next.info.Mongos && !best.hasTags(serverTags) { - best.RUnlock() - best = nil - } - continue - } - next.RLock() - swap := false - switch { - case serverTags != nil && !next.info.Mongos && !next.hasTags(serverTags): - // Must have requested tags. - case next.info.Master != best.info.Master: - // Prefer slaves. - swap = best.info.Master - case absDuration(next.pingValue-best.pingValue) > 15*time.Millisecond: - // Prefer nearest server. - swap = next.pingValue < best.pingValue - case len(next.liveSockets)-len(next.unusedSockets) < len(best.liveSockets)-len(best.unusedSockets): - // Prefer servers with less connections. - swap = true - } - if swap { - best.RUnlock() - best = next - } else { - next.RUnlock() - } - } - if best != nil { - best.RUnlock() - } - return best -} - -func absDuration(d time.Duration) time.Duration { - if d < 0 { - return -d - } - return d -} diff --git a/vendor/labix.org/v2/mgo/session.go b/vendor/labix.org/v2/mgo/session.go deleted file mode 100644 index 0ca86e8..0000000 --- a/vendor/labix.org/v2/mgo/session.go +++ /dev/null @@ -1,3517 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "crypto/md5" - "encoding/hex" - "errors" - "fmt" - "labix.org/v2/mgo/bson" - "math" - "net" - "net/url" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "time" -) - -type mode int - -const ( - Eventual mode = 0 - Monotonic mode = 1 - Strong mode = 2 -) - -// When changing the Session type, check if newSession and copySession -// need to be updated too. - -type Session struct { - m sync.RWMutex - cluster_ *mongoCluster - slaveSocket *mongoSocket - masterSocket *mongoSocket - slaveOk bool - consistency mode - queryConfig query - safeOp *queryOp - syncTimeout time.Duration - sockTimeout time.Duration - defaultdb string - sourcedb string - dialCred *Credential - creds []Credential -} - -type Database struct { - Session *Session - Name string -} - -type Collection struct { - Database *Database - Name string // "collection" - FullName string // "db.collection" -} - -type Query struct { - m sync.Mutex - session *Session - query // Enables default settings in session. -} - -type query struct { - op queryOp - prefetch float64 - limit int32 -} - -type getLastError struct { - CmdName int "getLastError" - W interface{} "w,omitempty" - WTimeout int "wtimeout,omitempty" - FSync bool "fsync,omitempty" - J bool "j,omitempty" -} - -type Iter struct { - m sync.Mutex - gotReply sync.Cond - session *Session - server *mongoServer - docData queue - err error - op getMoreOp - prefetch float64 - limit int32 - docsToReceive int - docsBeforeMore int - timeout time.Duration - timedout bool -} - -var ErrNotFound = errors.New("not found") - -const defaultPrefetch = 0.25 - -// Dial establishes a new session to the cluster identified by the given seed -// server(s). The session will enable communication with all of the servers in -// the cluster, so the seed servers are used only to find out about the cluster -// topology. -// -// Dial will timeout after 10 seconds if a server isn't reached. The returned -// session will timeout operations after one minute by default if servers -// aren't available. To customize the timeout, see DialWithTimeout, -// SetSyncTimeout, and SetSocketTimeout. -// -// This method is generally called just once for a given cluster. Further -// sessions to the same cluster are then established using the New or Copy -// methods on the obtained session. This will make them share the underlying -// cluster, and manage the pool of connections appropriately. -// -// Once the session is not useful anymore, Close must be called to release the -// resources appropriately. -// -// The seed servers must be provided in the following format: -// -// [mongodb://][user:pass@]host1[:port1][,host2[:port2],...][/database][?options] -// -// For example, it may be as simple as: -// -// localhost -// -// Or more involved like: -// -// mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb -// -// If the port number is not provided for a server, it defaults to 27017. -// -// The username and password provided in the URL will be used to authenticate -// into the database named after the slash at the end of the host names, or -// into the "admin" database if none is provided. The authentication information -// will persist in sessions obtained through the New method as well. -// -// The following connection options are supported after the question mark: -// -// connect=direct -// -// Disables the automatic replica set server discovery logic, and -// forces the use of servers provided only (even if secondaries). -// Note that to talk to a secondary the consistency requirements -// must be relaxed to Monotonic or Eventual via SetMode. -// -// -// authSource= -// -// Informs the database used to establish credentials and privileges -// with a MongoDB server. Defaults to the database name provided via -// the URL path, and "admin" if that's unset. -// -// -// authMechanism= -// -// Defines the protocol for credential negotiation. Defaults to "MONGODB-CR", -// which is the default username/password challenge-response mechanism. -// -// -// gssapiServiceName= -// -// Defines the service name to use when authenticating with the GSSAPI -// mechanism. Defaults to "mongodb". -// -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/connection-string/ -// -func Dial(url string) (*Session, error) { - session, err := DialWithTimeout(url, 10*time.Second) - if err == nil { - session.SetSyncTimeout(1 * time.Minute) - session.SetSocketTimeout(1 * time.Minute) - } - return session, err -} - -// DialWithTimeout works like Dial, but uses timeout as the amount of time to -// wait for a server to respond when first connecting and also on follow up -// operations in the session. If timeout is zero, the call may block -// forever waiting for a connection to be made. -// -// See SetSyncTimeout for customizing the timeout for the session. -func DialWithTimeout(url string, timeout time.Duration) (*Session, error) { - uinfo, err := parseURL(url) - if err != nil { - return nil, err - } - direct := false - mechanism := "" - service := "" - source := "" - for k, v := range uinfo.options { - switch k { - case "authSource": - source = v - case "authMechanism": - mechanism = v - case "gssapiServiceName": - service = v - case "connect": - if v == "direct" { - direct = true - break - } - if v == "replicaSet" { - break - } - fallthrough - default: - return nil, errors.New("unsupported connection URL option: " + k + "=" + v) - } - } - info := DialInfo{ - Addrs: uinfo.addrs, - Direct: direct, - Timeout: timeout, - Database: uinfo.db, - Username: uinfo.user, - Password: uinfo.pass, - Mechanism: mechanism, - Service: service, - Source: source, - } - return DialWithInfo(&info) -} - -// DialInfo holds options for establishing a session with a MongoDB cluster. -// To use a URL, see the Dial function. -type DialInfo struct { - // Addrs holds the addresses for the seed servers. - Addrs []string - - // Direct informs whether to establish connections only with the - // specified seed servers, or to obtain information for the whole - // cluster and establish connections with further servers too. - Direct bool - - // Timeout is the amount of time to wait for a server to respond when - // first connecting and on follow up operations in the session. If - // timeout is zero, the call may block forever waiting for a connection - // to be established. - Timeout time.Duration - - // FailFast will cause connection and query attempts to fail faster when - // the server is unavailable, instead of retrying until the configured - // timeout period. Note that an unavailable server may silently drop - // packets instead of rejecting them, in which case it's impossible to - // distinguish it from a slow server, so the timeout stays relevant. - FailFast bool - - // Database is the default database name used when the Session.DB method - // is called with an empty name, and is also used during the intial - // authenticatoin if Source is unset. - Database string - - // Source is the database used to establish credentials and privileges - // with a MongoDB server. Defaults to the value of Database, if that is - // set, or "admin" otherwise. - Source string - - // Service defines the service name to use when authenticating with the GSSAPI - // mechanism. Defaults to "mongodb". - Service string - - // Mechanism defines the protocol for credential negotiation. - // Defaults to "MONGODB-CR". - Mechanism string - - // Username and Password inform the credentials for the initial authentication - // done on the database defined by the Source field. See Session.Login. - Username string - Password string - - // DialServer optionally specifies the dial function for establishing - // connections with the MongoDB servers. - DialServer func(addr *ServerAddr) (net.Conn, error) - - // WARNING: This field is obsolete. See DialServer above. - Dial func(addr net.Addr) (net.Conn, error) -} - -// ServerAddr represents the address for establishing a connection to an -// individual MongoDB server. -type ServerAddr struct { - str string - tcp *net.TCPAddr -} - -// String returns the address that was provided for the server before resolution. -func (addr *ServerAddr) String() string { - return addr.str -} - -// TCPAddr returns the resolved TCP address for the server. -func (addr *ServerAddr) TCPAddr() *net.TCPAddr { - return addr.tcp -} - -// DialWithInfo establishes a new session to the cluster identified by info. -func DialWithInfo(info *DialInfo) (*Session, error) { - addrs := make([]string, len(info.Addrs)) - for i, addr := range info.Addrs { - p := strings.LastIndexAny(addr, "]:") - if p == -1 || addr[p] != ':' { - // XXX This is untested. The test suite doesn't use the standard port. - addr += ":27017" - } - addrs[i] = addr - } - cluster := newCluster(addrs, info.Direct, info.FailFast, dialer{info.Dial, info.DialServer}) - session := newSession(Eventual, cluster, info.Timeout) - session.defaultdb = info.Database - if session.defaultdb == "" { - session.defaultdb = "test" - } - session.sourcedb = info.Source - if session.sourcedb == "" { - session.sourcedb = info.Database - if session.sourcedb == "" { - session.sourcedb = "admin" - } - } - if info.Username != "" { - source := session.sourcedb - if info.Source == "" && (info.Mechanism == "GSSAPI" || info.Mechanism == "PLAIN") { - source = "$external" - } - session.dialCred = &Credential{ - Username: info.Username, - Password: info.Password, - Mechanism: info.Mechanism, - Service: info.Service, - Source: source, - } - session.creds = []Credential{*session.dialCred} - } - cluster.Release() - - // People get confused when we return a session that is not actually - // established to any servers yet (e.g. what if url was wrong). So, - // ping the server to ensure there's someone there, and abort if it - // fails. - if err := session.Ping(); err != nil { - session.Close() - return nil, err - } - session.SetMode(Strong, true) - return session, nil -} - -func isOptSep(c rune) bool { - return c == ';' || c == '&' -} - -type urlInfo struct { - addrs []string - user string - pass string - db string - options map[string]string -} - -func parseURL(s string) (*urlInfo, error) { - if strings.HasPrefix(s, "mongodb://") { - s = s[10:] - } - info := &urlInfo{options: make(map[string]string)} - if c := strings.Index(s, "?"); c != -1 { - for _, pair := range strings.FieldsFunc(s[c+1:], isOptSep) { - l := strings.SplitN(pair, "=", 2) - if len(l) != 2 || l[0] == "" || l[1] == "" { - return nil, errors.New("connection option must be key=value: " + pair) - } - info.options[l[0]] = l[1] - } - s = s[:c] - } - if c := strings.Index(s, "@"); c != -1 { - pair := strings.SplitN(s[:c], ":", 2) - if len(pair) > 2 || pair[0] == "" { - return nil, errors.New("credentials must be provided as user:pass@host") - } - var err error - info.user, err = url.QueryUnescape(pair[0]) - if err != nil { - return nil, fmt.Errorf("cannot unescape username in URL: %q", pair[0]) - } - if len(pair) > 1 { - info.pass, err = url.QueryUnescape(pair[1]) - if err != nil { - return nil, fmt.Errorf("cannot unescape password in URL") - } - } - s = s[c+1:] - } - if c := strings.Index(s, "/"); c != -1 { - info.db = s[c+1:] - s = s[:c] - } - info.addrs = strings.Split(s, ",") - return info, nil -} - -func newSession(consistency mode, cluster *mongoCluster, timeout time.Duration) (session *Session) { - cluster.Acquire() - session = &Session{cluster_: cluster, syncTimeout: timeout, sockTimeout: timeout} - debugf("New session %p on cluster %p", session, cluster) - session.SetMode(consistency, true) - session.SetSafe(&Safe{}) - session.queryConfig.prefetch = defaultPrefetch - return session -} - -func copySession(session *Session, keepCreds bool) (s *Session) { - cluster := session.cluster() - cluster.Acquire() - if session.masterSocket != nil { - session.masterSocket.Acquire() - } - if session.slaveSocket != nil { - session.slaveSocket.Acquire() - } - var creds []Credential - if keepCreds { - creds = make([]Credential, len(session.creds)) - copy(creds, session.creds) - } else if session.dialCred != nil { - creds = []Credential{*session.dialCred} - } - scopy := *session - scopy.m = sync.RWMutex{} - scopy.creds = creds - s = &scopy - debugf("New session %p on cluster %p (copy from %p)", s, cluster, session) - return s -} - -// LiveServers returns a list of server addresses which are -// currently known to be alive. -func (s *Session) LiveServers() (addrs []string) { - s.m.RLock() - addrs = s.cluster().LiveServers() - s.m.RUnlock() - return addrs -} - -// DB returns a value representing the named database. If name -// is empty, the database name provided in the dialed URL is -// used instead. If that is also empty, "test" is used as a -// fallback in a way equivalent to the mongo shell. -// -// Creating this value is a very lightweight operation, and -// involves no network communication. -func (s *Session) DB(name string) *Database { - if name == "" { - name = s.defaultdb - } - return &Database{s, name} -} - -// C returns a value representing the named collection. -// -// Creating this value is a very lightweight operation, and -// involves no network communication. -func (db *Database) C(name string) *Collection { - return &Collection{db, name, db.Name + "." + name} -} - -// With returns a copy of db that uses session s. -func (db *Database) With(s *Session) *Database { - newdb := *db - newdb.Session = s - return &newdb -} - -// With returns a copy of c that uses session s. -func (c *Collection) With(s *Session) *Collection { - newdb := *c.Database - newdb.Session = s - newc := *c - newc.Database = &newdb - return &newc -} - -// GridFS returns a GridFS value representing collections in db that -// follow the standard GridFS specification. -// The provided prefix (sometimes known as root) will determine which -// collections to use, and is usually set to "fs" when there is a -// single GridFS in the database. -// -// See the GridFS Create, Open, and OpenId methods for more details. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/GridFS -// http://www.mongodb.org/display/DOCS/GridFS+Tools -// http://www.mongodb.org/display/DOCS/GridFS+Specification -// -func (db *Database) GridFS(prefix string) *GridFS { - return newGridFS(db, prefix) -} - -// Run issues the provided command on the db database and unmarshals -// its result in the respective argument. The cmd argument may be either -// a string with the command name itself, in which case an empty document of -// the form bson.M{cmd: 1} will be used, or it may be a full command document. -// -// Note that MongoDB considers the first marshalled key as the command -// name, so when providing a command with options, it's important to -// use an ordering-preserving document, such as a struct value or an -// instance of bson.D. For instance: -// -// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) -// -// For privilleged commands typically run on the "admin" database, see -// the Run method in the Session type. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Commands -// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips -// -func (db *Database) Run(cmd interface{}, result interface{}) error { - if name, ok := cmd.(string); ok { - cmd = bson.D{{name, 1}} - } - return db.C("$cmd").Find(cmd).One(result) -} - -// Credential holds details to authenticate with a MongoDB server. -type Credential struct { - // Username and Password hold the basic details for authentication. - // Password is optional with some authentication mechanisms. - Username string - Password string - - // Source is the database used to establish credentials and privileges - // with a MongoDB server. Defaults to the default database provided - // during dial, or "admin" if that was unset. - Source string - - // Service defines the service name to use when authenticating with the GSSAPI - // mechanism. Defaults to "mongodb". - Service string - - // Mechanism defines the protocol for credential negotiation. - // Defaults to "MONGODB-CR". - Mechanism string -} - -// Login authenticates with MongoDB using the provided credential. The -// authentication is valid for the whole session and will stay valid until -// Logout is explicitly called for the same database, or the session is -// closed. -func (db *Database) Login(user, pass string) error { - return db.Session.Login(&Credential{Username: user, Password: pass, Source: db.Name}) -} - -// Login authenticates with MongoDB using the provided credential. The -// authentication is valid for the whole session and will stay valid until -// Logout is explicitly called for the same database, or the session is -// closed. -func (s *Session) Login(cred *Credential) error { - socket, err := s.acquireSocket(true) - if err != nil { - return err - } - defer socket.Release() - - credCopy := *cred - if cred.Source == "" { - if cred.Mechanism == "GSSAPI" { - credCopy.Source = "$external" - } else { - credCopy.Source = s.sourcedb - } - } - err = socket.Login(credCopy) - if err != nil { - return err - } - - s.m.Lock() - s.creds = append(s.creds, credCopy) - s.m.Unlock() - return nil -} - -func (s *Session) socketLogin(socket *mongoSocket) error { - for _, cred := range s.creds { - if err := socket.Login(cred); err != nil { - return err - } - } - return nil -} - -// Logout removes any established authentication credentials for the database. -func (db *Database) Logout() { - session := db.Session - dbname := db.Name - session.m.Lock() - found := false - for i, cred := range session.creds { - if cred.Source == dbname { - copy(session.creds[i:], session.creds[i+1:]) - session.creds = session.creds[:len(session.creds)-1] - found = true - break - } - } - if found { - if session.masterSocket != nil { - session.masterSocket.Logout(dbname) - } - if session.slaveSocket != nil { - session.slaveSocket.Logout(dbname) - } - } - session.m.Unlock() -} - -// LogoutAll removes all established authentication credentials for the session. -func (s *Session) LogoutAll() { - s.m.Lock() - for _, cred := range s.creds { - if s.masterSocket != nil { - s.masterSocket.Logout(cred.Source) - } - if s.slaveSocket != nil { - s.slaveSocket.Logout(cred.Source) - } - } - s.creds = s.creds[0:0] - s.m.Unlock() -} - -// User represents a MongoDB user. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/privilege-documents/ -// http://docs.mongodb.org/manual/reference/user-privileges/ -// -type User struct { - // Username is how the user identifies itself to the system. - Username string `bson:"user"` - - // Password is the plaintext password for the user. If set, - // the UpsertUser method will hash it into PasswordHash and - // unset it before the user is added to the database. - Password string `bson:",omitempty"` - - // PasswordHash is the MD5 hash of Username+":mongo:"+Password. - PasswordHash string `bson:"pwd,omitempty"` - - // CustomData holds arbitrary data admins decide to associate - // with this user, such as the full name or employee id. - CustomData interface{} `bson:"customData,omitempty"` - - // Roles indicates the set of roles the user will be provided. - // See the Role constants. - Roles []Role `bson:"roles"` - - // OtherDBRoles allows assigning roles in other databases from - // user documents inserted in the admin database. This field - // only works in the admin database. - OtherDBRoles map[string][]Role `bson:"otherDBRoles,omitempty"` - - // UserSource indicates where to look for this user's credentials. - // It may be set to a database name, or to "$external" for - // consulting an external resource such as Kerberos. UserSource - // must not be set if Password or PasswordHash are present. - // - // WARNING: This setting was only ever supported in MongoDB 2.4, - // and is now obsolete. - UserSource string `bson:"userSource,omitempty"` -} - -type Role string - -const ( - // Relevant documentation: - // - // http://docs.mongodb.org/manual/reference/user-privileges/ - // - RoleRoot Role = "root" - RoleRead Role = "read" - RoleReadAny Role = "readAnyDatabase" - RoleReadWrite Role = "readWrite" - RoleReadWriteAny Role = "readWriteAnyDatabase" - RoleDBAdmin Role = "dbAdmin" - RoleDBAdminAny Role = "dbAdminAnyDatabase" - RoleUserAdmin Role = "userAdmin" - RoleUserAdminAny Role = "userAdminAnyDatabase" - RoleClusterAdmin Role = "clusterAdmin" -) - -// UpsertUser updates the authentication credentials and the roles for -// a MongoDB user within the db database. If the named user doesn't exist -// it will be created. -// -// This method should only be used from MongoDB 2.4 and on. For older -// MongoDB releases, use the obsolete AddUser method instead. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/user-privileges/ -// http://docs.mongodb.org/manual/reference/privilege-documents/ -// -func (db *Database) UpsertUser(user *User) error { - if user.Username == "" { - return fmt.Errorf("user has no Username") - } - if (user.Password != "" || user.PasswordHash != "") && user.UserSource != "" { - return fmt.Errorf("user has both Password/PasswordHash and UserSource set") - } - if len(user.OtherDBRoles) > 0 && db.Name != "admin" { - return fmt.Errorf("user with OtherDBRoles is only supported in admin database") - } - - // Attempt to run this using 2.6+ commands. - rundb := db - if user.UserSource != "" { - // Compatibility logic for the userSource field of MongoDB <= 2.4.X - rundb = db.Session.DB(user.UserSource) - } - err := rundb.runUserCmd("updateUser", user) - if e, ok := err.(*QueryError); ok && e.Code == 11 { - return rundb.runUserCmd("createUser", user) - } - if !isNoCmd(err) { - return err - } - - // Command does not exist. Fallback to pre-2.6 behavior. - var set, unset bson.D - if user.Password != "" { - psum := md5.New() - psum.Write([]byte(user.Username + ":mongo:" + user.Password)) - set = append(set, bson.DocElem{"pwd", hex.EncodeToString(psum.Sum(nil))}) - unset = append(unset, bson.DocElem{"userSource", 1}) - } else if user.PasswordHash != "" { - set = append(set, bson.DocElem{"pwd", user.PasswordHash}) - unset = append(unset, bson.DocElem{"userSource", 1}) - } - if user.UserSource != "" { - set = append(set, bson.DocElem{"userSource", user.UserSource}) - unset = append(unset, bson.DocElem{"pwd", 1}) - } - if user.Roles != nil || user.OtherDBRoles != nil { - set = append(set, bson.DocElem{"roles", user.Roles}) - if len(user.OtherDBRoles) > 0 { - set = append(set, bson.DocElem{"otherDBRoles", user.OtherDBRoles}) - } else { - unset = append(unset, bson.DocElem{"otherDBRoles", 1}) - } - } - users := db.C("system.users") - err = users.Update(bson.D{{"user", user.Username}}, bson.D{{"$unset", unset}, {"$set", set}}) - if err == ErrNotFound { - set = append(set, bson.DocElem{"user", user.Username}) - if user.Roles == nil && user.OtherDBRoles == nil { - // Roles must be sent, as it's the way MongoDB distinguishes - // old-style documents from new-style documents in pre-2.6. - set = append(set, bson.DocElem{"roles", user.Roles}) - } - err = users.Insert(set) - } - return err -} - -func isNoCmd(err error) bool { - e, ok := err.(*QueryError) - return ok && strings.HasPrefix(e.Message, "no such cmd:") -} - -func (db *Database) runUserCmd(cmdName string, user *User) error { - //if user.UserSource != "" && (user.UserSource != "$external" || db.Name != "$external") { - // return fmt.Errorf("MongoDB 2.6+ does not support the UserSource setting") - //} - - cmd := make(bson.D, 0, 16) - cmd = append(cmd, bson.DocElem{cmdName, user.Username}) - if user.Password != "" { - cmd = append(cmd, bson.DocElem{"pwd", user.Password}) - } - var roles []interface{} - for _, role := range user.Roles { - roles = append(roles, role) - } - for db, dbroles := range user.OtherDBRoles { - for _, role := range dbroles { - roles = append(roles, bson.D{{"role", role}, {"db", db}}) - } - } - if roles != nil || user.Roles != nil || cmdName == "createUser" { - cmd = append(cmd, bson.DocElem{"roles", roles}) - } - return db.Run(cmd, nil) -} - -// AddUser creates or updates the authentication credentials of user within -// the db database. -// -// WARNING: This method is obsolete and should only be used with MongoDB 2.2 -// or earlier. For MongoDB 2.4 and on, use UpsertUser instead. -func (db *Database) AddUser(username, password string, readOnly bool) error { - // Try to emulate the old behavior on 2.6+ - user := &User{Username: username, Password: password} - if db.Name == "admin" { - if readOnly { - user.Roles = []Role{RoleReadAny} - } else { - user.Roles = []Role{RoleReadWriteAny} - } - } else { - if readOnly { - user.Roles = []Role{RoleRead} - } else { - user.Roles = []Role{RoleReadWrite} - } - } - err := db.runUserCmd("updateUser", user) - if e, ok := err.(*QueryError); ok && e.Code == 11 { - return db.runUserCmd("createUser", user) - } - if !isNoCmd(err) { - return err - } - - // Command doesn't exist. Fallback to pre-2.6 behavior. - psum := md5.New() - psum.Write([]byte(username + ":mongo:" + password)) - digest := hex.EncodeToString(psum.Sum(nil)) - c := db.C("system.users") - _, err = c.Upsert(bson.M{"user": username}, bson.M{"$set": bson.M{"user": username, "pwd": digest, "readOnly": readOnly}}) - return err -} - -// RemoveUser removes the authentication credentials of user from the database. -func (db *Database) RemoveUser(user string) error { - err := db.Run(bson.D{{"dropUser", user}}, nil) - if isNoCmd(err) { - users := db.C("system.users") - return users.Remove(bson.M{"user": user}) - } - return err -} - -type indexSpec struct { - Name, NS string - Key bson.D - Unique bool ",omitempty" - DropDups bool "dropDups,omitempty" - Background bool ",omitempty" - Sparse bool ",omitempty" - Bits, Min, Max int ",omitempty" - ExpireAfter int "expireAfterSeconds,omitempty" -} - -type Index struct { - Key []string // Index key fields; prefix name with dash (-) for descending order - Unique bool // Prevent two documents from having the same index key - DropDups bool // Drop documents with the same index key as a previously indexed one - Background bool // Build index in background and return immediately - Sparse bool // Only index documents containing the Key fields - - ExpireAfter time.Duration // Periodically delete docs with indexed time.Time older than that. - - Name string // Index name, computed by EnsureIndex - - Bits, Min, Max int // Properties for spatial indexes -} - -func parseIndexKey(key []string) (name string, realKey bson.D, err error) { - var order interface{} - for _, field := range key { - raw := field - if name != "" { - name += "_" - } - var kind string - if field != "" { - if field[0] == '$' { - if c := strings.Index(field, ":"); c > 1 && c < len(field)-1 { - kind = field[1:c] - field = field[c+1:] - name += field + "_" + kind - } - } - switch field[0] { - case '$': - // Logic above failed. Reset and error. - field = "" - case '@': - order = "2d" - field = field[1:] - // The shell used to render this field as key_ instead of key_2d, - // and mgo followed suit. This has been fixed in recent server - // releases, and mgo followed as well. - name += field + "_2d" - case '-': - order = -1 - field = field[1:] - name += field + "_-1" - case '+': - field = field[1:] - fallthrough - default: - if kind == "" { - order = 1 - name += field + "_1" - } else { - order = kind - } - } - } - if field == "" || kind != "" && order != kind { - return "", nil, fmt.Errorf(`invalid index key: want "[$:][-]", got %q`, raw) - } - realKey = append(realKey, bson.DocElem{field, order}) - } - if name == "" { - return "", nil, errors.New("invalid index key: no fields provided") - } - return -} - -// EnsureIndexKey ensures an index with the given key exists, creating it -// if necessary. -// -// This example: -// -// err := collection.EnsureIndexKey("a", "b") -// -// Is equivalent to: -// -// err := collection.EnsureIndex(mgo.Index{Key: []string{"a", "b"}}) -// -// See the EnsureIndex method for more details. -func (c *Collection) EnsureIndexKey(key ...string) error { - return c.EnsureIndex(Index{Key: key}) -} - -// EnsureIndex ensures an index with the given key exists, creating it with -// the provided parameters if necessary. -// -// Once EnsureIndex returns successfully, following requests for the same index -// will not contact the server unless Collection.DropIndex is used to drop the -// same index, or Session.ResetIndexCache is called. -// -// For example: -// -// index := Index{ -// Key: []string{"lastname", "firstname"}, -// Unique: true, -// DropDups: true, -// Background: true, // See notes. -// Sparse: true, -// } -// err := collection.EnsureIndex(index) -// -// The Key value determines which fields compose the index. The index ordering -// will be ascending by default. To obtain an index with a descending order, -// the field name should be prefixed by a dash (e.g. []string{"-time"}). -// -// If Unique is true, the index must necessarily contain only a single -// document per Key. With DropDups set to true, documents with the same key -// as a previously indexed one will be dropped rather than an error returned. -// -// If Background is true, other connections will be allowed to proceed using -// the collection without the index while it's being built. Note that the -// session executing EnsureIndex will be blocked for as long as it takes for -// the index to be built. -// -// If Sparse is true, only documents containing the provided Key fields will be -// included in the index. When using a sparse index for sorting, only indexed -// documents will be returned. -// -// If ExpireAfter is non-zero, the server will periodically scan the collection -// and remove documents containing an indexed time.Time field with a value -// older than ExpireAfter. See the documentation for details: -// -// http://docs.mongodb.org/manual/tutorial/expire-data -// -// Other kinds of indexes are also supported through that API. Here is an example: -// -// index := Index{ -// Key: []string{"$2d:loc"}, -// Bits: 26, -// } -// err := collection.EnsureIndex(index) -// -// The example above requests the creation of a "2d" index for the "loc" field. -// -// The 2D index bounds may be changed using the Min and Max attributes of the -// Index value. The default bound setting of (-180, 180) is suitable for -// latitude/longitude pairs. -// -// The Bits parameter sets the precision of the 2D geohash values. If not -// provided, 26 bits are used, which is roughly equivalent to 1 foot of -// precision for the default (-180, 180) index bounds. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Indexes -// http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ -// http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation -// http://www.mongodb.org/display/DOCS/Geospatial+Indexing -// http://www.mongodb.org/display/DOCS/Multikeys -// -func (c *Collection) EnsureIndex(index Index) error { - name, realKey, err := parseIndexKey(index.Key) - if err != nil { - return err - } - - session := c.Database.Session - cacheKey := c.FullName + "\x00" + name - if session.cluster().HasCachedIndex(cacheKey) { - return nil - } - - spec := indexSpec{ - Name: name, - NS: c.FullName, - Key: realKey, - Unique: index.Unique, - DropDups: index.DropDups, - Background: index.Background, - Sparse: index.Sparse, - Bits: index.Bits, - Min: index.Min, - Max: index.Max, - ExpireAfter: int(index.ExpireAfter / time.Second), - } - - session = session.Clone() - defer session.Close() - session.SetMode(Strong, false) - session.EnsureSafe(&Safe{}) - - db := c.Database.With(session) - err = db.C("system.indexes").Insert(&spec) - if err == nil { - session.cluster().CacheIndex(cacheKey, true) - } - session.Close() - return err -} - -// DropIndex removes the index with key from the collection. -// -// The key value determines which fields compose the index. The index ordering -// will be ascending by default. To obtain an index with a descending order, -// the field name should be prefixed by a dash (e.g. []string{"-time"}). -// -// For example: -// -// err := collection.DropIndex("lastname", "firstname") -// -// See the EnsureIndex method for more details on indexes. -func (c *Collection) DropIndex(key ...string) error { - name, _, err := parseIndexKey(key) - if err != nil { - return err - } - - session := c.Database.Session - cacheKey := c.FullName + "\x00" + name - session.cluster().CacheIndex(cacheKey, false) - - session = session.Clone() - defer session.Close() - session.SetMode(Strong, false) - - db := c.Database.With(session) - result := struct { - ErrMsg string - Ok bool - }{} - err = db.Run(bson.D{{"dropIndexes", c.Name}, {"index", name}}, &result) - if err != nil { - return err - } - if !result.Ok { - return errors.New(result.ErrMsg) - } - return nil -} - -// Indexes returns a list of all indexes for the collection. -// -// For example, this snippet would drop all available indexes: -// -// indexes, err := collection.Indexes() -// if err != nil { -// return err -// } -// for _, index := range indexes { -// err = collection.DropIndex(index.Key...) -// if err != nil { -// return err -// } -// } -// -// See the EnsureIndex method for more details on indexes. -func (c *Collection) Indexes() (indexes []Index, err error) { - query := c.Database.C("system.indexes").Find(bson.M{"ns": c.FullName}) - iter := query.Sort("name").Iter() - for { - var spec indexSpec - if !iter.Next(&spec) { - break - } - index := Index{ - Name: spec.Name, - Key: simpleIndexKey(spec.Key), - Unique: spec.Unique, - DropDups: spec.DropDups, - Background: spec.Background, - Sparse: spec.Sparse, - ExpireAfter: time.Duration(spec.ExpireAfter) * time.Second, - } - indexes = append(indexes, index) - } - err = iter.Close() - return -} - -func simpleIndexKey(realKey bson.D) (key []string) { - for i := range realKey { - field := realKey[i].Name - vi, ok := realKey[i].Value.(int) - if !ok { - vf, _ := realKey[i].Value.(float64) - vi = int(vf) - } - if vi == 1 { - key = append(key, field) - continue - } - if vi == -1 { - key = append(key, "-"+field) - continue - } - if vs, ok := realKey[i].Value.(string); ok { - key = append(key, "$"+vs+":"+field) - continue - } - panic("Got unknown index key type for field " + field) - } - return -} - -// ResetIndexCache() clears the cache of previously ensured indexes. -// Following requests to EnsureIndex will contact the server. -func (s *Session) ResetIndexCache() { - s.cluster().ResetIndexCache() -} - -// New creates a new session with the same parameters as the original -// session, including consistency, batch size, prefetching, safety mode, -// etc. The returned session will use sockets from the pool, so there's -// a chance that writes just performed in another session may not yet -// be visible. -// -// Login information from the original session will not be copied over -// into the new session unless it was provided through the initial URL -// for the Dial function. -// -// See the Copy and Clone methods. -// -func (s *Session) New() *Session { - s.m.Lock() - scopy := copySession(s, false) - s.m.Unlock() - scopy.Refresh() - return scopy -} - -// Copy works just like New, but preserves the exact authentication -// information from the original session. -func (s *Session) Copy() *Session { - s.m.Lock() - scopy := copySession(s, true) - s.m.Unlock() - scopy.Refresh() - return scopy -} - -// Clone works just like Copy, but also reuses the same socket as the original -// session, in case it had already reserved one due to its consistency -// guarantees. This behavior ensures that writes performed in the old session -// are necessarily observed when using the new session, as long as it was a -// strong or monotonic session. That said, it also means that long operations -// may cause other goroutines using the original session to wait. -func (s *Session) Clone() *Session { - s.m.Lock() - scopy := copySession(s, true) - s.m.Unlock() - return scopy -} - -// Close terminates the session. It's a runtime error to use a session -// after it has been closed. -func (s *Session) Close() { - s.m.Lock() - if s.cluster_ != nil { - debugf("Closing session %p", s) - s.unsetSocket() - s.cluster_.Release() - s.cluster_ = nil - } - s.m.Unlock() -} - -func (s *Session) cluster() *mongoCluster { - if s.cluster_ == nil { - panic("Session already closed") - } - return s.cluster_ -} - -// Refresh puts back any reserved sockets in use and restarts the consistency -// guarantees according to the current consistency setting for the session. -func (s *Session) Refresh() { - s.m.Lock() - s.slaveOk = s.consistency != Strong - s.unsetSocket() - s.m.Unlock() -} - -// SetMode changes the consistency mode for the session. -// -// In the Strong consistency mode reads and writes will always be made to -// the primary server using a unique connection so that reads and writes are -// fully consistent, ordered, and observing the most up-to-date data. -// This offers the least benefits in terms of distributing load, but the -// most guarantees. See also Monotonic and Eventual. -// -// In the Monotonic consistency mode reads may not be entirely up-to-date, -// but they will always see the history of changes moving forward, the data -// read will be consistent across sequential queries in the same session, -// and modifications made within the session will be observed in following -// queries (read-your-writes). -// -// In practice, the Monotonic mode is obtained by performing initial reads -// on a unique connection to an arbitrary secondary, if one is available, -// and once the first write happens, the session connection is switched over -// to the primary server. This manages to distribute some of the reading -// load with secondaries, while maintaining some useful guarantees. -// -// In the Eventual consistency mode reads will be made to any secondary in the -// cluster, if one is available, and sequential reads will not necessarily -// be made with the same connection. This means that data may be observed -// out of order. Writes will of course be issued to the primary, but -// independent writes in the same Eventual session may also be made with -// independent connections, so there are also no guarantees in terms of -// write ordering (no read-your-writes guarantees either). -// -// The Eventual mode is the fastest and most resource-friendly, but is -// also the one offering the least guarantees about ordering of the data -// read and written. -// -// If refresh is true, in addition to ensuring the session is in the given -// consistency mode, the consistency guarantees will also be reset (e.g. -// a Monotonic session will be allowed to read from secondaries again). -// This is equivalent to calling the Refresh function. -// -// Shifting between Monotonic and Strong modes will keep a previously -// reserved connection for the session unless refresh is true or the -// connection is unsuitable (to a secondary server in a Strong session). -func (s *Session) SetMode(consistency mode, refresh bool) { - s.m.Lock() - debugf("Session %p: setting mode %d with refresh=%v (master=%p, slave=%p)", s, consistency, refresh, s.masterSocket, s.slaveSocket) - s.consistency = consistency - if refresh { - s.slaveOk = s.consistency != Strong - s.unsetSocket() - } else if s.consistency == Strong { - s.slaveOk = false - } else if s.masterSocket == nil { - s.slaveOk = true - } - s.m.Unlock() -} - -// Mode returns the current consistency mode for the session. -func (s *Session) Mode() mode { - s.m.RLock() - mode := s.consistency - s.m.RUnlock() - return mode -} - -// SetSyncTimeout sets the amount of time an operation with this session -// will wait before returning an error in case a connection to a usable -// server can't be established. Set it to zero to wait forever. The -// default value is 7 seconds. -func (s *Session) SetSyncTimeout(d time.Duration) { - s.m.Lock() - s.syncTimeout = d - s.m.Unlock() -} - -// SetSocketTimeout sets the amount of time to wait for a non-responding -// socket to the database before it is forcefully closed. -func (s *Session) SetSocketTimeout(d time.Duration) { - s.m.Lock() - s.sockTimeout = d - if s.masterSocket != nil { - s.masterSocket.SetTimeout(d) - } - if s.slaveSocket != nil { - s.slaveSocket.SetTimeout(d) - } - s.m.Unlock() -} - -// SetCursorTimeout changes the standard timeout period that the server -// enforces on created cursors. The only supported value right now is -// 0, which disables the timeout. The standard server timeout is 10 minutes. -func (s *Session) SetCursorTimeout(d time.Duration) { - s.m.Lock() - if d == 0 { - s.queryConfig.op.flags |= flagNoCursorTimeout - } else { - panic("SetCursorTimeout: only 0 (disable timeout) supported for now") - } - s.m.Unlock() -} - -// SetBatch sets the default batch size used when fetching documents from the -// database. It's possible to change this setting on a per-query basis as -// well, using the Query.Batch method. -// -// The default batch size is defined by the database itself. As of this -// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the -// first batch, and 4MB on remaining ones. -func (s *Session) SetBatch(n int) { - if n == 1 { - // Server interprets 1 as -1 and closes the cursor (!?) - n = 2 - } - s.m.Lock() - s.queryConfig.op.limit = int32(n) - s.m.Unlock() -} - -// SetPrefetch sets the default point at which the next batch of results will be -// requested. When there are p*batch_size remaining documents cached in an -// Iter, the next batch will be requested in background. For instance, when -// using this: -// -// session.SetBatch(200) -// session.SetPrefetch(0.25) -// -// and there are only 50 documents cached in the Iter to be processed, the -// next batch of 200 will be requested. It's possible to change this setting on -// a per-query basis as well, using the Prefetch method of Query. -// -// The default prefetch value is 0.25. -func (s *Session) SetPrefetch(p float64) { - s.m.Lock() - s.queryConfig.prefetch = p - s.m.Unlock() -} - -// See SetSafe for details on the Safe type. -type Safe struct { - W int // Min # of servers to ack before success - WMode string // Write mode for MongoDB 2.0+ (e.g. "majority") - WTimeout int // Milliseconds to wait for W before timing out - FSync bool // Should servers sync to disk before returning success - J bool // Wait for next group commit if journaling; no effect otherwise -} - -// Safe returns the current safety mode for the session. -func (s *Session) Safe() (safe *Safe) { - s.m.Lock() - defer s.m.Unlock() - if s.safeOp != nil { - cmd := s.safeOp.query.(*getLastError) - safe = &Safe{WTimeout: cmd.WTimeout, FSync: cmd.FSync, J: cmd.J} - switch w := cmd.W.(type) { - case string: - safe.WMode = w - case int: - safe.W = w - } - } - return -} - -// SetSafe changes the session safety mode. -// -// If the safe parameter is nil, the session is put in unsafe mode, and writes -// become fire-and-forget, without error checking. The unsafe mode is faster -// since operations won't hold on waiting for a confirmation. -// -// If the safe parameter is not nil, any changing query (insert, update, ...) -// will be followed by a getLastError command with the specified parameters, -// to ensure the request was correctly processed. -// -// The safe.W parameter determines how many servers should confirm a write -// before the operation is considered successful. If set to 0 or 1, the -// command will return as soon as the primary is done with the request. -// If safe.WTimeout is greater than zero, it determines how many milliseconds -// to wait for the safe.W servers to respond before returning an error. -// -// Starting with MongoDB 2.0.0 the safe.WMode parameter can be used instead -// of W to request for richer semantics. If set to "majority" the server will -// wait for a majority of members from the replica set to respond before -// returning. Custom modes may also be defined within the server to create -// very detailed placement schemas. See the data awareness documentation in -// the links below for more details (note that MongoDB internally reuses the -// "w" field name for WMode). -// -// If safe.FSync is true and journaling is disabled, the servers will be -// forced to sync all files to disk immediately before returning. If the -// same option is true but journaling is enabled, the server will instead -// await for the next group commit before returning. -// -// Since MongoDB 2.0.0, the safe.J option can also be used instead of FSync -// to force the server to wait for a group commit in case journaling is -// enabled. The option has no effect if the server has journaling disabled. -// -// For example, the following statement will make the session check for -// errors, without imposing further constraints: -// -// session.SetSafe(&mgo.Safe{}) -// -// The following statement will force the server to wait for a majority of -// members of a replica set to return (MongoDB 2.0+ only): -// -// session.SetSafe(&mgo.Safe{WMode: "majority"}) -// -// The following statement, on the other hand, ensures that at least two -// servers have flushed the change to disk before confirming the success -// of operations: -// -// session.EnsureSafe(&mgo.Safe{W: 2, FSync: true}) -// -// The following statement, on the other hand, disables the verification -// of errors entirely: -// -// session.SetSafe(nil) -// -// See also the EnsureSafe method. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/getLastError+Command -// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError -// http://www.mongodb.org/display/DOCS/Data+Center+Awareness -// -func (s *Session) SetSafe(safe *Safe) { - s.m.Lock() - s.safeOp = nil - s.ensureSafe(safe) - s.m.Unlock() -} - -// EnsureSafe compares the provided safety parameters with the ones -// currently in use by the session and picks the most conservative -// choice for each setting. -// -// That is: -// -// - safe.WMode is always used if set. -// - safe.W is used if larger than the current W and WMode is empty. -// - safe.FSync is always used if true. -// - safe.J is used if FSync is false. -// - safe.WTimeout is used if set and smaller than the current WTimeout. -// -// For example, the following statement will ensure the session is -// at least checking for errors, without enforcing further constraints. -// If a more conservative SetSafe or EnsureSafe call was previously done, -// the following call will be ignored. -// -// session.EnsureSafe(&mgo.Safe{}) -// -// See also the SetSafe method for details on what each option means. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/getLastError+Command -// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError -// http://www.mongodb.org/display/DOCS/Data+Center+Awareness -// -func (s *Session) EnsureSafe(safe *Safe) { - s.m.Lock() - s.ensureSafe(safe) - s.m.Unlock() -} - -func (s *Session) ensureSafe(safe *Safe) { - if safe == nil { - return - } - - var w interface{} - if safe.WMode != "" { - w = safe.WMode - } else if safe.W > 0 { - w = safe.W - } - - var cmd getLastError - if s.safeOp == nil { - cmd = getLastError{1, w, safe.WTimeout, safe.FSync, safe.J} - } else { - // Copy. We don't want to mutate the existing query. - cmd = *(s.safeOp.query.(*getLastError)) - if cmd.W == nil { - cmd.W = w - } else if safe.WMode != "" { - cmd.W = safe.WMode - } else if i, ok := cmd.W.(int); ok && safe.W > i { - cmd.W = safe.W - } - if safe.WTimeout > 0 && safe.WTimeout < cmd.WTimeout { - cmd.WTimeout = safe.WTimeout - } - if safe.FSync { - cmd.FSync = true - cmd.J = false - } else if safe.J && !cmd.FSync { - cmd.J = true - } - } - s.safeOp = &queryOp{ - query: &cmd, - collection: "admin.$cmd", - limit: -1, - } -} - -// Run issues the provided command on the "admin" database and -// and unmarshals its result in the respective argument. The cmd -// argument may be either a string with the command name itself, in -// which case an empty document of the form bson.M{cmd: 1} will be used, -// or it may be a full command document. -// -// Note that MongoDB considers the first marshalled key as the command -// name, so when providing a command with options, it's important to -// use an ordering-preserving document, such as a struct value or an -// instance of bson.D. For instance: -// -// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) -// -// For commands on arbitrary databases, see the Run method in -// the Database type. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Commands -// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips -// -func (s *Session) Run(cmd interface{}, result interface{}) error { - return s.DB("admin").Run(cmd, result) -} - -// SelectServers restricts communication to servers configured with the -// given tags. For example, the following statement restricts servers -// used for reading operations to those with both tag "disk" set to -// "ssd" and tag "rack" set to 1: -// -// session.SelectSlaves(bson.D{{"disk", "ssd"}, {"rack", 1}}) -// -// Multiple sets of tags may be provided, in which case the used server -// must match all tags within any one set. -// -// If a connection was previously assigned to the session due to the -// current session mode (see Session.SetMode), the tag selection will -// only be enforced after the session is refreshed. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/tutorial/configure-replica-set-tag-sets -// -func (s *Session) SelectServers(tags ...bson.D) { - s.m.Lock() - s.queryConfig.op.serverTags = tags - s.m.Unlock() -} - -// Ping runs a trivial ping command just to get in touch with the server. -func (s *Session) Ping() error { - return s.Run("ping", nil) -} - -// Fsync flushes in-memory writes to disk on the server the session -// is established with. If async is true, the call returns immediately, -// otherwise it returns after the flush has been made. -func (s *Session) Fsync(async bool) error { - return s.Run(bson.D{{"fsync", 1}, {"async", async}}, nil) -} - -// FsyncLock locks all writes in the specific server the session is -// established with and returns. Any writes attempted to the server -// after it is successfully locked will block until FsyncUnlock is -// called for the same server. -// -// This method works on secondaries as well, preventing the oplog from -// being flushed while the server is locked, but since only the server -// connected to is locked, for locking specific secondaries it may be -// necessary to establish a connection directly to the secondary (see -// Dial's connect=direct option). -// -// As an important caveat, note that once a write is attempted and -// blocks, follow up reads will block as well due to the way the -// lock is internally implemented in the server. More details at: -// -// https://jira.mongodb.org/browse/SERVER-4243 -// -// FsyncLock is often used for performing consistent backups of -// the database files on disk. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/fsync+Command -// http://www.mongodb.org/display/DOCS/Backups -// -func (s *Session) FsyncLock() error { - return s.Run(bson.D{{"fsync", 1}, {"lock", true}}, nil) -} - -// FsyncUnlock releases the server for writes. See FsyncLock for details. -func (s *Session) FsyncUnlock() error { - return s.DB("admin").C("$cmd.sys.unlock").Find(nil).One(nil) // WTF? -} - -// Find prepares a query using the provided document. The document may be a -// map or a struct value capable of being marshalled with bson. The map -// may be a generic one using interface{} for its key and/or values, such as -// bson.M, or it may be a properly typed map. Providing nil as the document -// is equivalent to providing an empty document such as bson.M{}. -// -// Further details of the query may be tweaked using the resulting Query value, -// and then executed to retrieve results using methods such as One, For, -// Iter, or Tail. -// -// In case the resulting document includes a field named $err or errmsg, which -// are standard ways for MongoDB to return query errors, the returned err will -// be set to a *QueryError value including the Err message and the Code. In -// those cases, the result argument is still unmarshalled into with the -// received document so that any other custom values may be obtained if -// desired. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Querying -// http://www.mongodb.org/display/DOCS/Advanced+Queries -// -func (c *Collection) Find(query interface{}) *Query { - session := c.Database.Session - session.m.RLock() - q := &Query{session: session, query: session.queryConfig} - session.m.RUnlock() - q.op.query = query - q.op.collection = c.FullName - return q -} - -// FindId is a convenience helper equivalent to: -// -// query := collection.Find(bson.M{"_id": id}) -// -// See the Find method for more details. -func (c *Collection) FindId(id interface{}) *Query { - return c.Find(bson.D{{"_id", id}}) -} - -type Pipe struct { - session *Session - collection *Collection - pipeline interface{} -} - -// Pipe prepares a pipeline to aggregate. The pipeline document -// must be a slice built in terms of the aggregation framework language. -// -// For example: -// -// pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}}) -// iter := pipe.Iter() -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/aggregation -// http://docs.mongodb.org/manual/applications/aggregation -// http://docs.mongodb.org/manual/tutorial/aggregation-examples -// -func (c *Collection) Pipe(pipeline interface{}) *Pipe { - session := c.Database.Session - return &Pipe{ - session: session, - collection: c, - pipeline: pipeline, - } -} - -// Iter executes the pipeline and returns an iterator capable of going -// over all the generated results. -func (p *Pipe) Iter() *Iter { - iter := &Iter{ - session: p.session, - timeout: -1, - } - iter.gotReply.L = &iter.m - var result struct{ Result []bson.Raw } - c := p.collection - iter.err = c.Database.Run(bson.D{{"aggregate", c.Name}, {"pipeline", p.pipeline}}, &result) - if iter.err != nil { - return iter - } - for i := range result.Result { - iter.docData.Push(result.Result[i].Data) - } - return iter -} - -// All works like Iter.All. -func (p *Pipe) All(result interface{}) error { - return p.Iter().All(result) -} - -// One executes the pipeline and unmarshals the first item from the -// result set into the result parameter. -// It returns ErrNotFound if no items are generated by the pipeline. -func (p *Pipe) One(result interface{}) error { - iter := p.Iter() - if iter.Next(result) { - return nil - } - if err := iter.Err(); err != nil { - return err - } - return ErrNotFound -} - -type LastError struct { - Err string - Code, N, Waited int - FSyncFiles int `bson:"fsyncFiles"` - WTimeout bool - UpdatedExisting bool `bson:"updatedExisting"` - UpsertedId interface{} `bson:"upserted"` -} - -func (err *LastError) Error() string { - return err.Err -} - -type queryError struct { - Err string "$err" - ErrMsg string - Assertion string - Code int - AssertionCode int "assertionCode" - LastError *LastError "lastErrorObject" -} - -type QueryError struct { - Code int - Message string - Assertion bool -} - -func (err *QueryError) Error() string { - return err.Message -} - -// IsDup returns whether err informs of a duplicate key error because -// a primary key index or a secondary unique index already has an entry -// with the given value. -func IsDup(err error) bool { - // Besides being handy, helps with MongoDB bugs SERVER-7164 and SERVER-11493. - // What follows makes me sad. Hopefully conventions will be more clear over time. - switch e := err.(type) { - case *LastError: - return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 || e.Code == 16460 && strings.Contains(e.Err, " E11000 ") - case *QueryError: - return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 - } - return false -} - -// Insert inserts one or more documents in the respective collection. In -// case the session is in safe mode (see the SetSafe method) and an error -// happens while inserting the provided documents, the returned error will -// be of type *LastError. -func (c *Collection) Insert(docs ...interface{}) error { - _, err := c.writeQuery(&insertOp{c.FullName, docs, 0}) - return err -} - -// Update finds a single document matching the provided selector document -// and modifies it according to the update document. -// If the session is in safe mode (see SetSafe) a ErrNotFound error is -// returned if a document isn't found, or a value of type *LastError -// when some other error is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) Update(selector interface{}, update interface{}) error { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 0}) - if err == nil && lerr != nil && !lerr.UpdatedExisting { - return ErrNotFound - } - return err -} - -// UpdateId is a convenience helper equivalent to: -// -// err := collection.Update(bson.M{"_id": id}, update) -// -// See the Update method for more details. -func (c *Collection) UpdateId(id interface{}, update interface{}) error { - return c.Update(bson.D{{"_id", id}}, update) -} - -// ChangeInfo holds details about the outcome of an update operation. -type ChangeInfo struct { - Updated int // Number of existing documents updated - Removed int // Number of documents removed - UpsertedId interface{} // Upserted _id field, when not explicitly provided -} - -// UpdateAll finds all documents matching the provided selector document -// and modifies them according to the update document. -// If the session is in safe mode (see SetSafe) details of the executed -// operation are returned in info or an error of type *LastError when -// some problem is detected. It is not an error for the update to not be -// applied on any documents because the selector doesn't match. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) UpdateAll(selector interface{}, update interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 2}) - if err == nil && lerr != nil { - info = &ChangeInfo{Updated: lerr.N} - } - return info, err -} - -// Upsert finds a single document matching the provided selector document -// and modifies it according to the update document. If no document matching -// the selector is found, the update document is applied to the selector -// document and the result is inserted in the collection. -// If the session is in safe mode (see SetSafe) details of the executed -// operation are returned in info, or an error of type *LastError when -// some problem is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) Upsert(selector interface{}, update interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 1}) - if err == nil && lerr != nil { - info = &ChangeInfo{} - if lerr.UpdatedExisting { - info.Updated = lerr.N - } else { - info.UpsertedId = lerr.UpsertedId - } - } - return info, err -} - -// UpsertId is a convenience helper equivalent to: -// -// info, err := collection.Upsert(bson.M{"_id": id}, update) -// -// See the Upsert method for more details. -func (c *Collection) UpsertId(id interface{}, update interface{}) (info *ChangeInfo, err error) { - return c.Upsert(bson.D{{"_id", id}}, update) -} - -// Remove finds a single document matching the provided selector document -// and removes it from the database. -// If the session is in safe mode (see SetSafe) a ErrNotFound error is -// returned if a document isn't found, or a value of type *LastError -// when some other error is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Removing -// -func (c *Collection) Remove(selector interface{}) error { - lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 1}) - if err == nil && lerr != nil && lerr.N == 0 { - return ErrNotFound - } - return err -} - -// RemoveId is a convenience helper equivalent to: -// -// err := collection.Remove(bson.M{"_id": id}) -// -// See the Remove method for more details. -func (c *Collection) RemoveId(id interface{}) error { - return c.Remove(bson.D{{"_id", id}}) -} - -// RemoveAll finds all documents matching the provided selector document -// and removes them from the database. In case the session is in safe mode -// (see the SetSafe method) and an error happens when attempting the change, -// the returned error will be of type *LastError. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Removing -// -func (c *Collection) RemoveAll(selector interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 0}) - if err == nil && lerr != nil { - info = &ChangeInfo{Removed: lerr.N} - } - return info, err -} - -// DropDatabase removes the entire database including all of its collections. -func (db *Database) DropDatabase() error { - return db.Run(bson.D{{"dropDatabase", 1}}, nil) -} - -// DropCollection removes the entire collection including all of its documents. -func (c *Collection) DropCollection() error { - return c.Database.Run(bson.D{{"drop", c.Name}}, nil) -} - -// The CollectionInfo type holds metadata about a collection. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/createCollection+Command -// http://www.mongodb.org/display/DOCS/Capped+Collections -// -type CollectionInfo struct { - // DisableIdIndex prevents the automatic creation of the index - // on the _id field for the collection. - DisableIdIndex bool - - // ForceIdIndex enforces the automatic creation of the index - // on the _id field for the collection. Capped collections, - // for example, do not have such an index by default. - ForceIdIndex bool - - // If Capped is true new documents will replace old ones when - // the collection is full. MaxBytes must necessarily be set - // to define the size when the collection wraps around. - // MaxDocs optionally defines the number of documents when it - // wraps, but MaxBytes still needs to be set. - Capped bool - MaxBytes int - MaxDocs int -} - -// Create explicitly creates the c collection with details of info. -// MongoDB creates collections automatically on use, so this method -// is only necessary when creating collection with non-default -// characteristics, such as capped collections. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/createCollection+Command -// http://www.mongodb.org/display/DOCS/Capped+Collections -// -func (c *Collection) Create(info *CollectionInfo) error { - cmd := make(bson.D, 0, 4) - cmd = append(cmd, bson.DocElem{"create", c.Name}) - if info.Capped { - if info.MaxBytes < 1 { - return fmt.Errorf("Collection.Create: with Capped, MaxBytes must also be set") - } - cmd = append(cmd, bson.DocElem{"capped", true}) - cmd = append(cmd, bson.DocElem{"size", info.MaxBytes}) - if info.MaxDocs > 0 { - cmd = append(cmd, bson.DocElem{"max", info.MaxDocs}) - } - } - if info.DisableIdIndex { - cmd = append(cmd, bson.DocElem{"autoIndexId", false}) - } - if info.ForceIdIndex { - cmd = append(cmd, bson.DocElem{"autoIndexId", true}) - } - return c.Database.Run(cmd, nil) -} - -// Batch sets the batch size used when fetching documents from the database. -// It's possible to change this setting on a per-session basis as well, using -// the Batch method of Session. -// -// The default batch size is defined by the database itself. As of this -// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the -// first batch, and 4MB on remaining ones. -func (q *Query) Batch(n int) *Query { - if n == 1 { - // Server interprets 1 as -1 and closes the cursor (!?) - n = 2 - } - q.m.Lock() - q.op.limit = int32(n) - q.m.Unlock() - return q -} - -// Prefetch sets the point at which the next batch of results will be requested. -// When there are p*batch_size remaining documents cached in an Iter, the next -// batch will be requested in background. For instance, when using this: -// -// query.Batch(200).Prefetch(0.25) -// -// and there are only 50 documents cached in the Iter to be processed, the -// next batch of 200 will be requested. It's possible to change this setting on -// a per-session basis as well, using the SetPrefetch method of Session. -// -// The default prefetch value is 0.25. -func (q *Query) Prefetch(p float64) *Query { - q.m.Lock() - q.prefetch = p - q.m.Unlock() - return q -} - -// Skip skips over the n initial documents from the query results. Note that -// this only makes sense with capped collections where documents are naturally -// ordered by insertion time, or with sorted results. -func (q *Query) Skip(n int) *Query { - q.m.Lock() - q.op.skip = int32(n) - q.m.Unlock() - return q -} - -// Limit restricts the maximum number of documents retrieved to n, and also -// changes the batch size to the same value. Once n documents have been -// returned by Next, the following call will return ErrNotFound. -func (q *Query) Limit(n int) *Query { - q.m.Lock() - switch { - case n == 1: - q.limit = 1 - q.op.limit = -1 - case n == math.MinInt32: // -MinInt32 == -MinInt32 - q.limit = math.MaxInt32 - q.op.limit = math.MinInt32 + 1 - case n < 0: - q.limit = int32(-n) - q.op.limit = int32(n) - default: - q.limit = int32(n) - q.op.limit = int32(n) - } - q.m.Unlock() - return q -} - -// Select enables selecting which fields should be retrieved for the results -// found. For example, the following query would only retrieve the name field: -// -// err := collection.Find(nil).Select(bson.M{"name": 1}).One(&result) -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields -// -func (q *Query) Select(selector interface{}) *Query { - q.m.Lock() - q.op.selector = selector - q.m.Unlock() - return q -} - -// Sort asks the database to order returned documents according to the -// provided field names. A field name may be prefixed by - (minus) for -// it to be sorted in reverse order. -// -// For example: -// -// query1 := collection.Find(nil).Sort("firstname", "lastname") -// query2 := collection.Find(nil).Sort("-age") -// query3 := collection.Find(nil).Sort("$natural") -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order -// -func (q *Query) Sort(fields ...string) *Query { - // TODO // query4 := collection.Find(nil).Sort("score:{$meta:textScore}") - q.m.Lock() - var order bson.D - for _, field := range fields { - n := 1 - if field != "" { - switch field[0] { - case '+': - field = field[1:] - case '-': - n = -1 - field = field[1:] - } - } - if field == "" { - panic("Sort: empty field name") - } - order = append(order, bson.DocElem{field, n}) - } - q.op.options.OrderBy = order - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// Explain returns a number of details about how the MongoDB server would -// execute the requested query, such as the number of objects examined, -// the number of time the read lock was yielded to allow writes to go in, -// and so on. -// -// For example: -// -// m := bson.M{} -// err := collection.Find(bson.M{"filename": name}).Explain(m) -// if err == nil { -// fmt.Printf("Explain: %#v\n", m) -// } -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Optimization -// http://www.mongodb.org/display/DOCS/Query+Optimizer -// -func (q *Query) Explain(result interface{}) error { - q.m.Lock() - clone := &Query{session: q.session, query: q.query} - q.m.Unlock() - clone.op.options.Explain = true - clone.op.hasOptions = true - if clone.op.limit > 0 { - clone.op.limit = -q.op.limit - } - iter := clone.Iter() - if iter.Next(result) { - return nil - } - return iter.Close() -} - -// Hint will include an explicit "hint" in the query to force the server -// to use a specified index, potentially improving performance in some -// situations. The provided parameters are the fields that compose the -// key of the index to be used. For details on how the indexKey may be -// built, see the EnsureIndex method. -// -// For example: -// -// query := collection.Find(bson.M{"firstname": "Joe", "lastname": "Winter"}) -// query.Hint("lastname", "firstname") -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Optimization -// http://www.mongodb.org/display/DOCS/Query+Optimizer -// -func (q *Query) Hint(indexKey ...string) *Query { - q.m.Lock() - _, realKey, err := parseIndexKey(indexKey) - q.op.options.Hint = realKey - q.op.hasOptions = true - q.m.Unlock() - if err != nil { - panic(err) - } - return q -} - -// Snapshot will force the performed query to make use of an available -// index on the _id field to prevent the same document from being returned -// more than once in a single iteration. This might happen without this -// setting in situations when the document changes in size and thus has to -// be moved while the iteration is running. -// -// Because snapshot mode traverses the _id index, it may not be used with -// sorting or explicit hints. It also cannot use any other index for the -// query. -// -// Even with snapshot mode, items inserted or deleted during the query may -// or may not be returned; that is, this mode is not a true point-in-time -// snapshot. -// -// The same effect of Snapshot may be obtained by using any unique index on -// field(s) that will not be modified (best to use Hint explicitly too). -// A non-unique index (such as creation time) may be made unique by -// appending _id to the index when creating it. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database -// -func (q *Query) Snapshot() *Query { - q.m.Lock() - q.op.options.Snapshot = true - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// LogReplay enables an option that optimizes queries that are typically -// made on the MongoDB oplog for replaying it. This is an internal -// implementation aspect and most likely uninteresting for other uses. -// It has seen at least one use case, though, so it's exposed via the API. -func (q *Query) LogReplay() *Query { - q.m.Lock() - q.op.flags |= flagLogReplay - q.m.Unlock() - return q -} - -func checkQueryError(fullname string, d []byte) error { - l := len(d) - if l < 16 { - return nil - } - if d[5] == '$' && d[6] == 'e' && d[7] == 'r' && d[8] == 'r' && d[9] == '\x00' && d[4] == '\x02' { - goto Error - } - if len(fullname) < 5 || fullname[len(fullname)-5:] != ".$cmd" { - return nil - } - for i := 0; i+8 < l; i++ { - if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { - goto Error - } - } - return nil - -Error: - result := &queryError{} - bson.Unmarshal(d, result) - logf("queryError: %#v\n", result) - if result.LastError != nil { - return result.LastError - } - if result.Err == "" && result.ErrMsg == "" { - return nil - } - if result.AssertionCode != 0 && result.Assertion != "" { - return &QueryError{Code: result.AssertionCode, Message: result.Assertion, Assertion: true} - } - if result.Err != "" { - return &QueryError{Code: result.Code, Message: result.Err} - } - return &QueryError{Code: result.Code, Message: result.ErrMsg} -} - -// One executes the query and unmarshals the first obtained document into the -// result argument. The result must be a struct or map value capable of being -// unmarshalled into by gobson. This function blocks until either a result -// is available or an error happens. For example: -// -// err := collection.Find(bson.M{"a", 1}).One(&result) -// -// In case the resulting document includes a field named $err or errmsg, which -// are standard ways for MongoDB to return query errors, the returned err will -// be set to a *QueryError value including the Err message and the Code. In -// those cases, the result argument is still unmarshalled into with the -// received document so that any other custom values may be obtained if -// desired. -// -func (q *Query) One(result interface{}) (err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - socket, err := session.acquireSocket(true) - if err != nil { - return err - } - defer socket.Release() - - op.flags |= session.slaveOkFlag() - op.limit = -1 - - data, err := socket.SimpleQuery(&op) - if err != nil { - return err - } - if data == nil { - return ErrNotFound - } - if result != nil { - err = bson.Unmarshal(data, result) - if err == nil { - debugf("Query %p document unmarshaled: %#v", q, result) - } else { - debugf("Query %p document unmarshaling failed: %#v", q, err) - return err - } - } - return checkQueryError(op.collection, data) -} - -// The DBRef type implements support for the database reference MongoDB -// convention as supported by multiple drivers. This convention enables -// cross-referencing documents between collections and databases using -// a structure which includes a collection name, a document id, and -// optionally a database name. -// -// See the FindRef methods on Session and on Database. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -type DBRef struct { - Collection string `bson:"$ref"` - Id interface{} `bson:"$id"` - Database string `bson:"$db,omitempty"` -} - -// NOTE: Order of fields for DBRef above does matter, per documentation. - -// FindRef returns a query that looks for the document in the provided -// reference. If the reference includes the DB field, the document will -// be retrieved from the respective database. -// -// See also the DBRef type and the FindRef method on Session. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -func (db *Database) FindRef(ref *DBRef) *Query { - var c *Collection - if ref.Database == "" { - c = db.C(ref.Collection) - } else { - c = db.Session.DB(ref.Database).C(ref.Collection) - } - return c.FindId(ref.Id) -} - -// FindRef returns a query that looks for the document in the provided -// reference. For a DBRef to be resolved correctly at the session level -// it must necessarily have the optional DB field defined. -// -// See also the DBRef type and the FindRef method on Database. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -func (s *Session) FindRef(ref *DBRef) *Query { - if ref.Database == "" { - panic(errors.New(fmt.Sprintf("Can't resolve database for %#v", ref))) - } - c := s.DB(ref.Database).C(ref.Collection) - return c.FindId(ref.Id) -} - -// CollectionNames returns the collection names present in database. -func (db *Database) CollectionNames() (names []string, err error) { - c := len(db.Name) + 1 - iter := db.C("system.namespaces").Find(nil).Iter() - var result *struct{ Name string } - for iter.Next(&result) { - if strings.Index(result.Name, "$") < 0 || strings.Index(result.Name, ".oplog.$") >= 0 { - names = append(names, result.Name[c:]) - } - } - if err := iter.Close(); err != nil { - return nil, err - } - sort.Strings(names) - return names, nil -} - -type dbNames struct { - Databases []struct { - Name string - Empty bool - } -} - -// DatabaseNames returns the names of non-empty databases present in the cluster. -func (s *Session) DatabaseNames() (names []string, err error) { - var result dbNames - err = s.Run("listDatabases", &result) - if err != nil { - return nil, err - } - for _, db := range result.Databases { - if !db.Empty { - names = append(names, db.Name) - } - } - sort.Strings(names) - return names, nil -} - -// Iter executes the query and returns an iterator capable of going over all -// the results. Results will be returned in batches of configurable -// size (see the Batch method) and more documents will be requested when a -// configurable number of documents is iterated over (see the Prefetch method). -func (q *Query) Iter() *Iter { - q.m.Lock() - session := q.session - op := q.op - prefetch := q.prefetch - limit := q.limit - q.m.Unlock() - - iter := &Iter{ - session: session, - prefetch: prefetch, - limit: limit, - timeout: -1, - } - iter.gotReply.L = &iter.m - iter.op.collection = op.collection - iter.op.limit = op.limit - iter.op.replyFunc = iter.replyFunc() - iter.docsToReceive++ - op.replyFunc = iter.op.replyFunc - op.flags |= session.slaveOkFlag() - - socket, err := session.acquireSocket(true) - if err != nil { - iter.err = err - } else { - iter.server = socket.Server() - err = socket.Query(&op) - if err != nil { - // Must lock as the query above may call replyFunc. - iter.m.Lock() - iter.err = err - iter.m.Unlock() - } - socket.Release() - } - return iter -} - -// Tail returns a tailable iterator. Unlike a normal iterator, a -// tailable iterator may wait for new values to be inserted in the -// collection once the end of the current result set is reached, -// A tailable iterator may only be used with capped collections. -// -// The timeout parameter indicates how long Next will block waiting -// for a result before timing out. If set to -1, Next will not -// timeout, and will continue waiting for a result for as long as -// the cursor is valid and the session is not closed. If set to 0, -// Next times out as soon as it reaches the end of the result set. -// Otherwise, Next will wait for at least the given number of -// seconds for a new document to be available before timing out. -// -// On timeouts, Next will unblock and return false, and the Timeout -// method will return true if called. In these cases, Next may still -// be called again on the same iterator to check if a new value is -// available at the current cursor position, and again it will block -// according to the specified timeoutSecs. If the cursor becomes -// invalid, though, both Next and Timeout will return false and -// the query must be restarted. -// -// The following example demonstrates timeout handling and query -// restarting: -// -// iter := collection.Find(nil).Sort("$natural").Tail(5 * time.Second) -// for { -// for iter.Next(&result) { -// fmt.Println(result.Id) -// lastId = result.Id -// } -// if iter.Err() != nil { -// return iter.Close() -// } -// if iter.Timeout() { -// continue -// } -// query := collection.Find(bson.M{"_id": bson.M{"$gt": lastId}}) -// iter = query.Sort("$natural").Tail(5 * time.Second) -// } -// iter.Close() -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Tailable+Cursors -// http://www.mongodb.org/display/DOCS/Capped+Collections -// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order -// -func (q *Query) Tail(timeout time.Duration) *Iter { - q.m.Lock() - session := q.session - op := q.op - prefetch := q.prefetch - q.m.Unlock() - - iter := &Iter{session: session, prefetch: prefetch} - iter.gotReply.L = &iter.m - iter.timeout = timeout - iter.op.collection = op.collection - iter.op.limit = op.limit - iter.op.replyFunc = iter.replyFunc() - iter.docsToReceive++ - op.replyFunc = iter.op.replyFunc - op.flags |= flagTailable | flagAwaitData | session.slaveOkFlag() - - socket, err := session.acquireSocket(true) - if err != nil { - iter.err = err - } else { - iter.server = socket.Server() - err = socket.Query(&op) - if err != nil { - // Must lock as the query above may call replyFunc. - iter.m.Lock() - iter.err = err - iter.m.Unlock() - } - socket.Release() - } - return iter -} - -func (s *Session) slaveOkFlag() (flag queryOpFlags) { - s.m.RLock() - if s.slaveOk { - flag = flagSlaveOk - } - s.m.RUnlock() - return -} - -// Err returns nil if no errors happened during iteration, or the actual -// error otherwise. -// -// In case a resulting document included a field named $err or errmsg, which are -// standard ways for MongoDB to report an improper query, the returned value has -// a *QueryError type, and includes the Err message and the Code. -func (iter *Iter) Err() error { - iter.m.Lock() - err := iter.err - iter.m.Unlock() - if err == ErrNotFound { - return nil - } - return err -} - -// Close kills the server cursor used by the iterator, if any, and returns -// nil if no errors happened during iteration, or the actual error otherwise. -// -// Server cursors are automatically closed at the end of an iteration, which -// means close will do nothing unless the iteration was interrupted before -// the server finished sending results to the driver. If Close is not called -// in such a situation, the cursor will remain available at the server until -// the default cursor timeout period is reached. No further problems arise. -// -// Close is idempotent. That means it can be called repeatedly and will -// return the same result every time. -// -// In case a resulting document included a field named $err or errmsg, which are -// standard ways for MongoDB to report an improper query, the returned value has -// a *QueryError type. -func (iter *Iter) Close() error { - iter.m.Lock() - iter.killCursor() - err := iter.err - iter.m.Unlock() - if err == ErrNotFound { - return nil - } - return err -} - -func (iter *Iter) killCursor() error { - if iter.op.cursorId != 0 { - socket, err := iter.acquireSocket() - if err == nil { - // TODO Batch kills. - err = socket.Query(&killCursorsOp{[]int64{iter.op.cursorId}}) - socket.Release() - } - if err != nil && (iter.err == nil || iter.err == ErrNotFound) { - iter.err = err - } - iter.op.cursorId = 0 - return err - } - return nil -} - -// Timeout returns true if Next returned false due to a timeout of -// a tailable cursor. In those cases, Next may be called again to continue -// the iteration at the previous cursor position. -func (iter *Iter) Timeout() bool { - iter.m.Lock() - result := iter.timedout - iter.m.Unlock() - return result -} - -// Next retrieves the next document from the result set, blocking if necessary. -// This method will also automatically retrieve another batch of documents from -// the server when the current one is exhausted, or before that in background -// if pre-fetching is enabled (see the Query.Prefetch and Session.SetPrefetch -// methods). -// -// Next returns true if a document was successfully unmarshalled onto result, -// and false at the end of the result set or if an error happened. -// When Next returns false, the Err method should be called to verify if -// there was an error during iteration. -// -// For example: -// -// iter := collection.Find(nil).Iter() -// for iter.Next(&result) { -// fmt.Printf("Result: %v\n", result.Id) -// } -// if err := iter.Close(); err != nil { -// return err -// } -// -func (iter *Iter) Next(result interface{}) bool { - iter.m.Lock() - iter.timedout = false - timeout := time.Time{} - for iter.err == nil && iter.docData.Len() == 0 && (iter.docsToReceive > 0 || iter.op.cursorId != 0) { - if iter.docsToReceive == 0 { - if iter.timeout >= 0 { - if timeout.IsZero() { - timeout = time.Now().Add(iter.timeout) - } - if time.Now().After(timeout) { - iter.timedout = true - iter.m.Unlock() - return false - } - } - iter.getMore() - if iter.err != nil { - break - } - } - iter.gotReply.Wait() - } - - // Exhaust available data before reporting any errors. - if docData, ok := iter.docData.Pop().([]byte); ok { - if iter.limit > 0 { - iter.limit-- - if iter.limit == 0 { - if iter.docData.Len() > 0 { - iter.m.Unlock() - panic(fmt.Errorf("data remains after limit exhausted: %d", iter.docData.Len())) - } - iter.err = ErrNotFound - if iter.killCursor() != nil { - iter.m.Unlock() - return false - } - } - } - if iter.op.cursorId != 0 && iter.err == nil { - if iter.docsBeforeMore == 0 { - iter.getMore() - } - iter.docsBeforeMore-- // Goes negative. - } - iter.m.Unlock() - err := bson.Unmarshal(docData, result) - if err != nil { - debugf("Iter %p document unmarshaling failed: %#v", iter, err) - iter.m.Lock() - if iter.err == nil { - iter.err = err - } - iter.m.Unlock() - return false - } - debugf("Iter %p document unmarshaled: %#v", iter, result) - // XXX Only have to check first document for a query error? - err = checkQueryError(iter.op.collection, docData) - if err != nil { - iter.m.Lock() - if iter.err == nil { - iter.err = err - } - iter.m.Unlock() - return false - } - return true - } else if iter.err != nil { - debugf("Iter %p returning false: %s", iter, iter.err) - iter.m.Unlock() - return false - } else if iter.op.cursorId == 0 { - iter.err = ErrNotFound - debugf("Iter %p exhausted with cursor=0", iter) - iter.m.Unlock() - return false - } - - panic("unreachable") -} - -// All retrieves all documents from the result set into the provided slice -// and closes the iterator. -// -// The result argument must necessarily be the address for a slice. The slice -// may be nil or previously allocated. -// -// WARNING: Obviously, All must not be used with result sets that may be -// potentially large, since it may consume all memory until the system -// crashes. Consider building the query with a Limit clause to ensure the -// result size is bounded. -// -// For instance: -// -// var result []struct{ Value int } -// iter := collection.Find(nil).Limit(100).Iter() -// err := iter.All(&result) -// if err != nil { -// return err -// } -// -func (iter *Iter) All(result interface{}) error { - resultv := reflect.ValueOf(result) - if resultv.Kind() != reflect.Ptr || resultv.Elem().Kind() != reflect.Slice { - panic("result argument must be a slice address") - } - slicev := resultv.Elem() - slicev = slicev.Slice(0, slicev.Cap()) - elemt := slicev.Type().Elem() - i := 0 - for { - if slicev.Len() == i { - elemp := reflect.New(elemt) - if !iter.Next(elemp.Interface()) { - break - } - slicev = reflect.Append(slicev, elemp.Elem()) - slicev = slicev.Slice(0, slicev.Cap()) - } else { - if !iter.Next(slicev.Index(i).Addr().Interface()) { - break - } - } - i++ - } - resultv.Elem().Set(slicev.Slice(0, i)) - return iter.Close() -} - -// All works like Iter.All. -func (q *Query) All(result interface{}) error { - return q.Iter().All(result) -} - -// The For method is obsolete and will be removed in a future release. -// See Iter as an elegant replacement. -func (q *Query) For(result interface{}, f func() error) error { - return q.Iter().For(result, f) -} - -// The For method is obsolete and will be removed in a future release. -// See Iter as an elegant replacement. -func (iter *Iter) For(result interface{}, f func() error) (err error) { - valid := false - v := reflect.ValueOf(result) - if v.Kind() == reflect.Ptr { - v = v.Elem() - switch v.Kind() { - case reflect.Map, reflect.Ptr, reflect.Interface, reflect.Slice: - valid = v.IsNil() - } - } - if !valid { - panic("For needs a pointer to nil reference value. See the documentation.") - } - zero := reflect.Zero(v.Type()) - for { - v.Set(zero) - if !iter.Next(result) { - break - } - err = f() - if err != nil { - return err - } - } - return iter.Err() -} - -func (iter *Iter) acquireSocket() (*mongoSocket, error) { - socket, err := iter.session.acquireSocket(true) - if err != nil { - return nil, err - } - if socket.Server() != iter.server { - // Socket server changed during iteration. This may happen - // with Eventual sessions, if a Refresh is done, or if a - // monotonic session gets a write and shifts from secondary - // to primary. Our cursor is in a specific server, though. - iter.session.m.Lock() - sockTimeout := iter.session.sockTimeout - iter.session.m.Unlock() - socket.Release() - socket, _, err = iter.server.AcquireSocket(0, sockTimeout) - if err != nil { - return nil, err - } - err := iter.session.socketLogin(socket) - if err != nil { - socket.Release() - return nil, err - } - } - return socket, nil -} - -func (iter *Iter) getMore() { - socket, err := iter.acquireSocket() - if err != nil { - iter.err = err - return - } - defer socket.Release() - - debugf("Iter %p requesting more documents", iter) - if iter.limit > 0 { - limit := iter.limit - int32(iter.docsToReceive) - int32(iter.docData.Len()) - if limit < iter.op.limit { - iter.op.limit = limit - } - } - if err := socket.Query(&iter.op); err != nil { - iter.err = err - } - iter.docsToReceive++ -} - -type countCmd struct { - Count string - Query interface{} - Limit int32 ",omitempty" - Skip int32 ",omitempty" -} - -// Count returns the total number of documents in the result set. -func (q *Query) Count() (n int, err error) { - q.m.Lock() - session := q.session - op := q.op - limit := q.limit - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return 0, errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - result := struct{ N int }{} - err = session.DB(dbname).Run(countCmd{cname, op.query, limit, op.skip}, &result) - return result.N, err -} - -// Count returns the total number of documents in the collection. -func (c *Collection) Count() (n int, err error) { - return c.Find(nil).Count() -} - -type distinctCmd struct { - Collection string "distinct" - Key string - Query interface{} ",omitempty" -} - -// Distinct returns a list of distinct values for the given key within -// the result set. The list of distinct values will be unmarshalled -// in the "values" key of the provided result parameter. -// -// For example: -// -// var result []int -// err := collection.Find(bson.M{"gender": "F"}).Distinct("age", &result) -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Aggregation -// -func (q *Query) Distinct(key string, result interface{}) error { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - var doc struct{ Values bson.Raw } - err := session.DB(dbname).Run(distinctCmd{cname, key, op.query}, &doc) - if err != nil { - return err - } - return doc.Values.Unmarshal(result) -} - -type mapReduceCmd struct { - Collection string "mapreduce" - Map string ",omitempty" - Reduce string ",omitempty" - Finalize string ",omitempty" - Limit int32 ",omitempty" - Out interface{} - Query interface{} ",omitempty" - Sort interface{} ",omitempty" - Scope interface{} ",omitempty" - Verbose bool ",omitempty" -} - -type mapReduceResult struct { - Results bson.Raw - Result bson.Raw - TimeMillis int64 "timeMillis" - Counts struct{ Input, Emit, Output int } - Ok bool - Err string - Timing *MapReduceTime -} - -type MapReduce struct { - Map string // Map Javascript function code (required) - Reduce string // Reduce Javascript function code (required) - Finalize string // Finalize Javascript function code (optional) - Out interface{} // Output collection name or document. If nil, results are inlined into the result parameter. - Scope interface{} // Optional global scope for Javascript functions - Verbose bool -} - -type MapReduceInfo struct { - InputCount int // Number of documents mapped - EmitCount int // Number of times reduce called emit - OutputCount int // Number of documents in resulting collection - Database string // Output database, if results are not inlined - Collection string // Output collection, if results are not inlined - Time int64 // Time to run the job, in nanoseconds - VerboseTime *MapReduceTime // Only defined if Verbose was true -} - -type MapReduceTime struct { - Total int64 // Total time, in nanoseconds - Map int64 "mapTime" // Time within map function, in nanoseconds - EmitLoop int64 "emitLoop" // Time within the emit/map loop, in nanoseconds -} - -// MapReduce executes a map/reduce job for documents covered by the query. -// That kind of job is suitable for very flexible bulk aggregation of data -// performed at the server side via Javascript functions. -// -// Results from the job may be returned as a result of the query itself -// through the result parameter in case they'll certainly fit in memory -// and in a single document. If there's the possibility that the amount -// of data might be too large, results must be stored back in an alternative -// collection or even a separate database, by setting the Out field of the -// provided MapReduce job. In that case, provide nil as the result parameter. -// -// These are some of the ways to set Out: -// -// nil -// Inline results into the result parameter. -// -// bson.M{"replace": "mycollection"} -// The output will be inserted into a collection which replaces any -// existing collection with the same name. -// -// bson.M{"merge": "mycollection"} -// This option will merge new data into the old output collection. In -// other words, if the same key exists in both the result set and the -// old collection, the new key will overwrite the old one. -// -// bson.M{"reduce": "mycollection"} -// If documents exist for a given key in the result set and in the old -// collection, then a reduce operation (using the specified reduce -// function) will be performed on the two values and the result will be -// written to the output collection. If a finalize function was -// provided, this will be run after the reduce as well. -// -// bson.M{...., "db": "mydb"} -// Any of the above options can have the "db" key included for doing -// the respective action in a separate database. -// -// The following is a trivial example which will count the number of -// occurrences of a field named n on each document in a collection, and -// will return results inline: -// -// job := &mgo.MapReduce{ -// Map: "function() { emit(this.n, 1) }", -// Reduce: "function(key, values) { return Array.sum(values) }", -// } -// var result []struct { Id int "_id"; Value int } -// _, err := collection.Find(nil).MapReduce(job, &result) -// if err != nil { -// return err -// } -// for _, item := range result { -// fmt.Println(item.Value) -// } -// -// This function is compatible with MongoDB 1.7.4+. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/MapReduce -// -func (q *Query) MapReduce(job *MapReduce, result interface{}) (info *MapReduceInfo, err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - limit := q.limit - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return nil, errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - cmd := mapReduceCmd{ - Collection: cname, - Map: job.Map, - Reduce: job.Reduce, - Finalize: job.Finalize, - Out: fixMROut(job.Out), - Scope: job.Scope, - Verbose: job.Verbose, - Query: op.query, - Sort: op.options.OrderBy, - Limit: limit, - } - - if cmd.Out == nil { - cmd.Out = bson.M{"inline": 1} - } - - var doc mapReduceResult - err = session.DB(dbname).Run(&cmd, &doc) - if err != nil { - return nil, err - } - if doc.Err != "" { - return nil, errors.New(doc.Err) - } - - info = &MapReduceInfo{ - InputCount: doc.Counts.Input, - EmitCount: doc.Counts.Emit, - OutputCount: doc.Counts.Output, - Time: doc.TimeMillis * 1e6, - } - - if doc.Result.Kind == 0x02 { - err = doc.Result.Unmarshal(&info.Collection) - info.Database = dbname - } else if doc.Result.Kind == 0x03 { - var v struct{ Collection, Db string } - err = doc.Result.Unmarshal(&v) - info.Collection = v.Collection - info.Database = v.Db - } - - if doc.Timing != nil { - info.VerboseTime = doc.Timing - info.VerboseTime.Total *= 1e6 - info.VerboseTime.Map *= 1e6 - info.VerboseTime.EmitLoop *= 1e6 - } - - if err != nil { - return nil, err - } - if result != nil { - return info, doc.Results.Unmarshal(result) - } - return info, nil -} - -// The "out" option in the MapReduce command must be ordered. This was -// found after the implementation was accepting maps for a long time, -// so rather than breaking the API, we'll fix the order if necessary. -// Details about the order requirement may be seen in MongoDB's code: -// -// http://goo.gl/L8jwJX -// -func fixMROut(out interface{}) interface{} { - outv := reflect.ValueOf(out) - if outv.Kind() != reflect.Map || outv.Type().Key() != reflect.TypeOf("") { - return out - } - outs := make(bson.D, outv.Len()) - - outTypeIndex := -1 - for i, k := range outv.MapKeys() { - ks := k.String() - outs[i].Name = ks - outs[i].Value = outv.MapIndex(k).Interface() - switch ks { - case "normal", "replace", "merge", "reduce", "inline": - outTypeIndex = i - } - } - if outTypeIndex > 0 { - outs[0], outs[outTypeIndex] = outs[outTypeIndex], outs[0] - } - return outs -} - -// Change holds fields for running a findAndModify MongoDB command via -// the Query.Apply method. -type Change struct { - Update interface{} // The update document - Upsert bool // Whether to insert in case the document isn't found - Remove bool // Whether to remove the document found rather than updating - ReturnNew bool // Should the modified document be returned rather than the old one -} - -type findModifyCmd struct { - Collection string "findAndModify" - Query, Update, Sort, Fields interface{} ",omitempty" - Upsert, Remove, New bool ",omitempty" -} - -type valueResult struct { - Value bson.Raw - LastError LastError "lastErrorObject" -} - -// Apply runs the findAndModify MongoDB command, which allows updating, upserting -// or removing a document matching a query and atomically returning either the old -// version (the default) or the new version of the document (when ReturnNew is true). -// If no objects are found Apply returns ErrNotFound. -// -// The Sort and Select query methods affect the result of Apply. In case -// multiple documents match the query, Sort enables selecting which document to -// act upon by ordering it first. Select enables retrieving only a selection -// of fields of the new or old document. -// -// This simple example increments a counter and prints its new value: -// -// change := mgo.Change{ -// Update: bson.M{"$inc": bson.M{"n": 1}}, -// ReturnNew: true, -// } -// info, err = col.Find(M{"_id": id}).Apply(change, &doc) -// fmt.Println(doc.N) -// -// This method depends on MongoDB >= 2.0 to work properly. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/findAndModify+Command -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (q *Query) Apply(change Change, result interface{}) (info *ChangeInfo, err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return nil, errors.New("bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - cmd := findModifyCmd{ - Collection: cname, - Update: change.Update, - Upsert: change.Upsert, - Remove: change.Remove, - New: change.ReturnNew, - Query: op.query, - Sort: op.options.OrderBy, - Fields: op.selector, - } - - session = session.Clone() - defer session.Close() - session.SetMode(Strong, false) - - var doc valueResult - err = session.DB(dbname).Run(&cmd, &doc) - if err != nil { - if qerr, ok := err.(*QueryError); ok && qerr.Message == "No matching object found" { - return nil, ErrNotFound - } - return nil, err - } - if doc.LastError.N == 0 { - return nil, ErrNotFound - } - if doc.Value.Kind != 0x0A { - err = doc.Value.Unmarshal(result) - if err != nil { - return nil, err - } - } - info = &ChangeInfo{} - lerr := &doc.LastError - if lerr.UpdatedExisting { - info.Updated = lerr.N - } else if change.Remove { - info.Removed = lerr.N - } else if change.Upsert { - info.UpsertedId = lerr.UpsertedId - } - return info, nil -} - -// The BuildInfo type encapsulates details about the running MongoDB server. -// -// Note that the VersionArray field was introduced in MongoDB 2.0+, but it is -// internally assembled from the Version information for previous versions. -// In both cases, VersionArray is guaranteed to have at least 4 entries. -type BuildInfo struct { - Version string - VersionArray []int `bson:"versionArray"` // On MongoDB 2.0+; assembled from Version otherwise - GitVersion string `bson:"gitVersion"` - SysInfo string `bson:"sysInfo"` - Bits int - Debug bool - MaxObjectSize int `bson:"maxBsonObjectSize"` -} - -// VersionAtLeast returns whether the BuildInfo version is greater than or -// equal to the provided version number. If more than one number is -// provided, numbers will be considered as major, minor, and so on. -func (bi *BuildInfo) VersionAtLeast(version ...int) bool { - for i := range version { - if i == len(bi.VersionArray) { - return false - } - if bi.VersionArray[i] < version[i] { - return false - } - } - return true -} - -// BuildInfo retrieves the version and other details about the -// running MongoDB server. -func (s *Session) BuildInfo() (info BuildInfo, err error) { - err = s.Run(bson.D{{"buildInfo", "1"}}, &info) - if len(info.VersionArray) == 0 { - for _, a := range strings.Split(info.Version, ".") { - i, err := strconv.Atoi(a) - if err != nil { - break - } - info.VersionArray = append(info.VersionArray, i) - } - } - for len(info.VersionArray) < 4 { - info.VersionArray = append(info.VersionArray, 0) - } - return -} - -// --------------------------------------------------------------------------- -// Internal session handling helpers. - -func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) { - - // Read-only lock to check for previously reserved socket. - s.m.RLock() - if s.masterSocket != nil { - socket := s.masterSocket - socket.Acquire() - s.m.RUnlock() - return socket, nil - } - if s.slaveSocket != nil && s.slaveOk && slaveOk { - socket := s.slaveSocket - socket.Acquire() - s.m.RUnlock() - return socket, nil - } - s.m.RUnlock() - - // No go. We may have to request a new socket and change the session, - // so try again but with an exclusive lock now. - s.m.Lock() - defer s.m.Unlock() - - if s.masterSocket != nil { - s.masterSocket.Acquire() - return s.masterSocket, nil - } - if s.slaveSocket != nil && s.slaveOk && slaveOk { - s.slaveSocket.Acquire() - return s.slaveSocket, nil - } - - // Still not good. We need a new socket. - sock, err := s.cluster().AcquireSocket(slaveOk && s.slaveOk, s.syncTimeout, s.sockTimeout, s.queryConfig.op.serverTags) - if err != nil { - return nil, err - } - - // Authenticate the new socket. - if err = s.socketLogin(sock); err != nil { - sock.Release() - return nil, err - } - - // Keep track of the new socket, if necessary. - // Note that, as a special case, if the Eventual session was - // not refreshed (s.slaveSocket != nil), it means the developer - // asked to preserve an existing reserved socket, so we'll - // keep a master one around too before a Refresh happens. - if s.consistency != Eventual || s.slaveSocket != nil { - s.setSocket(sock) - } - - // Switch over a Monotonic session to the master. - if !slaveOk && s.consistency == Monotonic { - s.slaveOk = false - } - - return sock, nil -} - -// setSocket binds socket to this section. -func (s *Session) setSocket(socket *mongoSocket) { - info := socket.Acquire() - if info.Master { - if s.masterSocket != nil { - panic("setSocket(master) with existing master socket reserved") - } - s.masterSocket = socket - } else { - if s.slaveSocket != nil { - panic("setSocket(slave) with existing slave socket reserved") - } - s.slaveSocket = socket - } -} - -// unsetSocket releases any slave and/or master sockets reserved. -func (s *Session) unsetSocket() { - if s.masterSocket != nil { - s.masterSocket.Release() - } - if s.slaveSocket != nil { - s.slaveSocket.Release() - } - s.masterSocket = nil - s.slaveSocket = nil -} - -func (iter *Iter) replyFunc() replyFunc { - return func(err error, op *replyOp, docNum int, docData []byte) { - iter.m.Lock() - iter.docsToReceive-- - if err != nil { - iter.err = err - debugf("Iter %p received an error: %s", iter, err.Error()) - } else if docNum == -1 { - debugf("Iter %p received no documents (cursor=%d).", iter, op.cursorId) - if op != nil && op.cursorId != 0 { - // It's a tailable cursor. - iter.op.cursorId = op.cursorId - } else { - iter.err = ErrNotFound - } - } else { - rdocs := int(op.replyDocs) - if docNum == 0 { - iter.docsToReceive += rdocs - 1 - docsToProcess := iter.docData.Len() + rdocs - if iter.limit == 0 || int32(docsToProcess) < iter.limit { - iter.docsBeforeMore = docsToProcess - int(iter.prefetch*float64(rdocs)) - } else { - iter.docsBeforeMore = -1 - } - iter.op.cursorId = op.cursorId - } - // XXX Handle errors and flags. - debugf("Iter %p received reply document %d/%d (cursor=%d)", iter, docNum+1, rdocs, op.cursorId) - iter.docData.Push(docData) - } - iter.gotReply.Broadcast() - iter.m.Unlock() - } -} - -// writeQuery runs the given modifying operation, potentially followed up -// by a getLastError command in case the session is in safe mode. The -// LastError result is made available in lerr, and if lerr.Err is set it -// will also be returned as err. -func (c *Collection) writeQuery(op interface{}) (lerr *LastError, err error) { - s := c.Database.Session - dbname := c.Database.Name - socket, err := s.acquireSocket(dbname == "local") - if err != nil { - return nil, err - } - defer socket.Release() - - s.m.RLock() - safeOp := s.safeOp - s.m.RUnlock() - - if safeOp == nil { - return nil, socket.Query(op) - } else { - var mutex sync.Mutex - var replyData []byte - var replyErr error - mutex.Lock() - query := *safeOp // Copy the data. - query.collection = dbname + ".$cmd" - query.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - replyData = docData - replyErr = err - mutex.Unlock() - } - err = socket.Query(op, &query) - if err != nil { - return nil, err - } - mutex.Lock() // Wait. - if replyErr != nil { - return nil, replyErr // XXX TESTME - } - if hasErrMsg(replyData) { - // Looks like getLastError itself failed. - err = checkQueryError(query.collection, replyData) - if err != nil { - return nil, err - } - } - result := &LastError{} - bson.Unmarshal(replyData, &result) - debugf("Result from writing query: %#v", result) - if result.Err != "" { - return result, result - } - return result, nil - } - panic("unreachable") -} - -func hasErrMsg(d []byte) bool { - l := len(d) - for i := 0; i+8 < l; i++ { - if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { - return true - } - } - return false -} diff --git a/vendor/labix.org/v2/mgo/session_test.go b/vendor/labix.org/v2/mgo/session_test.go deleted file mode 100644 index e9f90f5..0000000 --- a/vendor/labix.org/v2/mgo/session_test.go +++ /dev/null @@ -1,3260 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "flag" - "fmt" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" - "math" - "reflect" - "runtime" - "sort" - "strconv" - "strings" - "time" -) - -func (s *S) TestRunString(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestRunValue(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run(M{"ping": 1}, &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestPing(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Just ensure the nonce has been received. - result := struct{}{} - err = session.Run("ping", &result) - - mgo.ResetStats() - - err = session.Ping() - c.Assert(err, IsNil) - - // Pretty boring. - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 1) - c.Assert(stats.ReceivedOps, Equals, 1) -} - -func (s *S) TestURLSingle(c *C) { - session, err := mgo.Dial("mongodb://localhost:40001/") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestURLMany(c *C) { - session, err := mgo.Dial("mongodb://localhost:40011,localhost:40012/") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestURLParsing(c *C) { - urls := []string{ - "localhost:40001?foo=1&bar=2", - "localhost:40001?foo=1;bar=2", - } - for _, url := range urls { - session, err := mgo.Dial(url) - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "unsupported connection URL option: (foo=1|bar=2)") - } -} - -func (s *S) TestInsertFindOne(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 1, "b": 3}) - c.Assert(err, IsNil) - - result := struct{ A, B int }{} - - err = coll.Find(M{"a": 1}).Sort("b").One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 1) - c.Assert(result.B, Equals, 2) -} - -func (s *S) TestInsertFindOneNil(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Find(nil).One(nil) - c.Assert(err, ErrorMatches, "unauthorized.*|not authorized.*") -} - -func (s *S) TestInsertFindOneMap(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - result := make(M) - err = coll.Find(M{"a": 1}).One(result) - c.Assert(err, IsNil) - c.Assert(result["a"], Equals, 1) - c.Assert(result["b"], Equals, 2) -} - -func (s *S) TestInsertFindAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 3, "b": 4}) - c.Assert(err, IsNil) - - type R struct{ A, B int } - var result []R - - assertResult := func() { - c.Assert(len(result), Equals, 2) - c.Assert(result[0].A, Equals, 1) - c.Assert(result[0].B, Equals, 2) - c.Assert(result[1].A, Equals, 3) - c.Assert(result[1].B, Equals, 4) - } - - // nil slice - err = coll.Find(nil).Sort("a").All(&result) - c.Assert(err, IsNil) - assertResult() - - // Previously allocated slice - allocd := make([]R, 5) - result = allocd - err = coll.Find(nil).Sort("a").All(&result) - c.Assert(err, IsNil) - assertResult() - - // Ensure result is backed by the originally allocated array - c.Assert(&result[0], Equals, &allocd[0]) - - // Non-pointer slice error - f := func() { coll.Find(nil).All(result) } - c.Assert(f, Panics, "result argument must be a slice address") - - // Non-slice error - f = func() { coll.Find(nil).All(new(int)) } - c.Assert(f, Panics, "result argument must be a slice address") -} - -func (s *S) TestFindRef(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1col1 := db1.C("col1") - - db2 := session.DB("db2") - db2col1 := db2.C("col1") - - err = db1col1.Insert(M{"_id": 1, "n": 1}) - c.Assert(err, IsNil) - err = db1col1.Insert(M{"_id": 2, "n": 2}) - c.Assert(err, IsNil) - err = db2col1.Insert(M{"_id": 2, "n": 3}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - ref1 := &mgo.DBRef{Collection: "col1", Id: 1} - ref2 := &mgo.DBRef{Collection: "col1", Id: 2, Database: "db2"} - - err = db1.FindRef(ref1).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) - - err = db1.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - err = db2.FindRef(ref1).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = db2.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - err = session.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - f := func() { session.FindRef(ref1).One(&result) } - c.Assert(f, PanicMatches, "Can't resolve database for &mgo.DBRef{Collection:\"col1\", Id:1, Database:\"\"}") -} - -func (s *S) TestDatabaseAndCollectionNames(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1col1 := db1.C("col1") - db1col2 := db1.C("col2") - - db2 := session.DB("db2") - db2col1 := db2.C("col3") - - err = db1col1.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = db1col2.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = db2col1.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - names, err := session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string{"db1", "db2"}) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"db1", "db2", "local"}) - } - - names, err = db1.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col1", "col2", "system.indexes"}) - - names, err = db2.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col3", "system.indexes"}) -} - -func (s *S) TestSelect(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ A, B int }{} - - err = coll.Find(M{"a": 1}).Select(M{"b": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 0) - c.Assert(result.B, Equals, 2) -} - -func (s *S) TestInlineMap(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - var v, result1 struct { - A int - M map[string]int ",inline" - } - - v.A = 1 - v.M = map[string]int{"b": 2} - err = coll.Insert(v) - c.Assert(err, IsNil) - - noId := M{"_id": 0} - - err = coll.Find(nil).Select(noId).One(&result1) - c.Assert(err, IsNil) - c.Assert(result1.A, Equals, 1) - c.Assert(result1.M, DeepEquals, map[string]int{"b": 2}) - - var result2 M - err = coll.Find(nil).Select(noId).One(&result2) - c.Assert(err, IsNil) - c.Assert(result2, DeepEquals, M{"a": 1, "b": 2}) - -} - -func (s *S) TestUpdate(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - err = coll.Update(M{"k": 42}, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.Update(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"k": 47}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestUpdateId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"_id": n, "n": n}) - c.Assert(err, IsNil) - } - - err = coll.UpdateId(42, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.FindId(42).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.UpdateId(47, M{"k": 47, "n": 47}) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.FindId(47).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestUpdateNil(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"k": 42, "n": 42}) - c.Assert(err, IsNil) - err = coll.Update(nil, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.Insert(M{"k": 45, "n": 45}) - c.Assert(err, IsNil) - _, err = coll.UpdateAll(nil, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - err = coll.Find(M{"k": 45}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 46) - -} - -func (s *S) TestUpsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.Upsert(M{"k": 42}, M{"k": 42, "n": 24}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result := M{} - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 24) - - // Insert with internally created id. - info, err = coll.Upsert(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.UpsertedId, NotNil) - - err = coll.Find(M{"k": 47}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) - - result = M{} - err = coll.Find(M{"_id": info.UpsertedId}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) - - // Insert with provided id. - info, err = coll.Upsert(M{"k": 48}, M{"k": 48, "n": 48, "_id": 48}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - if s.versionAtLeast(2, 6) { - c.Assert(info.UpsertedId, Equals, 48) - } else { - c.Assert(info.UpsertedId, IsNil) // Unfortunate, but that's what Mongo gave us. - } - - err = coll.Find(M{"k": 48}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 48) -} - -func (s *S) TestUpsertId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"_id": n, "n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.UpsertId(42, M{"n": 24}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result := M{} - err = coll.FindId(42).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 24) - - info, err = coll.UpsertId(47, M{"_id": 47, "n": 47}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - if s.versionAtLeast(2, 6) { - c.Assert(info.UpsertedId, Equals, 47) - } else { - c.Assert(info.UpsertedId, IsNil) - } - - err = coll.FindId(47).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) -} - -func (s *S) TestUpdateAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 4) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 42) - - err = coll.Find(M{"k": 43}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - - err = coll.Find(M{"k": 44}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 45) - - if !s.versionAtLeast(2, 6) { - // 2.6 made this invalid. - info, err = coll.UpdateAll(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, Equals, nil) - c.Assert(info.Updated, Equals, 0) - } -} - -func (s *S) TestRemove(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - err = coll.Remove(M{"n": M{"$gt": 42}}) - c.Assert(err, IsNil) - - result := &struct{ N int }{} - err = coll.Find(M{"n": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) - - err = coll.Find(M{"n": 43}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"n": 44}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 44) -} - -func (s *S) TestRemoveId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"_id": 40}, M{"_id": 41}, M{"_id": 42}) - c.Assert(err, IsNil) - - err = coll.RemoveId(41) - c.Assert(err, IsNil) - - c.Assert(coll.FindId(40).One(nil), IsNil) - c.Assert(coll.FindId(41).One(nil), Equals, mgo.ErrNotFound) - c.Assert(coll.FindId(42).One(nil), IsNil) -} - -func (s *S) TestRemoveAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.RemoveAll(M{"n": M{"$gt": 42}}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 4) - c.Assert(info.UpsertedId, IsNil) - - result := &struct{ N int }{} - err = coll.Find(M{"n": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) - - err = coll.Find(M{"n": 43}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"n": 44}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestDropDatabase(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1.C("col").Insert(M{"_id": 1}) - - db2 := session.DB("db2") - db2.C("col").Insert(M{"_id": 1}) - - err = db1.DropDatabase() - c.Assert(err, IsNil) - - names, err := session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string{"db2"}) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"db2", "local"}) - } - - err = db2.DropDatabase() - c.Assert(err, IsNil) - - names, err = session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string(nil)) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"local"}) - } -} - -func (s *S) TestDropCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("db1") - db.C("col1").Insert(M{"_id": 1}) - db.C("col2").Insert(M{"_id": 1}) - - err = db.C("col1").DropCollection() - c.Assert(err, IsNil) - - names, err := db.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col2", "system.indexes"}) - - err = db.C("col2").DropCollection() - c.Assert(err, IsNil) - - names, err = db.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"system.indexes"}) -} - -func (s *S) TestCreateCollectionCapped(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - Capped: true, - MaxBytes: 1024, - MaxDocs: 3, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - ns := []int{1, 2, 3, 4, 5} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(nil).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) -} - -func (s *S) TestCreateCollectionNoIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - DisableIdIndex: true, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(indexes, HasLen, 0) -} - -func (s *S) TestCreateCollectionForceIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - ForceIdIndex: true, - Capped: true, - MaxBytes: 1024, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(indexes, HasLen, 1) -} - -func (s *S) TestIsDupValues(c *C) { - c.Assert(mgo.IsDup(nil), Equals, false) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 1}), Equals, false) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 1}), Equals, false) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 11000}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11000}), Equals, true) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 11001}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11001}), Equals, true) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 12582}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 12582}), Equals, true) - lerr := &mgo.LastError{Code: 16460, Err:"error inserting 1 documents to shard ... caused by :: E11000 duplicate key error index: ..."} - c.Assert(mgo.IsDup(lerr), Equals, true) -} - -func (s *S) TestIsDupPrimary(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupUnique(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - index := mgo.Index{ - Key: []string{"a", "b"}, - Unique: true, - } - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(index) - c.Assert(err, IsNil) - - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupCapped(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - ForceIdIndex: true, - Capped: true, - MaxBytes: 1024, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 1}) - // The error was different for capped collections before 2.6. - c.Assert(err, ErrorMatches, ".*duplicate key.*") - // The issue is reduced by using IsDup. - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupFindAndModify(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(mgo.Index{Key: []string{"n"}, Unique: true}) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"n": 2}) - c.Assert(err, IsNil) - _, err = coll.Find(M{"n": 1}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, bson.M{}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestFindAndModify(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": 42}) - - session.SetMode(mgo.Monotonic, true) - - result := M{} - info, err := coll.Find(M{"n": 42}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 42) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 43}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 50}).Apply(mgo.Change{Upsert: true, Update: M{"n": 51, "o": 52}}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, NotNil) - - result = M{} - info, err = coll.Find(nil).Sort("-n").Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 52) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 52}).Select(M{"o": 1}).Apply(mgo.Change{Remove: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], IsNil) - c.Assert(result["o"], Equals, 52) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 60}).Apply(mgo.Change{Remove: true}, result) - c.Assert(err, Equals, mgo.ErrNotFound) - c.Assert(len(result), Equals, 0) - c.Assert(info, IsNil) -} - -func (s *S) TestFindAndModifyBug997828(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": "not-a-number"}) - - result := make(M) - _, err = coll.Find(M{"n": "not-a-number"}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) - c.Assert(err, ErrorMatches, `(exception: )?Cannot apply \$inc .*`) - if s.versionAtLeast(2, 1) { - qerr, _ := err.(*mgo.QueryError) - c.Assert(qerr, NotNil, Commentf("err: %#v", err)) - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(qerr.Code, Equals, 16837) - } else { - c.Assert(qerr.Code, Equals, 10140) - } - } else { - lerr, _ := err.(*mgo.LastError) - c.Assert(lerr, NotNil, Commentf("err: %#v", err)) - c.Assert(lerr.Code, Equals, 10140) - } -} - -func (s *S) TestCountCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) -} - -func (s *S) TestCountQuery(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(M{"n": M{"$gt": 40}}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestCountQuerySorted(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(M{"n": M{"$gt": 40}}).Sort("n").Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestCountSkipLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(nil).Skip(1).Limit(3).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - n, err = coll.Find(nil).Skip(1).Limit(5).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) -} - -func (s *S) TestQueryExplain(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - m := M{} - query := coll.Find(nil).Limit(2) - err = query.Explain(m) - c.Assert(err, IsNil) - c.Assert(m["cursor"], Equals, "BasicCursor") - c.Assert(m["nscanned"], Equals, 2) - c.Assert(m["n"], Equals, 2) - - n := 0 - var result M - iter := query.Iter() - for iter.Next(&result) { - n++ - } - c.Assert(iter.Close(), IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestQueryHint(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.EnsureIndexKey("a") - - m := M{} - err = coll.Find(nil).Hint("a").Explain(m) - c.Assert(err, IsNil) - c.Assert(m["indexBounds"], NotNil) - c.Assert(m["indexBounds"].(M)["a"], NotNil) -} - -func (s *S) TestFindOneNotFound(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct{ A, B int }{} - err = coll.Find(M{"a": 1}).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - c.Assert(err, ErrorMatches, "not found") - c.Assert(err == mgo.ErrNotFound, Equals, true) -} - -func (s *S) TestFindNil(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - err = coll.Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestFindId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 41, "n": 41}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 42, "n": 42}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - err = coll.FindId(42).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) -} - -func (s *S) TestFindIterAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - iter := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2).Iter() - result := struct{ N int }{} - for i := 2; i < 7; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindIterTwiceWithSameQuery(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 40; i != 47; i++ { - coll.Insert(M{"n": i}) - } - - query := coll.Find(M{}).Sort("n") - - result1 := query.Skip(1).Iter() - result2 := query.Skip(2).Iter() - - result := struct{ N int }{} - ok := result2.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, 42) - ok = result1.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, 41) -} - -func (s *S) TestFindIterWithoutResults(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 42}) - - iter := coll.Find(M{"n": 0}).Iter() - - result := struct{ N int }{} - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(result.N, Equals, 0) -} - -func (s *S) TestFindIterLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3) - iter := query.Iter() - - result := struct{ N int }{} - for i := 2; i < 5; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 2) // 1*QUERY_OP + 1*KILL_CURSORS_OP - c.Assert(stats.ReceivedOps, Equals, 1) // and its REPLY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestTooManyItemsLimitBug(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) - - mgo.SetDebug(false) - coll := session.DB("mydb").C("mycoll") - words := strings.Split("foo bar baz", " ") - for i := 0; i < 5; i++ { - words = append(words, words...) - } - doc := bson.D{{"words", words}} - inserts := 10000 - limit := 5000 - iters := 0 - c.Assert(inserts > limit, Equals, true) - for i := 0; i < inserts; i++ { - err := coll.Insert(&doc) - c.Assert(err, IsNil) - } - iter := coll.Find(nil).Limit(limit).Iter() - for iter.Next(&doc) { - if iters%100 == 0 { - c.Logf("Seen %d docments", iters) - } - iters++ - } - c.Assert(iter.Close(), IsNil) - c.Assert(iters, Equals, limit) -} - -func serverCursorsOpen(session *mgo.Session) int { - var result struct { - Cursors struct { - TotalOpen int `bson:"totalOpen"` - TimedOut int `bson:"timedOut"` - } - } - err := session.Run("serverStatus", &result) - if err != nil { - panic(err) - } - return result.Cursors.TotalOpen -} - -func (s *S) TestFindIterLimitWithMore(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Insane amounts of logging otherwise due to the - // amount of data being shuffled. - mgo.SetDebug(false) - defer mgo.SetDebug(true) - - // Should amount to more than 4MB bson payload, - // the default limit per result chunk. - const total = 4096 - var d struct{ A [1024]byte } - docs := make([]interface{}, total) - for i := 0; i < total; i++ { - docs[i] = &d - } - err = coll.Insert(docs...) - c.Assert(err, IsNil) - - n, err := coll.Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, total) - - // First, try restricting to a single chunk with a negative limit. - nresults := 0 - iter := coll.Find(nil).Limit(-total).Iter() - var discard struct{} - for iter.Next(&discard) { - nresults++ - } - if nresults < total/2 || nresults >= total { - c.Fatalf("Bad result size with negative limit: %d", nresults) - } - - cursorsOpen := serverCursorsOpen(session) - - // Try again, with a positive limit. Should reach the end now, - // using multiple chunks. - nresults = 0 - iter = coll.Find(nil).Limit(total).Iter() - for iter.Next(&discard) { - nresults++ - } - c.Assert(nresults, Equals, total) - - // Ensure the cursor used is properly killed. - c.Assert(serverCursorsOpen(session), Equals, cursorsOpen) - - // Edge case, -MinInt == -MinInt. - nresults = 0 - iter = coll.Find(nil).Limit(math.MinInt32).Iter() - for iter.Next(&discard) { - nresults++ - } - if nresults < total/2 || nresults >= total { - c.Fatalf("Bad result size with MinInt32 limit: %d", nresults) - } -} - -func (s *S) TestFindIterLimitWithBatch(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - // Ping the database to ensure the nonce has been received already. - c.Assert(session.Ping(), IsNil) - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3).Batch(2) - iter := query.Iter() - result := struct{ N int }{} - for i := 2; i < 5; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 1*GET_MORE_OP + 1*KILL_CURSORS_OP - c.Assert(stats.ReceivedOps, Equals, 2) // and its REPLY_OPs - c.Assert(stats.ReceivedDocs, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindIterSortWithBatch(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - // Without this, the logic above breaks because Mongo refuses to - // return a cursor with an in-memory sort. - coll.EnsureIndexKey("n") - - // Ping the database to ensure the nonce has been received already. - c.Assert(session.Ping(), IsNil) - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$lte": 44}}).Sort("-n").Batch(2) - iter := query.Iter() - ns = []int{46, 45, 44, 43, 42, 41, 40} - result := struct{ N int }{} - for i := 2; i < len(ns); i++ { - c.Logf("i=%d", i) - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and its REPLY_OPs - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -// Test tailable cursors in a situation where Next has to sleep to -// respect the timeout requested on Tail. -func (s *S) TestFindTailTimeoutWithSleep(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - timeout := 3 * time.Second - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(timeout) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - // The internal AwaitData timing of MongoDB is around 2 seconds, - // so this should force mgo to sleep at least once by itself to - // respect the requested timeout. - time.Sleep(timeout + 5e8*time.Nanosecond) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY for nonce + 1*GET_MORE_OP on Next + 1*GET_MORE_OP on Next after sleep + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 5) - c.Assert(stats.ReceivedOps, Equals, 4) // REPLY_OPs for 1*QUERY_OP for nonce + 2*GET_MORE_OPs + 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - started := time.Now() - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, true) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - - c.Log("Will now reuse the timed out tail cursor...") - - coll.Insert(M{"n": 48}) - ok = iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Close(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 48) -} - -// Test tailable cursors in a situation where Next never gets to sleep once -// to respect the timeout requested on Tail. -func (s *S) TestFindTailTimeoutNoSleep(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - timeout := 1 * time.Second - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(timeout) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - // The internal AwaitData timing of MongoDB is around 2 seconds, - // so this item should arrive within the AwaitData threshold. - time.Sleep(5e8) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 4) - c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - started := time.Now() - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, true) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - - c.Log("Will now reuse the timed out tail cursor...") - - coll.Insert(M{"n": 48}) - ok = iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Close(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 48) -} - -// Test tailable cursors in a situation where Next never gets to sleep once -// to respect the timeout requested on Tail. -func (s *S) TestFindTailNoTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(-1) - c.Assert(err, IsNil) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - time.Sleep(5e8) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 4) - c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - gotNext := make(chan bool) - go func() { - ok := iter.Next(&result) - gotNext <- ok - }() - - select { - case ok := <-gotNext: - c.Fatalf("Next returned: %v", ok) - case <-time.After(3e9): - // Good. Should still be sleeping at that point. - } - - // Closing the session should cause Next to return. - session.Close() - - select { - case ok := <-gotNext: - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), ErrorMatches, "Closed explicitly") - c.Assert(iter.Timeout(), Equals, false) - case <-time.After(1e9): - c.Fatal("Closing the session did not unblock Next") - } -} - -func (s *S) TestIterNextResetsResult(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{1, 2, 3} - for _, n := range ns { - coll.Insert(M{"n" + strconv.Itoa(n): n}) - } - - query := coll.Find(nil).Sort("$natural") - - i := 0 - var sresult *struct{ N1, N2, N3 int } - iter := query.Iter() - for iter.Next(&sresult) { - switch i { - case 0: - c.Assert(sresult.N1, Equals, 1) - c.Assert(sresult.N2+sresult.N3, Equals, 0) - case 1: - c.Assert(sresult.N2, Equals, 2) - c.Assert(sresult.N1+sresult.N3, Equals, 0) - case 2: - c.Assert(sresult.N3, Equals, 3) - c.Assert(sresult.N1+sresult.N2, Equals, 0) - } - i++ - } - c.Assert(iter.Close(), IsNil) - - i = 0 - var mresult M - iter = query.Iter() - for iter.Next(&mresult) { - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, M{"n3": 3}) - } - i++ - } - c.Assert(iter.Close(), IsNil) - - i = 0 - var iresult interface{} - iter = query.Iter() - for iter.Next(&iresult) { - mresult, ok := iresult.(bson.M) - c.Assert(ok, Equals, true, Commentf("%#v", iresult)) - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) - } - i++ - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestFindForOnIter(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Iter() - - i := 2 - var result *struct{ N int } - err = iter.For(&result, func() error { - c.Assert(i < 7, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindFor(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - - i := 2 - var result *struct{ N int } - err = query.For(&result, func() error { - c.Assert(i < 7, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindForStopOnError(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - query := coll.Find(M{"n": M{"$gte": 42}}) - i := 2 - var result *struct{ N int } - err = query.For(&result, func() error { - c.Assert(i < 4, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - return fmt.Errorf("stop!") - } - i++ - return nil - }) - c.Assert(err, ErrorMatches, "stop!") -} - -func (s *S) TestFindForResetsResult(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{1, 2, 3} - for _, n := range ns { - coll.Insert(M{"n" + strconv.Itoa(n): n}) - } - - query := coll.Find(nil).Sort("$natural") - - i := 0 - var sresult *struct{ N1, N2, N3 int } - err = query.For(&sresult, func() error { - switch i { - case 0: - c.Assert(sresult.N1, Equals, 1) - c.Assert(sresult.N2+sresult.N3, Equals, 0) - case 1: - c.Assert(sresult.N2, Equals, 2) - c.Assert(sresult.N1+sresult.N3, Equals, 0) - case 2: - c.Assert(sresult.N3, Equals, 3) - c.Assert(sresult.N1+sresult.N2, Equals, 0) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - i = 0 - var mresult M - err = query.For(&mresult, func() error { - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, M{"n3": 3}) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - i = 0 - var iresult interface{} - err = query.For(&iresult, func() error { - mresult, ok := iresult.(bson.M) - c.Assert(ok, Equals, true, Commentf("%#v", iresult)) - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) - } - i++ - return nil - }) - c.Assert(err, IsNil) -} - -func (s *S) TestFindIterSnapshot(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Insane amounts of logging otherwise due to the - // amount of data being shuffled. - mgo.SetDebug(false) - defer mgo.SetDebug(true) - - coll := session.DB("mydb").C("mycoll") - - var a [1024000]byte - - for n := 0; n < 10; n++ { - err := coll.Insert(M{"_id": n, "n": n, "a1": &a}) - c.Assert(err, IsNil) - } - - query := coll.Find(M{"n": M{"$gt": -1}}).Batch(2).Prefetch(0) - query.Snapshot() - iter := query.Iter() - - seen := map[int]bool{} - result := struct { - Id int "_id" - }{} - for iter.Next(&result) { - if len(seen) == 2 { - // Grow all entries so that they have to move. - // Backwards so that the order is inverted. - for n := 10; n >= 0; n-- { - _, err := coll.Upsert(M{"_id": n}, M{"$set": M{"a2": &a}}) - c.Assert(err, IsNil) - } - } - if seen[result.Id] { - c.Fatalf("seen duplicated key: %d", result.Id) - } - seen[result.Id] = true - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestSort(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - coll.Insert(M{"a": 1, "b": 1}) - coll.Insert(M{"a": 2, "b": 2}) - coll.Insert(M{"a": 2, "b": 1}) - coll.Insert(M{"a": 0, "b": 1}) - coll.Insert(M{"a": 2, "b": 0}) - coll.Insert(M{"a": 0, "b": 2}) - coll.Insert(M{"a": 1, "b": 2}) - coll.Insert(M{"a": 0, "b": 0}) - coll.Insert(M{"a": 1, "b": 0}) - - query := coll.Find(M{}) - query.Sort("-a") // Should be ignored. - query.Sort("-b", "a") - iter := query.Iter() - - l := make([]int, 18) - r := struct{ A, B int }{} - for i := 0; i != len(l); i += 2 { - ok := iter.Next(&r) - c.Assert(ok, Equals, true) - c.Assert(err, IsNil) - l[i] = r.A - l[i+1] = r.B - } - - c.Assert(l, DeepEquals, []int{0, 2, 1, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 0, 1, 0, 2, 0}) -} - -func (s *S) TestSortWithBadArgs(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - f1 := func() { coll.Find(nil).Sort("") } - f2 := func() { coll.Find(nil).Sort("+") } - f3 := func() { coll.Find(nil).Sort("foo", "-") } - - for _, f := range []func(){f1, f2, f3} { - c.Assert(f, PanicMatches, "Sort: empty field name") - } -} - -func (s *S) TestPrefetching(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - mgo.SetDebug(false) - docs := make([]interface{}, 800) - for i := 0; i != 600; i++ { - docs[i] = bson.D{{"n", i}} - } - coll.Insert(docs...) - - for testi := 0; testi < 5; testi++ { - mgo.ResetStats() - - var iter *mgo.Iter - var beforeMore int - - switch testi { - case 0: // The default session value. - session.SetBatch(100) - iter = coll.Find(M{}).Iter() - beforeMore = 75 - - case 2: // Changing the session value. - session.SetBatch(100) - session.SetPrefetch(0.27) - iter = coll.Find(M{}).Iter() - beforeMore = 73 - - case 1: // Changing via query methods. - iter = coll.Find(M{}).Prefetch(0.27).Batch(100).Iter() - beforeMore = 73 - - case 3: // With prefetch on first document. - iter = coll.Find(M{}).Prefetch(1.0).Batch(100).Iter() - beforeMore = 0 - - case 4: // Without prefetch. - iter = coll.Find(M{}).Prefetch(0).Batch(100).Iter() - beforeMore = 100 - } - - pings := 0 - for batchi := 0; batchi < len(docs)/100-1; batchi++ { - c.Logf("Iterating over %d documents on batch %d", beforeMore, batchi) - var result struct{ N int } - for i := 0; i < beforeMore; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) - } - beforeMore = 99 - c.Logf("Done iterating.") - - session.Run("ping", nil) // Roundtrip to settle down. - pings++ - - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, (batchi+1)*100+pings) - - c.Logf("Iterating over one more document on batch %d", batchi) - ok := iter.Next(&result) - c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) - c.Logf("Done iterating.") - - session.Run("ping", nil) // Roundtrip to settle down. - pings++ - - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, (batchi+2)*100+pings) - } - } -} - -func (s *S) TestSafeSetting(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Check the default - safe := session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 0) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, false) - - // Tweak it - session.SetSafe(&mgo.Safe{W: 1, WTimeout: 2, FSync: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 1) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Reset it again. - session.SetSafe(&mgo.Safe{}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 0) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, false) - - // Ensure safety to something more conservative. - session.SetSafe(&mgo.Safe{W: 5, WTimeout: 6, J: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 5) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 6) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, true) - - // Ensure safety to something less conservative won't change it. - session.EnsureSafe(&mgo.Safe{W: 4, WTimeout: 7}) - safe = session.Safe() - c.Assert(safe.W, Equals, 5) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 6) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, true) - - // But to something more conservative will. - session.EnsureSafe(&mgo.Safe{W: 6, WTimeout: 4, FSync: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 6) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 4) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Even more conservative. - session.EnsureSafe(&mgo.Safe{WMode: "majority", WTimeout: 2}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "majority") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // WMode always overrides, whatever it is, but J doesn't. - session.EnsureSafe(&mgo.Safe{WMode: "something", J: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "something") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // EnsureSafe with nil does nothing. - session.EnsureSafe(nil) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "something") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Changing the safety of a cloned session doesn't touch the original. - clone := session.Clone() - defer clone.Close() - clone.EnsureSafe(&mgo.Safe{WMode: "foo"}) - safe = session.Safe() - c.Assert(safe.WMode, Equals, "something") -} - -func (s *S) TestSafeInsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Insert an element with a predefined key. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - mgo.ResetStats() - - // Session should be safe by default, so inserting it again must fail. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, ".*E11000 duplicate.*") - c.Assert(err.(*mgo.LastError).Code, Equals, 11000) - - // It must have sent two operations (INSERT_OP + getLastError QUERY_OP) - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 2) - - mgo.ResetStats() - - // If we disable safety, though, it won't complain. - session.SetSafe(nil) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Must have sent a single operation this time (just the INSERT_OP) - stats = mgo.GetStats() - c.Assert(stats.SentOps, Equals, 1) -} - -func (s *S) TestSafeParameters(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Tweak the safety parameters to something unachievable. - session.SetSafe(&mgo.Safe{W: 4, WTimeout: 100}) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, "timeout|timed out waiting for slaves") - if !s.versionAtLeast(2, 6) { - // 2.6 turned it into a query error. - c.Assert(err.(*mgo.LastError).WTimeout, Equals, true) - } -} - -func (s *S) TestQueryErrorOne(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct { - Err string "$err" - }{} - - err = coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).One(&result) - c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") - c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) - } else { - c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) - } - - // The result should be properly unmarshalled with QueryError - c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") -} - -func (s *S) TestQueryErrorNext(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct { - Err string "$err" - }{} - - iter := coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).Iter() - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - - err = iter.Close() - c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") - c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) - } else { - c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) - } - c.Assert(iter.Err(), Equals, err) - - // The result should be properly unmarshalled with QueryError - c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") -} - -func (s *S) TestEnsureIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - index1 := mgo.Index{ - Key: []string{"a"}, - Background: true, - } - - index2 := mgo.Index{ - Key: []string{"a", "-b"}, - Unique: true, - DropDups: true, - } - - // Obsolete: - index3 := mgo.Index{ - Key: []string{"@loc_old"}, - Min: -500, - Max: 500, - Bits: 32, - } - - index4 := mgo.Index{ - Key: []string{"$2d:loc"}, - Min: -500, - Max: 500, - Bits: 32, - } - - coll := session.DB("mydb").C("mycoll") - - for _, index := range []mgo.Index{index1, index2, index3, index4} { - err = coll.EnsureIndex(index) - c.Assert(err, IsNil) - } - - sysidx := session.DB("mydb").C("system.indexes") - - result1 := M{} - err = sysidx.Find(M{"name": "a_1"}).One(result1) - c.Assert(err, IsNil) - - result2 := M{} - err = sysidx.Find(M{"name": "a_1_b_-1"}).One(result2) - c.Assert(err, IsNil) - - result3 := M{} - err = sysidx.Find(M{"name": "loc_old_2d"}).One(result3) - c.Assert(err, IsNil) - - result4 := M{} - err = sysidx.Find(M{"name": "loc_2d"}).One(result4) - c.Assert(err, IsNil) - - delete(result1, "v") - expected1 := M{ - "name": "a_1", - "key": M{"a": 1}, - "ns": "mydb.mycoll", - "background": true, - } - c.Assert(result1, DeepEquals, expected1) - - delete(result2, "v") - expected2 := M{ - "name": "a_1_b_-1", - "key": M{"a": 1, "b": -1}, - "ns": "mydb.mycoll", - "unique": true, - "dropDups": true, - } - c.Assert(result2, DeepEquals, expected2) - - delete(result3, "v") - expected3 := M{ - "name": "loc_old_2d", - "key": M{"loc_old": "2d"}, - "ns": "mydb.mycoll", - "min": -500, - "max": 500, - "bits": 32, - } - c.Assert(result3, DeepEquals, expected3) - - delete(result4, "v") - expected4 := M{ - "name": "loc_2d", - "key": M{"loc": "2d"}, - "ns": "mydb.mycoll", - "min": -500, - "max": 500, - "bits": 32, - } - c.Assert(result4, DeepEquals, expected4) - - // Ensure the index actually works for real. - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestEnsureIndexWithBadInfo(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(mgo.Index{}) - c.Assert(err, ErrorMatches, "invalid index key:.*") - - err = coll.EnsureIndex(mgo.Index{Key: []string{""}}) - c.Assert(err, ErrorMatches, "invalid index key:.*") -} - -func (s *S) TestEnsureIndexWithUnsafeSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - session.SetSafe(nil) - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Should fail since there are duplicated entries. - index := mgo.Index{ - Key: []string{"a"}, - Unique: true, - } - - err = coll.EnsureIndex(index) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") -} - -func (s *S) TestEnsureIndexKey(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("a", "-b") - c.Assert(err, IsNil) - - sysidx := session.DB("mydb").C("system.indexes") - - result1 := M{} - err = sysidx.Find(M{"name": "a_1"}).One(result1) - c.Assert(err, IsNil) - - result2 := M{} - err = sysidx.Find(M{"name": "a_1_b_-1"}).One(result2) - c.Assert(err, IsNil) - - delete(result1, "v") - expected1 := M{ - "name": "a_1", - "key": M{"a": 1}, - "ns": "mydb.mycoll", - } - c.Assert(result1, DeepEquals, expected1) - - delete(result2, "v") - expected2 := M{ - "name": "a_1_b_-1", - "key": M{"a": 1, "b": -1}, - "ns": "mydb.mycoll", - } - c.Assert(result2, DeepEquals, expected2) -} - -func (s *S) TestEnsureIndexDropIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("-b") - c.Assert(err, IsNil) - - err = coll.DropIndex("-b") - c.Assert(err, IsNil) - - sysidx := session.DB("mydb").C("system.indexes") - dummy := &struct{}{} - - err = sysidx.Find(M{"name": "a_1"}).One(dummy) - c.Assert(err, IsNil) - - err = sysidx.Find(M{"name": "b_1"}).One(dummy) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.DropIndex("a") - c.Assert(err, IsNil) - - err = sysidx.Find(M{"name": "a_1"}).One(dummy) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.DropIndex("a") - c.Assert(err, ErrorMatches, "index not found.*") -} - -func (s *S) TestEnsureIndexCaching(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - mgo.ResetStats() - - // Second EnsureIndex should be cached and do nothing. - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 0) - - // Resetting the cache should make it contact the server again. - session.ResetIndexCache() - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats = mgo.GetStats() - c.Assert(stats.SentOps, Equals, 2) - - // Dropping the index should also drop the cached index key. - err = coll.DropIndex("a") - c.Assert(err, IsNil) - - mgo.ResetStats() - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats = mgo.GetStats() - c.Assert(stats.SentOps, Equals, 2) -} - -func (s *S) TestEnsureIndexGetIndexes(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("-b") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - // Obsolete. - err = coll.EnsureIndexKey("@c") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("$2d:d") - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - - c.Assert(indexes[0].Name, Equals, "_id_") - c.Assert(indexes[1].Name, Equals, "a_1") - c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) - c.Assert(indexes[2].Name, Equals, "b_-1") - c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) - c.Assert(indexes[3].Name, Equals, "c_2d") - c.Assert(indexes[3].Key, DeepEquals, []string{"$2d:c"}) - c.Assert(indexes[4].Name, Equals, "d_2d") - c.Assert(indexes[4].Key, DeepEquals, []string{"$2d:d"}) -} - -func (s *S) TestEnsureIndexEvalGetIndexes(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({b: -1})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({a: 1})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({c: '2d'})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({d: -1, e: 1})"}}, nil) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - - c.Assert(indexes[0].Name, Equals, "_id_") - c.Assert(indexes[1].Name, Equals, "a_1") - c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) - c.Assert(indexes[2].Name, Equals, "b_-1") - c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) - c.Assert(indexes[3].Name, Equals, "c_2d") - c.Assert(indexes[3].Key, DeepEquals, []string{"$2d:c"}) - c.Assert(indexes[4].Name, Equals, "d_-1_e_1") - c.Assert(indexes[4].Key, DeepEquals, []string{"-d", "e"}) -} - -var testTTL = flag.Bool("test-ttl", false, "test TTL collections (may take 1 minute)") - -func (s *S) TestEnsureIndexExpireAfter(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - session.SetSafe(nil) - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": 1, "t": time.Now().Add(-120 * time.Second)}) - c.Assert(err, IsNil) - err = coll.Insert(M{"n": 2, "t": time.Now()}) - c.Assert(err, IsNil) - - // Should fail since there are duplicated entries. - index := mgo.Index{ - Key: []string{"t"}, - ExpireAfter: 1 * time.Minute, - } - - err = coll.EnsureIndex(index) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - c.Assert(indexes[1].Name, Equals, "t_1") - c.Assert(indexes[1].ExpireAfter, Equals, 1*time.Minute) - - if *testTTL { - worked := false - stop := time.Now().Add(70 * time.Second) - for time.Now().Before(stop) { - n, err := coll.Count() - c.Assert(err, IsNil) - if n == 1 { - worked = true - break - } - c.Assert(n, Equals, 2) - c.Logf("Still has 2 entries...") - time.Sleep(1 * time.Second) - } - if !worked { - c.Fatalf("TTL index didn't work") - } - } -} - -func (s *S) TestDistinct(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - var result []int - err = coll.Find(M{"n": M{"$gt": 2}}).Sort("n").Distinct("n", &result) - - sort.IntSlice(result).Sort() - c.Assert(result, DeepEquals, []int{3, 4, 6}) -} - -func (s *S) TestMapReduce(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - } - var result []struct { - Id int "_id" - Value int - } - - info, err := coll.Find(M{"n": M{"$gt": 2}}).MapReduce(job, &result) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 4) - c.Assert(info.EmitCount, Equals, 4) - c.Assert(info.OutputCount, Equals, 3) - c.Assert(info.VerboseTime, IsNil) - - expected := map[int]int{3: 1, 4: 2, 6: 1} - for _, item := range result { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } - - // Weak attempt of testing that Sort gets delivered. - _, err = coll.Find(nil).Sort("-n").MapReduce(job, &result) - _, isQueryError := err.(*mgo.QueryError) - c.Assert(isQueryError, Equals, true) -} - -func (s *S) TestMapReduceFinalize(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1) }", - Reduce: "function(key, values) { return Array.sum(values) }", - Finalize: "function(key, count) { return {count: count} }", - } - var result []struct { - Id int "_id" - Value struct{ Count int } - } - _, err = coll.Find(nil).MapReduce(job, &result) - c.Assert(err, IsNil) - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - for _, item := range result { - c.Logf("Item: %#v", &item) - c.Assert(item.Value.Count, Equals, expected[item.Id]) - expected[item.Id] = -1 - } -} - -func (s *S) TestMapReduceToCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: "mr", - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 7) - c.Assert(info.EmitCount, Equals, 7) - c.Assert(info.OutputCount, Equals, 5) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "mydb") - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - var item *struct { - Id int "_id" - Value int - } - mr := session.DB("mydb").C("mr") - iter := mr.Find(nil).Iter() - for iter.Next(&item) { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestMapReduceToOtherDb(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: bson.D{{"replace", "mr"}, {"db", "otherdb"}}, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 7) - c.Assert(info.EmitCount, Equals, 7) - c.Assert(info.OutputCount, Equals, 5) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "otherdb") - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - var item *struct { - Id int "_id" - Value int - } - mr := session.DB("otherdb").C("mr") - iter := mr.Find(nil).Iter() - for iter.Next(&item) { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestMapReduceOutOfOrder(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: bson.M{"a": "a", "z": "z", "replace": "mr", "db": "otherdb", "b": "b", "y": "y"}, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "otherdb") -} - -func (s *S) TestMapReduceScope(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - coll.Insert(M{"n": 1}) - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, x); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Scope: M{"x": 42}, - } - - var result []bson.M - _, err = coll.Find(nil).MapReduce(job, &result) - c.Assert(len(result), Equals, 1) - c.Assert(result[0]["value"], Equals, 42.0) -} - -func (s *S) TestMapReduceVerbose(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 100; i++ { - err = coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Verbose: true, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.VerboseTime, NotNil) -} - -func (s *S) TestMapReduceLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - } - - var result []bson.M - _, err = coll.Find(nil).Limit(3).MapReduce(job, &result) - c.Assert(err, IsNil) - c.Assert(len(result), Equals, 3) -} - -func (s *S) TestBuildInfo(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - info, err := session.BuildInfo() - c.Assert(err, IsNil) - - var v []int - for i, a := range strings.Split(info.Version, ".") { - for _, token := range []string{"-rc", "-pre"} { - if i == 2 && strings.Contains(a, token) { - a = a[:strings.Index(a, token)] - info.VersionArray[len(info.VersionArray)-1] = 0 - } - } - n, err := strconv.Atoi(a) - c.Assert(err, IsNil) - v = append(v, n) - } - for len(v) < 4 { - v = append(v, 0) - } - - c.Assert(info.VersionArray, DeepEquals, v) - c.Assert(info.GitVersion, Matches, "[a-z0-9]+") - c.Assert(info.SysInfo, Matches, ".*[0-9:]+.*") - if info.Bits != 32 && info.Bits != 64 { - c.Fatalf("info.Bits is %d", info.Bits) - } - if info.MaxObjectSize < 8192 { - c.Fatalf("info.MaxObjectSize seems too small: %d", info.MaxObjectSize) - } -} - -func (s *S) TestZeroTimeRoundtrip(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - var d struct{ T time.Time } - conn := session.DB("mydb").C("mycoll") - err = conn.Insert(d) - c.Assert(err, IsNil) - - var result bson.M - err = conn.Find(nil).One(&result) - c.Assert(err, IsNil) - t, isTime := result["t"].(time.Time) - c.Assert(isTime, Equals, true) - c.Assert(t, Equals, time.Time{}) -} - -func (s *S) TestFsyncLock(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - clone := session.Clone() - defer clone.Close() - - err = session.FsyncLock() - c.Assert(err, IsNil) - - done := make(chan time.Time) - go func() { - time.Sleep(3e9) - now := time.Now() - err := session.FsyncUnlock() - c.Check(err, IsNil) - done <- now - }() - - err = clone.DB("mydb").C("mycoll").Insert(bson.M{"n": 1}) - unlocked := time.Now() - unlocking := <-done - c.Assert(err, IsNil) - - c.Assert(unlocked.After(unlocking), Equals, true) - c.Assert(unlocked.Sub(unlocking) < 1e9, Equals, true) -} - -func (s *S) TestFsync(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Not much to do here. Just a smoke check. - err = session.Fsync(false) - c.Assert(err, IsNil) - err = session.Fsync(true) - c.Assert(err, IsNil) -} - -func (s *S) TestPipeIter(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - iter := coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}).Iter() - result := struct{ N int }{} - for i := 2; i < 7; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - } - - c.Assert(iter.Next(&result), Equals, false) - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestPipeAll(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - var result []struct{ N int } - err = coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}).All(&result) - c.Assert(err, IsNil) - for i := 2; i < 7; i++ { - c.Assert(result[i-2].N, Equals, ns[i]) - } -} - -func (s *S) TestPipeOne(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ A, B int }{} - - pipe := coll.Pipe([]M{{"$project": M{"a": 1, "b": M{"$add": []interface{}{"$b", 1}}}}}) - err = pipe.One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 1) - c.Assert(result.B, Equals, 3) - - pipe = coll.Pipe([]M{{"$match": M{"a": 2}}}) - err = pipe.One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestBatch1Bug(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 3; i++ { - err := coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - var ns []struct{ N int } - err = coll.Find(nil).Batch(1).All(&ns) - c.Assert(err, IsNil) - c.Assert(len(ns), Equals, 3) - - session.SetBatch(1) - err = coll.Find(nil).All(&ns) - c.Assert(err, IsNil) - c.Assert(len(ns), Equals, 3) -} - -func (s *S) TestInterfaceIterBug(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 3; i++ { - err := coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - var result interface{} - - i := 0 - iter := coll.Find(nil).Sort("n").Iter() - for iter.Next(&result) { - c.Assert(result.(bson.M)["n"], Equals, i) - i++ - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestFindIterCloseKillsCursor(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cursors := serverCursorsOpen(session) - - coll := session.DB("mydb").C("mycoll") - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err = coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - iter := coll.Find(nil).Batch(2).Iter() - c.Assert(iter.Next(bson.M{}), Equals, true) - - c.Assert(iter.Close(), IsNil) - c.Assert(serverCursorsOpen(session), Equals, cursors) -} - -func (s *S) TestLogReplay(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - for i := 0; i < 5; i++ { - err = coll.Insert(M{"ts": time.Now()}) - c.Assert(err, IsNil) - } - - iter := coll.Find(nil).LogReplay().Iter() - if s.versionAtLeast(2, 6) { - // This used to fail in 2.4. Now it's just a smoke test. - c.Assert(iter.Err(), IsNil) - } else { - c.Assert(iter.Next(bson.M{}), Equals, false) - c.Assert(iter.Err(), ErrorMatches, "no ts field in query") - } -} - -func (s *S) TestSetCursorTimeout(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 42}) - - // This is just a smoke test. Won't wait 10 minutes for an actual timeout. - - session.SetCursorTimeout(0) - - var result struct{ N int } - iter := coll.Find(nil).Iter() - c.Assert(iter.Next(&result), Equals, true) - c.Assert(result.N, Equals, 42) - c.Assert(iter.Next(&result), Equals, false) -} diff --git a/vendor/labix.org/v2/mgo/socket.go b/vendor/labix.org/v2/mgo/socket.go deleted file mode 100644 index 97c2fd7..0000000 --- a/vendor/labix.org/v2/mgo/socket.go +++ /dev/null @@ -1,673 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "errors" - "labix.org/v2/mgo/bson" - "net" - "sync" - "time" -) - -type replyFunc func(err error, reply *replyOp, docNum int, docData []byte) - -type mongoSocket struct { - sync.Mutex - server *mongoServer // nil when cached - conn net.Conn - timeout time.Duration - addr string // For debugging only. - nextRequestId uint32 - replyFuncs map[uint32]replyFunc - references int - creds []Credential - logout []Credential - cachedNonce string - gotNonce sync.Cond - dead error - serverInfo *mongoServerInfo -} - -type queryOpFlags uint32 - -const ( - _ queryOpFlags = 1 << iota - flagTailable - flagSlaveOk - flagLogReplay - flagNoCursorTimeout - flagAwaitData -) - -type queryOp struct { - collection string - query interface{} - skip int32 - limit int32 - selector interface{} - flags queryOpFlags - replyFunc replyFunc - - options queryWrapper - hasOptions bool - serverTags []bson.D -} - -type queryWrapper struct { - Query interface{} "$query" - OrderBy interface{} "$orderby,omitempty" - Hint interface{} "$hint,omitempty" - Explain bool "$explain,omitempty" - Snapshot bool "$snapshot,omitempty" - ReadPreference bson.D "$readPreference,omitempty" -} - -func (op *queryOp) finalQuery(socket *mongoSocket) interface{} { - if op.flags&flagSlaveOk != 0 && len(op.serverTags) > 0 && socket.ServerInfo().Mongos { - op.hasOptions = true - op.options.ReadPreference = bson.D{{"mode", "secondaryPreferred"}, {"tags", op.serverTags}} - } - if op.hasOptions { - if op.query == nil { - var empty bson.D - op.options.Query = empty - } else { - op.options.Query = op.query - } - debugf("final query is %#v\n", &op.options) - return &op.options - } - return op.query -} - -type getMoreOp struct { - collection string - limit int32 - cursorId int64 - replyFunc replyFunc -} - -type replyOp struct { - flags uint32 - cursorId int64 - firstDoc int32 - replyDocs int32 -} - -type insertOp struct { - collection string // "database.collection" - documents []interface{} // One or more documents to insert - flags uint32 -} - -type updateOp struct { - collection string // "database.collection" - selector interface{} - update interface{} - flags uint32 -} - -type deleteOp struct { - collection string // "database.collection" - selector interface{} - flags uint32 -} - -type killCursorsOp struct { - cursorIds []int64 -} - -type requestInfo struct { - bufferPos int - replyFunc replyFunc -} - -func newSocket(server *mongoServer, conn net.Conn, timeout time.Duration) *mongoSocket { - socket := &mongoSocket{ - conn: conn, - addr: server.Addr, - server: server, - replyFuncs: make(map[uint32]replyFunc), - } - socket.gotNonce.L = &socket.Mutex - if err := socket.InitialAcquire(server.Info(), timeout); err != nil { - panic("newSocket: InitialAcquire returned error: " + err.Error()) - } - stats.socketsAlive(+1) - debugf("Socket %p to %s: initialized", socket, socket.addr) - socket.resetNonce() - go socket.readLoop() - return socket -} - -// Server returns the server that the socket is associated with. -// It returns nil while the socket is cached in its respective server. -func (socket *mongoSocket) Server() *mongoServer { - socket.Lock() - server := socket.server - socket.Unlock() - return server -} - -// ServerInfo returns details for the server at the time the socket -// was initially acquired. -func (socket *mongoSocket) ServerInfo() *mongoServerInfo { - socket.Lock() - serverInfo := socket.serverInfo - socket.Unlock() - return serverInfo -} - -// InitialAcquire obtains the first reference to the socket, either -// right after the connection is made or once a recycled socket is -// being put back in use. -func (socket *mongoSocket) InitialAcquire(serverInfo *mongoServerInfo, timeout time.Duration) error { - socket.Lock() - if socket.references > 0 { - panic("Socket acquired out of cache with references") - } - if socket.dead != nil { - dead := socket.dead - socket.Unlock() - return dead - } - socket.references++ - socket.serverInfo = serverInfo - socket.timeout = timeout - stats.socketsInUse(+1) - stats.socketRefs(+1) - socket.Unlock() - return nil -} - -// Acquire obtains an additional reference to the socket. -// The socket will only be recycled when it's released as many -// times as it's been acquired. -func (socket *mongoSocket) Acquire() (info *mongoServerInfo) { - socket.Lock() - if socket.references == 0 { - panic("Socket got non-initial acquire with references == 0") - } - // We'll track references to dead sockets as well. - // Caller is still supposed to release the socket. - socket.references++ - stats.socketRefs(+1) - serverInfo := socket.serverInfo - socket.Unlock() - return serverInfo -} - -// Release decrements a socket reference. The socket will be -// recycled once its released as many times as it's been acquired. -func (socket *mongoSocket) Release() { - socket.Lock() - if socket.references == 0 { - panic("socket.Release() with references == 0") - } - socket.references-- - stats.socketRefs(-1) - if socket.references == 0 { - stats.socketsInUse(-1) - server := socket.server - socket.Unlock() - socket.LogoutAll() - // If the socket is dead server is nil. - if server != nil { - server.RecycleSocket(socket) - } - } else { - socket.Unlock() - } -} - -// SetTimeout changes the timeout used on socket operations. -func (socket *mongoSocket) SetTimeout(d time.Duration) { - socket.Lock() - socket.timeout = d - socket.Unlock() -} - -type deadlineType int - -const ( - readDeadline deadlineType = 1 - writeDeadline deadlineType = 2 -) - -func (socket *mongoSocket) updateDeadline(which deadlineType) { - var when time.Time - if socket.timeout > 0 { - when = time.Now().Add(socket.timeout) - } - whichstr := "" - switch which { - case readDeadline | writeDeadline: - whichstr = "read/write" - socket.conn.SetDeadline(when) - case readDeadline: - whichstr = "read" - socket.conn.SetReadDeadline(when) - case writeDeadline: - whichstr = "write" - socket.conn.SetWriteDeadline(when) - default: - panic("invalid parameter to updateDeadline") - } - debugf("Socket %p to %s: updated %s deadline to %s ahead (%s)", socket, socket.addr, whichstr, socket.timeout, when) -} - -// Close terminates the socket use. -func (socket *mongoSocket) Close() { - socket.kill(errors.New("Closed explicitly"), false) -} - -func (socket *mongoSocket) kill(err error, abend bool) { - socket.Lock() - if socket.dead != nil { - debugf("Socket %p to %s: killed again: %s (previously: %s)", socket, socket.addr, err.Error(), socket.dead.Error()) - socket.Unlock() - return - } - logf("Socket %p to %s: closing: %s (abend=%v)", socket, socket.addr, err.Error(), abend) - socket.dead = err - socket.conn.Close() - stats.socketsAlive(-1) - replyFuncs := socket.replyFuncs - socket.replyFuncs = make(map[uint32]replyFunc) - server := socket.server - socket.server = nil - socket.gotNonce.Broadcast() - socket.Unlock() - for _, replyFunc := range replyFuncs { - logf("Socket %p to %s: notifying replyFunc of closed socket: %s", socket, socket.addr, err.Error()) - replyFunc(err, nil, -1, nil) - } - if abend { - server.AbendSocket(socket) - } -} - -func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) { - var wait, change sync.Mutex - var replyDone bool - var replyData []byte - var replyErr error - wait.Lock() - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - change.Lock() - if !replyDone { - replyDone = true - replyErr = err - if err == nil { - replyData = docData - } - } - change.Unlock() - wait.Unlock() - } - err = socket.Query(op) - if err != nil { - return nil, err - } - wait.Lock() - change.Lock() - data = replyData - err = replyErr - change.Unlock() - return data, err -} - -func (socket *mongoSocket) Query(ops ...interface{}) (err error) { - - if lops := socket.flushLogout(); len(lops) > 0 { - ops = append(lops, ops...) - } - - buf := make([]byte, 0, 256) - - // Serialize operations synchronously to avoid interrupting - // other goroutines while we can't really be sending data. - // Also, record id positions so that we can compute request - // ids at once later with the lock already held. - requests := make([]requestInfo, len(ops)) - requestCount := 0 - - for _, op := range ops { - debugf("Socket %p to %s: serializing op: %#v", socket, socket.addr, op) - start := len(buf) - var replyFunc replyFunc - switch op := op.(type) { - - case *updateOp: - buf = addHeader(buf, 2001) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, int32(op.flags)) - debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - debugf("Socket %p to %s: serializing update document: %#v", socket, socket.addr, op.update) - buf, err = addBSON(buf, op.update) - if err != nil { - return err - } - - case *insertOp: - buf = addHeader(buf, 2002) - buf = addInt32(buf, int32(op.flags)) - buf = addCString(buf, op.collection) - for _, doc := range op.documents { - debugf("Socket %p to %s: serializing document for insertion: %#v", socket, socket.addr, doc) - buf, err = addBSON(buf, doc) - if err != nil { - return err - } - } - - case *queryOp: - buf = addHeader(buf, 2004) - buf = addInt32(buf, int32(op.flags)) - buf = addCString(buf, op.collection) - buf = addInt32(buf, op.skip) - buf = addInt32(buf, op.limit) - buf, err = addBSON(buf, op.finalQuery(socket)) - if err != nil { - return err - } - if op.selector != nil { - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - } - replyFunc = op.replyFunc - - case *getMoreOp: - buf = addHeader(buf, 2005) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, op.limit) - buf = addInt64(buf, op.cursorId) - replyFunc = op.replyFunc - - case *deleteOp: - buf = addHeader(buf, 2006) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, int32(op.flags)) - debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - - case *killCursorsOp: - buf = addHeader(buf, 2007) - buf = addInt32(buf, 0) // Reserved - buf = addInt32(buf, int32(len(op.cursorIds))) - for _, cursorId := range op.cursorIds { - buf = addInt64(buf, cursorId) - } - - default: - panic("internal error: unknown operation type") - } - - setInt32(buf, start, int32(len(buf)-start)) - - if replyFunc != nil { - request := &requests[requestCount] - request.replyFunc = replyFunc - request.bufferPos = start - requestCount++ - } - } - - // Buffer is ready for the pipe. Lock, allocate ids, and enqueue. - - socket.Lock() - if socket.dead != nil { - dead := socket.dead - socket.Unlock() - debugf("Socket %p to %s: failing query, already closed: %s", socket, socket.addr, socket.dead.Error()) - // XXX This seems necessary in case the session is closed concurrently - // with a query being performed, but it's not yet tested: - for i := 0; i != requestCount; i++ { - request := &requests[i] - if request.replyFunc != nil { - request.replyFunc(dead, nil, -1, nil) - } - } - return dead - } - - wasWaiting := len(socket.replyFuncs) > 0 - - // Reserve id 0 for requests which should have no responses. - requestId := socket.nextRequestId + 1 - if requestId == 0 { - requestId++ - } - socket.nextRequestId = requestId + uint32(requestCount) - for i := 0; i != requestCount; i++ { - request := &requests[i] - setInt32(buf, request.bufferPos+4, int32(requestId)) - socket.replyFuncs[requestId] = request.replyFunc - requestId++ - } - - debugf("Socket %p to %s: sending %d op(s) (%d bytes)", socket, socket.addr, len(ops), len(buf)) - stats.sentOps(len(ops)) - - socket.updateDeadline(writeDeadline) - _, err = socket.conn.Write(buf) - if !wasWaiting && requestCount > 0 { - socket.updateDeadline(readDeadline) - } - socket.Unlock() - return err -} - -func fill(r net.Conn, b []byte) error { - l := len(b) - n, err := r.Read(b) - for n != l && err == nil { - var ni int - ni, err = r.Read(b[n:]) - n += ni - } - return err -} - -// Estimated minimum cost per socket: 1 goroutine + memory for the largest -// document ever seen. -func (socket *mongoSocket) readLoop() { - p := make([]byte, 36) // 16 from header + 20 from OP_REPLY fixed fields - s := make([]byte, 4) - conn := socket.conn // No locking, conn never changes. - for { - // XXX Handle timeouts, , etc - err := fill(conn, p) - if err != nil { - socket.kill(err, true) - return - } - - totalLen := getInt32(p, 0) - responseTo := getInt32(p, 8) - opCode := getInt32(p, 12) - - // Don't use socket.server.Addr here. socket is not - // locked and socket.server may go away. - debugf("Socket %p to %s: got reply (%d bytes)", socket, socket.addr, totalLen) - - _ = totalLen - - if opCode != 1 { - socket.kill(errors.New("opcode != 1, corrupted data?"), true) - return - } - - reply := replyOp{ - flags: uint32(getInt32(p, 16)), - cursorId: getInt64(p, 20), - firstDoc: getInt32(p, 28), - replyDocs: getInt32(p, 32), - } - - stats.receivedOps(+1) - stats.receivedDocs(int(reply.replyDocs)) - - socket.Lock() - replyFunc, ok := socket.replyFuncs[uint32(responseTo)] - if ok { - delete(socket.replyFuncs, uint32(responseTo)) - } - socket.Unlock() - - if replyFunc != nil && reply.replyDocs == 0 { - replyFunc(nil, &reply, -1, nil) - } else { - for i := 0; i != int(reply.replyDocs); i++ { - err := fill(conn, s) - if err != nil { - if replyFunc != nil { - replyFunc(err, nil, -1, nil) - } - socket.kill(err, true) - return - } - - b := make([]byte, int(getInt32(s, 0))) - - // copy(b, s) in an efficient way. - b[0] = s[0] - b[1] = s[1] - b[2] = s[2] - b[3] = s[3] - - err = fill(conn, b[4:]) - if err != nil { - if replyFunc != nil { - replyFunc(err, nil, -1, nil) - } - socket.kill(err, true) - return - } - - if globalDebug && globalLogger != nil { - m := bson.M{} - if err := bson.Unmarshal(b, m); err == nil { - debugf("Socket %p to %s: received document: %#v", socket, socket.addr, m) - } - } - - if replyFunc != nil { - replyFunc(nil, &reply, i, b) - } - - // XXX Do bound checking against totalLen. - } - } - - socket.Lock() - if len(socket.replyFuncs) == 0 { - // Nothing else to read for now. Disable deadline. - socket.conn.SetReadDeadline(time.Time{}) - } else { - socket.updateDeadline(readDeadline) - } - socket.Unlock() - - // XXX Do bound checking against totalLen. - } -} - -var emptyHeader = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - -func addHeader(b []byte, opcode int) []byte { - i := len(b) - b = append(b, emptyHeader...) - // Enough for current opcodes. - b[i+12] = byte(opcode) - b[i+13] = byte(opcode >> 8) - return b -} - -func addInt32(b []byte, i int32) []byte { - return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24)) -} - -func addInt64(b []byte, i int64) []byte { - return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24), - byte(i>>32), byte(i>>40), byte(i>>48), byte(i>>56)) -} - -func addCString(b []byte, s string) []byte { - b = append(b, []byte(s)...) - b = append(b, 0) - return b -} - -func addBSON(b []byte, doc interface{}) ([]byte, error) { - if doc == nil { - return append(b, 5, 0, 0, 0, 0), nil - } - data, err := bson.Marshal(doc) - if err != nil { - return b, err - } - return append(b, data...), nil -} - -func setInt32(b []byte, pos int, i int32) { - b[pos] = byte(i) - b[pos+1] = byte(i >> 8) - b[pos+2] = byte(i >> 16) - b[pos+3] = byte(i >> 24) -} - -func getInt32(b []byte, pos int) int32 { - return (int32(b[pos+0])) | - (int32(b[pos+1]) << 8) | - (int32(b[pos+2]) << 16) | - (int32(b[pos+3]) << 24) -} - -func getInt64(b []byte, pos int) int64 { - return (int64(b[pos+0])) | - (int64(b[pos+1]) << 8) | - (int64(b[pos+2]) << 16) | - (int64(b[pos+3]) << 24) | - (int64(b[pos+4]) << 32) | - (int64(b[pos+5]) << 40) | - (int64(b[pos+6]) << 48) | - (int64(b[pos+7]) << 56) -} diff --git a/vendor/labix.org/v2/mgo/stats.go b/vendor/labix.org/v2/mgo/stats.go deleted file mode 100644 index 59723e6..0000000 --- a/vendor/labix.org/v2/mgo/stats.go +++ /dev/null @@ -1,147 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo - -import ( - "sync" -) - -var stats *Stats -var statsMutex sync.Mutex - -func SetStats(enabled bool) { - statsMutex.Lock() - if enabled { - if stats == nil { - stats = &Stats{} - } - } else { - stats = nil - } - statsMutex.Unlock() -} - -func GetStats() (snapshot Stats) { - statsMutex.Lock() - snapshot = *stats - statsMutex.Unlock() - return -} - -func ResetStats() { - statsMutex.Lock() - debug("Resetting stats") - old := stats - stats = &Stats{} - // These are absolute values: - stats.Clusters = old.Clusters - stats.SocketsInUse = old.SocketsInUse - stats.SocketsAlive = old.SocketsAlive - stats.SocketRefs = old.SocketRefs - statsMutex.Unlock() - return -} - -type Stats struct { - Clusters int - MasterConns int - SlaveConns int - SentOps int - ReceivedOps int - ReceivedDocs int - SocketsAlive int - SocketsInUse int - SocketRefs int -} - -func (stats *Stats) cluster(delta int) { - if stats != nil { - statsMutex.Lock() - stats.Clusters += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) conn(delta int, master bool) { - if stats != nil { - statsMutex.Lock() - if master { - stats.MasterConns += delta - } else { - stats.SlaveConns += delta - } - statsMutex.Unlock() - } -} - -func (stats *Stats) sentOps(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SentOps += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) receivedOps(delta int) { - if stats != nil { - statsMutex.Lock() - stats.ReceivedOps += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) receivedDocs(delta int) { - if stats != nil { - statsMutex.Lock() - stats.ReceivedDocs += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketsInUse(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketsInUse += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketsAlive(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketsAlive += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketRefs(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketRefs += delta - statsMutex.Unlock() - } -} diff --git a/vendor/labix.org/v2/mgo/suite_test.go b/vendor/labix.org/v2/mgo/suite_test.go deleted file mode 100644 index a846c51..0000000 --- a/vendor/labix.org/v2/mgo/suite_test.go +++ /dev/null @@ -1,240 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package mgo_test - -import ( - "errors" - "flag" - "fmt" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" - "net" - "os/exec" - "strconv" - "syscall" - - "testing" - "time" -) - -var fast = flag.Bool("fast", false, "Skip slow tests") - -type M bson.M - -type cLogger C - -func (c *cLogger) Output(calldepth int, s string) error { - ns := time.Now().UnixNano() - t := float64(ns%100e9) / 1e9 - ((*C)(c)).Logf("[LOG] %.05f %s", t, s) - return nil -} - -func TestAll(t *testing.T) { - TestingT(t) -} - -type S struct { - session *mgo.Session - stopped bool - build mgo.BuildInfo - frozen []string -} - -func (s *S) versionAtLeast(v ...int) bool { - for i := range v { - if i == len(s.build.VersionArray) { - return false - } - if s.build.VersionArray[i] < v[i] { - return false - } - } - return true -} - -var _ = Suite(&S{}) - -func (s *S) SetUpSuite(c *C) { - mgo.SetDebug(true) - mgo.SetStats(true) - s.StartAll() - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - s.build, err = session.BuildInfo() - c.Check(err, IsNil) - session.Close() -} - -func (s *S) SetUpTest(c *C) { - err := run("mongo --nodb testdb/dropall.js") - if err != nil { - panic(err.Error()) - } - mgo.SetLogger((*cLogger)(c)) - mgo.ResetStats() -} - -func (s *S) TearDownTest(c *C) { - if s.stopped { - s.StartAll() - } - for _, host := range s.frozen { - if host != "" { - s.Thaw(host) - } - } - var stats mgo.Stats - for i := 0; ; i++ { - stats = mgo.GetStats() - if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { - break - } - if i == 20 { - c.Fatal("Test left sockets in a dirty state") - } - c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) - time.Sleep(500 * time.Millisecond) - } - for i := 0; ; i++ { - stats = mgo.GetStats() - if stats.Clusters == 0 { - break - } - if i == 60 { - c.Fatal("Test left clusters alive") - } - c.Logf("Waiting for clusters to die: %d alive", stats.Clusters) - time.Sleep(1 * time.Second) - } -} - -func (s *S) Stop(host string) { - // Give a moment for slaves to sync and avoid getting rollback issues. - time.Sleep(2 * time.Second) - err := run("cd _testdb && supervisorctl stop " + supvName(host)) - if err != nil { - panic(err) - } - s.stopped = true -} - -func (s *S) pid(host string) int { - output, err := exec.Command("lsof", "-iTCP:"+hostPort(host), "-sTCP:LISTEN", "-Fp").CombinedOutput() - if err != nil { - panic(err) - } - pidstr := string(output[1 : len(output)-1]) - pid, err := strconv.Atoi(pidstr) - if err != nil { - panic("cannot convert pid to int: " + pidstr) - } - return pid -} - -func (s *S) Freeze(host string) { - err := syscall.Kill(s.pid(host), syscall.SIGSTOP) - if err != nil { - panic(err) - } - s.frozen = append(s.frozen, host) -} - -func (s *S) Thaw(host string) { - err := syscall.Kill(s.pid(host), syscall.SIGCONT) - if err != nil { - panic(err) - } - for i, frozen := range s.frozen { - if frozen == host { - s.frozen[i] = "" - } - } -} - -func (s *S) StartAll() { - // Restart any stopped nodes. - run("cd _testdb && supervisorctl start all") - err := run("cd testdb && mongo --nodb wait.js") - if err != nil { - panic(err) - } - s.stopped = false -} - -func run(command string) error { - output, err := exec.Command("/bin/sh", "-c", command).CombinedOutput() - if err != nil { - msg := fmt.Sprintf("Failed to execute: %s: %s\n%s", command, err.Error(), string(output)) - return errors.New(msg) - } - return nil -} - -var supvNames = map[string]string{ - "40001": "db1", - "40002": "db2", - "40011": "rs1a", - "40012": "rs1b", - "40013": "rs1c", - "40021": "rs2a", - "40022": "rs2b", - "40023": "rs2c", - "40031": "rs3a", - "40032": "rs3b", - "40033": "rs3c", - "40041": "rs4a", - "40101": "cfg1", - "40102": "cfg2", - "40103": "cfg3", - "40201": "s1", - "40202": "s2", - "40203": "s3", -} - -// supvName returns the supervisord name for the given host address. -func supvName(host string) string { - host, port, err := net.SplitHostPort(host) - if err != nil { - panic(err) - } - name, ok := supvNames[port] - if !ok { - panic("Unknown host: " + host) - } - return name -} - -func hostPort(host string) string { - _, port, err := net.SplitHostPort(host) - if err != nil { - panic(err) - } - return port -} diff --git a/vendor/labix.org/v2/mgo/testdb/dropall.js b/vendor/labix.org/v2/mgo/testdb/dropall.js deleted file mode 100644 index ca12892..0000000 --- a/vendor/labix.org/v2/mgo/testdb/dropall.js +++ /dev/null @@ -1,47 +0,0 @@ - -var ports = [40001, 40002, 40011, 40012, 40013, 40021, 40022, 40023, 40041, 40101, 40102, 40103, 40201, 40202, 40203] -var auth = [40002, 40103, 40203, 40031] - -for (var i in ports) { - var port = ports[i] - var server = "localhost:" + port - var mongo = new Mongo("localhost:" + port) - var admin = mongo.getDB("admin") - - for (var j in auth) { - if (auth[j] == port) { - admin.auth("root", "rapadura") - admin.system.users.find().forEach(function(u) { - if (u.user == "root" || u.user == "reader") { - return; - } - if (typeof admin.dropUser == "function") { - mongo.getDB(u.db).dropUser(u.user); - } else { - admin.removeUser(u.user); - } - }) - break - } - } - var result = admin.runCommand({"listDatabases": 1}) - // Why is the command returning undefined!? - while (typeof result.databases == "undefined") { - print("dropall.js: listing databases of :" + port + " got:", result) - result = admin.runCommand({"listDatabases": 1}) - } - var dbs = result.databases - for (var j = 0; j != dbs.length; j++) { - var db = dbs[j] - switch (db.name) { - case "admin": - case "local": - case "config": - break - default: - mongo.getDB(db.name).dropDatabase() - } - } -} - -// vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/init.js b/vendor/labix.org/v2/mgo/testdb/init.js deleted file mode 100644 index 02a6c61..0000000 --- a/vendor/labix.org/v2/mgo/testdb/init.js +++ /dev/null @@ -1,103 +0,0 @@ -//var settings = {heartbeatSleep: 0.05, heartbeatTimeout: 0.5} -var settings = {}; - -// We know the master of the first set (pri=1), but not of the second. -var rs1cfg = {_id: "rs1", - members: [{_id: 1, host: "127.0.0.1:40011", priority: 1, tags: {rs1: "a"}}, - {_id: 2, host: "127.0.0.1:40012", priority: 0, tags: {rs1: "b"}}, - {_id: 3, host: "127.0.0.1:40013", priority: 0, tags: {rs1: "c"}}], - settings: settings} -var rs2cfg = {_id: "rs2", - members: [{_id: 1, host: "127.0.0.1:40021", priority: 1, tags: {rs2: "a"}}, - {_id: 2, host: "127.0.0.1:40022", priority: 1, tags: {rs2: "b"}}, - {_id: 3, host: "127.0.0.1:40023", priority: 1, tags: {rs2: "c"}}], - settings: settings} -var rs3cfg = {_id: "rs3", - members: [{_id: 1, host: "127.0.0.1:40031", priority: 1, tags: {rs3: "a"}}, - {_id: 2, host: "127.0.0.1:40032", priority: 1, tags: {rs3: "b"}}, - {_id: 3, host: "127.0.0.1:40033", priority: 1, tags: {rs3: "c"}}], - settings: settings} - -for (var i = 0; i != 60; i++) { - try { - db1 = new Mongo("127.0.0.1:40001").getDB("admin") - db2 = new Mongo("127.0.0.1:40002").getDB("admin") - rs1a = new Mongo("127.0.0.1:40011").getDB("admin") - rs2a = new Mongo("127.0.0.1:40021").getDB("admin") - rs3a = new Mongo("127.0.0.1:40031").getDB("admin") - break - } catch(err) { - print("Can't connect yet...") - } - sleep(1000) -} - -rs1a.runCommand({replSetInitiate: rs1cfg}) -rs2a.runCommand({replSetInitiate: rs2cfg}) -rs3a.runCommand({replSetInitiate: rs3cfg}) - -function configShards() { - cfg1 = new Mongo("127.0.0.1:40201").getDB("admin") - cfg1.runCommand({addshard: "127.0.0.1:40001"}) - cfg1.runCommand({addshard: "rs1/127.0.0.1:40011"}) - - cfg2 = new Mongo("127.0.0.1:40202").getDB("admin") - cfg2.runCommand({addshard: "rs2/127.0.0.1:40021"}) - - cfg3 = new Mongo("127.0.0.1:40203").getDB("admin") - cfg3.runCommand({addshard: "rs3/127.0.0.1:40031"}) -} - -function configAuth() { - var addrs = ["127.0.0.1:40002", "127.0.0.1:40203", "127.0.0.1:40031"] - for (var i in addrs) { - var db = new Mongo(addrs[i]).getDB("admin") - var v = db.serverBuildInfo().versionArray - if (v < [2, 5]) { - db.addUser("root", "rapadura") - } else { - db.createUser({user: "root", pwd: "rapadura", roles: ["root"]}) - } - db.auth("root", "rapadura") - if (v >= [2, 6]) { - db.createUser({user: "reader", pwd: "rapadura", roles: ["readAnyDatabase"]}) - } else if (v >= [2, 4]) { - db.addUser({user: "reader", pwd: "rapadura", roles: ["readAnyDatabase"]}) - } else { - db.addUser("reader", "rapadura", true) - } - } -} - -function countHealthy(rs) { - var status = rs.runCommand({replSetGetStatus: 1}) - var count = 0 - if (typeof status.members != "undefined") { - for (var i = 0; i != status.members.length; i++) { - var m = status.members[i] - if (m.health == 1 && (m.state == 1 || m.state == 2)) { - count += 1 - } - } - } - return count -} - -var totalRSMembers = rs1cfg.members.length + rs2cfg.members.length + rs3cfg.members.length - -for (var i = 0; i != 60; i++) { - var count = countHealthy(rs1a) + countHealthy(rs2a) + countHealthy(rs3a) - print("Replica sets have", count, "healthy nodes.") - if (count == totalRSMembers) { - sleep(2000) - configShards() - configAuth() - quit(0) - } - sleep(1000) -} - -print("Replica sets didn't sync up properly.") -quit(12) - -// vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/setup.sh b/vendor/labix.org/v2/mgo/testdb/setup.sh deleted file mode 100755 index ab841da..0000000 --- a/vendor/labix.org/v2/mgo/testdb/setup.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -e - -start() { - mkdir _testdb - cd _testdb - mkdir db1 db2 rs1a rs1b rs1c rs2a rs2b rs2c rs3a rs3b rs3c rs4a cfg1 cfg2 cfg3 - ln -s ../testdb/supervisord.conf supervisord.conf - echo keyfile > keyfile - chmod 600 keyfile - echo "Running supervisord..." - supervisord || ( echo "Supervisord failed executing ($?)" && exit 1 ) - COUNT=$(grep '^\[program' supervisord.conf | wc -l) - echo "Supervisord is up, starting $COUNT processes..." - for i in $(seq 10); do - RUNNING=$(supervisorctl status | grep RUNNING | wc -l) - echo "$RUNNING processes running..." - if [ x$COUNT = x$RUNNING ]; then - echo "Running setup.js with mongo..." - mongo --nodb ../testdb/init.js - exit 0 - fi - sleep 1 - done - echo "Failed to start all processes. Check out what's up at $PWD now!" - exit 1 -} - -stop() { - if [ -d _testdb ]; then - echo "Shutting down test cluster..." - (cd _testdb && supervisorctl shutdown) - rm -rf _testdb - fi -} - - -if [ ! -f suite_test.go ]; then - echo "This script must be run from within the source directory." - exit 1 -fi - -case "$1" in - - start) - start - ;; - - stop) - stop - ;; - -esac - -# vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/supervisord.conf b/vendor/labix.org/v2/mgo/testdb/supervisord.conf deleted file mode 100644 index b0aca01..0000000 --- a/vendor/labix.org/v2/mgo/testdb/supervisord.conf +++ /dev/null @@ -1,62 +0,0 @@ -[supervisord] -logfile = %(here)s/supervisord.log -pidfile = %(here)s/supervisord.pid -directory = %(here)s -#nodaemon = true - -[inet_http_server] -port = 127.0.0.1:9001 - -[supervisorctl] -serverurl = http://127.0.0.1:9001 - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[program:db1] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --dbpath %(here)s/db1 --bind_ip=127.0.0.1 --port 40001 - -[program:db2] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --dbpath %(here)s/db2 --bind_ip=127.0.0.1 --port 40002 --auth - -[program:rs1a] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1a --bind_ip=127.0.0.1 --port 40011 -[program:rs1b] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1b --bind_ip=127.0.0.1 --port 40012 -[program:rs1c] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1c --bind_ip=127.0.0.1 --port 40013 - -[program:rs2a] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2a --bind_ip=127.0.0.1 --port 40021 -[program:rs2b] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2b --bind_ip=127.0.0.1 --port 40022 -[program:rs2c] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2c --bind_ip=127.0.0.1 --port 40023 - -[program:rs3a] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3a --bind_ip=127.0.0.1 --port 40031 --auth --keyFile=%(here)s/keyfile -[program:rs3b] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3b --bind_ip=127.0.0.1 --port 40032 --auth --keyFile=%(here)s/keyfile -[program:rs3c] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3c --bind_ip=127.0.0.1 --port 40033 --auth --keyFile=%(here)s/keyfile - -[program:rs4a] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs4 --dbpath %(here)s/rs4a --bind_ip=127.0.0.1 --port 40041 - -[program:cfg1] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg1 --bind_ip=127.0.0.1 --port 40101 - -[program:cfg2] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg2 --bind_ip=127.0.0.1 --port 40102 - -[program:cfg3] -command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg3 --bind_ip=127.0.0.1 --port 40103 --auth --keyFile=%(here)s/keyfile - -[program:s1] -command = mongos --configdb 127.0.0.1:40101 --bind_ip=127.0.0.1 --port 40201 --chunkSize 1 - -[program:s2] -command = mongos --configdb 127.0.0.1:40102 --bind_ip=127.0.0.1 --port 40202 --chunkSize 1 - -[program:s3] -command = mongos --configdb 127.0.0.1:40103 --bind_ip=127.0.0.1 --port 40203 --chunkSize 1 --keyFile=%(here)s/keyfile diff --git a/vendor/labix.org/v2/mgo/testdb/wait.js b/vendor/labix.org/v2/mgo/testdb/wait.js deleted file mode 100644 index de0d660..0000000 --- a/vendor/labix.org/v2/mgo/testdb/wait.js +++ /dev/null @@ -1,58 +0,0 @@ -// We know the master of the first set (pri=1), but not of the second. -var settings = {} -var rs1cfg = {_id: "rs1", - members: [{_id: 1, host: "127.0.0.1:40011", priority: 1}, - {_id: 2, host: "127.0.0.1:40012", priority: 0}, - {_id: 3, host: "127.0.0.1:40013", priority: 0}]} -var rs2cfg = {_id: "rs2", - members: [{_id: 1, host: "127.0.0.1:40021", priority: 1}, - {_id: 2, host: "127.0.0.1:40022", priority: 1}, - {_id: 3, host: "127.0.0.1:40023", priority: 0}]} -var rs3cfg = {_id: "rs3", - members: [{_id: 1, host: "127.0.0.1:40031", priority: 1}, - {_id: 2, host: "127.0.0.1:40032", priority: 1}, - {_id: 3, host: "127.0.0.1:40033", priority: 1}], - settings: settings} - -for (var i = 0; i != 60; i++) { - try { - rs1a = new Mongo("127.0.0.1:40011").getDB("admin") - rs2a = new Mongo("127.0.0.1:40021").getDB("admin") - rs3a = new Mongo("127.0.0.1:40031").getDB("admin") - rs3a.auth("root", "rapadura") - db1 = new Mongo("127.0.0.1:40001").getDB("admin") - db2 = new Mongo("127.0.0.1:40002").getDB("admin") - break - } catch(err) { - print("Can't connect yet...") - } - sleep(1000) -} - -function countHealthy(rs) { - var status = rs.runCommand({replSetGetStatus: 1}) - var count = 0 - if (typeof status.members != "undefined") { - for (var i = 0; i != status.members.length; i++) { - var m = status.members[i] - if (m.health == 1 && (m.state == 1 || m.state == 2)) { - count += 1 - } - } - } - return count -} - -var totalRSMembers = rs1cfg.members.length + rs2cfg.members.length + rs3cfg.members.length - -for (var i = 0; i != 60; i++) { - var count = countHealthy(rs1a) + countHealthy(rs2a) + countHealthy(rs3a) - print("Replica sets have", count, "healthy nodes.") - if (count == totalRSMembers) { - quit(0) - } - sleep(1000) -} - -print("Replica sets didn't sync up properly.") -quit(12) diff --git a/vendor/labix.org/v2/mgo/txn/chaos.go b/vendor/labix.org/v2/mgo/txn/chaos.go deleted file mode 100644 index a9258fa..0000000 --- a/vendor/labix.org/v2/mgo/txn/chaos.go +++ /dev/null @@ -1,68 +0,0 @@ -package txn - -import ( - mrand "math/rand" - "time" -) - -var chaosEnabled = false -var chaosSetting Chaos - -// Chaos holds parameters for the failure injection mechanism. -type Chaos struct { - // KillChance is the 0.0 to 1.0 chance that a given checkpoint - // within the algorithm will raise an interruption that will - // stop the procedure. - KillChance float64 - - // SlowdownChance is the 0.0 to 1.0 chance that a given checkpoint - // within the algorithm will be delayed by Slowdown before - // continuing. - SlowdownChance float64 - Slowdown time.Duration - - // If Breakpoint is set, the above settings will only affect the - // named breakpoint. - Breakpoint string -} - -// SetChaos sets the failure injection parameters to c. -func SetChaos(c Chaos) { - chaosSetting = c - chaosEnabled = c.KillChance > 0 || c.SlowdownChance > 0 -} - -func chaos(bpname string) { - if !chaosEnabled { - return - } - switch chaosSetting.Breakpoint { - case "", bpname: - kc := chaosSetting.KillChance - if kc > 0 && mrand.Intn(1000) < int(kc*1000) { - panic(chaosError{}) - } - if bpname == "insert" { - return - } - sc := chaosSetting.SlowdownChance - if sc > 0 && mrand.Intn(1000) < int(kc*1000) { - time.Sleep(chaosSetting.Slowdown) - } - } -} - -type chaosError struct{} - -func (f *flusher) handleChaos(err *error) { - v := recover() - if v == nil { - return - } - if _, ok := v.(chaosError); ok { - f.debugf("Killed by chaos!") - *err = ErrChaos - return - } - panic(v) -} diff --git a/vendor/labix.org/v2/mgo/txn/debug.go b/vendor/labix.org/v2/mgo/txn/debug.go deleted file mode 100644 index 7f67f4e..0000000 --- a/vendor/labix.org/v2/mgo/txn/debug.go +++ /dev/null @@ -1,108 +0,0 @@ -package txn - -import ( - "bytes" - "fmt" - "labix.org/v2/mgo/bson" - "sort" - "sync/atomic" -) - -var ( - debugEnabled bool - logger log_Logger -) - -type log_Logger interface { - Output(calldepth int, s string) error -} - -// Specify the *log.Logger where logged messages should be sent to. -func SetLogger(l log_Logger) { - logger = l -} - -// SetDebug enables or disables debugging. -func SetDebug(debug bool) { - debugEnabled = debug -} - -var ErrChaos = fmt.Errorf("interrupted by chaos") - -var debugId uint32 - -func debugPrefix() string { - d := atomic.AddUint32(&debugId, 1) - 1 - s := make([]byte, 0, 10) - for i := uint(0); i < 8; i++ { - s = append(s, "abcdefghijklmnop"[(d>>(4*i))&0xf]) - if d>>(4*(i+1)) == 0 { - break - } - } - s = append(s, ')', ' ') - return string(s) -} - -func logf(format string, args ...interface{}) { - if logger != nil { - logger.Output(2, fmt.Sprintf(format, argsForLog(args)...)) - } -} - -func debugf(format string, args ...interface{}) { - if debugEnabled && logger != nil { - logger.Output(2, fmt.Sprintf(format, argsForLog(args)...)) - } -} - -func argsForLog(args []interface{}) []interface{} { - for i, arg := range args { - switch v := arg.(type) { - case bson.ObjectId: - args[i] = v.Hex() - case []bson.ObjectId: - lst := make([]string, len(v)) - for j, id := range v { - lst[j] = id.Hex() - } - args[i] = lst - case map[docKey][]bson.ObjectId: - buf := &bytes.Buffer{} - var dkeys docKeys - for dkey := range v { - dkeys = append(dkeys, dkey) - } - sort.Sort(dkeys) - for i, dkey := range dkeys { - if i > 0 { - buf.WriteByte(' ') - } - buf.WriteString(fmt.Sprintf("%v: {", dkey)) - for j, id := range v[dkey] { - if j > 0 { - buf.WriteByte(' ') - } - buf.WriteString(id.Hex()) - } - buf.WriteByte('}') - } - args[i] = buf.String() - case map[docKey][]int64: - buf := &bytes.Buffer{} - var dkeys docKeys - for dkey := range v { - dkeys = append(dkeys, dkey) - } - sort.Sort(dkeys) - for i, dkey := range dkeys { - if i > 0 { - buf.WriteByte(' ') - } - buf.WriteString(fmt.Sprintf("%v: %v", dkey, v[dkey])) - } - args[i] = buf.String() - } - } - return args -} diff --git a/vendor/labix.org/v2/mgo/txn/flusher.go b/vendor/labix.org/v2/mgo/txn/flusher.go deleted file mode 100644 index 846eefe..0000000 --- a/vendor/labix.org/v2/mgo/txn/flusher.go +++ /dev/null @@ -1,996 +0,0 @@ -package txn - -import ( - "fmt" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - "sort" -) - -func flush(r *Runner, t *transaction) error { - f := &flusher{ - Runner: r, - goal: t, - goalKeys: make(map[docKey]bool), - queue: make(map[docKey][]token), - debugId: debugPrefix(), - } - for _, dkey := range f.goal.docKeys() { - f.goalKeys[dkey] = true - } - return f.run() -} - -type flusher struct { - *Runner - goal *transaction - goalKeys map[docKey]bool - queue map[docKey][]token - debugId string -} - -func (f *flusher) run() (err error) { - if chaosEnabled { - defer f.handleChaos(&err) - } - - f.debugf("Processing %s", f.goal) - seen := make(map[bson.ObjectId]*transaction) - if err := f.recurse(f.goal, seen); err != nil { - return err - } - if f.goal.done() { - return nil - } - - // Sparse workloads will generally be managed entirely by recurse. - // Getting here means one or more transactions have dependencies - // and perhaps cycles. - - // Build successors data for Tarjan's sort. Must consider - // that entries in txn-queue are not necessarily valid. - successors := make(map[bson.ObjectId][]bson.ObjectId) - ready := true - for _, dqueue := range f.queue { - NextPair: - for i := 0; i < len(dqueue); i++ { - pred := dqueue[i] - predid := pred.id() - predt := seen[predid] - if predt == nil || predt.Nonce != pred.nonce() { - continue - } - predsuccids, ok := successors[predid] - if !ok { - successors[predid] = nil - } - - for j := i + 1; j < len(dqueue); j++ { - succ := dqueue[j] - succid := succ.id() - succt := seen[succid] - if succt == nil || succt.Nonce != succ.nonce() { - continue - } - if _, ok := successors[succid]; !ok { - successors[succid] = nil - } - - // Found a valid pred/succ pair. - i = j - 1 - for _, predsuccid := range predsuccids { - if predsuccid == succid { - continue NextPair - } - } - successors[predid] = append(predsuccids, succid) - if succid == f.goal.Id { - // There are still pre-requisites to handle. - ready = false - } - continue NextPair - } - } - } - f.debugf("Queues: %v", f.queue) - f.debugf("Successors: %v", successors) - if ready { - f.debugf("Goal %s has no real pre-requisites", f.goal) - return f.advance(f.goal, nil, true) - } - - // Robert Tarjan's algorithm for detecting strongly-connected - // components is used for topological sorting and detecting - // cycles at once. The order in which transactions are applied - // in commonly affected documents must be a global agreement. - sorted := tarjanSort(successors) - if debugEnabled { - f.debugf("Tarjan output: %v", sorted) - } - pull := make(map[bson.ObjectId]*transaction) - for i := len(sorted) - 1; i >= 0; i-- { - scc := sorted[i] - f.debugf("Flushing %v", scc) - if len(scc) == 1 { - pull[scc[0]] = seen[scc[0]] - } - for _, id := range scc { - if err := f.advance(seen[id], pull, true); err != nil { - return err - } - } - if len(scc) > 1 { - for _, id := range scc { - pull[id] = seen[id] - } - } - } - return nil -} - -func (f *flusher) recurse(t *transaction, seen map[bson.ObjectId]*transaction) error { - seen[t.Id] = t - err := f.advance(t, nil, false) - if err != errPreReqs { - return err - } - for _, dkey := range t.docKeys() { - for _, dtt := range f.queue[dkey] { - id := dtt.id() - if seen[id] != nil { - continue - } - qt, err := f.load(id) - if err != nil { - return err - } - err = f.recurse(qt, seen) - if err != nil { - return err - } - } - } - return nil -} - -func (f *flusher) advance(t *transaction, pull map[bson.ObjectId]*transaction, force bool) error { - for { - switch t.State { - case tpreparing, tprepared: - revnos, err := f.prepare(t, force) - if err != nil { - return err - } - if t.State != tprepared { - continue - } - if err = f.assert(t, revnos, pull); err != nil { - return err - } - if t.State != tprepared { - continue - } - if err = f.checkpoint(t, revnos); err != nil { - return err - } - case tapplying: - return f.apply(t, pull) - case taborting: - return f.abortOrReload(t, nil, pull) - case tapplied, taborted: - return nil - default: - panic(fmt.Errorf("transaction in unknown state: %q", t.State)) - } - } - panic("unreachable") -} - -type stash string - -const ( - stashStable stash = "" - stashInsert stash = "insert" - stashRemove stash = "remove" -) - -type txnInfo struct { - Queue []token `bson:"txn-queue"` - Revno int64 `bson:"txn-revno,omitempty"` - Insert bson.ObjectId `bson:"txn-insert,omitempty"` - Remove bson.ObjectId `bson:"txn-remove,omitempty"` -} - -type stashState string - -const ( - stashNew stashState = "" - stashInserting stashState = "inserting" -) - -var txnFields = bson.D{{"txn-queue", 1}, {"txn-revno", 1}, {"txn-remove", 1}, {"txn-insert", 1}} - -var errPreReqs = fmt.Errorf("transaction has pre-requisites and force is false") - -// prepare injects t's id onto txn-queue for all affected documents -// and collects the current txn-queue and txn-revno values during -// the process. If the prepared txn-queue indicates that there are -// pre-requisite transactions to be applied and the force parameter -// is false, errPreReqs will be returned. Otherwise, the current -// tip revision numbers for all the documents are returned. -func (f *flusher) prepare(t *transaction, force bool) (revnos []int64, err error) { - if t.State != tpreparing { - return f.rescan(t, force) - } - f.debugf("Preparing %s", t) - - // Iterate in a stable way across all runners. This isn't - // strictly required, but reduces the chances of cycles. - dkeys := t.docKeys() - sort.Sort(dkeys) - - revno := make(map[docKey]int64) - info := txnInfo{} - tt := tokenFor(t) -NextDoc: - for _, dkey := range dkeys { - change := mgo.Change{ - Update: bson.D{{"$addToSet", bson.D{{"txn-queue", tt}}}}, - ReturnNew: true, - } - c := f.tc.Database.C(dkey.C) - cquery := c.FindId(dkey.Id).Select(txnFields) - - RetryDoc: - change.Upsert = false - chaos("") - if _, err := cquery.Apply(change, &info); err == nil { - if info.Remove == "" { - // Fast path, unless workload is insert/remove heavy. - revno[dkey] = info.Revno - f.queue[dkey] = info.Queue - f.debugf("[A] Prepared document %v with revno %d and queue: %v", dkey, info.Revno, info.Queue) - continue NextDoc - } else { - // Handle remove in progress before preparing it. - if err := f.loadAndApply(info.Remove); err != nil { - return nil, err - } - goto RetryDoc - } - } else if err != mgo.ErrNotFound { - return nil, err - } - - // Document missing. Use stash collection. - change.Upsert = true - chaos("") - _, err := f.sc.FindId(dkey).Apply(change, &info) - if err != nil { - return nil, err - } - if info.Insert != "" { - // Handle insert in progress before preparing it. - if err := f.loadAndApply(info.Insert); err != nil { - return nil, err - } - goto RetryDoc - } - - // Must confirm stash is still in use and is the same one - // prepared, since applying a remove overwrites the stash. - docFound := false - stashFound := false - if err = c.FindId(dkey.Id).Select(txnFields).One(&info); err == nil { - docFound = true - } else if err != mgo.ErrNotFound { - return nil, err - } else if err = f.sc.FindId(dkey).One(&info); err == nil { - stashFound = true - if info.Revno == 0 { - // Missing revno in the stash only happens when it - // has been upserted, in which case it defaults to -1. - // Txn-inserted documents get revno -1 while in the stash - // for the first time, and -revno-1 == 2 when they go live. - info.Revno = -1 - } - } else if err != mgo.ErrNotFound { - return nil, err - } - - if docFound && info.Remove == "" || stashFound && info.Insert == "" { - for _, dtt := range info.Queue { - if dtt != tt { - continue - } - // Found tt properly prepared. - if stashFound { - f.debugf("[B] Prepared document %v on stash with revno %d and queue: %v", dkey, info.Revno, info.Queue) - } else { - f.debugf("[B] Prepared document %v with revno %d and queue: %v", dkey, info.Revno, info.Queue) - } - revno[dkey] = info.Revno - f.queue[dkey] = info.Queue - continue NextDoc - } - } - - // The stash wasn't valid and tt got overwriten. Try again. - f.unstashToken(tt, dkey) - goto RetryDoc - } - - // Save the prepared nonce onto t. - nonce := tt.nonce() - qdoc := bson.D{{"_id", t.Id}, {"s", tpreparing}} - udoc := bson.D{{"$set", bson.D{{"s", tprepared}, {"n", nonce}}}} - chaos("set-prepared") - err = f.tc.Update(qdoc, udoc) - if err == nil { - t.State = tprepared - t.Nonce = nonce - } else if err == mgo.ErrNotFound { - f.debugf("Can't save nonce of %s: LOST RACE", tt) - if err := f.reload(t); err != nil { - return nil, err - } else if t.State == tpreparing { - panic("can't save nonce yet transaction is still preparing") - } else if t.State != tprepared { - return t.Revnos, nil - } - tt = t.token() - } else if err != nil { - return nil, err - } - - prereqs, found := f.hasPreReqs(tt, dkeys) - if !found { - // Must only happen when reloading above. - return f.rescan(t, force) - } else if prereqs && !force { - f.debugf("Prepared queue with %s [has prereqs & not forced].", tt) - return nil, errPreReqs - } - for _, op := range t.Ops { - dkey := op.docKey() - revnos = append(revnos, revno[dkey]) - drevno := revno[dkey] - switch { - case op.Insert != nil && drevno < 0: - revno[dkey] = -drevno+1 - case op.Update != nil && drevno >= 0: - revno[dkey] = drevno+1 - case op.Remove && drevno >= 0: - revno[dkey] = -drevno-1 - } - } - if !prereqs { - f.debugf("Prepared queue with %s [no prereqs]. Revnos: %v", tt, revnos) - } else { - f.debugf("Prepared queue with %s [forced] Revnos: %v", tt, revnos) - } - return revnos, nil -} - -func (f *flusher) unstashToken(tt token, dkey docKey) error { - qdoc := bson.D{{"_id", dkey}, {"txn-queue", tt}} - udoc := bson.D{{"$pull", bson.D{{"txn-queue", tt}}}} - chaos("") - if err := f.sc.Update(qdoc, udoc); err == nil { - chaos("") - err = f.sc.Remove(bson.D{{"_id", dkey}, {"txn-queue", bson.D{}}}) - } else if err != mgo.ErrNotFound { - return err - } - return nil -} - -func (f *flusher) rescan(t *transaction, force bool) (revnos []int64, err error) { - f.debugf("Rescanning %s", t) - if t.State != tprepared { - panic(fmt.Errorf("rescanning transaction in invalid state: %q", t.State)) - } - - // Iterate in a stable way across all runners. This isn't - // strictly required, but reduces the chances of cycles. - dkeys := t.docKeys() - sort.Sort(dkeys) - - tt := t.token() - if !force { - prereqs, found := f.hasPreReqs(tt, dkeys) - if found && prereqs { - // Its state is already known. - return nil, errPreReqs - } - } - - revno := make(map[docKey]int64) - info := txnInfo{} - for _, dkey := range dkeys { - retry := 0 - - RetryDoc: - c := f.tc.Database.C(dkey.C) - if err := c.FindId(dkey.Id).Select(txnFields).One(&info); err == mgo.ErrNotFound { - // Document is missing. Look in stash. - if err := f.sc.FindId(dkey).One(&info); err == mgo.ErrNotFound { - // Stash also doesn't exist. Maybe someone applied it. - if err := f.reload(t); err != nil { - return nil, err - } else if t.State != tprepared { - return t.Revnos, err - } - // Not applying either. - retry++ - if retry < 3 { - // Retry since there might be an insert/remove race. - goto RetryDoc - } - // Neither the doc nor the stash seem to exist. - return nil, fmt.Errorf("cannot find document %v for applying transaction %s", dkey, t) - } else if err != nil { - return nil, err - } - // Stash found. - if info.Insert != "" { - // Handle insert in progress before assuming ordering is good. - if err := f.loadAndApply(info.Insert); err != nil { - return nil, err - } - goto RetryDoc - } - if info.Revno == 0 { - // Missing revno in the stash means -1. - info.Revno = -1 - } - } else if err != nil { - return nil, err - } else if info.Remove != "" { - // Handle remove in progress before assuming ordering is good. - if err := f.loadAndApply(info.Remove); err != nil { - return nil, err - } - goto RetryDoc - } - revno[dkey] = info.Revno - - found := false - for _, id := range info.Queue { - if id == tt { - found = true - break - } - } - f.queue[dkey] = info.Queue - if !found { - // Previously set txn-queue was popped by someone. - // Transaction is being/has been applied elsewhere. - f.debugf("Rescanned document %v misses %s in queue: %v", dkey, tt, info.Queue) - err := f.reload(t) - if t.State == tpreparing || t.State == tprepared { - panic("rescanned document misses transaction in queue") - } - return t.Revnos, err - } - } - - prereqs, found := f.hasPreReqs(tt, dkeys) - if !found { - panic("rescanning loop guarantees that this can't happen") - } else if prereqs && !force { - f.debugf("Rescanned queue with %s: has prereqs, not forced", tt) - return nil, errPreReqs - } - for _, op := range t.Ops { - dkey := op.docKey() - revnos = append(revnos, revno[dkey]) - if op.isChange() { - revno[dkey] += 1 - } - } - if !prereqs { - f.debugf("Rescanned queue with %s: no prereqs, revnos: %v", tt, revnos) - } else { - f.debugf("Rescanned queue with %s: has prereqs, forced, revnos: %v", tt, revnos) - } - return revnos, nil -} - -func (f *flusher) hasPreReqs(tt token, dkeys docKeys) (prereqs, found bool) { - found = true -NextDoc: - for _, dkey := range dkeys { - for _, dtt := range f.queue[dkey] { - if dtt == tt { - continue NextDoc - } else if dtt.id() != tt.id() { - prereqs = true - } - } - found = false - } - return -} - -func (f *flusher) reload(t *transaction) error { - var newt transaction - query := f.tc.FindId(t.Id) - query.Select(bson.D{{"s", 1}, {"n", 1}, {"r", 1}}) - if err := query.One(&newt); err != nil { - return fmt.Errorf("failed to reload transaction: %v", err) - } - t.State = newt.State - t.Nonce = newt.Nonce - t.Revnos = newt.Revnos - f.debugf("Reloaded %s: %q", t, t.State) - return nil -} - -func (f *flusher) loadAndApply(id bson.ObjectId) error { - t, err := f.load(id) - if err != nil { - return err - } - return f.advance(t, nil, true) -} - -// assert verifies that all assertions in t match the content that t -// will be applied upon. If an assertion fails, the transaction state -// is changed to aborted. -func (f *flusher) assert(t *transaction, revnos []int64, pull map[bson.ObjectId]*transaction) error { - f.debugf("Asserting %s with revnos %v", t, revnos) - if t.State != tprepared { - panic(fmt.Errorf("asserting transaction in invalid state: %q", t.State)) - } - qdoc := make(bson.D, 3) - revno := make(map[docKey]int64) - for i, op := range t.Ops { - dkey := op.docKey() - if _, ok := revno[dkey]; !ok { - revno[dkey] = revnos[i] - } - if op.Assert == nil { - continue - } - if op.Assert == DocMissing { - if revnos[i] >= 0 { - return f.abortOrReload(t, revnos, pull) - } - continue - } - if op.Insert != nil { - return fmt.Errorf("Insert can only Assert txn.DocMissing", op.Assert) - } - // if revnos[i] < 0 { abort }? - - qdoc = append(qdoc[:0], bson.DocElem{"_id", op.Id}) - if op.Assert != DocMissing { - var revnoq interface{} - if n := revno[dkey]; n == 0 { - revnoq = bson.D{{"$exists", false}} - } else { - revnoq = n - } - // XXX Add tt to the query here, once we're sure it's all working. - // Not having it increases the chances of breaking on bad logic. - qdoc = append(qdoc, bson.DocElem{"txn-revno", revnoq}) - if op.Assert != DocExists { - qdoc = append(qdoc, bson.DocElem{"$or", []interface{}{op.Assert}}) - } - } - - c := f.tc.Database.C(op.C) - if err := c.Find(qdoc).Select(bson.D{{"_id", 1}}).One(nil); err == mgo.ErrNotFound { - // Assertion failed or someone else started applying. - return f.abortOrReload(t, revnos, pull) - } else if err != nil { - return err - } - } - f.debugf("Asserting %s succeeded", t) - return nil -} - -func (f *flusher) abortOrReload(t *transaction, revnos []int64, pull map[bson.ObjectId]*transaction) (err error) { - f.debugf("Aborting or reloading %s (was %q)", t, t.State) - if t.State == tprepared { - qdoc := bson.D{{"_id", t.Id}, {"s", tprepared}} - udoc := bson.D{{"$set", bson.D{{"s", taborting}}}} - chaos("set-aborting") - if err = f.tc.Update(qdoc, udoc); err == nil { - t.State = taborting - } else if err == mgo.ErrNotFound { - if err = f.reload(t); err != nil || t.State != taborting { - f.debugf("Won't abort %s. Reloaded state: %q", t, t.State) - return err - } - } else { - return err - } - } else if t.State != taborting { - panic(fmt.Errorf("aborting transaction in invalid state: %q", t.State)) - } - - if len(revnos) > 0 { - if pull == nil { - pull = map[bson.ObjectId]*transaction{t.Id: t} - } - seen := make(map[docKey]bool) - for i, op := range t.Ops { - dkey := op.docKey() - if seen[op.docKey()] { - continue - } - seen[dkey] = true - - pullAll := tokensToPull(f.queue[dkey], pull, "") - if len(pullAll) == 0 { - continue - } - udoc := bson.D{{"$pullAll", bson.D{{"txn-queue", pullAll}}}} - chaos("") - if revnos[i] < 0 { - err = f.sc.UpdateId(dkey, udoc) - } else { - c := f.tc.Database.C(dkey.C) - err = c.UpdateId(dkey.Id, udoc) - } - if err != nil && err != mgo.ErrNotFound { - return err - } - } - } - udoc := bson.D{{"$set", bson.D{{"s", taborted}}}} - chaos("set-aborted") - if err := f.tc.UpdateId(t.Id, udoc); err != nil && err != mgo.ErrNotFound { - return err - } - t.State = taborted - f.debugf("Aborted %s", t) - return nil -} - -func (f *flusher) checkpoint(t *transaction, revnos []int64) error { - var debugRevnos map[docKey][]int64 - if debugEnabled { - debugRevnos = make(map[docKey][]int64) - for i, op := range t.Ops { - dkey := op.docKey() - debugRevnos[dkey] = append(debugRevnos[dkey], revnos[i]) - } - f.debugf("Ready to apply %s. Saving revnos %v", t, debugRevnos) - } - - // Save in t the txn-revno values the transaction must run on. - qdoc := bson.D{{"_id", t.Id}, {"s", tprepared}} - udoc := bson.D{{"$set", bson.D{{"s", tapplying}, {"r", revnos}}}} - chaos("set-applying") - err := f.tc.Update(qdoc, udoc) - if err == nil { - t.State = tapplying - t.Revnos = revnos - f.debugf("Ready to apply %s. Saving revnos %v: DONE", t, debugRevnos) - } else if err == mgo.ErrNotFound { - f.debugf("Ready to apply %s. Saving revnos %v: LOST RACE", t, debugRevnos) - return f.reload(t) - } - return nil -} - -func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) error { - f.debugf("Applying transaction %s", t) - if t.State != tapplying { - panic(fmt.Errorf("applying transaction in invalid state: %q", t.State)) - } - if pull == nil { - pull = map[bson.ObjectId]*transaction{t.Id: t} - } - - // Compute the operation in which t's id may be pulled - // out of txn-queue. That's on its last change, or the - // first assertion. - pullOp := make(map[docKey]int) - for i := range t.Ops { - op := &t.Ops[i] - dkey := op.docKey() - if _, ok := pullOp[dkey]; !ok || op.isChange() { - pullOp[dkey] = i - } - } - - logRevnos := append([]int64(nil), t.Revnos...) - logDoc := bson.D{{"_id", t.Id}} - - tt := tokenFor(t) - for i := range t.Ops { - op := &t.Ops[i] - dkey := op.docKey() - dqueue := f.queue[dkey] - revno := t.Revnos[i] - - var opName string - if debugEnabled { - opName = op.name() - f.debugf("Applying %s op %d (%s) on %v with txn-revno %d", t, i, opName, dkey, revno) - } - - c := f.tc.Database.C(op.C) - - qdoc := bson.D{{"_id", dkey.Id}, {"txn-revno", revno}, {"txn-queue", tt}} - if op.Insert != nil { - qdoc[0].Value = dkey - if revno == -1 { - qdoc[1].Value = bson.D{{"$exists", false}} - } - } else if revno == 0 { - // There's no document with revno 0. The only way to see it is - // when an existent document participates in a transaction the - // first time. Txn-inserted documents get revno -1 while in the - // stash for the first time, and -revno-1 == 2 when they go live. - qdoc[1].Value = bson.D{{"$exists", false}} - } - - dontPull := tt - isPullOp := pullOp[dkey] == i - if isPullOp { - dontPull = "" - } - pullAll := tokensToPull(dqueue, pull, dontPull) - - var d bson.D - var outcome string - var err error - switch { - case op.Update != nil: - if revno < 0 { - err = mgo.ErrNotFound - f.debugf("Won't try to apply update op; negative revision means the document is missing or stashed"); - } else { - newRevno := revno + 1 - logRevnos[i] = newRevno - if d, err = objToDoc(op.Update); err != nil { - return err - } - if d, err = addToDoc(d, "$pullAll", bson.D{{"txn-queue", pullAll}}); err != nil { - return err - } - if d, err = addToDoc(d, "$set", bson.D{{"txn-revno", newRevno}}); err != nil { - return err - } - chaos("") - err = c.Update(qdoc, d) - } - case op.Remove: - if revno < 0 { - err = mgo.ErrNotFound - } else { - newRevno := -revno - 1 - logRevnos[i] = newRevno - nonce := newNonce() - stash := txnInfo{} - change := mgo.Change{ - Update: bson.D{{"$push", bson.D{{"n", nonce}}}}, - Upsert: true, - ReturnNew: true, - } - if _, err = f.sc.FindId(dkey).Apply(change, &stash); err != nil { - return err - } - change = mgo.Change{ - Update: bson.D{{"$set", bson.D{{"txn-remove", t.Id}}}}, - ReturnNew: true, - } - var info txnInfo - if _, err = c.Find(qdoc).Apply(change, &info); err == nil { - // The document still exists so the stash previously - // observed was either out of date or necessarily - // contained the token being applied. - f.debugf("Marked document %v to be removed on revno %d with queue: %v", dkey, info.Revno, info.Queue) - updated := false - if !hasToken(stash.Queue, tt) { - var set, unset bson.D - if revno == 0 { - // Missing revno in stash means -1. - set = bson.D{{"txn-queue", info.Queue}} - unset = bson.D{{"n", 1}, {"txn-revno", 1}} - } else { - set = bson.D{{"txn-queue", info.Queue}, {"txn-revno", newRevno}} - unset = bson.D{{"n", 1}} - } - qdoc := bson.D{{"_id", dkey}, {"n", nonce}} - udoc := bson.D{{"$set", set}, {"$unset", unset}} - if err = f.sc.Update(qdoc, udoc); err == nil { - updated = true - } else if err != mgo.ErrNotFound { - return err - } - } - if updated { - f.debugf("Updated stash for document %v with revno %d and queue: %v", dkey, newRevno, info.Queue) - } else { - f.debugf("Stash for document %v was up-to-date", dkey) - } - err = c.Remove(qdoc) - } - } - case op.Insert != nil: - if revno >= 0 { - err = mgo.ErrNotFound - } else { - newRevno := -revno + 1 - logRevnos[i] = newRevno - if d, err = objToDoc(op.Insert); err != nil { - return err - } - change := mgo.Change{ - Update: bson.D{{"$set", bson.D{{"txn-insert", t.Id}}}}, - ReturnNew: true, - } - chaos("") - var info txnInfo - if _, err = f.sc.Find(qdoc).Apply(change, &info); err == nil { - f.debugf("Stash for document %v has revno %d and queue: %v", dkey, info.Revno, info.Queue) - d = setInDoc(d, bson.D{{"_id", op.Id}, {"txn-revno", newRevno}, {"txn-queue", info.Queue}}) - // Unlikely yet unfortunate race in here if this gets seriously - // delayed. If someone inserts+removes meanwhile, this will - // reinsert, and there's no way to avoid that while keeping the - // collection clean or compromising sharding. applyOps can solve - // the former, but it can't shard (SERVER-1439). - chaos("insert") - err = c.Insert(d) - if err == nil || mgo.IsDup(err) { - if err == nil { - f.debugf("New document %v inserted with revno %d and queue: %v", dkey, info.Revno, info.Queue) - } else { - f.debugf("Document %v already existed", dkey) - } - chaos("") - if err = f.sc.Remove(qdoc); err == nil { - f.debugf("Stash for document %v removed", dkey) - } - } - if pullOp[dkey] == i && len(pullAll) > 0 { - _ = f.sc.UpdateId(dkey, bson.D{{"$pullAll", bson.D{{"txn-queue", pullAll}}}}) - } - } - } - case op.Assert != nil: - // TODO pullAll if pullOp[dkey] == i - } - if err == nil { - outcome = "DONE" - } else if err == mgo.ErrNotFound || mgo.IsDup(err) { - outcome = "MISS" - err = nil - } else { - outcome = err.Error() - } - if debugEnabled { - f.debugf("Applying %s op %d (%s) on %v with txn-revno %d: %s", t, i, opName, dkey, revno, outcome) - } - if err != nil { - return err - } - - if f.lc != nil && op.isChange() { - // Add change to the log document. - var dr bson.D - for li := range logDoc { - elem := &logDoc[li] - if elem.Name == op.C { - dr = elem.Value.(bson.D) - break - } - } - if dr == nil { - logDoc = append(logDoc, bson.DocElem{op.C, bson.D{{"d", []interface{}{}}, {"r", []int64{}}}}) - dr = logDoc[len(logDoc)-1].Value.(bson.D) - } - dr[0].Value = append(dr[0].Value.([]interface{}), op.Id) - dr[1].Value = append(dr[1].Value.([]int64), logRevnos[i]) - } - } - t.State = tapplied - - if f.lc != nil { - // Insert log document into the changelog collection. - f.debugf("Inserting %s into change log", t) - err := f.lc.Insert(logDoc) - if err != nil && !mgo.IsDup(err) { - return err - } - } - - // It's been applied, so errors are ignored here. It's fine for someone - // else to win the race and mark it as applied, and it's also fine for - // it to remain pending until a later point when someone will perceive - // it has been applied and mark it at such. - f.debugf("Marking %s as applied", t) - chaos("set-applied") - f.tc.Update(bson.D{{"_id", t.Id}, {"s", tapplying}}, bson.D{{"$set", bson.D{{"s", tapplied}}}}) - return nil -} - -func tokensToPull(dqueue []token, pull map[bson.ObjectId]*transaction, dontPull token) []token { - var result []token - for j := len(dqueue) - 1; j >= 0; j-- { - dtt := dqueue[j] - if dt, ok := pull[dtt.id()]; ok { - if dt.Nonce == dtt.nonce() { - // It's valid and is being pulled out, so everything - // preceding it must have been handled already. - if dtt == dontPull { - // Not time to pull this one out yet. - j-- - } - result = append(result, dqueue[:j+1]...) - break - } - // It was handled before and this is a leftover invalid - // nonce in the queue. Cherry-pick it out. - result = append(result, dtt) - } - } - return result -} - -func objToDoc(obj interface{}) (d bson.D, err error) { - data, err := bson.Marshal(obj) - if err != nil { - return nil, err - } - err = bson.Unmarshal(data, &d) - if err != nil { - return nil, err - } - return d, err -} - -func addToDoc(doc bson.D, key string, add bson.D) (bson.D, error) { - for i := range doc { - elem := &doc[i] - if elem.Name != key { - continue - } - if old, ok := elem.Value.(bson.D); ok { - elem.Value = append(old, add...) - return doc, nil - } else { - return nil, fmt.Errorf("invalid %q value in change document: %#v", key, elem.Value) - } - } - return append(doc, bson.DocElem{key, add}), nil -} - -func setInDoc(doc bson.D, set bson.D) bson.D { - dlen := len(doc) -NextS: - for s := range set { - sname := set[s].Name - for d := 0; d < dlen; d++ { - if doc[d].Name == sname { - doc[d].Value = set[s].Value - continue NextS - } - } - doc = append(doc, set[s]) - } - return doc -} - -func hasToken(tokens []token, tt token) bool { - for _, ttt := range tokens { - if ttt == tt { - return true - } - } - return false -} - -func (f *flusher) debugf(format string, args ...interface{}) { - if !debugEnabled { - return - } - debugf(f.debugId+format, args...) -} diff --git a/vendor/labix.org/v2/mgo/txn/mgo_test.go b/vendor/labix.org/v2/mgo/txn/mgo_test.go deleted file mode 100644 index ce5d9d0..0000000 --- a/vendor/labix.org/v2/mgo/txn/mgo_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package txn_test - -import ( - "bytes" - "labix.org/v2/mgo" - . "launchpad.net/gocheck" - "os/exec" - "time" -) - -// ---------------------------------------------------------------------------- -// The mgo test suite - -type MgoSuite struct { - output bytes.Buffer - server *exec.Cmd - session *mgo.Session -} - -var mgoaddr = "127.0.0.1:50017" - -func (s *MgoSuite) SetUpSuite(c *C) { - //mgo.SetDebug(true) - mgo.SetStats(true) - dbdir := c.MkDir() - args := []string{ - "--dbpath", dbdir, - "--bind_ip", "127.0.0.1", - "--port", "50017", - "--nssize", "1", - "--noprealloc", - "--smallfiles", - "--nojournal", - "-vvvvv", - } - s.server = exec.Command("mongod", args...) - s.server.Stdout = &s.output - s.server.Stderr = &s.output - err := s.server.Start() - if err != nil { - panic(err) - } -} - -func (s *MgoSuite) TearDownSuite(c *C) { - s.server.Process.Kill() - s.server.Process.Wait() -} - -func (s *MgoSuite) SetUpTest(c *C) { - err := DropAll(mgoaddr) - if err != nil { - panic(err) - } - mgo.SetLogger(c) - mgo.ResetStats() - - s.session, err = mgo.Dial(mgoaddr) - c.Assert(err, IsNil) -} - -func (s *MgoSuite) TearDownTest(c *C) { - if s.session != nil { - s.session.Close() - } - for i := 0; ; i++ { - stats := mgo.GetStats() - if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { - break - } - if i == 20 { - c.Fatal("Test left sockets in a dirty state") - } - c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) - time.Sleep(500 * time.Millisecond) - } -} - -func DropAll(mongourl string) (err error) { - session, err := mgo.Dial(mongourl) - if err != nil { - return err - } - defer session.Close() - - names, err := session.DatabaseNames() - if err != nil { - return err - } - for _, name := range names { - switch name { - case "admin", "local", "config": - default: - err = session.DB(name).DropDatabase() - if err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/labix.org/v2/mgo/txn/sim_test.go b/vendor/labix.org/v2/mgo/txn/sim_test.go deleted file mode 100644 index 312eed9..0000000 --- a/vendor/labix.org/v2/mgo/txn/sim_test.go +++ /dev/null @@ -1,389 +0,0 @@ -package txn_test - -import ( - "flag" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - "labix.org/v2/mgo/txn" - . "launchpad.net/gocheck" - "math/rand" - "time" -) - -var ( - duration = flag.Duration("duration", 200*time.Millisecond, "duration for each simulation") - seed = flag.Int64("seed", 0, "seed for rand") -) - -type params struct { - killChance float64 - slowdownChance float64 - slowdown time.Duration - - unsafe bool - workers int - accounts int - changeHalf bool - reinsertCopy bool - reinsertZeroed bool - changelog bool - - changes int -} - -func (s *S) TestSim1Worker(c *C) { - simulate(c, params{ - workers: 1, - accounts: 4, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSim4WorkersDense(c *C) { - simulate(c, params{ - workers: 4, - accounts: 2, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSim4WorkersSparse(c *C) { - simulate(c, params{ - workers: 4, - accounts: 10, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimHalf1Worker(c *C) { - simulate(c, params{ - workers: 1, - accounts: 4, - changeHalf: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimHalf4WorkersDense(c *C) { - simulate(c, params{ - workers: 4, - accounts: 2, - changeHalf: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimHalf4WorkersSparse(c *C) { - simulate(c, params{ - workers: 4, - accounts: 10, - changeHalf: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimReinsertCopy1Worker(c *C) { - simulate(c, params{ - workers: 1, - accounts: 10, - reinsertCopy: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimReinsertCopy4Workers(c *C) { - simulate(c, params{ - workers: 4, - accounts: 10, - reinsertCopy: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimReinsertZeroed1Worker(c *C) { - simulate(c, params{ - workers: 1, - accounts: 10, - reinsertZeroed: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimReinsertZeroed4Workers(c *C) { - simulate(c, params{ - workers: 4, - accounts: 10, - reinsertZeroed: true, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - }) -} - -func (s *S) TestSimChangeLog(c *C) { - simulate(c, params{ - workers: 4, - accounts: 10, - killChance: 0.01, - slowdownChance: 0.3, - slowdown: 100 * time.Millisecond, - changelog: true, - }) -} - - -type balanceChange struct { - id bson.ObjectId - origin int - target int - amount int -} - -func simulate(c *C, params params) { - seed := *seed - if seed == 0 { - seed = time.Now().UnixNano() - } - rand.Seed(seed) - c.Logf("Seed: %v", seed) - - txn.SetChaos(txn.Chaos{ - KillChance: params.killChance, - SlowdownChance: params.slowdownChance, - Slowdown: params.slowdown, - }) - defer txn.SetChaos(txn.Chaos{}) - - session, err := mgo.Dial(mgoaddr) - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("test") - tc := db.C("tc") - - runner := txn.NewRunner(tc) - - tclog := db.C("tc.log") - if params.changelog { - info := mgo.CollectionInfo{ - Capped: true, - MaxBytes: 1000000, - } - err := tclog.Create(&info) - c.Assert(err, IsNil) - runner.ChangeLog(tclog) - } - - accounts := db.C("accounts") - for i := 0; i < params.accounts; i++ { - err := accounts.Insert(M{"_id": i, "balance": 300}) - c.Assert(err, IsNil) - } - var stop time.Time - if params.changes <= 0 { - stop = time.Now().Add(*duration) - } - - max := params.accounts - if params.reinsertCopy || params.reinsertZeroed { - max = int(float64(params.accounts) * 1.5) - } - - changes := make(chan balanceChange, 1024) - - //session.SetMode(mgo.Eventual, true) - for i := 0; i < params.workers; i++ { - go func() { - n := 0 - for { - if n > 0 && n == params.changes { - break - } - if !stop.IsZero() && time.Now().After(stop) { - break - } - - change := balanceChange{ - id: bson.NewObjectId(), - origin: rand.Intn(max), - target: rand.Intn(max), - amount: 100, - } - - var old Account - var oldExists bool - if params.reinsertCopy || params.reinsertZeroed { - if err := accounts.FindId(change.origin).One(&old); err != mgo.ErrNotFound { - c.Check(err, IsNil) - change.amount = old.Balance - oldExists = true - } - } - - var ops []txn.Op - switch { - case params.reinsertCopy && oldExists: - ops = []txn.Op{{ - C: "accounts", - Id: change.origin, - Assert: M{"balance": change.amount}, - Remove: true, - }, { - C: "accounts", - Id: change.target, - Assert: txn.DocMissing, - Insert: M{"balance": change.amount}, - }} - case params.reinsertZeroed && oldExists: - ops = []txn.Op{{ - C: "accounts", - Id: change.target, - Assert: txn.DocMissing, - Insert: M{"balance": 0}, - }, { - C: "accounts", - Id: change.origin, - Assert: M{"balance": change.amount}, - Remove: true, - }, { - C: "accounts", - Id: change.target, - Assert: txn.DocExists, - Update: M{"$inc": M{"balance": change.amount}}, - }} - case params.changeHalf: - ops = []txn.Op{{ - C: "accounts", - Id: change.origin, - Assert: M{"balance": M{"$gte": change.amount}}, - Update: M{"$inc": M{"balance": -change.amount / 2}}, - }, { - C: "accounts", - Id: change.target, - Assert: txn.DocExists, - Update: M{"$inc": M{"balance": change.amount / 2}}, - }, { - C: "accounts", - Id: change.origin, - Update: M{"$inc": M{"balance": -change.amount / 2}}, - }, { - C: "accounts", - Id: change.target, - Update: M{"$inc": M{"balance": change.amount / 2}}, - }} - default: - ops = []txn.Op{{ - C: "accounts", - Id: change.origin, - Assert: M{"balance": M{"$gte": change.amount}}, - Update: M{"$inc": M{"balance": -change.amount}}, - }, { - C: "accounts", - Id: change.target, - Assert: txn.DocExists, - Update: M{"$inc": M{"balance": change.amount}}, - }} - } - - err = runner.Run(ops, change.id, nil) - if err != nil && err != txn.ErrAborted && err != txn.ErrChaos { - c.Check(err, IsNil) - } - n++ - changes <- change - } - changes <- balanceChange{} - }() - } - - alive := params.workers - changeLog := make([]balanceChange, 0, 1024) - for alive > 0 { - change := <-changes - if change.id == "" { - alive-- - } else { - changeLog = append(changeLog, change) - } - } - c.Check(len(changeLog), Not(Equals), 0, Commentf("No operations were even attempted.")) - - txn.SetChaos(txn.Chaos{}) - err = runner.ResumeAll() - c.Assert(err, IsNil) - - n, err := accounts.Count() - c.Check(err, IsNil) - c.Check(n, Equals, params.accounts, Commentf("Number of accounts has changed.")) - - n, err = accounts.Find(M{"balance": M{"$lt": 0}}).Count() - c.Check(err, IsNil) - c.Check(n, Equals, 0, Commentf("There are %d accounts with negative balance.", n)) - - globalBalance := 0 - iter := accounts.Find(nil).Iter() - account := Account{} - for iter.Next(&account) { - globalBalance += account.Balance - } - c.Check(iter.Close(), IsNil) - c.Check(globalBalance, Equals, params.accounts*300, Commentf("Total amount of money should be constant.")) - - // Compute and verify the exact final state of all accounts. - balance := make(map[int]int) - for i := 0; i < params.accounts; i++ { - balance[i] += 300 - } - var applied, aborted int - for _, change := range changeLog { - err := runner.Resume(change.id) - if err == txn.ErrAborted { - aborted++ - continue - } else if err != nil { - c.Fatalf("resuming %s failed: %v", change.id, err) - } - balance[change.origin] -= change.amount - balance[change.target] += change.amount - applied++ - } - iter = accounts.Find(nil).Iter() - for iter.Next(&account) { - c.Assert(account.Balance, Equals, balance[account.Id]) - } - c.Check(iter.Close(), IsNil) - c.Logf("Total transactions: %d (%d applied, %d aborted)", len(changeLog), applied, aborted) - - if params.changelog { - n, err := tclog.Count() - c.Assert(err, IsNil) - // Check if the capped collection is full. - dummy := make([]byte, 1024) - tclog.Insert(M{"_id": bson.NewObjectId(), "dummy": dummy}) - m, err := tclog.Count() - c.Assert(err, IsNil) - if m == n+1 { - // Wasn't full, so it must have seen it all. - c.Assert(err, IsNil) - c.Assert(n, Equals, applied) - } - } -} diff --git a/vendor/labix.org/v2/mgo/txn/tarjan.go b/vendor/labix.org/v2/mgo/txn/tarjan.go deleted file mode 100644 index a5ac0b0..0000000 --- a/vendor/labix.org/v2/mgo/txn/tarjan.go +++ /dev/null @@ -1,96 +0,0 @@ -package txn - -import ( - "labix.org/v2/mgo/bson" - "sort" -) - -func tarjanSort(successors map[bson.ObjectId][]bson.ObjectId) [][]bson.ObjectId { - // http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - data := &tarjanData{ - successors: successors, - nodes: make([]tarjanNode, 0, len(successors)), - index: make(map[bson.ObjectId]int, len(successors)), - } - - // Sort all nodes to stabilize the logic. - var all []string - for id := range successors { - all = append(all, string(id)) - } - sort.Strings(all) - for _, strid := range all { - id := bson.ObjectId(strid) - if _, seen := data.index[id]; !seen { - data.strongConnect(id) - } - } - return data.output -} - -type tarjanData struct { - successors map[bson.ObjectId][]bson.ObjectId - output [][]bson.ObjectId - - nodes []tarjanNode - stack []bson.ObjectId - index map[bson.ObjectId]int -} - -type tarjanNode struct { - lowlink int - stacked bool -} - -type idList []bson.ObjectId - -func (l idList) Len() int { return len(l) } -func (l idList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l idList) Less(i, j int) bool { return l[i] < l[j] } - -func (data *tarjanData) strongConnect(id bson.ObjectId) *tarjanNode { - index := len(data.nodes) - data.index[id] = index - data.stack = append(data.stack, id) - data.nodes = append(data.nodes, tarjanNode{index, true}) - node := &data.nodes[index] - - // Sort to stabilize the algorithm. - succids := idList(data.successors[id]) - sort.Sort(succids) - for _, succid := range succids { - succindex, seen := data.index[succid] - if !seen { - succnode := data.strongConnect(succid) - if succnode.lowlink < node.lowlink { - node.lowlink = succnode.lowlink - } - } else if data.nodes[succindex].stacked { - // Part of the current strongly-connected component. - if succindex < node.lowlink { - node.lowlink = succindex - } - } - } - - if node.lowlink == index { - // Root node; pop stack and output new - // strongly-connected component. - var scc []bson.ObjectId - i := len(data.stack) - 1 - for { - stackid := data.stack[i] - stackindex := data.index[stackid] - data.nodes[stackindex].stacked = false - scc = append(scc, stackid) - if stackindex == index { - break - } - i-- - } - data.stack = data.stack[:i] - data.output = append(data.output, scc) - } - - return node -} diff --git a/vendor/labix.org/v2/mgo/txn/tarjan_test.go b/vendor/labix.org/v2/mgo/txn/tarjan_test.go deleted file mode 100644 index c422605..0000000 --- a/vendor/labix.org/v2/mgo/txn/tarjan_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package txn - -import ( - "fmt" - "labix.org/v2/mgo/bson" - . "launchpad.net/gocheck" -) - -type TarjanSuite struct{} - -var _ = Suite(TarjanSuite{}) - -func bid(n int) bson.ObjectId { - return bson.ObjectId(fmt.Sprintf("%024d", n)) -} - -func bids(ns ...int) (ids []bson.ObjectId) { - for _, n := range ns { - ids = append(ids, bid(n)) - } - return -} - -func (TarjanSuite) TestExample(c *C) { - successors := map[bson.ObjectId][]bson.ObjectId{ - bid(1): bids(2), - bid(2): bids(1, 5), - bid(3): bids(4), - bid(4): bids(3, 5), - bid(5): bids(6), - bid(6): bids(7), - bid(7): bids(8), - bid(8): bids(6, 9), - bid(9): bids(), - } - - c.Assert(tarjanSort(successors), DeepEquals, [][]bson.ObjectId{ - bids(9), - bids(8, 7, 6), - bids(5), - bids(2, 1), - bids(4, 3), - }) -} diff --git a/vendor/labix.org/v2/mgo/txn/txn.go b/vendor/labix.org/v2/mgo/txn/txn.go deleted file mode 100644 index e798e65..0000000 --- a/vendor/labix.org/v2/mgo/txn/txn.go +++ /dev/null @@ -1,518 +0,0 @@ -// The txn package implements support for multi-document transactions. -// -// For details check the following blog post: -// -// http://blog.labix.org/2012/08/22/multi-doc-transactions-for-mongodb -// -package txn - -import ( - "encoding/binary" - "fmt" - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - "reflect" - "sort" - "sync" - - crand "crypto/rand" - mrand "math/rand" -) - -type state int - -const ( - tpreparing state = 1 // One or more documents not prepared - tprepared state = 2 // Prepared but not yet ready to run - taborting state = 3 // Assertions failed, cleaning up - tapplying state = 4 // Changes are in progress - taborted state = 5 // Pre-conditions failed, nothing done - tapplied state = 6 // All changes applied -) - -func (s state) String() string { - switch s { - case tpreparing: - return "preparing" - case tprepared: - return "prepared" - case taborting: - return "aborting" - case tapplying: - return "applying" - case taborted: - return "aborted" - case tapplied: - return "applied" - } - panic(fmt.Errorf("unknown state: %d", s)) -} - -var rand *mrand.Rand -var randmu sync.Mutex - -func init() { - var seed int64 - err := binary.Read(crand.Reader, binary.BigEndian, &seed) - if err != nil { - panic(err) - } - rand = mrand.New(mrand.NewSource(seed)) -} - -type transaction struct { - Id bson.ObjectId `bson:"_id"` - State state `bson:"s"` - Info interface{} `bson:"i,omitempty"` - Ops []Op `bson:"o"` - Nonce string `bson:"n,omitempty"` - Revnos []int64 `bson:"r,omitempty"` - - docKeysCached docKeys -} - -func (t *transaction) String() string { - if t.Nonce == "" { - return t.Id.Hex() - } - return string(t.token()) -} - -func (t *transaction) done() bool { - return t.State == tapplied || t.State == taborted -} - -func (t *transaction) token() token { - if t.Nonce == "" { - panic("transaction has no nonce") - } - return tokenFor(t) -} - -func (t *transaction) docKeys() docKeys { - if t.docKeysCached != nil { - return t.docKeysCached - } - dkeys := make(docKeys, 0, len(t.Ops)) -NextOp: - for _, op := range t.Ops { - dkey := op.docKey() - for i := range dkeys { - if dkey == dkeys[i] { - continue NextOp - } - } - dkeys = append(dkeys, dkey) - } - sort.Sort(dkeys) - t.docKeysCached = dkeys - return dkeys -} - -// tokenFor returns a unique transaction token that -// is composed by t's id and a nonce. If t already has -// a nonce assigned to it, it will be used, otherwise -// a new nonce will be generated. -func tokenFor(t *transaction) token { - nonce := t.Nonce - if nonce == "" { - nonce = newNonce() - } - return token(t.Id.Hex() + "_" + nonce) -} - -func newNonce() string { - randmu.Lock() - r := rand.Uint32() - randmu.Unlock() - n := make([]byte, 8) - for i := uint(0); i < 8; i++ { - n[i] = "0123456789abcdef"[(r>>(4*i))&0xf] - } - return string(n) -} - -type token string - -func (tt token) id() bson.ObjectId { return bson.ObjectIdHex(string(tt[:24])) } -func (tt token) nonce() string { return string(tt[25:]) } - -// Op represents an operation to a single document that may be -// applied as part of a transaction with other operations. -type Op struct { - // C and Id identify the collection and document this operation - // refers to. Id is matched against the "_id" document field. - C string `bson:"c"` - Id interface{} `bson:"d"` - - // Assert optionally holds a query document that is used to - // test the operation document at the time the transaction is - // going to be applied. The assertions for all operations in - // a transaction are tested before any changes take place, - // and the transaction is entirely aborted if any of them - // fails. This is also the only way to prevent a transaction - // from being being applied (the transaction continues despite - // the outcome of Insert, Update, and Remove). - Assert interface{} `bson:"a,omitempty"` - - // The Insert, Update and Remove fields describe the mutation - // intended by the operation. At most one of them may be set - // per operation. If none are set, Assert must be set and the - // operation becomes a read-only test. - // - // Insert holds the document to be inserted at the time the - // transaction is applied. The Id field will be inserted - // into the document automatically as its _id field. The - // transaction will continue even if the document already - // exists. Use Assert with txn.DocMissing if the insertion is - // required. - // - // Update holds the update document to be applied at the time - // the transaction is applied. The transaction will continue - // even if a document with Id is missing. Use Assert to - // test for the document presence or its contents. - // - // Remove indicates whether to remove the document with Id. - // The transaction continues even if the document doesn't yet - // exist at the time the transaction is applied. Use Assert - // with txn.DocExists to make sure it will be removed. - Insert interface{} `bson:"i,omitempty"` - Update interface{} `bson:"u,omitempty"` - Remove bool `bson:"r,omitempty"` -} - -func (op *Op) isChange() bool { - return op.Update != nil || op.Insert != nil || op.Remove -} - -func (op *Op) docKey() docKey { - return docKey{op.C, op.Id} -} - -func (op *Op) name() string { - switch { - case op.Update != nil: - return "update" - case op.Insert != nil: - return "insert" - case op.Remove: - return "remove" - case op.Assert != nil: - return "assert" - } - return "none" -} - -const ( - // DocExists and DocMissing may be used on an operation's - // Assert value to assert that the document with the given - // Id exists or does not exist, respectively. - DocExists = "d+" - DocMissing = "d-" -) - -// A Runner applies operations as part of a transaction onto any number -// of collections within a database. See the Run method for details. -type Runner struct { - tc *mgo.Collection // txns - sc *mgo.Collection // stash - lc *mgo.Collection // log -} - -// NewRunner returns a new transaction runner that uses tc to hold its -// transactions. -// -// Multiple transaction collections may exist in a single database, but -// all collections that are touched by operations in a given transaction -// collection must be handled exclusively by it. -// -// A second collection with the same name of tc but suffixed by ".stash" -// will be used for implementing the transactional behavior of insert -// and remove operations. -func NewRunner(tc *mgo.Collection) *Runner { - return &Runner{tc, tc.Database.C(tc.Name + ".stash"), nil} -} - -var ErrAborted = fmt.Errorf("transaction aborted") - -// Run creates a new transaction with ops and runs it immediately. -// The id parameter specifies the transaction id, and may be written -// down ahead of time to later verify the success of the change and -// resume it, when the procedure is interrupted for any reason. If -// empty, a random id will be generated. -// The info parameter, if not nil, is included under the "i" -// field of the transaction document. -// -// Operations across documents are not atomically applied, but are -// guaranteed to be eventually all applied in the order provided or -// all aborted, as long as the affected documents are only modified -// through transactions. If documents are simultaneously modified -// by transactions and out of transactions the behavior is undefined. -// -// If Run returns no errors, all operations were applied successfully. -// If it returns ErrAborted, one or more operations can't be applied -// and the transaction was entirely aborted with no changes performed. -// Otherwise, if the transaction is interrupted while running for any -// reason, it may be resumed explicitly or by attempting to apply -// another transaction on any of the documents targeted by ops, as -// long as the interruption was made after the transaction document -// itself was inserted. Run Resume with the obtained transaction id -// to confirm whether the transaction was applied or not. -// -// Any number of transactions may be run concurrently, with one -// runner or many. -func (r *Runner) Run(ops []Op, id bson.ObjectId, info interface{}) (err error) { - const efmt = "error in transaction op %d: %s" - for i := range ops { - op := &ops[i] - if op.C == "" || op.Id == nil { - return fmt.Errorf(efmt, i, "C or Id missing") - } - changes := 0 - if op.Insert != nil { - changes++ - } - if op.Update != nil { - changes++ - } - if op.Remove { - changes++ - } - if changes > 1 { - return fmt.Errorf(efmt, i, "more than one of Insert/Update/Remove set") - } - if changes == 0 && op.Assert == nil { - return fmt.Errorf(efmt, i, "none of Assert/Insert/Update/Remove set") - } - } - if id == "" { - id = bson.NewObjectId() - } - - // Insert transaction sooner rather than later, to stay on the safer side. - t := transaction{ - Id: id, - Ops: ops, - State: tpreparing, - Info: info, - } - if err = r.tc.Insert(&t); err != nil { - return err - } - if err = flush(r, &t); err != nil { - return err - } - if t.State == taborted { - return ErrAborted - } else if t.State != tapplied { - panic(fmt.Errorf("invalid state for %s after flush: %q", &t, t.State)) - } - return nil -} - -// ResumeAll resumes all pending transactions. All ErrAborted errors -// from individual transactions are ignored. -func (r *Runner) ResumeAll() (err error) { - debugf("Resuming all unfinished transactions") - iter := r.tc.Find(bson.D{{"s", bson.D{{"$in", []state{tpreparing, tprepared, tapplying}}}}}).Iter() - var t transaction - for iter.Next(&t) { - if t.State == tapplied || t.State == taborted { - continue - } - debugf("Resuming %s from %q", t.Id, t.State) - if err := flush(r, &t); err != nil { - return err - } - if !t.done() { - panic(fmt.Errorf("invalid state for %s after flush: %q", &t, t.State)) - } - } - return nil -} - -// Resume resumes the transaction with id. It returns mgo.ErrNotFound -// if the transaction is not found. Otherwise, it has the same semantics -// of the Run method after the transaction is inserted. -func (r *Runner) Resume(id bson.ObjectId) (err error) { - t, err := r.load(id) - if err != nil { - return err - } - if !t.done() { - debugf("Resuming %s from %q", t, t.State) - if err := flush(r, t); err != nil { - return err - } - } - if t.State == taborted { - return ErrAborted - } else if t.State != tapplied { - panic(fmt.Errorf("invalid state for %s after flush: %q", t, t.State)) - } - return nil -} - -// ChangeLog enables logging of changes to the given collection -// every time a transaction that modifies content is done being -// applied. -// -// Saved documents are in the format: -// -// {"_id": , : {"d": [, ...], "r": [, ...]}} -// -// The document revision is the value of the txn-revno field after -// the change has been applied. Negative values indicate the document -// was not present in the collection. Revisions will not change when -// updates or removes are applied to missing documents or inserts are -// attempted when the document isn't present. -func (r *Runner) ChangeLog(logc *mgo.Collection) { - r.lc = logc -} - -// PurgeMissing removes from collections any state that refers to transaction -// documents that for whatever reason have been lost from the system (removed -// by accident or lost in a hard crash, for example). -// -// This method should very rarely be needed, if at all, and should never be -// used during the normal operation of an application. Its purpose is to put -// a system that has seen unavoidable corruption back in a working state. -func (r *Runner) PurgeMissing(collections ...string) error { - type M map[string]interface{} - type S []interface{} - pipeline := []M{ - {"$project": M{"_id": 1, "txn-queue": 1}}, - {"$unwind": "$txn-queue"}, - {"$sort": M{"_id": 1, "txn-queue": 1}}, - //{"$group": M{"_id": M{"$substr": S{"$txn-queue", 0, 24}}, "docids": M{"$push": "$_id"}}}, - } - - type TRef struct { - DocId interface{} "_id" - TxnId string "txn-queue" - } - - found := make(map[bson.ObjectId]bool) - colls := make(map[string]bool) - - sort.Strings(collections) - for _, collection := range collections { - c := r.tc.Database.C(collection) - iter := c.Pipe(pipeline).Iter() - var tref TRef - for iter.Next(&tref) { - txnId := bson.ObjectIdHex(tref.TxnId[:24]) - if found[txnId] { - continue - } - if r.tc.FindId(txnId).One(nil) == nil { - found[txnId] = true - continue - } - logf("WARNING: purging from document %s/%v the missing transaction id %s", collection, tref.DocId, txnId) - err := c.UpdateId(tref.DocId, M{"$pull": M{"txn-queue": M{"$regex": "^" + txnId.Hex() + "_*"}}}) - if err != nil { - return fmt.Errorf("error purging missing transaction %s: %v", txnId.Hex(), err) - } - } - colls[collection] = true - } - - type StashTRef struct { - Id docKey "_id" - TxnId string "txn-queue" - } - - iter := r.sc.Pipe(pipeline).Iter() - var stref StashTRef - for iter.Next(&stref) { - txnId := bson.ObjectIdHex(stref.TxnId[:24]) - if found[txnId] { - continue - } - if r.tc.FindId(txnId).One(nil) == nil { - found[txnId] = true - continue - } - logf("WARNING: purging from stash document %s/%v the missing transaction id %s", stref.Id.C, stref.Id.Id, txnId) - err := r.sc.UpdateId(stref.Id, M{"$pull": M{"txn-queue": M{"$regex": "^" + txnId.Hex() + "_*"}}}) - if err != nil { - return fmt.Errorf("error purging missing transaction %s: %v", txnId.Hex(), err) - } - } - - return nil -} - -func (r *Runner) load(id bson.ObjectId) (*transaction, error) { - var t transaction - err := r.tc.FindId(id).One(&t) - if err == mgo.ErrNotFound { - return nil, fmt.Errorf("cannot find transaction %s", id) - } else if err != nil { - return nil, err - } - return &t, nil -} - -type docKey struct { - C string - Id interface{} -} - -type docKeys []docKey - -func (ks docKeys) Len() int { return len(ks) } -func (ks docKeys) Swap(i, j int) { ks[i], ks[j] = ks[j], ks[i] } -func (ks docKeys) Less(i, j int) bool { - a, b := ks[i], ks[j] - if a.C != b.C { - return a.C < b.C - } - av, an := valueNature(a.Id) - bv, bn := valueNature(b.Id) - if an != bn { - return an < bn - } - switch an { - case natureString: - return av.(string) < bv.(string) - case natureInt: - return av.(int64) < bv.(int64) - case natureFloat: - return av.(float64) < bv.(float64) - case natureBool: - return !av.(bool) && bv.(bool) - } - panic("unreachable") -} - -type typeNature int - -const ( - // The order of these values matters. Transactions - // from applications using different ordering will - // be incompatible with each other. - _ typeNature = iota - natureString - natureInt - natureFloat - natureBool -) - -func valueNature(v interface{}) (value interface{}, nature typeNature) { - rv := reflect.ValueOf(v) - switch rv.Kind() { - case reflect.String: - return rv.String(), natureString - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int(), natureInt - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return int64(rv.Uint()), natureInt - case reflect.Float32, reflect.Float64: - return rv.Float(), natureFloat - case reflect.Bool: - return rv.Bool(), natureBool - } - panic("document id type unsupported by txn: " + rv.Kind().String()) -} diff --git a/vendor/labix.org/v2/mgo/txn/txn_test.go b/vendor/labix.org/v2/mgo/txn/txn_test.go deleted file mode 100644 index b716783..0000000 --- a/vendor/labix.org/v2/mgo/txn/txn_test.go +++ /dev/null @@ -1,521 +0,0 @@ -package txn_test - -import ( - "labix.org/v2/mgo" - "labix.org/v2/mgo/bson" - "labix.org/v2/mgo/txn" - . "launchpad.net/gocheck" - "testing" -) - -func TestAll(t *testing.T) { - TestingT(t) -} - -type S struct { - MgoSuite - - db *mgo.Database - tc, sc *mgo.Collection - accounts *mgo.Collection - runner *txn.Runner -} - -var _ = Suite(&S{}) - -type M map[string]interface{} - -func (s *S) SetUpTest(c *C) { - txn.SetChaos(txn.Chaos{}) - txn.SetLogger(c) - txn.SetDebug(true) - s.MgoSuite.SetUpTest(c) - - s.db = s.session.DB("test") - s.tc = s.db.C("tc") - s.sc = s.db.C("tc.stash") - s.accounts = s.db.C("accounts") - s.runner = txn.NewRunner(s.tc) -} - -type Account struct { - Id int `bson:"_id"` - Balance int -} - -func (s *S) TestDocExists(c *C) { - err := s.accounts.Insert(M{"_id": 0, "balance": 300}) - c.Assert(err, IsNil) - - exists := []txn.Op{{ - C: "accounts", - Id: 0, - Assert: txn.DocExists, - }} - missing := []txn.Op{{ - C: "accounts", - Id: 0, - Assert: txn.DocMissing, - }} - - err = s.runner.Run(exists, "", nil) - c.Assert(err, IsNil) - err = s.runner.Run(missing, "", nil) - c.Assert(err, Equals, txn.ErrAborted) - - err = s.accounts.RemoveId(0) - c.Assert(err, IsNil) - - err = s.runner.Run(exists, "", nil) - c.Assert(err, Equals, txn.ErrAborted) - err = s.runner.Run(missing, "", nil) - c.Assert(err, IsNil) -} - -func (s *S) TestInsert(c *C) { - err := s.accounts.Insert(M{"_id": 0, "balance": 300}) - c.Assert(err, IsNil) - - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Insert: M{"balance": 200}, - }} - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) - - ops[0].Id = 1 - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - err = s.accounts.FindId(1).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 200) -} - -func (s *S) TestRemove(c *C) { - err := s.accounts.Insert(M{"_id": 0, "balance": 300}) - c.Assert(err, IsNil) - - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Remove: true, - }} - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - err = s.accounts.FindId(0).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) -} - -func (s *S) TestUpdate(c *C) { - var err error - err = s.accounts.Insert(M{"_id": 0, "balance": 200}) - c.Assert(err, IsNil) - err = s.accounts.Insert(M{"_id": 1, "balance": 200}) - c.Assert(err, IsNil) - - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Update: M{"$inc": M{"balance": 100}}, - }} - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) - - ops[0].Id = 1 - - err = s.accounts.FindId(1).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 200) -} - -func (s *S) TestInsertUpdate(c *C) { - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Insert: M{"_id": 0, "balance": 200}, - }, { - C: "accounts", - Id: 0, - Update: M{"$inc": M{"balance": 100}}, - }} - - err := s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 400) -} - -func (s *S) TestUpdateInsert(c *C) { - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Update: M{"$inc": M{"balance": 100}}, - }, { - C: "accounts", - Id: 0, - Insert: M{"_id": 0, "balance": 200}, - }} - - err := s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 200) - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) -} - -func (s *S) TestInsertRemoveInsert(c *C) { - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Insert: M{"_id": 0, "balance": 200}, - }, { - C: "accounts", - Id: 0, - Remove: true, - }, { - C: "accounts", - Id: 0, - Insert: M{"_id": 0, "balance": 300}, - }} - - err := s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) -} - -func (s *S) TestQueueStashing(c *C) { - txn.SetChaos(txn.Chaos{ - KillChance: 1, - Breakpoint: "set-applying", - }) - - opses := [][]txn.Op{{{ - C: "accounts", - Id: 0, - Insert: M{"balance": 100}, - }}, {{ - C: "accounts", - Id: 0, - Remove: true, - }}, {{ - C: "accounts", - Id: 0, - Insert: M{"balance": 200}, - }}, {{ - C: "accounts", - Id: 0, - Update: M{"$inc": M{"balance": 100}}, - }}} - - var last bson.ObjectId - for _, ops := range opses { - last = bson.NewObjectId() - err := s.runner.Run(ops, last, nil) - c.Assert(err, Equals, txn.ErrChaos) - } - - txn.SetChaos(txn.Chaos{}) - err := s.runner.Resume(last) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 300) -} - -func (s *S) TestInfo(c *C) { - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Assert: txn.DocMissing, - }} - - id := bson.NewObjectId() - err := s.runner.Run(ops, id, M{"n": 42}) - c.Assert(err, IsNil) - - var t struct{ I struct{ N int } } - err = s.tc.FindId(id).One(&t) - c.Assert(err, IsNil) - c.Assert(t.I.N, Equals, 42) -} - -func (s *S) TestErrors(c *C) { - doc := bson.M{"foo": 1} - tests := []txn.Op{{ - C: "c", - Id: 0, - }, { - C: "c", - Id: 0, - Insert: doc, - Remove: true, - }, { - C: "c", - Id: 0, - Insert: doc, - Update: doc, - }, { - C: "c", - Id: 0, - Update: doc, - Remove: true, - }, { - C: "c", - Assert: doc, - }, { - Id: 0, - Assert: doc, - }} - - txn.SetChaos(txn.Chaos{KillChance: 1.0}) - for _, op := range tests { - c.Logf("op: %v", op) - err := s.runner.Run([]txn.Op{op}, "", nil) - c.Assert(err, ErrorMatches, "error in transaction op 0: .*") - } -} - -func (s *S) TestAssertNestedOr(c *C) { - // Assert uses $or internally. Ensure nesting works. - err := s.accounts.Insert(M{"_id": 0, "balance": 300}) - c.Assert(err, IsNil) - - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Assert: bson.D{{"$or", []bson.D{{{"balance", 100}}, {{"balance", 300}}}}}, - Update: bson.D{{"$inc", bson.D{{"balance", 100}}}}, - }} - - err = s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var account Account - err = s.accounts.FindId(0).One(&account) - c.Assert(err, IsNil) - c.Assert(account.Balance, Equals, 400) -} - -func (s *S) TestVerifyFieldOrdering(c *C) { - // Used to have a map in certain operations, which means - // the ordering of fields would be messed up. - fields := bson.D{{"a", 1}, {"b", 2}, {"c", 3}} - ops := []txn.Op{{ - C: "accounts", - Id: 0, - Insert: fields, - }} - - err := s.runner.Run(ops, "", nil) - c.Assert(err, IsNil) - - var d bson.D - err = s.accounts.FindId(0).One(&d) - c.Assert(err, IsNil) - - var filtered bson.D - for _, e := range d { - switch e.Name { - case "a", "b", "c": - filtered = append(filtered, e) - } - } - c.Assert(filtered, DeepEquals, fields) -} - -func (s *S) TestChangeLog(c *C) { - chglog := s.db.C("chglog") - s.runner.ChangeLog(chglog) - - ops := []txn.Op{{ - C: "debts", - Id: 0, - Assert: txn.DocMissing, - }, { - C: "accounts", - Id: 0, - Insert: M{"balance": 300}, - }, { - C: "accounts", - Id: 1, - Insert: M{"balance": 300}, - }, { - C: "people", - Id: "joe", - Insert: M{"accounts": []int64{0, 1}}, - }} - id := bson.NewObjectId() - err := s.runner.Run(ops, id, nil) - c.Assert(err, IsNil) - - type IdList []interface{} - type Log struct { - Docs IdList "d" - Revnos []int64 "r" - } - var m map[string]*Log - err = chglog.FindId(id).One(&m) - c.Assert(err, IsNil) - - c.Assert(m["accounts"], DeepEquals, &Log{IdList{0, 1}, []int64{2, 2}}) - c.Assert(m["people"], DeepEquals, &Log{IdList{"joe"}, []int64{2}}) - c.Assert(m["debts"], IsNil) - - ops = []txn.Op{{ - C: "accounts", - Id: 0, - Update: M{"$inc": M{"balance": 100}}, - }, { - C: "accounts", - Id: 1, - Update: M{"$inc": M{"balance": 100}}, - }} - id = bson.NewObjectId() - err = s.runner.Run(ops, id, nil) - c.Assert(err, IsNil) - - m = nil - err = chglog.FindId(id).One(&m) - c.Assert(err, IsNil) - - c.Assert(m["accounts"], DeepEquals, &Log{IdList{0, 1}, []int64{3, 3}}) - c.Assert(m["people"], IsNil) - - ops = []txn.Op{{ - C: "accounts", - Id: 0, - Remove: true, - }, { - C: "people", - Id: "joe", - Remove: true, - }} - id = bson.NewObjectId() - err = s.runner.Run(ops, id, nil) - c.Assert(err, IsNil) - - m = nil - err = chglog.FindId(id).One(&m) - c.Assert(err, IsNil) - - c.Assert(m["accounts"], DeepEquals, &Log{IdList{0}, []int64{-4}}) - c.Assert(m["people"], DeepEquals, &Log{IdList{"joe"}, []int64{-3}}) -} - -func (s *S) TestPurgeMissing(c *C) { - txn.SetChaos(txn.Chaos{ - KillChance: 1, - Breakpoint: "set-applying", - }) - - err := s.accounts.Insert(M{"_id": 0, "balance": 100}) - c.Assert(err, IsNil) - err = s.accounts.Insert(M{"_id": 1, "balance": 100}) - c.Assert(err, IsNil) - - ops1 := []txn.Op{{ - C: "accounts", - Id: 3, - Insert: M{"balance": 100}, - }} - - ops2 := []txn.Op{{ - C: "accounts", - Id: 0, - Remove: true, - }, { - C: "accounts", - Id: 1, - Update: M{"$inc": M{"balance": 100}}, - }, { - C: "accounts", - Id: 2, - Insert: M{"balance": 100}, - }} - - err = s.runner.Run(ops1, "", nil) - c.Assert(err, Equals, txn.ErrChaos) - - last := bson.NewObjectId() - err = s.runner.Run(ops2, last, nil) - c.Assert(err, Equals, txn.ErrChaos) - err = s.tc.RemoveId(last) - c.Assert(err, IsNil) - - txn.SetChaos(txn.Chaos{}) - err = s.runner.ResumeAll() - c.Assert(err, IsNil) - - err = s.runner.Run(ops2, "", nil) - c.Assert(err, ErrorMatches, "cannot find transaction .*") - - err = s.runner.PurgeMissing("accounts") - c.Assert(err, IsNil) - - err = s.runner.Run(ops2, "", nil) - c.Assert(err, IsNil) - - expect := []struct{ Id, Balance int }{ - {0, -1}, - {1, 200}, - {2, 100}, - {3, 100}, - } - var got Account - for _, want := range expect { - err = s.accounts.FindId(want.Id).One(&got) - if want.Balance == -1 { - if err != mgo.ErrNotFound { - c.Errorf("Account %d should not exist, find got err=%#v", err) - } - } else if err != nil { - c.Errorf("Account %d should have balance of %d, but wasn't found", want.Id, want.Balance) - } else if got.Balance != want.Balance { - c.Errorf("Account %d should have balance of %d, got %d", want.Id, want.Balance, got.Balance) - } - } -} diff --git a/vendor/launchpad.net/goyaml/.bzr/README b/vendor/launchpad.net/goyaml/.bzr/README deleted file mode 100644 index f82dc1c..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/README +++ /dev/null @@ -1,3 +0,0 @@ -This is a Bazaar control directory. -Do not change any files in this directory. -See http://bazaar.canonical.com/ for more information about Bazaar. diff --git a/vendor/launchpad.net/goyaml/.bzr/branch-format b/vendor/launchpad.net/goyaml/.bzr/branch-format deleted file mode 100644 index 9eb09b7..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/branch-format +++ /dev/null @@ -1 +0,0 @@ -Bazaar-NG meta directory, format 1 diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf b/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf deleted file mode 100644 index dae50f0..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf +++ /dev/null @@ -1 +0,0 @@ -parent_location = http://bazaar.launchpad.net/~goyaml/goyaml/trunk/ diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/format b/vendor/launchpad.net/goyaml/.bzr/branch/format deleted file mode 100644 index dc392f4..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/branch/format +++ /dev/null @@ -1 +0,0 @@ -Bazaar Branch Format 7 (needs bzr 1.6) diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/last-revision b/vendor/launchpad.net/goyaml/.bzr/branch/last-revision deleted file mode 100644 index 5128c99..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/branch/last-revision +++ /dev/null @@ -1 +0,0 @@ -51 gustavo@niemeyer.net-20140305200416-7gh64vkcckre5mob diff --git a/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts b/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts deleted file mode 100644 index 0dc2d3a..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts +++ /dev/null @@ -1 +0,0 @@ -BZR conflict list format 1 diff --git a/vendor/launchpad.net/goyaml/.bzr/checkout/dirstate b/vendor/launchpad.net/goyaml/.bzr/checkout/dirstate deleted file mode 100644 index 748ed3049ced7aacbb8854d87fe218f19fc6f44b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5692 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 a43O;PKqyl2cpljcz{UVLX1M_NVvwL)N`xu^ diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix b/vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix deleted file mode 100644 index a1fb02affed0160b9319ee856f7e5d40f4e90b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3430 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 diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/pack-names b/vendor/launchpad.net/goyaml/.bzr/repository/pack-names deleted file mode 100644 index f17a210..0000000 --- a/vendor/launchpad.net/goyaml/.bzr/repository/pack-names +++ /dev/null @@ -1,6 +0,0 @@ -B+Tree Graph Index 2 -node_ref_lists=0 -key_elements=1 -len=1 -row_lengths=1 -xœÁ»€ Pj¦È R8ŒŸPYXظ½ï½ß“Ûûª×ÊuΡ RÓÓ0³5ÆAX0F)04̤ϮW[ÔþZ \ No newline at end of file diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack b/vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack deleted file mode 100644 index 5fec2552227164540e8971bd15374d0dc8cf07a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583825 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�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%0A293v$oGO`ph=T%U2^kg9I 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%0AE(?|1sL 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 f^0ALQZ_B^; + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/labix.org/v2/mgo/Makefile b/vendor/labix.org/v2/mgo/Makefile new file mode 100644 index 0000000..51bee73 --- /dev/null +++ b/vendor/labix.org/v2/mgo/Makefile @@ -0,0 +1,5 @@ +startdb: + @testdb/setup.sh start + +stopdb: + @testdb/setup.sh stop diff --git a/vendor/labix.org/v2/mgo/auth.go b/vendor/labix.org/v2/mgo/auth.go new file mode 100644 index 0000000..7f3ba8c --- /dev/null +++ b/vendor/labix.org/v2/mgo/auth.go @@ -0,0 +1,412 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "labix.org/v2/mgo/bson" + "sync" +) + +type authCmd struct { + Authenticate int + + Nonce string + User string + Key string +} + +type startSaslCmd struct { + StartSASL int `bson:"startSasl"` +} + +type authResult struct { + ErrMsg string + Ok bool +} + +type getNonceCmd struct { + GetNonce int +} + +type getNonceResult struct { + Nonce string + Err string "$err" + Code int +} + +type logoutCmd struct { + Logout int +} + +type saslCmd struct { + Start int `bson:"saslStart,omitempty"` + Continue int `bson:"saslContinue,omitempty"` + ConversationId int `bson:"conversationId,omitempty"` + Mechanism string `bson:"mechanism,omitempty"` + Payload []byte +} + +type saslResult struct { + Ok bool `bson:"ok"` + NotOk bool `bson:"code"` // Server <= 2.3.2 returns ok=1 & code>0 on errors (WTF?) + Done bool + + ConversationId int `bson:"conversationId"` + Payload []byte + ErrMsg string +} + +type saslStepper interface { + Step(serverData []byte) (clientData []byte, done bool, err error) + Close() +} + +func (socket *mongoSocket) getNonce() (nonce string, err error) { + socket.Lock() + for socket.cachedNonce == "" && socket.dead == nil { + debugf("Socket %p to %s: waiting for nonce", socket, socket.addr) + socket.gotNonce.Wait() + } + if socket.cachedNonce == "mongos" { + socket.Unlock() + return "", errors.New("Can't authenticate with mongos; see http://j.mp/mongos-auth") + } + debugf("Socket %p to %s: got nonce", socket, socket.addr) + nonce, err = socket.cachedNonce, socket.dead + socket.cachedNonce = "" + socket.Unlock() + if err != nil { + nonce = "" + } + return +} + +func (socket *mongoSocket) resetNonce() { + debugf("Socket %p to %s: requesting a new nonce", socket, socket.addr) + op := &queryOp{} + op.query = &getNonceCmd{GetNonce: 1} + op.collection = "admin.$cmd" + op.limit = -1 + op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { + if err != nil { + socket.kill(errors.New("getNonce: "+err.Error()), true) + return + } + result := &getNonceResult{} + err = bson.Unmarshal(docData, &result) + if err != nil { + socket.kill(errors.New("Failed to unmarshal nonce: "+err.Error()), true) + return + } + debugf("Socket %p to %s: nonce unmarshalled: %#v", socket, socket.addr, result) + if result.Code == 13390 { + // mongos doesn't yet support auth (see http://j.mp/mongos-auth) + result.Nonce = "mongos" + } else if result.Nonce == "" { + var msg string + if result.Err != "" { + msg = fmt.Sprintf("Got an empty nonce: %s (%d)", result.Err, result.Code) + } else { + msg = "Got an empty nonce" + } + socket.kill(errors.New(msg), true) + return + } + socket.Lock() + if socket.cachedNonce != "" { + socket.Unlock() + panic("resetNonce: nonce already cached") + } + socket.cachedNonce = result.Nonce + socket.gotNonce.Signal() + socket.Unlock() + } + err := socket.Query(op) + if err != nil { + socket.kill(errors.New("resetNonce: "+err.Error()), true) + } +} + +func (socket *mongoSocket) Login(cred Credential) error { + socket.Lock() + for _, sockCred := range socket.creds { + if sockCred == cred { + debugf("Socket %p to %s: login: db=%q user=%q (already logged in)", socket, socket.addr, cred.Source, cred.Username) + socket.Unlock() + return nil + } + } + if socket.dropLogout(cred) { + debugf("Socket %p to %s: login: db=%q user=%q (cached)", socket, socket.addr, cred.Source, cred.Username) + socket.creds = append(socket.creds, cred) + socket.Unlock() + return nil + } + socket.Unlock() + + debugf("Socket %p to %s: login: db=%q user=%q", socket, socket.addr, cred.Source, cred.Username) + + var err error + switch cred.Mechanism { + case "", "MONGO-CR": + err = socket.loginClassic(cred) + case "PLAIN": + err = socket.loginPlain(cred) + case "MONGO-X509": + err = fmt.Errorf("unsupported authentication mechanism: %s", cred.Mechanism) + default: + // Try SASL for everything else, if it is available. + err = socket.loginSASL(cred) + } + + if err != nil { + debugf("Socket %p to %s: login error: %s", socket, socket.addr, err) + } else { + debugf("Socket %p to %s: login successful", socket, socket.addr) + } + return err +} + +func (socket *mongoSocket) loginClassic(cred Credential) error { + // Note that this only works properly because this function is + // synchronous, which means the nonce won't get reset while we're + // using it and any other login requests will block waiting for a + // new nonce provided in the defer call below. + nonce, err := socket.getNonce() + if err != nil { + return err + } + defer socket.resetNonce() + + psum := md5.New() + psum.Write([]byte(cred.Username + ":mongo:" + cred.Password)) + + ksum := md5.New() + ksum.Write([]byte(nonce + cred.Username)) + ksum.Write([]byte(hex.EncodeToString(psum.Sum(nil)))) + + key := hex.EncodeToString(ksum.Sum(nil)) + + cmd := authCmd{Authenticate: 1, User: cred.Username, Nonce: nonce, Key: key} + res := authResult{} + return socket.loginRun(cred.Source, &cmd, &res, func() error { + if !res.Ok { + return errors.New(res.ErrMsg) + } + socket.Lock() + socket.dropAuth(cred.Source) + socket.creds = append(socket.creds, cred) + socket.Unlock() + return nil + }) +} + +func (socket *mongoSocket) loginPlain(cred Credential) error { + cmd := saslCmd{Start: 1, Mechanism: "PLAIN", Payload: []byte("\x00" + cred.Username + "\x00" + cred.Password)} + res := authResult{} + return socket.loginRun(cred.Source, &cmd, &res, func() error { + if !res.Ok { + return errors.New(res.ErrMsg) + } + socket.Lock() + socket.dropAuth(cred.Source) + socket.creds = append(socket.creds, cred) + socket.Unlock() + return nil + }) +} + +func (socket *mongoSocket) loginSASL(cred Credential) error { + sasl, err := saslNew(cred, socket.Server().Addr) + if err != nil { + return err + } + defer sasl.Close() + + // The goal of this logic is to carry a locked socket until the + // local SASL step confirms the auth is valid; the socket needs to be + // locked so that concurrent action doesn't leave the socket in an + // auth state that doesn't reflect the operations that took place. + // As a simple case, imagine inverting login=>logout to logout=>login. + // + // The logic below works because the lock func isn't called concurrently. + locked := false + lock := func(b bool) { + if locked != b { + locked = b + if b { + socket.Lock() + } else { + socket.Unlock() + } + } + } + + lock(true) + defer lock(false) + + start := 1 + cmd := saslCmd{} + res := saslResult{} + for { + payload, done, err := sasl.Step(res.Payload) + if err != nil { + return err + } + if done && res.Done { + socket.dropAuth(cred.Source) + socket.creds = append(socket.creds, cred) + break + } + lock(false) + + cmd = saslCmd{ + Start: start, + Continue: 1 - start, + ConversationId: res.ConversationId, + Mechanism: cred.Mechanism, + Payload: payload, + } + start = 0 + err = socket.loginRun(cred.Source, &cmd, &res, func() error { + // See the comment on lock for why this is necessary. + lock(true) + if !res.Ok || res.NotOk { + return fmt.Errorf("server returned error on SASL authentication step: %s", res.ErrMsg) + } + return nil + }) + if err != nil { + return err + } + if done && res.Done { + socket.dropAuth(cred.Source) + socket.creds = append(socket.creds, cred) + break + } + } + + return nil +} + +func (socket *mongoSocket) loginRun(db string, query, result interface{}, f func() error) error { + var mutex sync.Mutex + var replyErr error + mutex.Lock() + + op := queryOp{} + op.query = query + op.collection = db + ".$cmd" + op.limit = -1 + op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { + defer mutex.Unlock() + + if err != nil { + replyErr = err + return + } + + err = bson.Unmarshal(docData, result) + if err != nil { + replyErr = err + } else { + // Must handle this within the read loop for the socket, so + // that concurrent login requests are properly ordered. + replyErr = f() + } + } + + err := socket.Query(&op) + if err != nil { + return err + } + mutex.Lock() // Wait. + return replyErr +} + +func (socket *mongoSocket) Logout(db string) { + socket.Lock() + cred, found := socket.dropAuth(db) + if found { + debugf("Socket %p to %s: logout: db=%q (flagged)", socket, socket.addr, db) + socket.logout = append(socket.logout, cred) + } + socket.Unlock() +} + +func (socket *mongoSocket) LogoutAll() { + socket.Lock() + if l := len(socket.creds); l > 0 { + debugf("Socket %p to %s: logout all (flagged %d)", socket, socket.addr, l) + socket.logout = append(socket.logout, socket.creds...) + socket.creds = socket.creds[0:0] + } + socket.Unlock() +} + +func (socket *mongoSocket) flushLogout() (ops []interface{}) { + socket.Lock() + if l := len(socket.logout); l > 0 { + debugf("Socket %p to %s: logout all (flushing %d)", socket, socket.addr, l) + for i := 0; i != l; i++ { + op := queryOp{} + op.query = &logoutCmd{1} + op.collection = socket.logout[i].Source + ".$cmd" + op.limit = -1 + ops = append(ops, &op) + } + socket.logout = socket.logout[0:0] + } + socket.Unlock() + return +} + +func (socket *mongoSocket) dropAuth(db string) (cred Credential, found bool) { + for i, sockCred := range socket.creds { + if sockCred.Source == db { + copy(socket.creds[i:], socket.creds[i+1:]) + socket.creds = socket.creds[:len(socket.creds)-1] + return sockCred, true + } + } + return cred, false +} + +func (socket *mongoSocket) dropLogout(cred Credential) (found bool) { + for i, sockCred := range socket.logout { + if sockCred == cred { + copy(socket.logout[i:], socket.logout[i+1:]) + socket.logout = socket.logout[:len(socket.logout)-1] + return true + } + } + return false +} diff --git a/vendor/labix.org/v2/mgo/auth_test.go b/vendor/labix.org/v2/mgo/auth_test.go new file mode 100644 index 0000000..07080ca --- /dev/null +++ b/vendor/labix.org/v2/mgo/auth_test.go @@ -0,0 +1,935 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "flag" + "fmt" + "labix.org/v2/mgo" + . "launchpad.net/gocheck" + "net/url" + "sync" + "time" +) + +func (s *S) TestAuthLoginDatabase(c *C) { + // Test both with a normal database and with an authenticated shard. + for _, addr := range []string{"localhost:40002", "localhost:40203"} { + session, err := mgo.Dial(addr) + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") + + admindb := session.DB("admin") + + err = admindb.Login("root", "wrong") + c.Assert(err, ErrorMatches, "auth fail(s|ed)") + + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + } +} + +func (s *S) TestAuthLoginSession(c *C) { + // Test both with a normal database and with an authenticated shard. + for _, addr := range []string{"localhost:40002", "localhost:40203"} { + session, err := mgo.Dial(addr) + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") + + cred := mgo.Credential{ + Username: "root", + Password: "wrong", + } + err = session.Login(&cred) + c.Assert(err, ErrorMatches, "auth fail(s|ed)") + + cred.Password = "rapadura" + + err = session.Login(&cred) + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + } +} + +func (s *S) TestAuthLoginLogout(c *C) { + // Test both with a normal database and with an authenticated shard. + for _, addr := range []string{"localhost:40002", "localhost:40203"} { + session, err := mgo.Dial(addr) + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + admindb.Logout() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") + + // Must have dropped auth from the session too. + session = session.Copy() + defer session.Close() + + coll = session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") + } +} + +func (s *S) TestAuthLoginLogoutAll(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + session.LogoutAll() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") + + // Must have dropped auth from the session too. + session = session.Copy() + defer session.Close() + + coll = session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") +} + +func (s *S) TestAuthUpsertUserErrors(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + + err = mydb.UpsertUser(&mgo.User{}) + c.Assert(err, ErrorMatches, "user has no Username") + + err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", UserSource: "source"}) + c.Assert(err, ErrorMatches, "user has both Password/PasswordHash and UserSource set") + + err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", OtherDBRoles: map[string][]mgo.Role{"db": nil}}) + c.Assert(err, ErrorMatches, "user with OtherDBRoles is only supported in admin database") +} + +func (s *S) TestAuthUpsertUser(c *C) { + if !s.versionAtLeast(2, 4) { + c.Skip("UpsertUser only works on 2.4+") + } + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + + ruser := &mgo.User{ + Username: "myruser", + Password: "mypass", + Roles: []mgo.Role{mgo.RoleRead}, + } + rwuser := &mgo.User{ + Username: "myrwuser", + Password: "mypass", + Roles: []mgo.Role{mgo.RoleReadWrite}, + } + + err = mydb.UpsertUser(ruser) + c.Assert(err, IsNil) + err = mydb.UpsertUser(rwuser) + c.Assert(err, IsNil) + + err = mydb.Login("myruser", "mypass") + c.Assert(err, IsNil) + + admindb.Logout() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + err = mydb.Login("myrwuser", "mypass") + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + + myotherdb := session.DB("myotherdb") + + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + // Test UserSource. + rwuserother := &mgo.User{ + Username: "myrwuser", + UserSource: "mydb", + Roles: []mgo.Role{mgo.RoleRead}, + } + + err = myotherdb.UpsertUser(rwuserother) + if s.versionAtLeast(2, 6) { + c.Assert(err, ErrorMatches, `MongoDB 2.6\+ does not support the UserSource setting`) + return + } + c.Assert(err, IsNil) + + admindb.Logout() + + // Test indirection via UserSource: we can't write to it, because + // the roles for myrwuser are different there. + othercoll := myotherdb.C("myothercoll") + err = othercoll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + // Reading works, though. + err = othercoll.Find(nil).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) + + // Can't login directly into the database using UserSource, though. + err = myotherdb.Login("myrwuser", "mypass") + c.Assert(err, ErrorMatches, "auth fail(s|ed)") +} + +func (s *S) TestAuthUpsertUserOtherDBRoles(c *C) { + if !s.versionAtLeast(2, 4) { + c.Skip("UpsertUser only works on 2.4+") + } + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + ruser := &mgo.User{ + Username: "myruser", + Password: "mypass", + OtherDBRoles: map[string][]mgo.Role{"mydb": []mgo.Role{mgo.RoleRead}}, + } + + err = admindb.UpsertUser(ruser) + c.Assert(err, IsNil) + defer admindb.RemoveUser("myruser") + + admindb.Logout() + err = admindb.Login("myruser", "mypass") + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + err = coll.Find(nil).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestAuthUpsertUserUpdates(c *C) { + if !s.versionAtLeast(2, 4) { + c.Skip("UpsertUser only works on 2.4+") + } + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + + // Insert a user that can read. + user := &mgo.User{ + Username: "myruser", + Password: "mypass", + Roles: []mgo.Role{mgo.RoleRead}, + } + err = mydb.UpsertUser(user) + c.Assert(err, IsNil) + + // Now update the user password. + user = &mgo.User{ + Username: "myruser", + Password: "mynewpass", + } + err = mydb.UpsertUser(user) + c.Assert(err, IsNil) + + // Login with the new user. + usession, err := mgo.Dial("myruser:mynewpass@localhost:40002/mydb") + c.Assert(err, IsNil) + defer usession.Close() + + // Can read, but not write. + err = usession.DB("mydb").C("mycoll").Find(nil).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) + err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + // Update the user role. + user = &mgo.User{ + Username: "myruser", + Roles: []mgo.Role{mgo.RoleReadWrite}, + } + err = mydb.UpsertUser(user) + c.Assert(err, IsNil) + + // Dial again to ensure the password hasn't changed. + usession, err = mgo.Dial("myruser:mynewpass@localhost:40002/mydb") + c.Assert(err, IsNil) + defer usession.Close() + + // Now it can write. + err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthAddUser(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + err = mydb.AddUser("myruser", "mypass", true) + c.Assert(err, IsNil) + err = mydb.AddUser("mywuser", "mypass", false) + c.Assert(err, IsNil) + + err = mydb.Login("myruser", "mypass") + c.Assert(err, IsNil) + + admindb.Logout() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + err = mydb.Login("mywuser", "mypass") + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthAddUserReplaces(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + err = mydb.AddUser("myuser", "myoldpass", false) + c.Assert(err, IsNil) + err = mydb.AddUser("myuser", "mynewpass", true) + c.Assert(err, IsNil) + + admindb.Logout() + + err = mydb.Login("myuser", "myoldpass") + c.Assert(err, ErrorMatches, "auth fail(s|ed)") + err = mydb.Login("myuser", "mynewpass") + c.Assert(err, IsNil) + + // ReadOnly flag was changed too. + err = mydb.C("mycoll").Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") +} + +func (s *S) TestAuthRemoveUser(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + err = mydb.AddUser("myuser", "mypass", true) + c.Assert(err, IsNil) + err = mydb.RemoveUser("myuser") + c.Assert(err, IsNil) + + err = mydb.Login("myuser", "mypass") + c.Assert(err, ErrorMatches, "auth fail(s|ed)") +} + +func (s *S) TestAuthLoginTwiceDoesNothing(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + oldStats := mgo.GetStats() + + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + newStats := mgo.GetStats() + c.Assert(newStats.SentOps, Equals, oldStats.SentOps) +} + +func (s *S) TestAuthLoginLogoutLoginDoesNothing(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + oldStats := mgo.GetStats() + + admindb.Logout() + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + newStats := mgo.GetStats() + c.Assert(newStats.SentOps, Equals, oldStats.SentOps) +} + +func (s *S) TestAuthLoginSwitchUser(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + + err = admindb.Login("reader", "rapadura") + c.Assert(err, IsNil) + + // Can't write. + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + // But can read. + result := struct{ N int }{} + err = coll.Find(nil).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 1) +} + +func (s *S) TestAuthLoginChangePassword(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + mydb := session.DB("mydb") + err = mydb.AddUser("myuser", "myoldpass", false) + c.Assert(err, IsNil) + + err = mydb.Login("myuser", "myoldpass") + c.Assert(err, IsNil) + + err = mydb.AddUser("myuser", "mynewpass", true) + c.Assert(err, IsNil) + + err = mydb.Login("myuser", "mynewpass") + c.Assert(err, IsNil) + + admindb.Logout() + + // The second login must be in effect, which means read-only. + err = mydb.C("mycoll").Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") +} + +func (s *S) TestAuthLoginCachingWithSessionRefresh(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + session.Refresh() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthLoginCachingWithSessionCopy(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + session = session.Copy() + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthLoginCachingWithSessionClone(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + session = session.Clone() + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthLoginCachingWithNewSession(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + session = session.New() + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized for .*") +} + +func (s *S) TestAuthLoginCachingAcrossPool(c *C) { + // Logins are cached even when the conenction goes back + // into the pool. + + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + // Add another user to test the logout case at the same time. + mydb := session.DB("mydb") + err = mydb.AddUser("myuser", "mypass", false) + c.Assert(err, IsNil) + + err = mydb.Login("myuser", "mypass") + c.Assert(err, IsNil) + + // Logout root explicitly, to test both cases. + admindb.Logout() + + // Give socket back to pool. + session.Refresh() + + // Brand new session, should use socket from the pool. + other := session.New() + defer other.Close() + + oldStats := mgo.GetStats() + + err = other.DB("admin").Login("root", "rapadura") + c.Assert(err, IsNil) + err = other.DB("mydb").Login("myuser", "mypass") + c.Assert(err, IsNil) + + // Both logins were cached, so no ops. + newStats := mgo.GetStats() + c.Assert(newStats.SentOps, Equals, oldStats.SentOps) + + // And they actually worked. + err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) + + other.DB("admin").Logout() + + err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthLoginCachingAcrossPoolWithLogout(c *C) { + // Now verify that logouts are properly flushed if they + // are not revalidated after leaving the pool. + + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + // Add another user to test the logout case at the same time. + mydb := session.DB("mydb") + err = mydb.AddUser("myuser", "mypass", true) + c.Assert(err, IsNil) + + err = mydb.Login("myuser", "mypass") + c.Assert(err, IsNil) + + // Just some data to query later. + err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) + + // Give socket back to pool. + session.Refresh() + + // Brand new session, should use socket from the pool. + other := session.New() + defer other.Close() + + oldStats := mgo.GetStats() + + err = other.DB("mydb").Login("myuser", "mypass") + c.Assert(err, IsNil) + + // Login was cached, so no ops. + newStats := mgo.GetStats() + c.Assert(newStats.SentOps, Equals, oldStats.SentOps) + + // Can't write, since root has been implicitly logged out + // when the collection went into the pool, and not revalidated. + err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + // But can read due to the revalidated myuser login. + result := struct{ N int }{} + err = other.DB("mydb").C("mycoll").Find(nil).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 1) +} + +func (s *S) TestAuthEventual(c *C) { + // Eventual sessions don't keep sockets around, so they are + // an interesting test case. + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + admindb := session.DB("admin") + err = admindb.Login("root", "rapadura") + c.Assert(err, IsNil) + + err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) + + var wg sync.WaitGroup + wg.Add(20) + + for i := 0; i != 10; i++ { + go func() { + defer wg.Done() + var result struct{ N int } + err := session.DB("mydb").C("mycoll").Find(nil).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 1) + }() + } + + for i := 0; i != 10; i++ { + go func() { + defer wg.Done() + err := session.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) + }() + } + + wg.Wait() +} + +func (s *S) TestAuthURL(c *C) { + session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") + c.Assert(err, IsNil) + defer session.Close() + + err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthURLWrongCredentials(c *C) { + session, err := mgo.Dial("mongodb://root:wrong@localhost:40002/") + if session != nil { + session.Close() + } + c.Assert(err, ErrorMatches, "auth fail(s|ed)") + c.Assert(session, IsNil) +} + +func (s *S) TestAuthURLWithNewSession(c *C) { + // When authentication is in the URL, the new session will + // actually carry it on as well, even if logged out explicitly. + session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") + c.Assert(err, IsNil) + defer session.Close() + + session.DB("admin").Logout() + + // Do it twice to ensure it passes the needed data on. + session = session.New() + defer session.Close() + session = session.New() + defer session.Close() + + err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) + c.Assert(err, IsNil) +} + +func (s *S) TestAuthURLWithDatabase(c *C) { + session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + mydb := session.DB("mydb") + err = mydb.AddUser("myruser", "mypass", true) + c.Assert(err, IsNil) + + // Test once with database, and once with source. + for i := 0; i < 2; i++ { + var url string + if i == 0 { + url = "mongodb://myruser:mypass@localhost:40002/mydb" + } else { + url = "mongodb://myruser:mypass@localhost:40002/admin?authSource=mydb" + } + usession, err := mgo.Dial(url) + c.Assert(err, IsNil) + defer usession.Close() + + ucoll := usession.DB("mydb").C("mycoll") + err = ucoll.FindId(0).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) + err = ucoll.Insert(M{"n": 1}) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + } +} + +func (s *S) TestDefaultDatabase(c *C) { + tests := []struct{ url, db string }{ + {"mongodb://root:rapadura@localhost:40002", "test"}, + {"mongodb://root:rapadura@localhost:40002/admin", "admin"}, + {"mongodb://localhost:40001", "test"}, + {"mongodb://localhost:40001/", "test"}, + {"mongodb://localhost:40001/mydb", "mydb"}, + } + + for _, test := range tests { + session, err := mgo.Dial(test.url) + c.Assert(err, IsNil) + defer session.Close() + + c.Logf("test: %#v", test) + c.Assert(session.DB("").Name, Equals, test.db) + + scopy := session.Copy() + c.Check(scopy.DB("").Name, Equals, test.db) + scopy.Close() + } +} + +func (s *S) TestAuthDirect(c *C) { + // Direct connections must work to the master and slaves. + for _, port := range []string{"40031", "40032", "40033"} { + url := fmt.Sprintf("mongodb://root:rapadura@localhost:%s/?connect=direct", port) + session, err := mgo.Dial(url) + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, true) + + var result struct{} + err = session.DB("mydb").C("mycoll").Find(nil).One(&result) + c.Assert(err, Equals, mgo.ErrNotFound) + } +} + +func (s *S) TestAuthDirectWithLogin(c *C) { + // Direct connections must work to the master and slaves. + for _, port := range []string{"40031", "40032", "40033"} { + url := fmt.Sprintf("mongodb://localhost:%s/?connect=direct", port) + session, err := mgo.Dial(url) + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, true) + session.SetSyncTimeout(3 * time.Second) + + err = session.DB("admin").Login("root", "rapadura") + c.Assert(err, IsNil) + + var result struct{} + err = session.DB("mydb").C("mycoll").Find(nil).One(&result) + c.Assert(err, Equals, mgo.ErrNotFound) + } +} + +var ( + plainFlag = flag.String("plain", "", "Host to test PLAIN authentication against (depends on custom environment)") + plainUser = "einstein" + plainPass = "password" +) + +func (s *S) TestAuthPlainCred(c *C) { + if *plainFlag == "" { + c.Skip("no -plain") + } + cred := &mgo.Credential{ + Username: plainUser, + Password: plainPass, + Source: "$external", + Mechanism: "PLAIN", + } + c.Logf("Connecting to %s...", *plainFlag) + session, err := mgo.Dial(*plainFlag) + c.Assert(err, IsNil) + defer session.Close() + + records := session.DB("records").C("records") + + c.Logf("Connected! Testing the need for authentication...") + err = records.Find(nil).One(nil) + c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") + + c.Logf("Authenticating...") + err = session.Login(cred) + c.Assert(err, IsNil) + c.Logf("Authenticated!") + + c.Logf("Connected! Testing the need for authentication...") + err = records.Find(nil).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestAuthPlainURL(c *C) { + if *plainFlag == "" { + c.Skip("no -plain") + } + c.Logf("Connecting to %s...", *plainFlag) + session, err := mgo.Dial(fmt.Sprintf("%s:%s@%s?authMechanism=PLAIN", url.QueryEscape(plainUser), url.QueryEscape(plainPass), *plainFlag)) + c.Assert(err, IsNil) + defer session.Close() + + c.Logf("Connected! Testing the need for authentication...") + err = session.DB("records").C("records").Find(nil).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +var ( + kerberosFlag = flag.Bool("kerberos", false, "Test Kerberos authentication (depends on custom environment)") + kerberosHost = "mmscustmongo.10gen.me" + kerberosUser = "mmsagent/mmscustagent.10gen.me@10GEN.ME" +) + +func (s *S) TestAuthKerberosCred(c *C) { + if !*kerberosFlag { + c.Skip("no -kerberos") + } + cred := &mgo.Credential{ + Username: kerberosUser, + Mechanism: "GSSAPI", + } + c.Logf("Connecting to %s...", kerberosHost) + session, err := mgo.Dial(kerberosHost) + c.Assert(err, IsNil) + defer session.Close() + + c.Logf("Connected! Testing the need for authentication...") + names, err := session.DatabaseNames() + c.Assert(err, ErrorMatches, "unauthorized") + + c.Logf("Authenticating...") + err = session.Login(cred) + c.Assert(err, IsNil) + c.Logf("Authenticated!") + + names, err = session.DatabaseNames() + c.Assert(err, IsNil) + c.Assert(len(names) > 0, Equals, true) +} + +func (s *S) TestAuthKerberosURL(c *C) { + if !*kerberosFlag { + c.Skip("no -kerberos") + } + c.Logf("Connecting to %s...", kerberosHost) + session, err := mgo.Dial(url.QueryEscape(kerberosUser) + "@" + kerberosHost + "?authMechanism=GSSAPI") + c.Assert(err, IsNil) + defer session.Close() + names, err := session.DatabaseNames() + c.Assert(err, IsNil) + c.Assert(len(names) > 0, Equals, true) +} diff --git a/vendor/labix.org/v2/mgo/bson/LICENSE b/vendor/labix.org/v2/mgo/bson/LICENSE new file mode 100644 index 0000000..8903260 --- /dev/null +++ b/vendor/labix.org/v2/mgo/bson/LICENSE @@ -0,0 +1,25 @@ +BSON library for Go + +Copyright (c) 2010-2012 - Gustavo Niemeyer + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/labix.org/v2/mgo/bson/bson.go b/vendor/labix.org/v2/mgo/bson/bson.go new file mode 100644 index 0000000..3ebfd84 --- /dev/null +++ b/vendor/labix.org/v2/mgo/bson/bson.go @@ -0,0 +1,682 @@ +// BSON library for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package bson is an implementation of the BSON specification for Go: +// +// http://bsonspec.org +// +// It was created as part of the mgo MongoDB driver for Go, but is standalone +// and may be used on its own without the driver. +package bson + +import ( + "crypto/md5" + "crypto/rand" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "reflect" + "runtime" + "strings" + "sync" + "sync/atomic" + "time" +) + +// -------------------------------------------------------------------------- +// The public API. + +// A value implementing the bson.Getter interface will have its GetBSON +// method called when the given value has to be marshalled, and the result +// of this method will be marshaled in place of the actual object. +// +// If GetBSON returns return a non-nil error, the marshalling procedure +// will stop and error out with the provided value. +type Getter interface { + GetBSON() (interface{}, error) +} + +// A value implementing the bson.Setter interface will receive the BSON +// value via the SetBSON method during unmarshaling, and the object +// itself will not be changed as usual. +// +// If setting the value works, the method should return nil or alternatively +// bson.SetZero to set the respective field to its zero value (nil for +// pointer types). If SetBSON returns a value of type bson.TypeError, the +// BSON value will be omitted from a map or slice being decoded and the +// unmarshalling will continue. If it returns any other non-nil error, the +// unmarshalling procedure will stop and error out with the provided value. +// +// This interface is generally useful in pointer receivers, since the method +// will want to change the receiver. A type field that implements the Setter +// interface doesn't have to be a pointer, though. +// +// Unlike the usual behavior, unmarshalling onto a value that implements a +// Setter interface will NOT reset the value to its zero state. This allows +// the value to decide by itself how to be unmarshalled. +// +// For example: +// +// type MyString string +// +// func (s *MyString) SetBSON(raw bson.Raw) error { +// return raw.Unmarshal(s) +// } +// +type Setter interface { + SetBSON(raw Raw) error +} + +// SetZero may be returned from a SetBSON method to have the value set to +// its respective zero value. When used in pointer values, this will set the +// field to nil rather than to the pre-allocated value. +var SetZero = errors.New("set to zero") + +// M is a convenient alias for a map[string]interface{} map, useful for +// dealing with BSON in a native way. For instance: +// +// bson.M{"a": 1, "b": true} +// +// There's no special handling for this type in addition to what's done anyway +// for an equivalent map type. Elements in the map will be dumped in an +// undefined ordered. See also the bson.D type for an ordered alternative. +type M map[string]interface{} + +// D represents a BSON document containing ordered elements. For example: +// +// bson.D{{"a", 1}, {"b", true}} +// +// In some situations, such as when creating indexes for MongoDB, the order in +// which the elements are defined is important. If the order is not important, +// using a map is generally more comfortable. See bson.M and bson.RawD. +type D []DocElem + +// See the D type. +type DocElem struct { + Name string + Value interface{} +} + +// Map returns a map out of the ordered element name/value pairs in d. +func (d D) Map() (m M) { + m = make(M, len(d)) + for _, item := range d { + m[item.Name] = item.Value + } + return m +} + +// The Raw type represents raw unprocessed BSON documents and elements. +// Kind is the kind of element as defined per the BSON specification, and +// Data is the raw unprocessed data for the respective element. +// Using this type it is possible to unmarshal or marshal values partially. +// +// Relevant documentation: +// +// http://bsonspec.org/#/specification +// +type Raw struct { + Kind byte + Data []byte +} + +// RawD represents a BSON document containing raw unprocessed elements. +// This low-level representation may be useful when lazily processing +// documents of uncertain content, or when manipulating the raw content +// documents in general. +type RawD []RawDocElem + +// See the RawD type. +type RawDocElem struct { + Name string + Value Raw +} + +// ObjectId is a unique ID identifying a BSON value. It must be exactly 12 bytes +// long. MongoDB objects by default have such a property set in their "_id" +// property. +// +// http://www.mongodb.org/display/DOCS/Object+IDs +type ObjectId string + +// ObjectIdHex returns an ObjectId from the provided hex representation. +// Calling this function with an invalid hex representation will +// cause a runtime panic. See the IsObjectIdHex function. +func ObjectIdHex(s string) ObjectId { + d, err := hex.DecodeString(s) + if err != nil || len(d) != 12 { + panic(fmt.Sprintf("Invalid input to ObjectIdHex: %q", s)) + } + return ObjectId(d) +} + +// IsObjectIdHex returns whether s is a valid hex representation of +// an ObjectId. See the ObjectIdHex function. +func IsObjectIdHex(s string) bool { + if len(s) != 24 { + return false + } + _, err := hex.DecodeString(s) + return err == nil +} + +// objectIdCounter is atomically incremented when generating a new ObjectId +// using NewObjectId() function. It's used as a counter part of an id. +var objectIdCounter uint32 = 0 + +// machineId stores machine id generated once and used in subsequent calls +// to NewObjectId function. +var machineId = readMachineId() + +// readMachineId generates machine id and puts it into the machineId global +// variable. If this function fails to get the hostname, it will cause +// a runtime error. +func readMachineId() []byte { + var sum [3]byte + id := sum[:] + hostname, err1 := os.Hostname() + if err1 != nil { + _, err2 := io.ReadFull(rand.Reader, id) + if err2 != nil { + panic(fmt.Errorf("cannot get hostname: %v; %v", err1, err2)) + } + return id + } + hw := md5.New() + hw.Write([]byte(hostname)) + copy(id, hw.Sum(nil)) + return id +} + +// NewObjectId returns a new unique ObjectId. +func NewObjectId() ObjectId { + var b [12]byte + // Timestamp, 4 bytes, big endian + binary.BigEndian.PutUint32(b[:], uint32(time.Now().Unix())) + // Machine, first 3 bytes of md5(hostname) + b[4] = machineId[0] + b[5] = machineId[1] + b[6] = machineId[2] + // Pid, 2 bytes, specs don't specify endianness, but we use big endian. + pid := os.Getpid() + b[7] = byte(pid >> 8) + b[8] = byte(pid) + // Increment, 3 bytes, big endian + i := atomic.AddUint32(&objectIdCounter, 1) + b[9] = byte(i >> 16) + b[10] = byte(i >> 8) + b[11] = byte(i) + return ObjectId(b[:]) +} + +// NewObjectIdWithTime returns a dummy ObjectId with the timestamp part filled +// with the provided number of seconds from epoch UTC, and all other parts +// filled with zeroes. It's not safe to insert a document with an id generated +// by this method, it is useful only for queries to find documents with ids +// generated before or after the specified timestamp. +func NewObjectIdWithTime(t time.Time) ObjectId { + var b [12]byte + binary.BigEndian.PutUint32(b[:4], uint32(t.Unix())) + return ObjectId(string(b[:])) +} + +// String returns a hex string representation of the id. +// Example: ObjectIdHex("4d88e15b60f486e428412dc9"). +func (id ObjectId) String() string { + return fmt.Sprintf(`ObjectIdHex("%x")`, string(id)) +} + +// Hex returns a hex representation of the ObjectId. +func (id ObjectId) Hex() string { + return hex.EncodeToString([]byte(id)) +} + +// MarshalJSON turns a bson.ObjectId into a json.Marshaller. +func (id ObjectId) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%x"`, string(id))), nil +} + +// UnmarshalJSON turns *bson.ObjectId into a json.Unmarshaller. +func (id *ObjectId) UnmarshalJSON(data []byte) error { + if len(data) != 26 || data[0] != '"' || data[25] != '"' { + return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s", string(data))) + } + var buf [12]byte + _, err := hex.Decode(buf[:], data[1:25]) + if err != nil { + return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s (%s)", string(data), err)) + } + *id = ObjectId(string(buf[:])) + return nil +} + +// Valid returns true if id is valid. A valid id must contain exactly 12 bytes. +func (id ObjectId) Valid() bool { + return len(id) == 12 +} + +// byteSlice returns byte slice of id from start to end. +// Calling this function with an invalid id will cause a runtime panic. +func (id ObjectId) byteSlice(start, end int) []byte { + if len(id) != 12 { + panic(fmt.Sprintf("Invalid ObjectId: %q", string(id))) + } + return []byte(string(id)[start:end]) +} + +// Time returns the timestamp part of the id. +// It's a runtime error to call this method with an invalid id. +func (id ObjectId) Time() time.Time { + // First 4 bytes of ObjectId is 32-bit big-endian seconds from epoch. + secs := int64(binary.BigEndian.Uint32(id.byteSlice(0, 4))) + return time.Unix(secs, 0) +} + +// Machine returns the 3-byte machine id part of the id. +// It's a runtime error to call this method with an invalid id. +func (id ObjectId) Machine() []byte { + return id.byteSlice(4, 7) +} + +// Pid returns the process id part of the id. +// It's a runtime error to call this method with an invalid id. +func (id ObjectId) Pid() uint16 { + return binary.BigEndian.Uint16(id.byteSlice(7, 9)) +} + +// Counter returns the incrementing value part of the id. +// It's a runtime error to call this method with an invalid id. +func (id ObjectId) Counter() int32 { + b := id.byteSlice(9, 12) + // Counter is stored as big-endian 3-byte value + return int32(uint32(b[0])<<16 | uint32(b[1])<<8 | uint32(b[2])) +} + +// The Symbol type is similar to a string and is used in languages with a +// distinct symbol type. +type Symbol string + +// Now returns the current time with millisecond precision. MongoDB stores +// timestamps with the same precision, so a Time returned from this method +// will not change after a roundtrip to the database. That's the only reason +// why this function exists. Using the time.Now function also works fine +// otherwise. +func Now() time.Time { + return time.Unix(0, time.Now().UnixNano()/1e6*1e6) +} + +// MongoTimestamp is a special internal type used by MongoDB that for some +// strange reason has its own datatype defined in BSON. +type MongoTimestamp int64 + +type orderKey int64 + +// MaxKey is a special value that compares higher than all other possible BSON +// values in a MongoDB database. +var MaxKey = orderKey(1<<63 - 1) + +// MinKey is a special value that compares lower than all other possible BSON +// values in a MongoDB database. +var MinKey = orderKey(-1 << 63) + +type undefined struct{} + +// Undefined represents the undefined BSON value. +var Undefined undefined + +// Binary is a representation for non-standard binary values. Any kind should +// work, but the following are known as of this writing: +// +// 0x00 - Generic. This is decoded as []byte(data), not Binary{0x00, data}. +// 0x01 - Function (!?) +// 0x02 - Obsolete generic. +// 0x03 - UUID +// 0x05 - MD5 +// 0x80 - User defined. +// +type Binary struct { + Kind byte + Data []byte +} + +// RegEx represents a regular expression. The Options field may contain +// individual characters defining the way in which the pattern should be +// applied, and must be sorted. Valid options as of this writing are 'i' for +// case insensitive matching, 'm' for multi-line matching, 'x' for verbose +// mode, 'l' to make \w, \W, and similar be locale-dependent, 's' for dot-all +// mode (a '.' matches everything), and 'u' to make \w, \W, and similar match +// unicode. The value of the Options parameter is not verified before being +// marshaled into the BSON format. +type RegEx struct { + Pattern string + Options string +} + +// JavaScript is a type that holds JavaScript code. If Scope is non-nil, it +// will be marshaled as a mapping from identifiers to values that may be +// used when evaluating the provided Code. +type JavaScript struct { + Code string + Scope interface{} +} + +const initialBufferSize = 64 + +func handleErr(err *error) { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } else if _, ok := r.(externalPanic); ok { + panic(r) + } else if s, ok := r.(string); ok { + *err = errors.New(s) + } else if e, ok := r.(error); ok { + *err = e + } else { + panic(r) + } + } +} + +// Marshal serializes the in value, which may be a map or a struct value. +// In the case of struct values, only exported fields will be serialized. +// The lowercased field name is used as the key for each exported field, +// but this behavior may be changed using the respective field tag. +// The tag may also contain flags to tweak the marshalling behavior for +// the field. The tag formats accepted are: +// +// "[][,[,]]" +// +// `(...) bson:"[][,[,]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// +// minsize Marshal an int64 value as an int32, if that's feasible +// while preserving the numeric value. +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the bson keys of other struct fields. +// +// Some examples: +// +// type T struct { +// A bool +// B int "myb" +// C string "myc,omitempty" +// D string `bson:",omitempty" json:"jsonkey"` +// E int64 ",minsize" +// F int64 "myf,omitempty,minsize" +// } +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := &encoder{make([]byte, 0, initialBufferSize)} + e.addDoc(reflect.ValueOf(in)) + return e.out, nil +} + +// Unmarshal deserializes data from in into the out value. The out value +// must be a map, a pointer to a struct, or a pointer to a bson.D value. +// The lowercased field name is used as the key for each exported field, +// but this behavior may be changed using the respective field tag. +// The tag may also contain flags to tweak the marshalling behavior for +// the field. The tag formats accepted are: +// +// "[][,[,]]" +// +// `(...) bson:"[][,[,]]" (...)` +// +// The following flags are currently supported during unmarshal (see the +// Marshal method for other flags): +// +// inline Inline the field, which must be a struct or a map. +// Inlined structs are handled as if its fields were part +// of the outer struct. An inlined map causes keys that do +// not match any other struct field to be inserted in the +// map rather than being discarded as usual. +// +// The target field or element types of out may not necessarily match +// the BSON values of the provided data. The following conversions are +// made automatically: +// +// - Numeric types are converted if at least the integer part of the +// value would be preserved correctly +// - Bools are converted to numeric types as 1 or 0 +// - Numeric types are converted to bools as true if not 0 or false otherwise +// - Binary and string BSON data is converted to a string, array or byte slice +// +// If the value would not fit the type and cannot be converted, it's +// silently skipped. +// +// Pointer values are initialized when necessary. +func Unmarshal(in []byte, out interface{}) (err error) { + defer handleErr(&err) + v := reflect.ValueOf(out) + switch v.Kind() { + case reflect.Map, reflect.Ptr: + d := newDecoder(in) + d.readDocTo(v) + case reflect.Struct: + return errors.New("Unmarshal can't deal with struct values. Use a pointer.") + default: + return errors.New("Unmarshal needs a map or a pointer to a struct.") + } + return nil +} + +// Unmarshal deserializes raw into the out value. If the out value type +// is not compatible with raw, a *bson.TypeError is returned. +// +// See the Unmarshal function documentation for more details on the +// unmarshalling process. +func (raw Raw) Unmarshal(out interface{}) (err error) { + defer handleErr(&err) + v := reflect.ValueOf(out) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + fallthrough + case reflect.Map: + d := newDecoder(raw.Data) + good := d.readElemTo(v, raw.Kind) + if !good { + return &TypeError{v.Type(), raw.Kind} + } + case reflect.Struct: + return errors.New("Raw Unmarshal can't deal with struct values. Use a pointer.") + default: + return errors.New("Raw Unmarshal needs a map or a valid pointer.") + } + return nil +} + +type TypeError struct { + Type reflect.Type + Kind byte +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("BSON kind 0x%02x isn't compatible with type %s", e.Kind, e.Type.String()) +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + InlineMap int + Zero reflect.Value +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + MinSize bool + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var structMapMutex sync.RWMutex + +type externalPanic string + +func (e externalPanic) String() string { + return string(e) +} + +func getStructInfo(st reflect.Type) (*structInfo, error) { + structMapMutex.RLock() + sinfo, found := structMap[st] + structMapMutex.RUnlock() + if found { + return sinfo, nil + } + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("bson") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + // XXX Drop this after a few releases. + if s := strings.Index(tag, "/"); s >= 0 { + recommend := tag[:s] + for _, c := range tag[s+1:] { + switch c { + case 'c': + recommend += ",omitempty" + case 's': + recommend += ",minsize" + default: + msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", string([]byte{uint8(c)}), tag, st) + panic(externalPanic(msg)) + } + } + msg := fmt.Sprintf("Replace tag %q in field %s of type %s by %q", tag, field.Name, st, recommend) + panic(externalPanic(msg)) + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "minsize": + info.MinSize = true + case "inline": + inline = true + default: + msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st) + panic(externalPanic(msg)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct: + sinfo, err := getStructInfo(field.Type) + if err != nil { + return nil, err + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + default: + panic("Option ,inline needs a struct value or map field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + sinfo = &structInfo{ + fieldsMap, + fieldsList, + inlineMap, + reflect.New(st).Elem(), + } + structMapMutex.Lock() + structMap[st] = sinfo + structMapMutex.Unlock() + return sinfo, nil +} diff --git a/vendor/labix.org/v2/mgo/bson/bson_test.go b/vendor/labix.org/v2/mgo/bson/bson_test.go new file mode 100644 index 0000000..1263e97 --- /dev/null +++ b/vendor/labix.org/v2/mgo/bson/bson_test.go @@ -0,0 +1,1466 @@ +// BSON library for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// gobson - BSON library for Go. + +package bson_test + +import ( + "encoding/binary" + "encoding/json" + "errors" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" + "net/url" + "reflect" + "testing" + "time" +) + +func TestAll(t *testing.T) { + TestingT(t) +} + +type S struct{} + +var _ = Suite(&S{}) + +// Wrap up the document elements contained in data, prepending the int32 +// length of the data, and appending the '\x00' value closing the document. +func wrapInDoc(data string) string { + result := make([]byte, len(data)+5) + binary.LittleEndian.PutUint32(result, uint32(len(result))) + copy(result[4:], []byte(data)) + return string(result) +} + +func makeZeroDoc(value interface{}) (zero interface{}) { + v := reflect.ValueOf(value) + t := v.Type() + switch t.Kind() { + case reflect.Map: + mv := reflect.MakeMap(t) + zero = mv.Interface() + case reflect.Ptr: + pv := reflect.New(v.Type().Elem()) + zero = pv.Interface() + case reflect.Slice: + zero = reflect.New(t).Interface() + default: + panic("unsupported doc type") + } + return zero +} + +func testUnmarshal(c *C, data string, obj interface{}) { + zero := makeZeroDoc(obj) + err := bson.Unmarshal([]byte(data), zero) + c.Assert(err, IsNil) + c.Assert(zero, DeepEquals, obj) +} + +type testItemType struct { + obj interface{} + data string +} + +// -------------------------------------------------------------------------- +// Samples from bsonspec.org: + +var sampleItems = []testItemType{ + {bson.M{"hello": "world"}, + "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, + {bson.M{"BSON": []interface{}{"awesome", float64(5.05), 1986}}, + "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + + "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, +} + +func (s *S) TestMarshalSampleItems(c *C) { + for i, item := range sampleItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, item.data, Commentf("Failed on item %d", i)) + } +} + +func (s *S) TestUnmarshalSampleItems(c *C) { + for i, item := range sampleItems { + value := bson.M{} + err := bson.Unmarshal([]byte(item.data), value) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d", i)) + } +} + +// -------------------------------------------------------------------------- +// Every type, ordered by the type flag. These are not wrapped with the +// length and last \x00 from the document. wrapInDoc() computes them. +// Note that all of them should be supported as two-way conversions. + +var allItems = []testItemType{ + {bson.M{}, + ""}, + {bson.M{"_": float64(5.05)}, + "\x01_\x00333333\x14@"}, + {bson.M{"_": "yo"}, + "\x02_\x00\x03\x00\x00\x00yo\x00"}, + {bson.M{"_": bson.M{"a": true}}, + "\x03_\x00\x09\x00\x00\x00\x08a\x00\x01\x00"}, + {bson.M{"_": []interface{}{true, false}}, + "\x04_\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, + {bson.M{"_": []byte("yo")}, + "\x05_\x00\x02\x00\x00\x00\x00yo"}, + {bson.M{"_": bson.Binary{0x80, []byte("udef")}}, + "\x05_\x00\x04\x00\x00\x00\x80udef"}, + {bson.M{"_": bson.Undefined}, // Obsolete, but still seen in the wild. + "\x06_\x00"}, + {bson.M{"_": bson.ObjectId("0123456789ab")}, + "\x07_\x000123456789ab"}, + {bson.M{"_": false}, + "\x08_\x00\x00"}, + {bson.M{"_": true}, + "\x08_\x00\x01"}, + {bson.M{"_": time.Unix(0, 258e6)}, // Note the NS <=> MS conversion. + "\x09_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, + {bson.M{"_": nil}, + "\x0A_\x00"}, + {bson.M{"_": bson.RegEx{"ab", "cd"}}, + "\x0B_\x00ab\x00cd\x00"}, + {bson.M{"_": bson.JavaScript{"code", nil}}, + "\x0D_\x00\x05\x00\x00\x00code\x00"}, + {bson.M{"_": bson.Symbol("sym")}, + "\x0E_\x00\x04\x00\x00\x00sym\x00"}, + {bson.M{"_": bson.JavaScript{"code", bson.M{"": nil}}}, + "\x0F_\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + + "\x07\x00\x00\x00\x0A\x00\x00"}, + {bson.M{"_": 258}, + "\x10_\x00\x02\x01\x00\x00"}, + {bson.M{"_": bson.MongoTimestamp(258)}, + "\x11_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, + {bson.M{"_": int64(258)}, + "\x12_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, + {bson.M{"_": int64(258 << 32)}, + "\x12_\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, + {bson.M{"_": bson.MaxKey}, + "\x7F_\x00"}, + {bson.M{"_": bson.MinKey}, + "\xFF_\x00"}, +} + +func (s *S) TestMarshalAllItems(c *C) { + for i, item := range allItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc(item.data), Commentf("Failed on item %d: %#v", i, item)) + } +} + +func (s *S) TestUnmarshalAllItems(c *C) { + for i, item := range allItems { + value := bson.M{} + err := bson.Unmarshal([]byte(wrapInDoc(item.data)), value) + c.Assert(err, IsNil) + c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) + } +} + +func (s *S) TestUnmarshalRawAllItems(c *C) { + for i, item := range allItems { + if len(item.data) == 0 { + continue + } + value := item.obj.(bson.M)["_"] + if value == nil { + continue + } + pv := reflect.New(reflect.ValueOf(value).Type()) + raw := bson.Raw{item.data[0], []byte(item.data[3:])} + c.Logf("Unmarshal raw: %#v, %#v", raw, pv.Interface()) + err := raw.Unmarshal(pv.Interface()) + c.Assert(err, IsNil) + c.Assert(pv.Elem().Interface(), DeepEquals, value, Commentf("Failed on item %d: %#v", i, item)) + } +} + +func (s *S) TestUnmarshalRawIncompatible(c *C) { + raw := bson.Raw{0x08, []byte{0x01}} // true + err := raw.Unmarshal(&struct{}{}) + c.Assert(err, ErrorMatches, "BSON kind 0x08 isn't compatible with type struct \\{\\}") +} + +func (s *S) TestUnmarshalZeroesStruct(c *C) { + data, err := bson.Marshal(bson.M{"b": 2}) + c.Assert(err, IsNil) + type T struct{ A, B int } + v := T{A: 1} + err = bson.Unmarshal(data, &v) + c.Assert(err, IsNil) + c.Assert(v.A, Equals, 0) + c.Assert(v.B, Equals, 2) +} + +func (s *S) TestUnmarshalZeroesMap(c *C) { + data, err := bson.Marshal(bson.M{"b": 2}) + c.Assert(err, IsNil) + m := bson.M{"a": 1} + err = bson.Unmarshal(data, &m) + c.Assert(err, IsNil) + c.Assert(m, DeepEquals, bson.M{"b": 2}) +} + +func (s *S) TestUnmarshalNonNilInterface(c *C) { + data, err := bson.Marshal(bson.M{"b": 2}) + c.Assert(err, IsNil) + m := bson.M{"a": 1} + var i interface{} + i = m + err = bson.Unmarshal(data, &i) + c.Assert(err, IsNil) + c.Assert(i, DeepEquals, bson.M{"b": 2}) + c.Assert(m, DeepEquals, bson.M{"a": 1}) +} + +// -------------------------------------------------------------------------- +// Some one way marshaling operations which would unmarshal differently. + +var oneWayMarshalItems = []testItemType{ + // These are being passed as pointers, and will unmarshal as values. + {bson.M{"": &bson.Binary{0x02, []byte("old")}}, + "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, + {bson.M{"": &bson.Binary{0x80, []byte("udef")}}, + "\x05\x00\x04\x00\x00\x00\x80udef"}, + {bson.M{"": &bson.RegEx{"ab", "cd"}}, + "\x0B\x00ab\x00cd\x00"}, + {bson.M{"": &bson.JavaScript{"code", nil}}, + "\x0D\x00\x05\x00\x00\x00code\x00"}, + {bson.M{"": &bson.JavaScript{"code", bson.M{"": nil}}}, + "\x0F\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + + "\x07\x00\x00\x00\x0A\x00\x00"}, + + // There's no float32 type in BSON. Will encode as a float64. + {bson.M{"": float32(5.05)}, + "\x01\x00\x00\x00\x00@33\x14@"}, + + // The array will be unmarshaled as a slice instead. + {bson.M{"": [2]bool{true, false}}, + "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, + + // The typed slice will be unmarshaled as []interface{}. + {bson.M{"": []bool{true, false}}, + "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, + + // Will unmarshal as a []byte. + {bson.M{"": bson.Binary{0x00, []byte("yo")}}, + "\x05\x00\x02\x00\x00\x00\x00yo"}, + {bson.M{"": bson.Binary{0x02, []byte("old")}}, + "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, + + // No way to preserve the type information here. We might encode as a zero + // value, but this would mean that pointer values in structs wouldn't be + // able to correctly distinguish between unset and set to the zero value. + {bson.M{"": (*byte)(nil)}, + "\x0A\x00"}, + + // No int types smaller than int32 in BSON. Could encode this as a char, + // but it would still be ambiguous, take more, and be awkward in Go when + // loaded without typing information. + {bson.M{"": byte(8)}, + "\x10\x00\x08\x00\x00\x00"}, + + // There are no unsigned types in BSON. Will unmarshal as int32 or int64. + {bson.M{"": uint32(258)}, + "\x10\x00\x02\x01\x00\x00"}, + {bson.M{"": uint64(258)}, + "\x12\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, + {bson.M{"": uint64(258 << 32)}, + "\x12\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, + + // This will unmarshal as int. + {bson.M{"": int32(258)}, + "\x10\x00\x02\x01\x00\x00"}, + + // That's a special case. The unsigned value is too large for an int32, + // so an int64 is used instead. + {bson.M{"": uint32(1<<32 - 1)}, + "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, + {bson.M{"": uint(1<<32 - 1)}, + "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, +} + +func (s *S) TestOneWayMarshalItems(c *C) { + for i, item := range oneWayMarshalItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc(item.data), + Commentf("Failed on item %d", i)) + } +} + +// -------------------------------------------------------------------------- +// Two-way tests for user-defined structures using the samples +// from bsonspec.org. + +type specSample1 struct { + Hello string +} + +type specSample2 struct { + BSON []interface{} "BSON" +} + +var structSampleItems = []testItemType{ + {&specSample1{"world"}, + "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, + {&specSample2{[]interface{}{"awesome", float64(5.05), 1986}}, + "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + + "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, +} + +func (s *S) TestMarshalStructSampleItems(c *C) { + for i, item := range structSampleItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, item.data, + Commentf("Failed on item %d", i)) + } +} + +func (s *S) TestUnmarshalStructSampleItems(c *C) { + for _, item := range structSampleItems { + testUnmarshal(c, item.data, item.obj) + } +} + +func (s *S) Test64bitInt(c *C) { + var i int64 = (1 << 31) + if int(i) > 0 { + data, err := bson.Marshal(bson.M{"i": int(i)}) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc("\x12i\x00\x00\x00\x00\x80\x00\x00\x00\x00")) + + var result struct{ I int } + err = bson.Unmarshal(data, &result) + c.Assert(err, IsNil) + c.Assert(int64(result.I), Equals, i) + } +} + +// -------------------------------------------------------------------------- +// Generic two-way struct marshaling tests. + +var bytevar = byte(8) +var byteptr = &bytevar + +var structItems = []testItemType{ + {&struct{ Ptr *byte }{nil}, + "\x0Aptr\x00"}, + {&struct{ Ptr *byte }{&bytevar}, + "\x10ptr\x00\x08\x00\x00\x00"}, + {&struct{ Ptr **byte }{&byteptr}, + "\x10ptr\x00\x08\x00\x00\x00"}, + {&struct{ Byte byte }{8}, + "\x10byte\x00\x08\x00\x00\x00"}, + {&struct{ Byte byte }{0}, + "\x10byte\x00\x00\x00\x00\x00"}, + {&struct { + V byte "Tag" + }{8}, + "\x10Tag\x00\x08\x00\x00\x00"}, + {&struct { + V *struct { + Byte byte + } + }{&struct{ Byte byte }{8}}, + "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, + {&struct{ priv byte }{}, ""}, + + // The order of the dumped fields should be the same in the struct. + {&struct{ A, C, B, D, F, E *byte }{}, + "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x0Ae\x00"}, + + {&struct{ V bson.Raw }{bson.Raw{0x03, []byte("\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00")}}, + "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, + {&struct{ V bson.Raw }{bson.Raw{0x10, []byte("\x00\x00\x00\x00")}}, + "\x10v\x00" + "\x00\x00\x00\x00"}, + + // Byte arrays. + {&struct{ V [2]byte }{[2]byte{'y', 'o'}}, + "\x05v\x00\x02\x00\x00\x00\x00yo"}, +} + +func (s *S) TestMarshalStructItems(c *C) { + for i, item := range structItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc(item.data), + Commentf("Failed on item %d", i)) + } +} + +func (s *S) TestUnmarshalStructItems(c *C) { + for _, item := range structItems { + testUnmarshal(c, wrapInDoc(item.data), item.obj) + } +} + +func (s *S) TestUnmarshalRawStructItems(c *C) { + for i, item := range structItems { + raw := bson.Raw{0x03, []byte(wrapInDoc(item.data))} + zero := makeZeroDoc(item.obj) + err := raw.Unmarshal(zero) + c.Assert(err, IsNil) + c.Assert(zero, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) + } +} + +func (s *S) TestUnmarshalRawNil(c *C) { + // Regression test: shouldn't try to nil out the pointer itself, + // as it's not settable. + raw := bson.Raw{0x0A, []byte{}} + err := raw.Unmarshal(&struct{}{}) + c.Assert(err, IsNil) +} + +// -------------------------------------------------------------------------- +// One-way marshaling tests. + +type dOnIface struct { + D interface{} +} + +type ignoreField struct { + Before string + Ignore string `bson:"-"` + After string +} + +var marshalItems = []testItemType{ + // Ordered document dump. Will unmarshal as a dictionary by default. + {bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, + "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, + {MyD{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, + "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, + {&dOnIface{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, + "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, + + {bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, + "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, + {MyRawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, + "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, + {&dOnIface{bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, + "\x03d\x00" + wrapInDoc("\x0Aa\x00"+"\x0Ac\x00"+"\x08b\x00\x01")}, + + {&ignoreField{"before", "ignore", "after"}, + "\x02before\x00\a\x00\x00\x00before\x00\x02after\x00\x06\x00\x00\x00after\x00"}, + + // Marshalling a Raw document does nothing. + {bson.Raw{0x03, []byte(wrapInDoc("anything"))}, + "anything"}, + {bson.Raw{Data: []byte(wrapInDoc("anything"))}, + "anything"}, +} + +func (s *S) TestMarshalOneWayItems(c *C) { + for _, item := range marshalItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc(item.data)) + } +} + +// -------------------------------------------------------------------------- +// One-way unmarshaling tests. + +var unmarshalItems = []testItemType{ + // Field is private. Should not attempt to unmarshal it. + {&struct{ priv byte }{}, + "\x10priv\x00\x08\x00\x00\x00"}, + + // Wrong casing. Field names are lowercased. + {&struct{ Byte byte }{}, + "\x10Byte\x00\x08\x00\x00\x00"}, + + // Ignore non-existing field. + {&struct{ Byte byte }{9}, + "\x10boot\x00\x08\x00\x00\x00" + "\x10byte\x00\x09\x00\x00\x00"}, + + // Do not unmarshal on ignored field. + {&ignoreField{"before", "", "after"}, + "\x02before\x00\a\x00\x00\x00before\x00" + + "\x02-\x00\a\x00\x00\x00ignore\x00" + + "\x02after\x00\x06\x00\x00\x00after\x00"}, + + // Ignore unsuitable types silently. + {map[string]string{"str": "s"}, + "\x02str\x00\x02\x00\x00\x00s\x00" + "\x10int\x00\x01\x00\x00\x00"}, + {map[string][]int{"array": []int{5, 9}}, + "\x04array\x00" + wrapInDoc("\x100\x00\x05\x00\x00\x00"+"\x021\x00\x02\x00\x00\x00s\x00"+"\x102\x00\x09\x00\x00\x00")}, + + // Wrong type. Shouldn't init pointer. + {&struct{ Str *byte }{}, + "\x02str\x00\x02\x00\x00\x00s\x00"}, + {&struct{ Str *struct{ Str string } }{}, + "\x02str\x00\x02\x00\x00\x00s\x00"}, + + // Ordered document. + {&struct{ bson.D }{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, + "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, + + // Raw document. + {&bson.Raw{0x03, []byte(wrapInDoc("\x10byte\x00\x08\x00\x00\x00"))}, + "\x10byte\x00\x08\x00\x00\x00"}, + + // RawD document. + {&struct{ bson.RawD }{bson.RawD{{"a", bson.Raw{0x0A, []byte{}}}, {"c", bson.Raw{0x0A, []byte{}}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, + "\x03rawd\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x08b\x00\x01")}, + + // Decode old binary. + {bson.M{"_": []byte("old")}, + "\x05_\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, + + // Decode old binary without length. According to the spec, this shouldn't happen. + {bson.M{"_": []byte("old")}, + "\x05_\x00\x03\x00\x00\x00\x02old"}, +} + +func (s *S) TestUnmarshalOneWayItems(c *C) { + for _, item := range unmarshalItems { + testUnmarshal(c, wrapInDoc(item.data), item.obj) + } +} + +func (s *S) TestUnmarshalNilInStruct(c *C) { + // Nil is the default value, so we need to ensure it's indeed being set. + b := byte(1) + v := &struct{ Ptr *byte }{&b} + err := bson.Unmarshal([]byte(wrapInDoc("\x0Aptr\x00")), v) + c.Assert(err, IsNil) + c.Assert(v, DeepEquals, &struct{ Ptr *byte }{nil}) +} + +// -------------------------------------------------------------------------- +// Marshalling error cases. + +type structWithDupKeys struct { + Name byte + Other byte "name" // Tag should precede. +} + +var marshalErrorItems = []testItemType{ + {bson.M{"": uint64(1 << 63)}, + "BSON has no uint64 type, and value is too large to fit correctly in an int64"}, + {bson.M{"": bson.ObjectId("tooshort")}, + "ObjectIDs must be exactly 12 bytes long \\(got 8\\)"}, + {int64(123), + "Can't marshal int64 as a BSON document"}, + {bson.M{"": 1i}, + "Can't marshal complex128 in a BSON document"}, + {&structWithDupKeys{}, + "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, + {bson.Raw{0x0A, []byte{}}, + "Attempted to unmarshal Raw kind 10 as a document"}, + {&inlineCantPtr{&struct{ A, B int }{1, 2}}, + "Option ,inline needs a struct value or map field"}, + {&inlineDupName{1, struct{ A, B int }{2, 3}}, + "Duplicated key 'a' in struct bson_test.inlineDupName"}, + {&inlineDupMap{}, + "Multiple ,inline maps in struct bson_test.inlineDupMap"}, + {&inlineBadKeyMap{}, + "Option ,inline needs a map with string keys in struct bson_test.inlineBadKeyMap"}, + {&inlineMap{A: 1, M: map[string]interface{}{"a": 1}}, + `Can't have key "a" in inlined map; conflicts with struct field`}, +} + +func (s *S) TestMarshalErrorItems(c *C) { + for _, item := range marshalErrorItems { + data, err := bson.Marshal(item.obj) + c.Assert(err, ErrorMatches, item.data) + c.Assert(data, IsNil) + } +} + +// -------------------------------------------------------------------------- +// Unmarshalling error cases. + +type unmarshalErrorType struct { + obj interface{} + data string + error string +} + +var unmarshalErrorItems = []unmarshalErrorType{ + // Tag name conflicts with existing parameter. + {&structWithDupKeys{}, + "\x10name\x00\x08\x00\x00\x00", + "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, + + // Non-string map key. + {map[int]interface{}{}, + "\x10name\x00\x08\x00\x00\x00", + "BSON map must have string keys. Got: map\\[int\\]interface \\{\\}"}, + + {nil, + "\xEEname\x00", + "Unknown element kind \\(0xEE\\)"}, + + {struct{ Name bool }{}, + "\x10name\x00\x08\x00\x00\x00", + "Unmarshal can't deal with struct values. Use a pointer."}, + + {123, + "\x10name\x00\x08\x00\x00\x00", + "Unmarshal needs a map or a pointer to a struct."}, +} + +func (s *S) TestUnmarshalErrorItems(c *C) { + for _, item := range unmarshalErrorItems { + data := []byte(wrapInDoc(item.data)) + var value interface{} + switch reflect.ValueOf(item.obj).Kind() { + case reflect.Map, reflect.Ptr: + value = makeZeroDoc(item.obj) + case reflect.Invalid: + value = bson.M{} + default: + value = item.obj + } + err := bson.Unmarshal(data, value) + c.Assert(err, ErrorMatches, item.error) + } +} + +type unmarshalRawErrorType struct { + obj interface{} + raw bson.Raw + error string +} + +var unmarshalRawErrorItems = []unmarshalRawErrorType{ + // Tag name conflicts with existing parameter. + {&structWithDupKeys{}, + bson.Raw{0x03, []byte("\x10byte\x00\x08\x00\x00\x00")}, + "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, + + {&struct{}{}, + bson.Raw{0xEE, []byte{}}, + "Unknown element kind \\(0xEE\\)"}, + + {struct{ Name bool }{}, + bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, + "Raw Unmarshal can't deal with struct values. Use a pointer."}, + + {123, + bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, + "Raw Unmarshal needs a map or a valid pointer."}, +} + +func (s *S) TestUnmarshalRawErrorItems(c *C) { + for i, item := range unmarshalRawErrorItems { + err := item.raw.Unmarshal(item.obj) + c.Assert(err, ErrorMatches, item.error, Commentf("Failed on item %d: %#v\n", i, item)) + } +} + +var corruptedData = []string{ + "\x04\x00\x00\x00\x00", // Shorter than minimum + "\x06\x00\x00\x00\x00", // Not enough data + "\x05\x00\x00", // Broken length + "\x05\x00\x00\x00\xff", // Corrupted termination + "\x0A\x00\x00\x00\x0Aooop\x00", // Unfinished C string + + // Array end past end of string (s[2]=0x07 is correct) + wrapInDoc("\x04\x00\x09\x00\x00\x00\x0A\x00\x00"), + + // Array end within string, but past acceptable. + wrapInDoc("\x04\x00\x08\x00\x00\x00\x0A\x00\x00"), + + // Document end within string, but past acceptable. + wrapInDoc("\x03\x00\x08\x00\x00\x00\x0A\x00\x00"), + + // String with corrupted end. + wrapInDoc("\x02\x00\x03\x00\x00\x00yo\xFF"), +} + +func (s *S) TestUnmarshalMapDocumentTooShort(c *C) { + for _, data := range corruptedData { + err := bson.Unmarshal([]byte(data), bson.M{}) + c.Assert(err, ErrorMatches, "Document is corrupted") + + err = bson.Unmarshal([]byte(data), &struct{}{}) + c.Assert(err, ErrorMatches, "Document is corrupted") + } +} + +// -------------------------------------------------------------------------- +// Setter test cases. + +var setterResult = map[string]error{} + +type setterType struct { + received interface{} +} + +func (o *setterType) SetBSON(raw bson.Raw) error { + err := raw.Unmarshal(&o.received) + if err != nil { + panic("The panic:" + err.Error()) + } + if s, ok := o.received.(string); ok { + if result, ok := setterResult[s]; ok { + return result + } + } + return nil +} + +type ptrSetterDoc struct { + Field *setterType "_" +} + +type valSetterDoc struct { + Field setterType "_" +} + +func (s *S) TestUnmarshalAllItemsWithPtrSetter(c *C) { + for _, item := range allItems { + for i := 0; i != 2; i++ { + var field *setterType + if i == 0 { + obj := &ptrSetterDoc{} + err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) + c.Assert(err, IsNil) + field = obj.Field + } else { + obj := &valSetterDoc{} + err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) + c.Assert(err, IsNil) + field = &obj.Field + } + if item.data == "" { + // Nothing to unmarshal. Should be untouched. + if i == 0 { + c.Assert(field, IsNil) + } else { + c.Assert(field.received, IsNil) + } + } else { + expected := item.obj.(bson.M)["_"] + c.Assert(field, NotNil, Commentf("Pointer not initialized (%#v)", expected)) + c.Assert(field.received, DeepEquals, expected) + } + } + } +} + +func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { + obj := &setterType{} + err := bson.Unmarshal([]byte(sampleItems[0].data), obj) + c.Assert(err, IsNil) + c.Assert(obj.received, DeepEquals, bson.M{"hello": "world"}) +} + +func (s *S) TestUnmarshalSetterOmits(c *C) { + setterResult["2"] = &bson.TypeError{} + setterResult["4"] = &bson.TypeError{} + defer func() { + delete(setterResult, "2") + delete(setterResult, "4") + }() + + m := map[string]*setterType{} + data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + + "\x02def\x00\x02\x00\x00\x002\x00" + + "\x02ghi\x00\x02\x00\x00\x003\x00" + + "\x02jkl\x00\x02\x00\x00\x004\x00") + err := bson.Unmarshal([]byte(data), m) + c.Assert(err, IsNil) + c.Assert(m["abc"], NotNil) + c.Assert(m["def"], IsNil) + c.Assert(m["ghi"], NotNil) + c.Assert(m["jkl"], IsNil) + + c.Assert(m["abc"].received, Equals, "1") + c.Assert(m["ghi"].received, Equals, "3") +} + +func (s *S) TestUnmarshalSetterErrors(c *C) { + boom := errors.New("BOOM") + setterResult["2"] = boom + defer delete(setterResult, "2") + + m := map[string]*setterType{} + data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + + "\x02def\x00\x02\x00\x00\x002\x00" + + "\x02ghi\x00\x02\x00\x00\x003\x00") + err := bson.Unmarshal([]byte(data), m) + c.Assert(err, Equals, boom) + c.Assert(m["abc"], NotNil) + c.Assert(m["def"], IsNil) + c.Assert(m["ghi"], IsNil) + + c.Assert(m["abc"].received, Equals, "1") +} + +func (s *S) TestDMap(c *C) { + d := bson.D{{"a", 1}, {"b", 2}} + c.Assert(d.Map(), DeepEquals, bson.M{"a": 1, "b": 2}) +} + +func (s *S) TestUnmarshalSetterSetZero(c *C) { + setterResult["foo"] = bson.SetZero + defer delete(setterResult, "field") + + data, err := bson.Marshal(bson.M{"field": "foo"}) + c.Assert(err, IsNil) + + m := map[string]*setterType{} + err = bson.Unmarshal([]byte(data), m) + c.Assert(err, IsNil) + + value, ok := m["field"] + c.Assert(ok, Equals, true) + c.Assert(value, IsNil) +} + +// -------------------------------------------------------------------------- +// Getter test cases. + +type typeWithGetter struct { + result interface{} + err error +} + +func (t *typeWithGetter) GetBSON() (interface{}, error) { + if t == nil { + return "", nil + } + return t.result, t.err +} + +type docWithGetterField struct { + Field *typeWithGetter "_" +} + +func (s *S) TestMarshalAllItemsWithGetter(c *C) { + for i, item := range allItems { + if item.data == "" { + continue + } + obj := &docWithGetterField{} + obj.Field = &typeWithGetter{result: item.obj.(bson.M)["_"]} + data, err := bson.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, wrapInDoc(item.data), + Commentf("Failed on item #%d", i)) + } +} + +func (s *S) TestMarshalWholeDocumentWithGetter(c *C) { + obj := &typeWithGetter{result: sampleItems[0].obj} + data, err := bson.Marshal(obj) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, sampleItems[0].data) +} + +func (s *S) TestGetterErrors(c *C) { + e := errors.New("oops") + + obj1 := &docWithGetterField{} + obj1.Field = &typeWithGetter{sampleItems[0].obj, e} + data, err := bson.Marshal(obj1) + c.Assert(err, ErrorMatches, "oops") + c.Assert(data, IsNil) + + obj2 := &typeWithGetter{sampleItems[0].obj, e} + data, err = bson.Marshal(obj2) + c.Assert(err, ErrorMatches, "oops") + c.Assert(data, IsNil) +} + +type intGetter int64 + +func (t intGetter) GetBSON() (interface{}, error) { + return int64(t), nil +} + +type typeWithIntGetter struct { + V intGetter ",minsize" +} + +func (s *S) TestMarshalShortWithGetter(c *C) { + obj := typeWithIntGetter{42} + data, err := bson.Marshal(obj) + c.Assert(err, IsNil) + m := bson.M{} + err = bson.Unmarshal(data, m) + c.Assert(err, IsNil) + c.Assert(m["v"], Equals, 42) +} + +func (s *S) TestMarshalWithGetterNil(c *C) { + obj := docWithGetterField{} + data, err := bson.Marshal(obj) + c.Assert(err, IsNil) + m := bson.M{} + err = bson.Unmarshal(data, m) + c.Assert(err, IsNil) + c.Assert(m, DeepEquals, bson.M{"_": ""}) +} + +// -------------------------------------------------------------------------- +// Cross-type conversion tests. + +type crossTypeItem struct { + obj1 interface{} + obj2 interface{} +} + +type condStr struct { + V string ",omitempty" +} +type condStrNS struct { + V string `a:"A" bson:",omitempty" b:"B"` +} +type condBool struct { + V bool ",omitempty" +} +type condInt struct { + V int ",omitempty" +} +type condUInt struct { + V uint ",omitempty" +} +type condFloat struct { + V float64 ",omitempty" +} +type condIface struct { + V interface{} ",omitempty" +} +type condPtr struct { + V *bool ",omitempty" +} +type condSlice struct { + V []string ",omitempty" +} +type condMap struct { + V map[string]int ",omitempty" +} +type namedCondStr struct { + V string "myv,omitempty" +} +type condTime struct { + V time.Time ",omitempty" +} +type condStruct struct { + V struct{ A []int } ",omitempty" +} + +type shortInt struct { + V int64 ",minsize" +} +type shortUint struct { + V uint64 ",minsize" +} +type shortIface struct { + V interface{} ",minsize" +} +type shortPtr struct { + V *int64 ",minsize" +} +type shortNonEmptyInt struct { + V int64 ",minsize,omitempty" +} + +type inlineInt struct { + V struct{ A, B int } ",inline" +} +type inlineCantPtr struct { + V *struct{ A, B int } ",inline" +} +type inlineDupName struct { + A int + V struct{ A, B int } ",inline" +} +type inlineMap struct { + A int + M map[string]interface{} ",inline" +} +type inlineMapInt struct { + A int + M map[string]int ",inline" +} +type inlineMapMyM struct { + A int + M MyM ",inline" +} +type inlineDupMap struct { + M1 map[string]interface{} ",inline" + M2 map[string]interface{} ",inline" +} +type inlineBadKeyMap struct { + M map[int]int ",inline" +} + +type ( + MyString string + MyBytes []byte + MyBool bool + MyD []bson.DocElem + MyRawD []bson.RawDocElem + MyM map[string]interface{} +) + +var ( + truevar = true + falsevar = false + + int64var = int64(42) + int64ptr = &int64var + intvar = int(42) + intptr = &intvar +) + +func parseURL(s string) *url.URL { + u, err := url.Parse(s) + if err != nil { + panic(err) + } + return u +} + +// That's a pretty fun test. It will dump the first item, generate a zero +// value equivalent to the second one, load the dumped data onto it, and then +// verify that the resulting value is deep-equal to the untouched second value. +// Then, it will do the same in the *opposite* direction! +var twoWayCrossItems = []crossTypeItem{ + // int<=>int + {&struct{ I int }{42}, &struct{ I int8 }{42}}, + {&struct{ I int }{42}, &struct{ I int32 }{42}}, + {&struct{ I int }{42}, &struct{ I int64 }{42}}, + {&struct{ I int8 }{42}, &struct{ I int32 }{42}}, + {&struct{ I int8 }{42}, &struct{ I int64 }{42}}, + {&struct{ I int32 }{42}, &struct{ I int64 }{42}}, + + // uint<=>uint + {&struct{ I uint }{42}, &struct{ I uint8 }{42}}, + {&struct{ I uint }{42}, &struct{ I uint32 }{42}}, + {&struct{ I uint }{42}, &struct{ I uint64 }{42}}, + {&struct{ I uint8 }{42}, &struct{ I uint32 }{42}}, + {&struct{ I uint8 }{42}, &struct{ I uint64 }{42}}, + {&struct{ I uint32 }{42}, &struct{ I uint64 }{42}}, + + // float32<=>float64 + {&struct{ I float32 }{42}, &struct{ I float64 }{42}}, + + // int<=>uint + {&struct{ I uint }{42}, &struct{ I int }{42}}, + {&struct{ I uint }{42}, &struct{ I int8 }{42}}, + {&struct{ I uint }{42}, &struct{ I int32 }{42}}, + {&struct{ I uint }{42}, &struct{ I int64 }{42}}, + {&struct{ I uint8 }{42}, &struct{ I int }{42}}, + {&struct{ I uint8 }{42}, &struct{ I int8 }{42}}, + {&struct{ I uint8 }{42}, &struct{ I int32 }{42}}, + {&struct{ I uint8 }{42}, &struct{ I int64 }{42}}, + {&struct{ I uint32 }{42}, &struct{ I int }{42}}, + {&struct{ I uint32 }{42}, &struct{ I int8 }{42}}, + {&struct{ I uint32 }{42}, &struct{ I int32 }{42}}, + {&struct{ I uint32 }{42}, &struct{ I int64 }{42}}, + {&struct{ I uint64 }{42}, &struct{ I int }{42}}, + {&struct{ I uint64 }{42}, &struct{ I int8 }{42}}, + {&struct{ I uint64 }{42}, &struct{ I int32 }{42}}, + {&struct{ I uint64 }{42}, &struct{ I int64 }{42}}, + + // int <=> float + {&struct{ I int }{42}, &struct{ I float64 }{42}}, + + // int <=> bool + {&struct{ I int }{1}, &struct{ I bool }{true}}, + {&struct{ I int }{0}, &struct{ I bool }{false}}, + + // uint <=> float64 + {&struct{ I uint }{42}, &struct{ I float64 }{42}}, + + // uint <=> bool + {&struct{ I uint }{1}, &struct{ I bool }{true}}, + {&struct{ I uint }{0}, &struct{ I bool }{false}}, + + // float64 <=> bool + {&struct{ I float64 }{1}, &struct{ I bool }{true}}, + {&struct{ I float64 }{0}, &struct{ I bool }{false}}, + + // string <=> string and string <=> []byte + {&struct{ S []byte }{[]byte("abc")}, &struct{ S string }{"abc"}}, + {&struct{ S []byte }{[]byte("def")}, &struct{ S bson.Symbol }{"def"}}, + {&struct{ S string }{"ghi"}, &struct{ S bson.Symbol }{"ghi"}}, + + // map <=> struct + {&struct { + A struct { + B, C int + } + }{struct{ B, C int }{1, 2}}, + map[string]map[string]int{"a": map[string]int{"b": 1, "c": 2}}}, + + {&struct{ A bson.Symbol }{"abc"}, map[string]string{"a": "abc"}}, + {&struct{ A bson.Symbol }{"abc"}, map[string][]byte{"a": []byte("abc")}}, + {&struct{ A []byte }{[]byte("abc")}, map[string]string{"a": "abc"}}, + {&struct{ A uint }{42}, map[string]int{"a": 42}}, + {&struct{ A uint }{42}, map[string]float64{"a": 42}}, + {&struct{ A uint }{1}, map[string]bool{"a": true}}, + {&struct{ A int }{42}, map[string]uint{"a": 42}}, + {&struct{ A int }{42}, map[string]float64{"a": 42}}, + {&struct{ A int }{1}, map[string]bool{"a": true}}, + {&struct{ A float64 }{42}, map[string]float32{"a": 42}}, + {&struct{ A float64 }{42}, map[string]int{"a": 42}}, + {&struct{ A float64 }{42}, map[string]uint{"a": 42}}, + {&struct{ A float64 }{1}, map[string]bool{"a": true}}, + {&struct{ A bool }{true}, map[string]int{"a": 1}}, + {&struct{ A bool }{true}, map[string]uint{"a": 1}}, + {&struct{ A bool }{true}, map[string]float64{"a": 1}}, + {&struct{ A **byte }{&byteptr}, map[string]byte{"a": 8}}, + + // url.URL <=> string + {&struct{ URL *url.URL }{parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, + {&struct{ URL url.URL }{*parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, + + // Slices + {&struct{ S []int }{[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, + {&struct{ S *[]int }{&[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, + + // Conditionals + {&condBool{true}, map[string]bool{"v": true}}, + {&condBool{}, map[string]bool{}}, + {&condInt{1}, map[string]int{"v": 1}}, + {&condInt{}, map[string]int{}}, + {&condUInt{1}, map[string]uint{"v": 1}}, + {&condUInt{}, map[string]uint{}}, + {&condFloat{}, map[string]int{}}, + {&condStr{"yo"}, map[string]string{"v": "yo"}}, + {&condStr{}, map[string]string{}}, + {&condStrNS{"yo"}, map[string]string{"v": "yo"}}, + {&condStrNS{}, map[string]string{}}, + {&condSlice{[]string{"yo"}}, map[string][]string{"v": []string{"yo"}}}, + {&condSlice{}, map[string][]string{}}, + {&condMap{map[string]int{"k": 1}}, bson.M{"v": bson.M{"k": 1}}}, + {&condMap{}, map[string][]string{}}, + {&condIface{"yo"}, map[string]string{"v": "yo"}}, + {&condIface{""}, map[string]string{"v": ""}}, + {&condIface{}, map[string]string{}}, + {&condPtr{&truevar}, map[string]bool{"v": true}}, + {&condPtr{&falsevar}, map[string]bool{"v": false}}, + {&condPtr{}, map[string]string{}}, + + {&condTime{time.Unix(123456789, 123e6)}, map[string]time.Time{"v": time.Unix(123456789, 123e6)}}, + {&condTime{}, map[string]string{}}, + + {&condStruct{struct{ A []int }{[]int{1}}}, bson.M{"v": bson.M{"a": []interface{}{1}}}}, + {&condStruct{struct{ A []int }{}}, bson.M{}}, + + {&namedCondStr{"yo"}, map[string]string{"myv": "yo"}}, + {&namedCondStr{}, map[string]string{}}, + + {&shortInt{1}, map[string]interface{}{"v": 1}}, + {&shortInt{1 << 30}, map[string]interface{}{"v": 1 << 30}}, + {&shortInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, + {&shortUint{1 << 30}, map[string]interface{}{"v": 1 << 30}}, + {&shortUint{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, + {&shortIface{int64(1) << 31}, map[string]interface{}{"v": int64(1 << 31)}}, + {&shortPtr{int64ptr}, map[string]interface{}{"v": intvar}}, + + {&shortNonEmptyInt{1}, map[string]interface{}{"v": 1}}, + {&shortNonEmptyInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, + {&shortNonEmptyInt{}, map[string]interface{}{}}, + + {&inlineInt{struct{ A, B int }{1, 2}}, map[string]interface{}{"a": 1, "b": 2}}, + {&inlineMap{A: 1, M: map[string]interface{}{"b": 2}}, map[string]interface{}{"a": 1, "b": 2}}, + {&inlineMap{A: 1, M: nil}, map[string]interface{}{"a": 1}}, + {&inlineMapInt{A: 1, M: map[string]int{"b": 2}}, map[string]int{"a": 1, "b": 2}}, + {&inlineMapInt{A: 1, M: nil}, map[string]int{"a": 1}}, + {&inlineMapMyM{A: 1, M: MyM{"b": MyM{"c": 3}}}, map[string]interface{}{"a": 1, "b": map[string]interface{}{"c": 3}}}, + + // []byte <=> MyBytes + {&struct{ B MyBytes }{[]byte("abc")}, map[string]string{"b": "abc"}}, + {&struct{ B MyBytes }{[]byte{}}, map[string]string{"b": ""}}, + {&struct{ B MyBytes }{}, map[string]bool{}}, + {&struct{ B []byte }{[]byte("abc")}, map[string]MyBytes{"b": []byte("abc")}}, + + // bool <=> MyBool + {&struct{ B MyBool }{true}, map[string]bool{"b": true}}, + {&struct{ B MyBool }{}, map[string]bool{"b": false}}, + {&struct{ B MyBool }{}, map[string]string{}}, + {&struct{ B bool }{}, map[string]MyBool{"b": false}}, + + // arrays + {&struct{ V [2]int }{[...]int{1, 2}}, map[string][2]int{"v": [2]int{1, 2}}}, + + // zero time + {&struct{ V time.Time }{}, map[string]interface{}{"v": time.Time{}}}, + + // zero time + 1 second + 1 millisecond; overflows int64 as nanoseconds + {&struct{ V time.Time }{time.Unix(-62135596799, 1e6).Local()}, + map[string]interface{}{"v": time.Unix(-62135596799, 1e6).Local()}}, + + // bson.D <=> []DocElem + {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}}, + {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &MyD{{"a", MyD{{"b", 1}, {"c", 2}}}}}, + + // bson.RawD <=> []RawDocElem + {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, + {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &MyRawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, + + // bson.M <=> map + {bson.M{"a": bson.M{"b": 1, "c": 2}}, MyM{"a": MyM{"b": 1, "c": 2}}}, + {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[string]interface{}{"a": map[string]interface{}{"b": 1, "c": 2}}}, + + // bson.M <=> map[MyString] + {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[MyString]interface{}{"a": map[MyString]interface{}{"b": 1, "c": 2}}}, +} + +// Same thing, but only one way (obj1 => obj2). +var oneWayCrossItems = []crossTypeItem{ + // map <=> struct + {map[string]interface{}{"a": 1, "b": "2", "c": 3}, map[string]int{"a": 1, "c": 3}}, + + // inline map elides badly typed values + {map[string]interface{}{"a": 1, "b": "2", "c": 3}, &inlineMapInt{A: 1, M: map[string]int{"c": 3}}}, + + // Can't decode int into struct. + {bson.M{"a": bson.M{"b": 2}}, &struct{ A bool }{}}, + + // Would get decoded into a int32 too in the opposite direction. + {&shortIface{int64(1) << 30}, map[string]interface{}{"v": 1 << 30}}, +} + +func testCrossPair(c *C, dump interface{}, load interface{}) { + c.Logf("Dump: %#v", dump) + c.Logf("Load: %#v", load) + zero := makeZeroDoc(load) + data, err := bson.Marshal(dump) + c.Assert(err, IsNil) + c.Logf("Dumped: %#v", string(data)) + err = bson.Unmarshal(data, zero) + c.Assert(err, IsNil) + c.Logf("Loaded: %#v", zero) + c.Assert(zero, DeepEquals, load) +} + +func (s *S) TestTwoWayCrossPairs(c *C) { + for _, item := range twoWayCrossItems { + testCrossPair(c, item.obj1, item.obj2) + testCrossPair(c, item.obj2, item.obj1) + } +} + +func (s *S) TestOneWayCrossPairs(c *C) { + for _, item := range oneWayCrossItems { + testCrossPair(c, item.obj1, item.obj2) + } +} + +// -------------------------------------------------------------------------- +// ObjectId hex representation test. + +func (s *S) TestObjectIdHex(c *C) { + id := bson.ObjectIdHex("4d88e15b60f486e428412dc9") + c.Assert(id.String(), Equals, `ObjectIdHex("4d88e15b60f486e428412dc9")`) + c.Assert(id.Hex(), Equals, "4d88e15b60f486e428412dc9") +} + +func (s *S) TestIsObjectIdHex(c *C) { + test := []struct { + id string + valid bool + }{ + {"4d88e15b60f486e428412dc9", true}, + {"4d88e15b60f486e428412dc", false}, + {"4d88e15b60f486e428412dc9e", false}, + {"4d88e15b60f486e428412dcx", false}, + } + for _, t := range test { + c.Assert(bson.IsObjectIdHex(t.id), Equals, t.valid) + } +} + +// -------------------------------------------------------------------------- +// ObjectId parts extraction tests. + +type objectIdParts struct { + id bson.ObjectId + timestamp int64 + machine []byte + pid uint16 + counter int32 +} + +var objectIds = []objectIdParts{ + objectIdParts{ + bson.ObjectIdHex("4d88e15b60f486e428412dc9"), + 1300816219, + []byte{0x60, 0xf4, 0x86}, + 0xe428, + 4271561, + }, + objectIdParts{ + bson.ObjectIdHex("000000000000000000000000"), + 0, + []byte{0x00, 0x00, 0x00}, + 0x0000, + 0, + }, + objectIdParts{ + bson.ObjectIdHex("00000000aabbccddee000001"), + 0, + []byte{0xaa, 0xbb, 0xcc}, + 0xddee, + 1, + }, +} + +func (s *S) TestObjectIdPartsExtraction(c *C) { + for i, v := range objectIds { + t := time.Unix(v.timestamp, 0) + c.Assert(v.id.Time(), Equals, t, Commentf("#%d Wrong timestamp value", i)) + c.Assert(v.id.Machine(), DeepEquals, v.machine, Commentf("#%d Wrong machine id value", i)) + c.Assert(v.id.Pid(), Equals, v.pid, Commentf("#%d Wrong pid value", i)) + c.Assert(v.id.Counter(), Equals, v.counter, Commentf("#%d Wrong counter value", i)) + } +} + +func (s *S) TestNow(c *C) { + before := time.Now() + time.Sleep(1e6) + now := bson.Now() + time.Sleep(1e6) + after := time.Now() + c.Assert(now.After(before) && now.Before(after), Equals, true, Commentf("now=%s, before=%s, after=%s", now, before, after)) +} + +// -------------------------------------------------------------------------- +// ObjectId generation tests. + +func (s *S) TestNewObjectId(c *C) { + // Generate 10 ids + ids := make([]bson.ObjectId, 10) + for i := 0; i < 10; i++ { + ids[i] = bson.NewObjectId() + } + for i := 1; i < 10; i++ { + prevId := ids[i-1] + id := ids[i] + // Test for uniqueness among all other 9 generated ids + for j, tid := range ids { + if j != i { + c.Assert(id, Not(Equals), tid, Commentf("Generated ObjectId is not unique")) + } + } + // Check that timestamp was incremented and is within 30 seconds of the previous one + secs := id.Time().Sub(prevId.Time()).Seconds() + c.Assert((secs >= 0 && secs <= 30), Equals, true, Commentf("Wrong timestamp in generated ObjectId")) + // Check that machine ids are the same + c.Assert(id.Machine(), DeepEquals, prevId.Machine()) + // Check that pids are the same + c.Assert(id.Pid(), Equals, prevId.Pid()) + // Test for proper increment + delta := int(id.Counter() - prevId.Counter()) + c.Assert(delta, Equals, 1, Commentf("Wrong increment in generated ObjectId")) + } +} + +func (s *S) TestNewObjectIdWithTime(c *C) { + t := time.Unix(12345678, 0) + id := bson.NewObjectIdWithTime(t) + c.Assert(id.Time(), Equals, t) + c.Assert(id.Machine(), DeepEquals, []byte{0x00, 0x00, 0x00}) + c.Assert(int(id.Pid()), Equals, 0) + c.Assert(int(id.Counter()), Equals, 0) +} + +// -------------------------------------------------------------------------- +// ObjectId JSON marshalling. + +type jsonType struct { + Id *bson.ObjectId +} + +func (s *S) TestObjectIdJSONMarshaling(c *C) { + id := bson.ObjectIdHex("4d88e15b60f486e428412dc9") + v := jsonType{Id: &id} + data, err := json.Marshal(&v) + c.Assert(err, IsNil) + c.Assert(string(data), Equals, `{"Id":"4d88e15b60f486e428412dc9"}`) +} + +func (s *S) TestObjectIdJSONUnmarshaling(c *C) { + data := []byte(`{"Id":"4d88e15b60f486e428412dc9"}`) + v := jsonType{} + err := json.Unmarshal(data, &v) + c.Assert(err, IsNil) + c.Assert(*v.Id, Equals, bson.ObjectIdHex("4d88e15b60f486e428412dc9")) +} + +func (s *S) TestObjectIdJSONUnmarshalingError(c *C) { + v := jsonType{} + err := json.Unmarshal([]byte(`{"Id":"4d88e15b60f486e428412dc9A"}`), &v) + c.Assert(err, ErrorMatches, `Invalid ObjectId in JSON: "4d88e15b60f486e428412dc9A"`) + err = json.Unmarshal([]byte(`{"Id":"4d88e15b60f486e428412dcZ"}`), &v) + c.Assert(err, ErrorMatches, `Invalid ObjectId in JSON: "4d88e15b60f486e428412dcZ" .*`) +} + +// -------------------------------------------------------------------------- +// Some simple benchmarks. + +type BenchT struct { + A, B, C, D, E, F string +} + +func BenchmarkUnmarhsalStruct(b *testing.B) { + v := BenchT{A: "A", D: "D", E: "E"} + data, err := bson.Marshal(&v) + if err != nil { + panic(err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + err = bson.Unmarshal(data, &v) + } + if err != nil { + panic(err) + } +} + +func BenchmarkUnmarhsalMap(b *testing.B) { + m := bson.M{"a": "a", "d": "d", "e": "e"} + data, err := bson.Marshal(&m) + if err != nil { + panic(err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + err = bson.Unmarshal(data, &m) + } + if err != nil { + panic(err) + } +} diff --git a/vendor/labix.org/v2/mgo/bson/decode.go b/vendor/labix.org/v2/mgo/bson/decode.go new file mode 100644 index 0000000..1ec034e --- /dev/null +++ b/vendor/labix.org/v2/mgo/bson/decode.go @@ -0,0 +1,795 @@ +// BSON library for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// gobson - BSON library for Go. + +package bson + +import ( + "fmt" + "math" + "net/url" + "reflect" + "sync" + "time" +) + +type decoder struct { + in []byte + i int + docType reflect.Type +} + +var typeM = reflect.TypeOf(M{}) + +func newDecoder(in []byte) *decoder { + return &decoder{in, 0, typeM} +} + +// -------------------------------------------------------------------------- +// Some helper functions. + +func corrupted() { + panic("Document is corrupted") +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +// -------------------------------------------------------------------------- +// Unmarshaling of documents. + +const ( + setterUnknown = iota + setterNone + setterType + setterAddr +) + +var setterStyle map[reflect.Type]int +var setterIface reflect.Type +var setterMutex sync.RWMutex + +func init() { + var iface Setter + setterIface = reflect.TypeOf(&iface).Elem() + setterStyle = make(map[reflect.Type]int) +} + +func getSetter(outt reflect.Type, out reflect.Value) Setter { + setterMutex.RLock() + style := setterStyle[outt] + setterMutex.RUnlock() + if style == setterNone { + return nil + } + if style == setterUnknown { + setterMutex.Lock() + defer setterMutex.Unlock() + if outt.Implements(setterIface) { + setterStyle[outt] = setterType + } else if reflect.PtrTo(outt).Implements(setterIface) { + setterStyle[outt] = setterAddr + } else { + setterStyle[outt] = setterNone + return nil + } + style = setterStyle[outt] + } + if style == setterAddr { + if !out.CanAddr() { + return nil + } + out = out.Addr() + } else if outt.Kind() == reflect.Ptr && out.IsNil() { + out.Set(reflect.New(outt.Elem())) + } + return out.Interface().(Setter) +} + +func clearMap(m reflect.Value) { + var none reflect.Value + for _, k := range m.MapKeys() { + m.SetMapIndex(k, none) + } +} + +func (d *decoder) readDocTo(out reflect.Value) { + var elemType reflect.Type + outt := out.Type() + outk := outt.Kind() + + for { + if outk == reflect.Ptr && out.IsNil() { + out.Set(reflect.New(outt.Elem())) + } + if setter := getSetter(outt, out); setter != nil { + var raw Raw + d.readDocTo(reflect.ValueOf(&raw)) + err := setter.SetBSON(raw) + if _, ok := err.(*TypeError); err != nil && !ok { + panic(err) + } + return + } + if outk == reflect.Ptr { + out = out.Elem() + outt = out.Type() + outk = out.Kind() + continue + } + break + } + + var fieldsMap map[string]fieldInfo + var inlineMap reflect.Value + start := d.i + + origout := out + if outk == reflect.Interface { + if d.docType.Kind() == reflect.Map { + mv := reflect.MakeMap(d.docType) + out.Set(mv) + out = mv + } else { + dv := reflect.New(d.docType).Elem() + out.Set(dv) + out = dv + } + outt = out.Type() + outk = outt.Kind() + } + + docType := d.docType + keyType := typeString + convertKey := false + switch outk { + case reflect.Map: + keyType = outt.Key() + if keyType.Kind() != reflect.String { + panic("BSON map must have string keys. Got: " + outt.String()) + } + if keyType != typeString { + convertKey = true + } + elemType = outt.Elem() + if elemType == typeIface { + d.docType = outt + } + if out.IsNil() { + out.Set(reflect.MakeMap(out.Type())) + } else if out.Len() > 0 { + clearMap(out) + } + case reflect.Struct: + if outt != typeRaw { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + fieldsMap = sinfo.FieldsMap + out.Set(sinfo.Zero) + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + if !inlineMap.IsNil() && inlineMap.Len() > 0 { + clearMap(inlineMap) + } + elemType = inlineMap.Type().Elem() + if elemType == typeIface { + d.docType = inlineMap.Type() + } + } + } + case reflect.Slice: + switch outt.Elem() { + case typeDocElem: + origout.Set(d.readDocElems(outt)) + return + case typeRawDocElem: + origout.Set(d.readRawDocElems(outt)) + return + } + fallthrough + default: + panic("Unsupported document type for unmarshalling: " + out.Type().String()) + } + + end := int(d.readInt32()) + end += d.i - 4 + if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { + corrupted() + } + for d.in[d.i] != '\x00' { + kind := d.readByte() + name := d.readCStr() + if d.i >= end { + corrupted() + } + + switch outk { + case reflect.Map: + e := reflect.New(elemType).Elem() + if d.readElemTo(e, kind) { + k := reflect.ValueOf(name) + if convertKey { + k = k.Convert(keyType) + } + out.SetMapIndex(k, e) + } + case reflect.Struct: + if outt == typeRaw { + d.dropElem(kind) + } else { + if info, ok := fieldsMap[name]; ok { + if info.Inline == nil { + d.readElemTo(out.Field(info.Num), kind) + } else { + d.readElemTo(out.FieldByIndex(info.Inline), kind) + } + } else if inlineMap.IsValid() { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + e := reflect.New(elemType).Elem() + if d.readElemTo(e, kind) { + inlineMap.SetMapIndex(reflect.ValueOf(name), e) + } + } else { + d.dropElem(kind) + } + } + case reflect.Slice: + } + + if d.i >= end { + corrupted() + } + } + d.i++ // '\x00' + if d.i != end { + corrupted() + } + d.docType = docType + + if outt == typeRaw { + out.Set(reflect.ValueOf(Raw{0x03, d.in[start:d.i]})) + } +} + +func (d *decoder) readArrayDocTo(out reflect.Value) { + end := int(d.readInt32()) + end += d.i - 4 + if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { + corrupted() + } + i := 0 + l := out.Len() + for d.in[d.i] != '\x00' { + if i >= l { + panic("Length mismatch on array field") + } + kind := d.readByte() + for d.i < end && d.in[d.i] != '\x00' { + d.i++ + } + if d.i >= end { + corrupted() + } + d.i++ + d.readElemTo(out.Index(i), kind) + if d.i >= end { + corrupted() + } + i++ + } + if i != l { + panic("Length mismatch on array field") + } + d.i++ // '\x00' + if d.i != end { + corrupted() + } +} + +func (d *decoder) readSliceDoc(t reflect.Type) interface{} { + tmp := make([]reflect.Value, 0, 8) + elemType := t.Elem() + + end := int(d.readInt32()) + end += d.i - 4 + if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { + corrupted() + } + for d.in[d.i] != '\x00' { + kind := d.readByte() + for d.i < end && d.in[d.i] != '\x00' { + d.i++ + } + if d.i >= end { + corrupted() + } + d.i++ + e := reflect.New(elemType).Elem() + if d.readElemTo(e, kind) { + tmp = append(tmp, e) + } + if d.i >= end { + corrupted() + } + } + d.i++ // '\x00' + if d.i != end { + corrupted() + } + + n := len(tmp) + slice := reflect.MakeSlice(t, n, n) + for i := 0; i != n; i++ { + slice.Index(i).Set(tmp[i]) + } + return slice.Interface() +} + +var typeSlice = reflect.TypeOf([]interface{}{}) +var typeIface = typeSlice.Elem() + +func (d *decoder) readDocElems(typ reflect.Type) reflect.Value { + docType := d.docType + d.docType = typ + slice := make([]DocElem, 0, 8) + d.readDocWith(func(kind byte, name string) { + e := DocElem{Name: name} + v := reflect.ValueOf(&e.Value) + if d.readElemTo(v.Elem(), kind) { + slice = append(slice, e) + } + }) + slicev := reflect.New(typ).Elem() + slicev.Set(reflect.ValueOf(slice)) + d.docType = docType + return slicev +} + +func (d *decoder) readRawDocElems(typ reflect.Type) reflect.Value { + docType := d.docType + d.docType = typ + slice := make([]RawDocElem, 0, 8) + d.readDocWith(func(kind byte, name string) { + e := RawDocElem{Name: name} + v := reflect.ValueOf(&e.Value) + if d.readElemTo(v.Elem(), kind) { + slice = append(slice, e) + } + }) + slicev := reflect.New(typ).Elem() + slicev.Set(reflect.ValueOf(slice)) + d.docType = docType + return slicev +} + +func (d *decoder) readDocWith(f func(kind byte, name string)) { + end := int(d.readInt32()) + end += d.i - 4 + if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { + corrupted() + } + for d.in[d.i] != '\x00' { + kind := d.readByte() + name := d.readCStr() + if d.i >= end { + corrupted() + } + f(kind, name) + if d.i >= end { + corrupted() + } + } + d.i++ // '\x00' + if d.i != end { + corrupted() + } +} + +// -------------------------------------------------------------------------- +// Unmarshaling of individual elements within a document. + +var blackHole = settableValueOf(struct{}{}) + +func (d *decoder) dropElem(kind byte) { + d.readElemTo(blackHole, kind) +} + +// Attempt to decode an element from the document and put it into out. +// If the types are not compatible, the returned ok value will be +// false and out will be unchanged. +func (d *decoder) readElemTo(out reflect.Value, kind byte) (good bool) { + + start := d.i + + if kind == '\x03' { + // Special case for documents. Delegate to readDocTo(). + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Struct, reflect.Map: + d.readDocTo(out) + default: + switch out.Interface().(type) { + case D: + out.Set(d.readDocElems(out.Type())) + case RawD: + out.Set(d.readRawDocElems(out.Type())) + default: + d.readDocTo(blackHole) + } + } + return true + } + + var in interface{} + + switch kind { + case 0x01: // Float64 + in = d.readFloat64() + case 0x02: // UTF-8 string + in = d.readStr() + case 0x03: // Document + panic("Can't happen. Handled above.") + case 0x04: // Array + outt := out.Type() + for outt.Kind() == reflect.Ptr { + outt = outt.Elem() + } + switch outt.Kind() { + case reflect.Array: + d.readArrayDocTo(out) + return true + case reflect.Slice: + in = d.readSliceDoc(outt) + default: + in = d.readSliceDoc(typeSlice) + } + case 0x05: // Binary + b := d.readBinary() + if b.Kind == 0x00 || b.Kind == 0x02 { + in = b.Data + } else { + in = b + } + case 0x06: // Undefined (obsolete, but still seen in the wild) + in = Undefined + case 0x07: // ObjectId + in = ObjectId(d.readBytes(12)) + case 0x08: // Bool + in = d.readBool() + case 0x09: // Timestamp + // MongoDB handles timestamps as milliseconds. + i := d.readInt64() + if i == -62135596800000 { + in = time.Time{} // In UTC for convenience. + } else { + in = time.Unix(i/1e3, i%1e3*1e6) + } + case 0x0A: // Nil + in = nil + case 0x0B: // RegEx + in = d.readRegEx() + case 0x0D: // JavaScript without scope + in = JavaScript{Code: d.readStr()} + case 0x0E: // Symbol + in = Symbol(d.readStr()) + case 0x0F: // JavaScript with scope + d.i += 4 // Skip length + js := JavaScript{d.readStr(), make(M)} + d.readDocTo(reflect.ValueOf(js.Scope)) + in = js + case 0x10: // Int32 + in = int(d.readInt32()) + case 0x11: // Mongo-specific timestamp + in = MongoTimestamp(d.readInt64()) + case 0x12: // Int64 + in = d.readInt64() + case 0x7F: // Max key + in = MaxKey + case 0xFF: // Min key + in = MinKey + default: + panic(fmt.Sprintf("Unknown element kind (0x%02X)", kind)) + } + + outt := out.Type() + + if outt == typeRaw { + out.Set(reflect.ValueOf(Raw{kind, d.in[start:d.i]})) + return true + } + + if setter := getSetter(outt, out); setter != nil { + err := setter.SetBSON(Raw{kind, d.in[start:d.i]}) + if err == SetZero { + out.Set(reflect.Zero(outt)) + return true + } + if err == nil { + return true + } + if _, ok := err.(*TypeError); !ok { + panic(err) + } + return false + } + + if in == nil { + out.Set(reflect.Zero(outt)) + return true + } + + outk := outt.Kind() + + // Dereference and initialize pointer if necessary. + first := true + for outk == reflect.Ptr { + if !out.IsNil() { + out = out.Elem() + } else { + elem := reflect.New(outt.Elem()) + if first { + // Only set if value is compatible. + first = false + defer func(out, elem reflect.Value) { + if good { + out.Set(elem) + } + }(out, elem) + } else { + out.Set(elem) + } + out = elem + } + outt = out.Type() + outk = outt.Kind() + } + + inv := reflect.ValueOf(in) + if outt == inv.Type() { + out.Set(inv) + return true + } + + switch outk { + case reflect.Interface: + out.Set(inv) + return true + case reflect.String: + switch inv.Kind() { + case reflect.String: + out.SetString(inv.String()) + return true + case reflect.Slice: + if b, ok := in.([]byte); ok { + out.SetString(string(b)) + return true + } + } + case reflect.Slice, reflect.Array: + // Remember, array (0x04) slices are built with the correct + // element type. If we are here, must be a cross BSON kind + // conversion (e.g. 0x05 unmarshalling on string). + if outt.Elem().Kind() != reflect.Uint8 { + break + } + switch inv.Kind() { + case reflect.String: + slice := []byte(inv.String()) + out.Set(reflect.ValueOf(slice)) + return true + case reflect.Slice: + switch outt.Kind() { + case reflect.Array: + reflect.Copy(out, inv) + case reflect.Slice: + out.SetBytes(inv.Bytes()) + } + return true + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch inv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + out.SetInt(inv.Int()) + return true + case reflect.Float32, reflect.Float64: + out.SetInt(int64(inv.Float())) + return true + case reflect.Bool: + if inv.Bool() { + out.SetInt(1) + } else { + out.SetInt(0) + } + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + panic("Can't happen. No uint types in BSON?") + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch inv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + out.SetUint(uint64(inv.Int())) + return true + case reflect.Float32, reflect.Float64: + out.SetUint(uint64(inv.Float())) + return true + case reflect.Bool: + if inv.Bool() { + out.SetUint(1) + } else { + out.SetUint(0) + } + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + panic("Can't happen. No uint types in BSON.") + } + case reflect.Float32, reflect.Float64: + switch inv.Kind() { + case reflect.Float32, reflect.Float64: + out.SetFloat(inv.Float()) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + out.SetFloat(float64(inv.Int())) + return true + case reflect.Bool: + if inv.Bool() { + out.SetFloat(1) + } else { + out.SetFloat(0) + } + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + panic("Can't happen. No uint types in BSON?") + } + case reflect.Bool: + switch inv.Kind() { + case reflect.Bool: + out.SetBool(inv.Bool()) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + out.SetBool(inv.Int() != 0) + return true + case reflect.Float32, reflect.Float64: + out.SetBool(inv.Float() != 0) + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + panic("Can't happen. No uint types in BSON?") + } + case reflect.Struct: + if outt == typeURL && inv.Kind() == reflect.String { + u, err := url.Parse(inv.String()) + if err != nil { + panic(err) + } + out.Set(reflect.ValueOf(u).Elem()) + return true + } + } + + return false +} + +// -------------------------------------------------------------------------- +// Parsers of basic types. + +func (d *decoder) readRegEx() RegEx { + re := RegEx{} + re.Pattern = d.readCStr() + re.Options = d.readCStr() + return re +} + +func (d *decoder) readBinary() Binary { + l := d.readInt32() + b := Binary{} + b.Kind = d.readByte() + b.Data = d.readBytes(l) + if b.Kind == 0x02 && len(b.Data) >= 4 { + // Weird obsolete format with redundant length. + b.Data = b.Data[4:] + } + return b +} + +func (d *decoder) readStr() string { + l := d.readInt32() + b := d.readBytes(l - 1) + if d.readByte() != '\x00' { + corrupted() + } + return string(b) +} + +func (d *decoder) readCStr() string { + start := d.i + end := start + l := len(d.in) + for ; end != l; end++ { + if d.in[end] == '\x00' { + break + } + } + d.i = end + 1 + if d.i > l { + corrupted() + } + return string(d.in[start:end]) +} + +func (d *decoder) readBool() bool { + if d.readByte() == 1 { + return true + } + return false +} + +func (d *decoder) readFloat64() float64 { + return math.Float64frombits(uint64(d.readInt64())) +} + +func (d *decoder) readInt32() int32 { + b := d.readBytes(4) + return int32((uint32(b[0]) << 0) | + (uint32(b[1]) << 8) | + (uint32(b[2]) << 16) | + (uint32(b[3]) << 24)) +} + +func (d *decoder) readInt64() int64 { + b := d.readBytes(8) + return int64((uint64(b[0]) << 0) | + (uint64(b[1]) << 8) | + (uint64(b[2]) << 16) | + (uint64(b[3]) << 24) | + (uint64(b[4]) << 32) | + (uint64(b[5]) << 40) | + (uint64(b[6]) << 48) | + (uint64(b[7]) << 56)) +} + +func (d *decoder) readByte() byte { + i := d.i + d.i++ + if d.i > len(d.in) { + corrupted() + } + return d.in[i] +} + +func (d *decoder) readBytes(length int32) []byte { + start := d.i + d.i += int(length) + if d.i > len(d.in) { + corrupted() + } + return d.in[start : start+int(length)] +} diff --git a/vendor/labix.org/v2/mgo/bson/encode.go b/vendor/labix.org/v2/mgo/bson/encode.go new file mode 100644 index 0000000..6ba383a --- /dev/null +++ b/vendor/labix.org/v2/mgo/bson/encode.go @@ -0,0 +1,462 @@ +// BSON library for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// gobson - BSON library for Go. + +package bson + +import ( + "fmt" + "math" + "net/url" + "reflect" + "strconv" + "time" +) + +// -------------------------------------------------------------------------- +// Some internal infrastructure. + +var ( + typeBinary = reflect.TypeOf(Binary{}) + typeObjectId = reflect.TypeOf(ObjectId("")) + typeSymbol = reflect.TypeOf(Symbol("")) + typeMongoTimestamp = reflect.TypeOf(MongoTimestamp(0)) + typeOrderKey = reflect.TypeOf(MinKey) + typeDocElem = reflect.TypeOf(DocElem{}) + typeRawDocElem = reflect.TypeOf(RawDocElem{}) + typeRaw = reflect.TypeOf(Raw{}) + typeURL = reflect.TypeOf(url.URL{}) + typeTime = reflect.TypeOf(time.Time{}) + typeString = reflect.TypeOf("") +) + +const itoaCacheSize = 32 + +var itoaCache []string + +func init() { + itoaCache = make([]string, itoaCacheSize) + for i := 0; i != itoaCacheSize; i++ { + itoaCache[i] = strconv.Itoa(i) + } +} + +func itoa(i int) string { + if i < itoaCacheSize { + return itoaCache[i] + } + return strconv.Itoa(i) +} + +// -------------------------------------------------------------------------- +// Marshaling of the document value itself. + +type encoder struct { + out []byte +} + +func (e *encoder) addDoc(v reflect.Value) { + for { + if vi, ok := v.Interface().(Getter); ok { + getv, err := vi.GetBSON() + if err != nil { + panic(err) + } + v = reflect.ValueOf(getv) + continue + } + if v.Kind() == reflect.Ptr { + v = v.Elem() + continue + } + break + } + + if v.Type() == typeRaw { + raw := v.Interface().(Raw) + if raw.Kind != 0x03 && raw.Kind != 0x00 { + panic("Attempted to unmarshal Raw kind " + strconv.Itoa(int(raw.Kind)) + " as a document") + } + e.addBytes(raw.Data...) + return + } + + start := e.reserveInt32() + + switch v.Kind() { + case reflect.Map: + e.addMap(v) + case reflect.Struct: + e.addStruct(v) + case reflect.Array, reflect.Slice: + e.addSlice(v) + default: + panic("Can't marshal " + v.Type().String() + " as a BSON document") + } + + e.addBytes(0) + e.setInt32(start, int32(len(e.out)-start)) +} + +func (e *encoder) addMap(v reflect.Value) { + for _, k := range v.MapKeys() { + e.addElem(k.String(), v.MapIndex(k), false) + } +} + +func (e *encoder) addStruct(v reflect.Value) { + sinfo, err := getStructInfo(v.Type()) + if err != nil { + panic(err) + } + var value reflect.Value + if sinfo.InlineMap >= 0 { + m := v.Field(sinfo.InlineMap) + if m.Len() > 0 { + for _, k := range m.MapKeys() { + ks := k.String() + if _, found := sinfo.FieldsMap[ks]; found { + panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", ks)) + } + e.addElem(ks, m.MapIndex(k), false) + } + } + } + for _, info := range sinfo.FieldsList { + if info.Inline == nil { + value = v.Field(info.Num) + } else { + value = v.FieldByIndex(info.Inline) + } + if info.OmitEmpty && isZero(value) { + continue + } + e.addElem(info.Key, value, info.MinSize) + } +} + +func isZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.String: + return len(v.String()) == 0 + case reflect.Ptr, reflect.Interface: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + if v.Type() == typeTime { + return v.Interface().(time.Time).IsZero() + } + for i := v.NumField()-1; i >= 0; i-- { + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} + +func (e *encoder) addSlice(v reflect.Value) { + vi := v.Interface() + if d, ok := vi.(D); ok { + for _, elem := range d { + e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) + } + return + } + if d, ok := vi.(RawD); ok { + for _, elem := range d { + e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) + } + return + } + l := v.Len() + et := v.Type().Elem() + if et == typeDocElem { + for i := 0; i < l; i++ { + elem := v.Index(i).Interface().(DocElem) + e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) + } + return + } + if et == typeRawDocElem { + for i := 0; i < l; i++ { + elem := v.Index(i).Interface().(RawDocElem) + e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) + } + return + } + for i := 0; i < l; i++ { + e.addElem(itoa(i), v.Index(i), false) + } +} + +// -------------------------------------------------------------------------- +// Marshaling of elements in a document. + +func (e *encoder) addElemName(kind byte, name string) { + e.addBytes(kind) + e.addBytes([]byte(name)...) + e.addBytes(0) +} + +func (e *encoder) addElem(name string, v reflect.Value, minSize bool) { + + if !v.IsValid() { + e.addElemName('\x0A', name) + return + } + + if getter, ok := v.Interface().(Getter); ok { + getv, err := getter.GetBSON() + if err != nil { + panic(err) + } + e.addElem(name, reflect.ValueOf(getv), minSize) + return + } + + switch v.Kind() { + + case reflect.Interface: + e.addElem(name, v.Elem(), minSize) + + case reflect.Ptr: + e.addElem(name, v.Elem(), minSize) + + case reflect.String: + s := v.String() + switch v.Type() { + case typeObjectId: + if len(s) != 12 { + panic("ObjectIDs must be exactly 12 bytes long (got " + + strconv.Itoa(len(s)) + ")") + } + e.addElemName('\x07', name) + e.addBytes([]byte(s)...) + case typeSymbol: + e.addElemName('\x0E', name) + e.addStr(s) + default: + e.addElemName('\x02', name) + e.addStr(s) + } + + case reflect.Float32, reflect.Float64: + e.addElemName('\x01', name) + e.addInt64(int64(math.Float64bits(v.Float()))) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + u := v.Uint() + if int64(u) < 0 { + panic("BSON has no uint64 type, and value is too large to fit correctly in an int64") + } else if u <= math.MaxInt32 && (minSize || v.Kind() <= reflect.Uint32) { + e.addElemName('\x10', name) + e.addInt32(int32(u)) + } else { + e.addElemName('\x12', name) + e.addInt64(int64(u)) + } + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch v.Type() { + case typeMongoTimestamp: + e.addElemName('\x11', name) + e.addInt64(v.Int()) + + case typeOrderKey: + if v.Int() == int64(MaxKey) { + e.addElemName('\x7F', name) + } else { + e.addElemName('\xFF', name) + } + + default: + i := v.Int() + if (minSize || v.Type().Kind() != reflect.Int64) && i >= math.MinInt32 && i <= math.MaxInt32 { + // It fits into an int32, encode as such. + e.addElemName('\x10', name) + e.addInt32(int32(i)) + } else { + e.addElemName('\x12', name) + e.addInt64(i) + } + } + + case reflect.Bool: + e.addElemName('\x08', name) + if v.Bool() { + e.addBytes(1) + } else { + e.addBytes(0) + } + + case reflect.Map: + e.addElemName('\x03', name) + e.addDoc(v) + + case reflect.Slice: + vt := v.Type() + et := vt.Elem() + if et.Kind() == reflect.Uint8 { + e.addElemName('\x05', name) + e.addBinary('\x00', v.Bytes()) + } else if et == typeDocElem || et == typeRawDocElem { + e.addElemName('\x03', name) + e.addDoc(v) + } else { + e.addElemName('\x04', name) + e.addDoc(v) + } + + case reflect.Array: + et := v.Type().Elem() + if et.Kind() == reflect.Uint8 { + e.addElemName('\x05', name) + e.addBinary('\x00', v.Slice(0, v.Len()).Interface().([]byte)) + } else { + e.addElemName('\x04', name) + e.addDoc(v) + } + + case reflect.Struct: + switch s := v.Interface().(type) { + + case Raw: + kind := s.Kind + if kind == 0x00 { + kind = 0x03 + } + e.addElemName(kind, name) + e.addBytes(s.Data...) + + case Binary: + e.addElemName('\x05', name) + e.addBinary(s.Kind, s.Data) + + case RegEx: + e.addElemName('\x0B', name) + e.addCStr(s.Pattern) + e.addCStr(s.Options) + + case JavaScript: + if s.Scope == nil { + e.addElemName('\x0D', name) + e.addStr(s.Code) + } else { + e.addElemName('\x0F', name) + start := e.reserveInt32() + e.addStr(s.Code) + e.addDoc(reflect.ValueOf(s.Scope)) + e.setInt32(start, int32(len(e.out)-start)) + } + + case time.Time: + // MongoDB handles timestamps as milliseconds. + e.addElemName('\x09', name) + e.addInt64(s.Unix() * 1000 + int64(s.Nanosecond() / 1e6)) + + case url.URL: + e.addElemName('\x02', name) + e.addStr(s.String()) + + case undefined: + e.addElemName('\x06', name) + + default: + e.addElemName('\x03', name) + e.addDoc(v) + } + + default: + panic("Can't marshal " + v.Type().String() + " in a BSON document") + } +} + +// -------------------------------------------------------------------------- +// Marshaling of base types. + +func (e *encoder) addBinary(subtype byte, v []byte) { + if subtype == 0x02 { + // Wonder how that brilliant idea came to life. Obsolete, luckily. + e.addInt32(int32(len(v) + 4)) + e.addBytes(subtype) + e.addInt32(int32(len(v))) + } else { + e.addInt32(int32(len(v))) + e.addBytes(subtype) + } + e.addBytes(v...) +} + +func (e *encoder) addStr(v string) { + e.addInt32(int32(len(v) + 1)) + e.addCStr(v) +} + +func (e *encoder) addCStr(v string) { + e.addBytes([]byte(v)...) + e.addBytes(0) +} + +func (e *encoder) reserveInt32() (pos int) { + pos = len(e.out) + e.addBytes(0, 0, 0, 0) + return pos +} + +func (e *encoder) setInt32(pos int, v int32) { + e.out[pos+0] = byte(v) + e.out[pos+1] = byte(v >> 8) + e.out[pos+2] = byte(v >> 16) + e.out[pos+3] = byte(v >> 24) +} + +func (e *encoder) addInt32(v int32) { + u := uint32(v) + e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24)) +} + +func (e *encoder) addInt64(v int64) { + u := uint64(v) + e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24), + byte(u>>32), byte(u>>40), byte(u>>48), byte(u>>56)) +} + +func (e *encoder) addBytes(v ...byte) { + e.out = append(e.out, v...) +} diff --git a/vendor/labix.org/v2/mgo/bulk.go b/vendor/labix.org/v2/mgo/bulk.go new file mode 100644 index 0000000..5a9d37b --- /dev/null +++ b/vendor/labix.org/v2/mgo/bulk.go @@ -0,0 +1,71 @@ +package mgo + +// Bulk represents an operation that can be prepared with several +// orthogonal changes before being delivered to the server. +// +// WARNING: This API is still experimental. +// +// Relevant documentation: +// +// http://blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api +// +type Bulk struct { + c *Collection + ordered bool + inserts []interface{} +} + +// BulkError holds an error returned from running a Bulk operation. +// +// TODO: This is private for the moment, until we understand exactly how +// to report these multi-errors in a useful and convenient way. +type bulkError struct { + err error +} + +// BulkResult holds the results for a bulk operation. +type BulkResult struct { + // Be conservative while we understand exactly how to report these + // results in a useful and convenient way, and also how to emulate + // them with prior servers. + private bool +} + +func (e *bulkError) Error() string { + return e.err.Error() +} + +// Bulk returns a value to prepare the execution of a bulk operation. +// +// WARNING: This API is still experimental. +// +func (c *Collection) Bulk() *Bulk { + return &Bulk{c: c, ordered: true} +} + +// Unordered puts the bulk operation in unordered mode. +// +// In unordered mode the indvidual operations may be sent +// out of order, which means latter operations may proceed +// even if prior ones have failed. +func (b *Bulk) Unordered() { + b.ordered = false +} + +// Insert queues up the provided documents for insertion. +func (b *Bulk) Insert(docs ...interface{}) { + b.inserts = append(b.inserts, docs...) +} + +// Run runs all the operations queued up. +func (b *Bulk) Run() (*BulkResult, error) { + op := &insertOp{b.c.FullName, b.inserts, 0} + if !b.ordered { + op.flags = 1 // ContinueOnError + } + _, err := b.c.writeQuery(op) + if err != nil { + return nil, &bulkError{err} + } + return &BulkResult{}, nil +} diff --git a/vendor/labix.org/v2/mgo/bulk_test.go b/vendor/labix.org/v2/mgo/bulk_test.go new file mode 100644 index 0000000..f8abca8 --- /dev/null +++ b/vendor/labix.org/v2/mgo/bulk_test.go @@ -0,0 +1,89 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2014 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "labix.org/v2/mgo" + . "launchpad.net/gocheck" +) + +func (s *S) TestBulkInsert(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + bulk := coll.Bulk() + bulk.Insert(M{"n": 1}) + bulk.Insert(M{"n": 2}, M{"n": 3}) + r, err := bulk.Run() + c.Assert(err, IsNil) + c.Assert(r, FitsTypeOf, &mgo.BulkResult{}) + + type doc struct{ N int } + var res []doc + err = coll.Find(nil).Sort("n").All(&res) + c.Assert(err, IsNil) + c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) +} + +func (s *S) TestBulkInsertError(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + bulk := coll.Bulk() + bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"n": 3}) + _, err = bulk.Run() + c.Assert(err, ErrorMatches, ".*duplicate key.*") + + type doc struct{ N int `_id` } + var res []doc + err = coll.Find(nil).Sort("_id").All(&res) + c.Assert(err, IsNil) + c.Assert(res, DeepEquals, []doc{{1}, {2}}) +} + +func (s *S) TestBulkInsertErrorUnordered(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + bulk := coll.Bulk() + bulk.Unordered() + bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"_id": 3}) + _, err = bulk.Run() + c.Assert(err, ErrorMatches, ".*duplicate key.*") + + type doc struct{ N int `_id` } + var res []doc + err = coll.Find(nil).Sort("_id").All(&res) + c.Assert(err, IsNil) + c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) +} diff --git a/vendor/labix.org/v2/mgo/cluster.go b/vendor/labix.org/v2/mgo/cluster.go new file mode 100644 index 0000000..b4ed5bf --- /dev/null +++ b/vendor/labix.org/v2/mgo/cluster.go @@ -0,0 +1,616 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "errors" + "labix.org/v2/mgo/bson" + "net" + "sync" + "time" +) + +// --------------------------------------------------------------------------- +// Mongo cluster encapsulation. +// +// A cluster enables the communication with one or more servers participating +// in a mongo cluster. This works with individual servers, a replica set, +// a replica pair, one or multiple mongos routers, etc. + +type mongoCluster struct { + sync.RWMutex + serverSynced sync.Cond + userSeeds []string + dynaSeeds []string + servers mongoServers + masters mongoServers + references int + syncing bool + direct bool + failFast bool + syncCount uint + cachedIndex map[string]bool + sync chan bool + dial dialer +} + +func newCluster(userSeeds []string, direct, failFast bool, dial dialer) *mongoCluster { + cluster := &mongoCluster{ + userSeeds: userSeeds, + references: 1, + direct: direct, + failFast: failFast, + dial: dial, + } + cluster.serverSynced.L = cluster.RWMutex.RLocker() + cluster.sync = make(chan bool, 1) + stats.cluster(+1) + go cluster.syncServersLoop() + return cluster +} + +// Acquire increases the reference count for the cluster. +func (cluster *mongoCluster) Acquire() { + cluster.Lock() + cluster.references++ + debugf("Cluster %p acquired (refs=%d)", cluster, cluster.references) + cluster.Unlock() +} + +// Release decreases the reference count for the cluster. Once +// it reaches zero, all servers will be closed. +func (cluster *mongoCluster) Release() { + cluster.Lock() + if cluster.references == 0 { + panic("cluster.Release() with references == 0") + } + cluster.references-- + debugf("Cluster %p released (refs=%d)", cluster, cluster.references) + if cluster.references == 0 { + for _, server := range cluster.servers.Slice() { + server.Close() + } + // Wake up the sync loop so it can die. + cluster.syncServers() + stats.cluster(-1) + } + cluster.Unlock() +} + +func (cluster *mongoCluster) LiveServers() (servers []string) { + cluster.RLock() + for _, serv := range cluster.servers.Slice() { + servers = append(servers, serv.Addr) + } + cluster.RUnlock() + return servers +} + +func (cluster *mongoCluster) removeServer(server *mongoServer) { + cluster.Lock() + cluster.masters.Remove(server) + other := cluster.servers.Remove(server) + cluster.Unlock() + if other != nil { + other.Close() + log("Removed server ", server.Addr, " from cluster.") + } + server.Close() +} + +type isMasterResult struct { + IsMaster bool + Secondary bool + Primary string + Hosts []string + Passives []string + Tags bson.D + Msg string +} + +func (cluster *mongoCluster) isMaster(socket *mongoSocket, result *isMasterResult) error { + // Monotonic let's it talk to a slave and still hold the socket. + session := newSession(Monotonic, cluster, 10*time.Second) + session.setSocket(socket) + err := session.Run("ismaster", result) + session.Close() + return err +} + +type possibleTimeout interface { + Timeout() bool +} + +var syncSocketTimeout = 5 * time.Second + +func (cluster *mongoCluster) syncServer(server *mongoServer) (info *mongoServerInfo, hosts []string, err error) { + var syncTimeout time.Duration + if raceDetector { + // This variable is only ever touched by tests. + globalMutex.Lock() + syncTimeout = syncSocketTimeout + globalMutex.Unlock() + } else { + syncTimeout = syncSocketTimeout + } + + addr := server.Addr + log("SYNC Processing ", addr, "...") + + // Retry a few times to avoid knocking a server down for a hiccup. + var result isMasterResult + var tryerr error + for retry := 0; ; retry++ { + if retry == 3 || retry == 1 && cluster.failFast { + return nil, nil, tryerr + } + if retry > 0 { + // Don't abuse the server needlessly if there's something actually wrong. + if err, ok := tryerr.(possibleTimeout); ok && err.Timeout() { + // Give a chance for waiters to timeout as well. + cluster.serverSynced.Broadcast() + } + time.Sleep(syncShortDelay) + } + + // It's not clear what would be a good timeout here. Is it + // better to wait longer or to retry? + socket, _, err := server.AcquireSocket(0, syncTimeout) + if err != nil { + tryerr = err + logf("SYNC Failed to get socket to %s: %v", addr, err) + continue + } + err = cluster.isMaster(socket, &result) + socket.Release() + if err != nil { + tryerr = err + logf("SYNC Command 'ismaster' to %s failed: %v", addr, err) + continue + } + debugf("SYNC Result of 'ismaster' from %s: %#v", addr, result) + break + } + + if result.IsMaster { + debugf("SYNC %s is a master.", addr) + // Made an incorrect assumption above, so fix stats. + stats.conn(-1, false) + stats.conn(+1, true) + } else if result.Secondary { + debugf("SYNC %s is a slave.", addr) + } else if cluster.direct { + logf("SYNC %s in unknown state. Pretending it's a slave due to direct connection.", addr) + } else { + logf("SYNC %s is neither a master nor a slave.", addr) + // Made an incorrect assumption above, so fix stats. + stats.conn(-1, false) + return nil, nil, errors.New(addr + " is not a master nor slave") + } + + info = &mongoServerInfo{ + Master: result.IsMaster, + Mongos: result.Msg == "isdbgrid", + Tags: result.Tags, + } + + hosts = make([]string, 0, 1+len(result.Hosts)+len(result.Passives)) + if result.Primary != "" { + // First in the list to speed up master discovery. + hosts = append(hosts, result.Primary) + } + hosts = append(hosts, result.Hosts...) + hosts = append(hosts, result.Passives...) + + debugf("SYNC %s knows about the following peers: %#v", addr, hosts) + return info, hosts, nil +} + +type syncKind bool + +const ( + completeSync syncKind = true + partialSync syncKind = false +) + +func (cluster *mongoCluster) addServer(server *mongoServer, info *mongoServerInfo, syncKind syncKind) { + cluster.Lock() + current := cluster.servers.Search(server.ResolvedAddr) + if current == nil { + if syncKind == partialSync { + cluster.Unlock() + server.Close() + log("SYNC Discarding unknown server ", server.Addr, " due to partial sync.") + return + } + cluster.servers.Add(server) + if info.Master { + cluster.masters.Add(server) + log("SYNC Adding ", server.Addr, " to cluster as a master.") + } else { + log("SYNC Adding ", server.Addr, " to cluster as a slave.") + } + } else { + if server != current { + panic("addServer attempting to add duplicated server") + } + if server.Info().Master != info.Master { + if info.Master { + log("SYNC Server ", server.Addr, " is now a master.") + cluster.masters.Add(server) + } else { + log("SYNC Server ", server.Addr, " is now a slave.") + cluster.masters.Remove(server) + } + } + } + server.SetInfo(info) + debugf("SYNC Broadcasting availability of server %s", server.Addr) + cluster.serverSynced.Broadcast() + cluster.Unlock() +} + +func (cluster *mongoCluster) getKnownAddrs() []string { + cluster.RLock() + max := len(cluster.userSeeds) + len(cluster.dynaSeeds) + cluster.servers.Len() + seen := make(map[string]bool, max) + known := make([]string, 0, max) + + add := func(addr string) { + if _, found := seen[addr]; !found { + seen[addr] = true + known = append(known, addr) + } + } + + for _, addr := range cluster.userSeeds { + add(addr) + } + for _, addr := range cluster.dynaSeeds { + add(addr) + } + for _, serv := range cluster.servers.Slice() { + add(serv.Addr) + } + cluster.RUnlock() + + return known +} + +// syncServers injects a value into the cluster.sync channel to force +// an iteration of the syncServersLoop function. +func (cluster *mongoCluster) syncServers() { + select { + case cluster.sync <- true: + default: + } +} + +// How long to wait for a checkup of the cluster topology if nothing +// else kicks a synchronization before that. +const syncServersDelay = 30 * time.Second +const syncShortDelay = 500 * time.Millisecond + +// syncServersLoop loops while the cluster is alive to keep its idea of +// the server topology up-to-date. It must be called just once from +// newCluster. The loop iterates once syncServersDelay has passed, or +// if somebody injects a value into the cluster.sync channel to force a +// synchronization. A loop iteration will contact all servers in +// parallel, ask them about known peers and their own role within the +// cluster, and then attempt to do the same with all the peers +// retrieved. +func (cluster *mongoCluster) syncServersLoop() { + for { + debugf("SYNC Cluster %p is starting a sync loop iteration.", cluster) + + cluster.Lock() + if cluster.references == 0 { + cluster.Unlock() + break + } + cluster.references++ // Keep alive while syncing. + direct := cluster.direct + cluster.Unlock() + + cluster.syncServersIteration(direct) + + // We just synchronized, so consume any outstanding requests. + select { + case <-cluster.sync: + default: + } + + cluster.Release() + + // Hold off before allowing another sync. No point in + // burning CPU looking for down servers. + if !cluster.failFast { + time.Sleep(syncShortDelay) + } + + cluster.Lock() + if cluster.references == 0 { + cluster.Unlock() + break + } + cluster.syncCount++ + // Poke all waiters so they have a chance to timeout or + // restart syncing if they wish to. + cluster.serverSynced.Broadcast() + // Check if we have to restart immediately either way. + restart := !direct && cluster.masters.Empty() || cluster.servers.Empty() + cluster.Unlock() + + if restart { + log("SYNC No masters found. Will synchronize again.") + time.Sleep(syncShortDelay) + continue + } + + debugf("SYNC Cluster %p waiting for next requested or scheduled sync.", cluster) + + // Hold off until somebody explicitly requests a synchronization + // or it's time to check for a cluster topology change again. + select { + case <-cluster.sync: + case <-time.After(syncServersDelay): + } + } + debugf("SYNC Cluster %p is stopping its sync loop.", cluster) +} + +func (cluster *mongoCluster) server(addr string, tcpaddr *net.TCPAddr) *mongoServer { + cluster.RLock() + server := cluster.servers.Search(tcpaddr.String()) + cluster.RUnlock() + if server != nil { + return server + } + return newServer(addr, tcpaddr, cluster.sync, cluster.dial) +} + +func resolveAddr(addr string) (*net.TCPAddr, error) { + tcpaddr, err := net.ResolveTCPAddr("tcp", addr) + if err != nil { + log("SYNC Failed to resolve ", addr, ": ", err.Error()) + return nil, err + } + if tcpaddr.String() != addr { + debug("SYNC Address ", addr, " resolved as ", tcpaddr.String()) + } + return tcpaddr, nil +} + +type pendingAdd struct { + server *mongoServer + info *mongoServerInfo +} + +func (cluster *mongoCluster) syncServersIteration(direct bool) { + log("SYNC Starting full topology synchronization...") + + var wg sync.WaitGroup + var m sync.Mutex + notYetAdded := make(map[string]pendingAdd) + addIfFound := make(map[string]bool) + seen := make(map[string]bool) + syncKind := partialSync + + var spawnSync func(addr string, byMaster bool) + spawnSync = func(addr string, byMaster bool) { + wg.Add(1) + go func() { + defer wg.Done() + + tcpaddr, err := resolveAddr(addr) + if err != nil { + log("SYNC Failed to start sync of ", addr, ": ", err.Error()) + return + } + resolvedAddr := tcpaddr.String() + + m.Lock() + if byMaster { + if pending, ok := notYetAdded[resolvedAddr]; ok { + delete(notYetAdded, resolvedAddr) + m.Unlock() + cluster.addServer(pending.server, pending.info, completeSync) + return + } + addIfFound[resolvedAddr] = true + } + if seen[resolvedAddr] { + m.Unlock() + return + } + seen[resolvedAddr] = true + m.Unlock() + + server := cluster.server(addr, tcpaddr) + info, hosts, err := cluster.syncServer(server) + if err != nil { + cluster.removeServer(server) + return + } + + m.Lock() + add := direct || info.Master || addIfFound[resolvedAddr] + if add { + syncKind = completeSync + } else { + notYetAdded[resolvedAddr] = pendingAdd{server, info} + } + m.Unlock() + if add { + cluster.addServer(server, info, completeSync) + } + if !direct { + for _, addr := range hosts { + spawnSync(addr, info.Master) + } + } + }() + } + + knownAddrs := cluster.getKnownAddrs() + for _, addr := range knownAddrs { + spawnSync(addr, false) + } + wg.Wait() + + if syncKind == completeSync { + logf("SYNC Synchronization was complete (got data from primary).") + for _, pending := range notYetAdded { + cluster.removeServer(pending.server) + } + } else { + logf("SYNC Synchronization was partial (cannot talk to primary).") + for _, pending := range notYetAdded { + cluster.addServer(pending.server, pending.info, partialSync) + } + } + + cluster.Lock() + ml := cluster.masters.Len() + logf("SYNC Synchronization completed: %d master(s) and %d slave(s) alive.", ml, cluster.servers.Len()-ml) + + // Update dynamic seeds, but only if we have any good servers. Otherwise, + // leave them alone for better chances of a successful sync in the future. + if syncKind == completeSync { + dynaSeeds := make([]string, cluster.servers.Len()) + for i, server := range cluster.servers.Slice() { + dynaSeeds[i] = server.Addr + } + cluster.dynaSeeds = dynaSeeds + debugf("SYNC New dynamic seeds: %#v\n", dynaSeeds) + } + cluster.Unlock() +} + +var socketsPerServer = 4096 + +// AcquireSocket returns a socket to a server in the cluster. If slaveOk is +// true, it will attempt to return a socket to a slave server. If it is +// false, the socket will necessarily be to a master server. +func (cluster *mongoCluster) AcquireSocket(slaveOk bool, syncTimeout time.Duration, socketTimeout time.Duration, serverTags []bson.D) (s *mongoSocket, err error) { + var started time.Time + var syncCount uint + warnedLimit := false + for { + cluster.RLock() + for { + ml := cluster.masters.Len() + sl := cluster.servers.Len() + debugf("Cluster has %d known masters and %d known slaves.", ml, sl-ml) + if ml > 0 || slaveOk && sl > 0 { + break + } + if started.IsZero() { + // Initialize after fast path above. + started = time.Now() + syncCount = cluster.syncCount + } else if syncTimeout != 0 && started.Before(time.Now().Add(-syncTimeout)) || cluster.failFast && cluster.syncCount != syncCount { + cluster.RUnlock() + return nil, errors.New("no reachable servers") + } + log("Waiting for servers to synchronize...") + cluster.syncServers() + + // Remember: this will release and reacquire the lock. + cluster.serverSynced.Wait() + } + + var server *mongoServer + if slaveOk { + server = cluster.servers.BestFit(serverTags) + } else { + server = cluster.masters.BestFit(nil) + } + cluster.RUnlock() + + if server == nil { + // Must have failed the requested tags. Sleep to avoid spinning. + time.Sleep(1e8) + continue + } + + s, abended, err := server.AcquireSocket(socketsPerServer, socketTimeout) + if err == errSocketLimit { + if !warnedLimit { + log("WARNING: Per-server connection limit reached.") + } + time.Sleep(1e8) + continue + } + if err != nil { + cluster.removeServer(server) + cluster.syncServers() + continue + } + if abended && !slaveOk { + var result isMasterResult + err := cluster.isMaster(s, &result) + if err != nil || !result.IsMaster { + logf("Cannot confirm server %s as master (%v)", server.Addr, err) + s.Release() + cluster.syncServers() + time.Sleep(1e8) + continue + } + } + return s, nil + } + panic("unreached") +} + +func (cluster *mongoCluster) CacheIndex(cacheKey string, exists bool) { + cluster.Lock() + if cluster.cachedIndex == nil { + cluster.cachedIndex = make(map[string]bool) + } + if exists { + cluster.cachedIndex[cacheKey] = true + } else { + delete(cluster.cachedIndex, cacheKey) + } + cluster.Unlock() +} + +func (cluster *mongoCluster) HasCachedIndex(cacheKey string) (result bool) { + cluster.RLock() + if cluster.cachedIndex != nil { + result = cluster.cachedIndex[cacheKey] + } + cluster.RUnlock() + return +} + +func (cluster *mongoCluster) ResetIndexCache() { + cluster.Lock() + cluster.cachedIndex = make(map[string]bool) + cluster.Unlock() +} diff --git a/vendor/labix.org/v2/mgo/cluster_test.go b/vendor/labix.org/v2/mgo/cluster_test.go new file mode 100644 index 0000000..d6d2810 --- /dev/null +++ b/vendor/labix.org/v2/mgo/cluster_test.go @@ -0,0 +1,1559 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "fmt" + "io" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" + "net" + "strings" + "sync" + "time" +) + +func (s *S) TestNewSession(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Do a dummy operation to wait for connection. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Tweak safety and query settings to ensure other has copied those. + session.SetSafe(nil) + session.SetBatch(-1) + other := session.New() + defer other.Close() + session.SetSafe(&mgo.Safe{}) + + // Clone was copied while session was unsafe, so no errors. + otherColl := other.DB("mydb").C("mycoll") + err = otherColl.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Original session was made safe again. + err = coll.Insert(M{"_id": 1}) + c.Assert(err, NotNil) + + // With New(), each session has its own socket now. + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 2) + c.Assert(stats.SocketsInUse, Equals, 2) + + // Ensure query parameters were cloned. + err = otherColl.Insert(M{"_id": 2}) + c.Assert(err, IsNil) + + // Ping the database to ensure the nonce has been received already. + c.Assert(other.Ping(), IsNil) + + mgo.ResetStats() + + iter := otherColl.Find(M{}).Iter() + c.Assert(err, IsNil) + + m := M{} + ok := iter.Next(m) + c.Assert(ok, Equals, true) + err = iter.Close() + c.Assert(err, IsNil) + + // If Batch(-1) is in effect, a single document must have been received. + stats = mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 1) +} + +func (s *S) TestCloneSession(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Do a dummy operation to wait for connection. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Tweak safety and query settings to ensure clone is copying those. + session.SetSafe(nil) + session.SetBatch(-1) + clone := session.Clone() + defer clone.Close() + session.SetSafe(&mgo.Safe{}) + + // Clone was copied while session was unsafe, so no errors. + cloneColl := clone.DB("mydb").C("mycoll") + err = cloneColl.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Original session was made safe again. + err = coll.Insert(M{"_id": 1}) + c.Assert(err, NotNil) + + // With Clone(), same socket is shared between sessions now. + stats := mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 1) + c.Assert(stats.SocketRefs, Equals, 2) + + // Refreshing one of them should let the original socket go, + // while preserving the safety settings. + clone.Refresh() + err = cloneColl.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Must have used another connection now. + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 2) + c.Assert(stats.SocketRefs, Equals, 2) + + // Ensure query parameters were cloned. + err = cloneColl.Insert(M{"_id": 2}) + c.Assert(err, IsNil) + + // Ping the database to ensure the nonce has been received already. + c.Assert(clone.Ping(), IsNil) + + mgo.ResetStats() + + iter := cloneColl.Find(M{}).Iter() + c.Assert(err, IsNil) + + m := M{} + ok := iter.Next(m) + c.Assert(ok, Equals, true) + err = iter.Close() + c.Assert(err, IsNil) + + // If Batch(-1) is in effect, a single document must have been received. + stats = mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 1) +} + +func (s *S) TestSetModeStrong(c *C) { + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, false) + session.SetMode(mgo.Strong, false) + + c.Assert(session.Mode(), Equals, mgo.Strong) + + result := M{} + cmd := session.DB("admin").C("$cmd") + err = cmd.Find(M{"ismaster": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, true) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 1) + c.Assert(stats.SlaveConns, Equals, 2) + c.Assert(stats.SocketsInUse, Equals, 1) + + session.SetMode(mgo.Strong, true) + + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestSetModeMonotonic(c *C) { + // Must necessarily connect to a slave, otherwise the + // master connection will be available first. + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, false) + + c.Assert(session.Mode(), Equals, mgo.Monotonic) + + result := M{} + cmd := session.DB("admin").C("$cmd") + err = cmd.Find(M{"ismaster": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, false) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + result = M{} + err = cmd.Find(M{"ismaster": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, true) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 1) + c.Assert(stats.SlaveConns, Equals, 2) + c.Assert(stats.SocketsInUse, Equals, 2) + + session.SetMode(mgo.Monotonic, true) + + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestSetModeMonotonicAfterStrong(c *C) { + // Test that a strong session shifting to a monotonic + // one preserves the socket untouched. + + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + // Insert something to force a connection to the master. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + session.SetMode(mgo.Monotonic, false) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + // Master socket should still be reserved. + stats := mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 1) + + // Confirm it's the master even though it's Monotonic by now. + result := M{} + cmd := session.DB("admin").C("$cmd") + err = cmd.Find(M{"ismaster": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, true) +} + +func (s *S) TestSetModeStrongAfterMonotonic(c *C) { + // Test that shifting from Monotonic to Strong while + // using a slave socket will keep the socket reserved + // until the master socket is necessary, so that no + // switch over occurs unless it's actually necessary. + + // Must necessarily connect to a slave, otherwise the + // master connection will be available first. + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, false) + + // Ensure we're talking to a slave, and reserve the socket. + result := M{} + err = session.Run("ismaster", &result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, false) + + // Switch to a Strong session. + session.SetMode(mgo.Strong, false) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + // Slave socket should still be reserved. + stats := mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 1) + + // But any operation will switch it to the master. + result = M{} + err = session.Run("ismaster", &result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, true) +} + +func (s *S) TestSetModeMonotonicWriteOnIteration(c *C) { + // Must necessarily connect to a slave, otherwise the + // master connection will be available first. + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, false) + + c.Assert(session.Mode(), Equals, mgo.Monotonic) + + coll1 := session.DB("mydb").C("mycoll1") + coll2 := session.DB("mydb").C("mycoll2") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll1.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + // Release master so we can grab a slave again. + session.Refresh() + + // Wait until synchronization is done. + for { + n, err := coll1.Count() + c.Assert(err, IsNil) + if n == len(ns) { + break + } + } + + iter := coll1.Find(nil).Batch(2).Iter() + i := 0 + m := M{} + for iter.Next(&m) { + i++ + if i > 3 { + err := coll2.Insert(M{"n": 47 + i}) + c.Assert(err, IsNil) + } + } + c.Assert(i, Equals, len(ns)) +} + +func (s *S) TestSetModeEventual(c *C) { + // Must necessarily connect to a slave, otherwise the + // master connection will be available first. + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Eventual, false) + + c.Assert(session.Mode(), Equals, mgo.Eventual) + + result := M{} + err = session.Run("ismaster", &result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, false) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + result = M{} + err = session.Run("ismaster", &result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, false) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 1) + c.Assert(stats.SlaveConns, Equals, 2) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestSetModeEventualAfterStrong(c *C) { + // Test that a strong session shifting to an eventual + // one preserves the socket untouched. + + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + // Insert something to force a connection to the master. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + session.SetMode(mgo.Eventual, false) + + // Wait since the sync also uses sockets. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for cluster sync to finish...") + time.Sleep(5e8) + } + + // Master socket should still be reserved. + stats := mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 1) + + // Confirm it's the master even though it's Eventual by now. + result := M{} + cmd := session.DB("admin").C("$cmd") + err = cmd.Find(M{"ismaster": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result["ismaster"], Equals, true) + + session.SetMode(mgo.Eventual, true) + + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestPrimaryShutdownStrong(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + // With strong consistency, this will open a socket to the master. + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + + // Kill the master. + host := result.Host + s.Stop(host) + + // This must fail, since the connection was broken. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + // With strong consistency, it fails again until reset. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + session.Refresh() + + // Now we should be able to talk to the new master. + // Increase the timeout since this may take quite a while. + session.SetSyncTimeout(3 * time.Minute) + + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(result.Host, Not(Equals), host) + + // Insert some data to confirm it's indeed a master. + err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) + c.Assert(err, IsNil) +} + +func (s *S) TestPrimaryHiccup(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + // With strong consistency, this will open a socket to the master. + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + + // Establish a few extra sessions to create spare sockets to + // the master. This increases a bit the chances of getting an + // incorrect cached socket. + var sessions []*mgo.Session + for i := 0; i < 20; i++ { + sessions = append(sessions, session.Copy()) + err = sessions[len(sessions)-1].Run("serverStatus", result) + c.Assert(err, IsNil) + } + for i := range sessions { + sessions[i].Close() + } + + // Kill the master, but bring it back immediatelly. + host := result.Host + s.Stop(host) + s.StartAll() + + // This must fail, since the connection was broken. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + // With strong consistency, it fails again until reset. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + session.Refresh() + + // Now we should be able to talk to the new master. + // Increase the timeout since this may take quite a while. + session.SetSyncTimeout(3 * time.Minute) + + // Insert some data to confirm it's indeed a master. + err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) + c.Assert(err, IsNil) +} + +func (s *S) TestPrimaryShutdownMonotonic(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, true) + + // Insert something to force a switch to the master. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + // Wait a bit for this to be synchronized to slaves. + time.Sleep(3 * time.Second) + + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + + // Kill the master. + host := result.Host + s.Stop(host) + + // This must fail, since the connection was broken. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + // With monotonic consistency, it fails again until reset. + err = session.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + session.Refresh() + + // Now we should be able to talk to the new master. + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(result.Host, Not(Equals), host) +} + +func (s *S) TestPrimaryShutdownMonotonicWithSlave(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + ssresult := &struct{ Host string }{} + imresult := &struct{ IsMaster bool }{} + + // Figure the master while still using the strong session. + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + err = session.Run("isMaster", imresult) + c.Assert(err, IsNil) + master := ssresult.Host + c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) + + // Create new monotonic session with an explicit address to ensure + // a slave is synchronized before the master, otherwise a connection + // with the master may be used below for lack of other options. + var addr string + switch { + case strings.HasSuffix(ssresult.Host, ":40021"): + addr = "localhost:40022" + case strings.HasSuffix(ssresult.Host, ":40022"): + addr = "localhost:40021" + case strings.HasSuffix(ssresult.Host, ":40023"): + addr = "localhost:40021" + default: + c.Fatal("Unknown host: ", ssresult.Host) + } + + session, err = mgo.Dial(addr) + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, true) + + // Check the address of the socket associated with the monotonic session. + c.Log("Running serverStatus and isMaster with monotonic session") + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + err = session.Run("isMaster", imresult) + c.Assert(err, IsNil) + slave := ssresult.Host + c.Assert(imresult.IsMaster, Equals, false, Commentf("%s is not a slave", slave)) + + c.Assert(master, Not(Equals), slave) + + // Kill the master. + s.Stop(master) + + // Session must still be good, since we were talking to a slave. + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + + c.Assert(ssresult.Host, Equals, slave, + Commentf("Monotonic session moved from %s to %s", slave, ssresult.Host)) + + // If we try to insert something, it'll have to hold until the new + // master is available to move the connection, and work correctly. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + // Must now be talking to the new master. + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + err = session.Run("isMaster", imresult) + c.Assert(err, IsNil) + c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) + + // ... which is not the old one, since it's still dead. + c.Assert(ssresult.Host, Not(Equals), master) +} + +func (s *S) TestPrimaryShutdownEventual(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + master := result.Host + + session.SetMode(mgo.Eventual, true) + + // Should connect to the master when needed. + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + // Wait a bit for this to be synchronized to slaves. + time.Sleep(3 * time.Second) + + // Kill the master. + s.Stop(master) + + // Should still work, with the new master now. + coll = session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(result.Host, Not(Equals), master) +} + +func (s *S) TestPreserveSocketCountOnSync(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + stats := mgo.GetStats() + for stats.MasterConns+stats.SlaveConns != 3 { + stats = mgo.GetStats() + c.Log("Waiting for all connections to be established...") + time.Sleep(5e8) + } + + c.Assert(stats.SocketsAlive, Equals, 3) + + // Kill the master (with rs1, 'a' is always the master). + s.Stop("localhost:40011") + + // Wait for the logic to run for a bit and bring it back. + startedAll := make(chan bool) + go func() { + time.Sleep(5e9) + s.StartAll() + startedAll <- true + }() + + // Do not allow the test to return before the goroutine above is done. + defer func() { + <-startedAll + }() + + // Do an action to kick the resync logic in, and also to + // wait until the cluster recognizes the server is back. + result := struct{ Ok bool }{} + err = session.Run("getLastError", &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, true) + + for i := 0; i != 20; i++ { + stats = mgo.GetStats() + if stats.SocketsAlive == 3 { + break + } + c.Logf("Waiting for 3 sockets alive, have %d", stats.SocketsAlive) + time.Sleep(5e8) + } + + // Ensure the number of sockets is preserved after syncing. + stats = mgo.GetStats() + c.Assert(stats.SocketsAlive, Equals, 3) + c.Assert(stats.SocketsInUse, Equals, 1) + c.Assert(stats.SocketRefs, Equals, 1) +} + +// Connect to the master of a deployment with a single server, +// run an insert, and then ensure the insert worked and that a +// single connection was established. +func (s *S) TestTopologySyncWithSingleMaster(c *C) { + // Use hostname here rather than IP, to make things trickier. + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1, "b": 2}) + c.Assert(err, IsNil) + + // One connection used for discovery. Master socket recycled for + // insert. Socket is reserved after insert. + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 1) + c.Assert(stats.SlaveConns, Equals, 0) + c.Assert(stats.SocketsInUse, Equals, 1) + + // Refresh session and socket must be released. + session.Refresh() + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestTopologySyncWithSlaveSeed(c *C) { + // That's supposed to be a slave. Must run discovery + // and find out master to insert successfully. + session, err := mgo.Dial("localhost:40012") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"a": 1, "b": 2}) + + result := struct{ Ok bool }{} + err = session.Run("getLastError", &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, true) + + // One connection to each during discovery. Master + // socket recycled for insert. + stats := mgo.GetStats() + c.Assert(stats.MasterConns, Equals, 1) + c.Assert(stats.SlaveConns, Equals, 2) + + // Only one socket reference alive, in the master socket owned + // by the above session. + c.Assert(stats.SocketsInUse, Equals, 1) + + // Refresh it, and it must be gone. + session.Refresh() + stats = mgo.GetStats() + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestSyncTimeout(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + s.Stop("localhost:40001") + + timeout := 3 * time.Second + session.SetSyncTimeout(timeout) + started := time.Now() + + // Do something. + result := struct{ Ok bool }{} + err = session.Run("getLastError", &result) + c.Assert(err, ErrorMatches, "no reachable servers") + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) +} + +func (s *S) TestDialWithTimeout(c *C) { + if *fast { + c.Skip("-fast") + } + + timeout := 2 * time.Second + started := time.Now() + + // 40009 isn't used by the test servers. + session, err := mgo.DialWithTimeout("localhost:40009", timeout) + if session != nil { + session.Close() + } + c.Assert(err, ErrorMatches, "no reachable servers") + c.Assert(session, IsNil) + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) +} + +func (s *S) TestSocketTimeout(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + s.Freeze("localhost:40001") + + timeout := 3 * time.Second + session.SetSocketTimeout(timeout) + started := time.Now() + + // Do something. + result := struct{ Ok bool }{} + err = session.Run("getLastError", &result) + c.Assert(err, ErrorMatches, ".*: i/o timeout") + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) +} + +func (s *S) TestSocketTimeoutOnDial(c *C) { + if *fast { + c.Skip("-fast") + } + + timeout := 1 * time.Second + + defer mgo.HackSyncSocketTimeout(timeout)() + + s.Freeze("localhost:40001") + + started := time.Now() + + session, err := mgo.DialWithTimeout("localhost:40001", timeout) + c.Assert(err, ErrorMatches, "no reachable servers") + c.Assert(session, IsNil) + + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + c.Assert(started.After(time.Now().Add(-20*time.Second)), Equals, true) +} + +func (s *S) TestSocketTimeoutOnInactiveSocket(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + timeout := 2 * time.Second + session.SetSocketTimeout(timeout) + + // Do something that relies on the timeout and works. + c.Assert(session.Ping(), IsNil) + + // Freeze and wait for the timeout to go by. + s.Freeze("localhost:40001") + time.Sleep(timeout + 500*time.Millisecond) + s.Thaw("localhost:40001") + + // Do something again. The timeout above should not have killed + // the socket as there was nothing to be done. + c.Assert(session.Ping(), IsNil) +} + +func (s *S) TestDirect(c *C) { + session, err := mgo.Dial("localhost:40012?connect=direct") + c.Assert(err, IsNil) + defer session.Close() + + // We know that server is a slave. + session.SetMode(mgo.Monotonic, true) + + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) + + stats := mgo.GetStats() + c.Assert(stats.SocketsAlive, Equals, 1) + c.Assert(stats.SocketsInUse, Equals, 1) + c.Assert(stats.SocketRefs, Equals, 1) + + // We've got no master, so it'll timeout. + session.SetSyncTimeout(5e8 * time.Nanosecond) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"test": 1}) + c.Assert(err, ErrorMatches, "no reachable servers") + + // Writing to the local database is okay. + coll = session.DB("local").C("mycoll") + defer coll.RemoveAll(nil) + id := bson.NewObjectId() + err = coll.Insert(M{"_id": id}) + c.Assert(err, IsNil) + + // Data was stored in the right server. + n, err := coll.Find(M{"_id": id}).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 1) + + // Server hasn't changed. + result.Host = "" + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) +} + +func (s *S) TestDirectToUnknownStateMember(c *C) { + session, err := mgo.Dial("localhost:40041?connect=direct") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Monotonic, true) + + result := &struct{ Host string }{} + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) + + // We've got no master, so it'll timeout. + session.SetSyncTimeout(5e8 * time.Nanosecond) + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"test": 1}) + c.Assert(err, ErrorMatches, "no reachable servers") + + // Slave is still reachable. + result.Host = "" + err = session.Run("serverStatus", result) + c.Assert(err, IsNil) + c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) +} + +func (s *S) TestFailFast(c *C) { + info := mgo.DialInfo{ + Addrs: []string{"localhost:99999"}, + Timeout: 5 * time.Second, + FailFast: true, + } + + started := time.Now() + + _, err := mgo.DialWithInfo(&info) + c.Assert(err, ErrorMatches, "no reachable servers") + + c.Assert(started.After(time.Now().Add(-time.Second)), Equals, true) +} + +type OpCounters struct { + Insert int + Query int + Update int + Delete int + GetMore int + Command int +} + +func getOpCounters(server string) (c *OpCounters, err error) { + session, err := mgo.Dial(server + "?connect=direct") + if err != nil { + return nil, err + } + defer session.Close() + session.SetMode(mgo.Monotonic, true) + result := struct{ OpCounters }{} + err = session.Run("serverStatus", &result) + return &result.OpCounters, err +} + +func (s *S) TestMonotonicSlaveOkFlagWithMongos(c *C) { + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + ssresult := &struct{ Host string }{} + imresult := &struct{ IsMaster bool }{} + + // Figure the master while still using the strong session. + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + err = session.Run("isMaster", imresult) + c.Assert(err, IsNil) + master := ssresult.Host + c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) + + // Collect op counters for everyone. + opc21a, err := getOpCounters("localhost:40021") + c.Assert(err, IsNil) + opc22a, err := getOpCounters("localhost:40022") + c.Assert(err, IsNil) + opc23a, err := getOpCounters("localhost:40023") + c.Assert(err, IsNil) + + // Do a SlaveOk query through MongoS + + mongos, err := mgo.Dial("localhost:40202") + c.Assert(err, IsNil) + defer mongos.Close() + + mongos.SetMode(mgo.Monotonic, true) + + coll := mongos.DB("mydb").C("mycoll") + result := &struct{}{} + for i := 0; i != 5; i++ { + err := coll.Find(nil).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) + } + + // Collect op counters for everyone again. + opc21b, err := getOpCounters("localhost:40021") + c.Assert(err, IsNil) + opc22b, err := getOpCounters("localhost:40022") + c.Assert(err, IsNil) + opc23b, err := getOpCounters("localhost:40023") + c.Assert(err, IsNil) + + masterPort := master[strings.Index(master, ":")+1:] + + var masterDelta, slaveDelta int + switch masterPort { + case "40021": + masterDelta = opc21b.Query - opc21a.Query + slaveDelta = (opc22b.Query - opc22a.Query) + (opc23b.Query - opc23a.Query) + case "40022": + masterDelta = opc22b.Query - opc22a.Query + slaveDelta = (opc21b.Query - opc21a.Query) + (opc23b.Query - opc23a.Query) + case "40023": + masterDelta = opc23b.Query - opc23a.Query + slaveDelta = (opc21b.Query - opc21a.Query) + (opc22b.Query - opc22a.Query) + default: + c.Fatal("Uh?") + } + + c.Check(masterDelta, Equals, 0) // Just the counting itself. + c.Check(slaveDelta, Equals, 5) // The counting for both, plus 5 queries above. +} + +func (s *S) TestRemovalOfClusterMember(c *C) { + if *fast { + c.Skip("-fast") + } + + master, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer master.Close() + + // Wait for cluster to fully sync up. + for i := 0; i < 10; i++ { + if len(master.LiveServers()) == 3 { + break + } + time.Sleep(5e8) + } + if len(master.LiveServers()) != 3 { + c.Fatalf("Test started with bad cluster state: %v", master.LiveServers()) + } + + result := &struct { + IsMaster bool + Me string + }{} + slave := master.Copy() + slave.SetMode(mgo.Monotonic, true) // Monotonic can hold a non-master socket persistently. + err = slave.Run("isMaster", result) + c.Assert(err, IsNil) + c.Assert(result.IsMaster, Equals, false) + slaveAddr := result.Me + + defer func() { + master.Refresh() + master.Run(bson.D{{"$eval", `rs.add("` + slaveAddr + `")`}}, nil) + master.Close() + slave.Close() + }() + + c.Logf("========== Removing slave: %s ==========", slaveAddr) + + master.Run(bson.D{{"$eval", `rs.remove("` + slaveAddr + `")`}}, nil) + err = master.Ping() + c.Assert(err, Equals, io.EOF) + + master.Refresh() + + // Give the cluster a moment to catch up by doing a roundtrip to the master. + err = master.Ping() + c.Assert(err, IsNil) + + time.Sleep(3e9) + + // This must fail since the slave has been taken off the cluster. + err = slave.Ping() + c.Assert(err, NotNil) + + for i := 0; i < 15; i++ { + if len(master.LiveServers()) == 2 { + break + } + time.Sleep(time.Second) + } + live := master.LiveServers() + if len(live) != 2 { + c.Errorf("Removed server still considered live: %#s", live) + } + + c.Log("========== Test succeeded. ==========") +} + +func (s *S) TestSocketLimit(c *C) { + if *fast { + c.Skip("-fast") + } + const socketLimit = 64 + restore := mgo.HackSocketsPerServer(socketLimit) + defer restore() + + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + stats := mgo.GetStats() + for stats.MasterConns+stats.SlaveConns != 3 { + stats = mgo.GetStats() + c.Log("Waiting for all connections to be established...") + time.Sleep(5e8) + } + c.Assert(stats.SocketsAlive, Equals, 3) + + // Consume the whole limit for the master. + var master []*mgo.Session + for i := 0; i < socketLimit; i++ { + s := session.Copy() + defer s.Close() + err := s.Ping() + c.Assert(err, IsNil) + master = append(master, s) + } + + before := time.Now() + go func() { + time.Sleep(3e9) + master[0].Refresh() + }() + + // Now a single ping must block, since it would need another + // connection to the master, over the limit. Once the goroutine + // above releases its socket, it should move on. + session.Ping() + delay := time.Now().Sub(before) + c.Assert(delay > 3e9, Equals, true) + c.Assert(delay < 6e9, Equals, true) +} + +func (s *S) TestSetModeEventualIterBug(c *C) { + session1, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session1.Close() + + session1.SetMode(mgo.Eventual, false) + + coll1 := session1.DB("mydb").C("mycoll") + + const N = 100 + for i := 0; i < N; i++ { + err = coll1.Insert(M{"_id": i}) + c.Assert(err, IsNil) + } + + c.Logf("Waiting until secondary syncs") + for { + n, err := coll1.Count() + c.Assert(err, IsNil) + if n == N { + c.Logf("Found all") + break + } + } + + session2, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session2.Close() + + session2.SetMode(mgo.Eventual, false) + + coll2 := session2.DB("mydb").C("mycoll") + + i := 0 + iter := coll2.Find(nil).Batch(10).Iter() + var result struct{} + for iter.Next(&result) { + i++ + } + c.Assert(iter.Close(), Equals, nil) + c.Assert(i, Equals, N) +} + +func (s *S) TestCustomDialOld(c *C) { + dials := make(chan bool, 16) + dial := func(addr net.Addr) (net.Conn, error) { + tcpaddr, ok := addr.(*net.TCPAddr) + if !ok { + return nil, fmt.Errorf("unexpected address type: %T", addr) + } + dials <- true + return net.DialTCP("tcp", nil, tcpaddr) + } + info := mgo.DialInfo{ + Addrs: []string{"localhost:40012"}, + Dial: dial, + } + + // Use hostname here rather than IP, to make things trickier. + session, err := mgo.DialWithInfo(&info) + c.Assert(err, IsNil) + defer session.Close() + + const N = 3 + for i := 0; i < N; i++ { + select { + case <-dials: + case <-time.After(5 * time.Second): + c.Fatalf("expected %d dials, got %d", N, i) + } + } + select { + case <-dials: + c.Fatalf("got more dials than expected") + case <-time.After(100 * time.Millisecond): + } +} + +func (s *S) TestCustomDialNew(c *C) { + dials := make(chan bool, 16) + dial := func(addr *mgo.ServerAddr) (net.Conn, error) { + dials <- true + if addr.TCPAddr().Port == 40012 { + c.Check(addr.String(), Equals, "localhost:40012") + } + return net.DialTCP("tcp", nil, addr.TCPAddr()) + } + info := mgo.DialInfo{ + Addrs: []string{"localhost:40012"}, + DialServer: dial, + } + + // Use hostname here rather than IP, to make things trickier. + session, err := mgo.DialWithInfo(&info) + c.Assert(err, IsNil) + defer session.Close() + + const N = 3 + for i := 0; i < N; i++ { + select { + case <-dials: + case <-time.After(5 * time.Second): + c.Fatalf("expected %d dials, got %d", N, i) + } + } + select { + case <-dials: + c.Fatalf("got more dials than expected") + case <-time.After(100 * time.Millisecond): + } +} + +func (s *S) TestPrimaryShutdownOnAuthShard(c *C) { + if *fast { + c.Skip("-fast") + } + + // Dial the shard. + session, err := mgo.Dial("localhost:40203") + c.Assert(err, IsNil) + defer session.Close() + + // Login and insert something to make it more realistic. + session.DB("admin").Login("root", "rapadura") + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(bson.M{"n": 1}) + c.Assert(err, IsNil) + + // Dial the replica set to figure the master out. + rs, err := mgo.Dial("root:rapadura@localhost:40031") + c.Assert(err, IsNil) + defer rs.Close() + + // With strong consistency, this will open a socket to the master. + result := &struct{ Host string }{} + err = rs.Run("serverStatus", result) + c.Assert(err, IsNil) + + // Kill the master. + host := result.Host + s.Stop(host) + + // This must fail, since the connection was broken. + err = rs.Run("serverStatus", result) + c.Assert(err, Equals, io.EOF) + + // This won't work because the master just died. + err = coll.Insert(bson.M{"n": 2}) + c.Assert(err, NotNil) + + // Refresh session and wait for re-election. + session.Refresh() + for i := 0; i < 60; i++ { + err = coll.Insert(bson.M{"n": 3}) + if err == nil { + break + } + c.Logf("Waiting for replica set to elect a new master. Last error: %v", err) + time.Sleep(500 * time.Millisecond) + } + c.Assert(err, IsNil) + + count, err := coll.Count() + c.Assert(count > 1, Equals, true) +} + +func (s *S) TestNearestSecondary(c *C) { + defer mgo.HackPingDelay(3 * time.Second)() + + rs1a := "127.0.0.1:40011" + rs1b := "127.0.0.1:40012" + rs1c := "127.0.0.1:40013" + s.Freeze(rs1b) + + session, err := mgo.Dial(rs1a) + c.Assert(err, IsNil) + defer session.Close() + + // Wait for the sync up to run through the first couple of servers. + for len(session.LiveServers()) != 2 { + c.Log("Waiting for two servers to be alive...") + time.Sleep(100 * time.Millisecond) + } + + // Extra delay to ensure the third server gets penalized. + time.Sleep(500 * time.Millisecond) + + // Release third server. + s.Thaw(rs1b) + + // Wait for it to come up. + for len(session.LiveServers()) != 3 { + c.Log("Waiting for all servers to be alive...") + time.Sleep(100 * time.Millisecond) + } + + session.SetMode(mgo.Monotonic, true) + var result struct{ Host string } + + // See which slave picks the line, several times to avoid chance. + for i := 0; i < 10; i++ { + session.Refresh() + err = session.Run("serverStatus", &result) + c.Assert(err, IsNil) + c.Assert(hostPort(result.Host), Equals, hostPort(rs1c)) + } + + if *fast { + // Don't hold back for several seconds. + return + } + + // Now hold the other server for long enough to penalize it. + s.Freeze(rs1c) + time.Sleep(5 * time.Second) + s.Thaw(rs1c) + + // Wait for the ping to be processed. + time.Sleep(500 * time.Millisecond) + + // Repeating the test should now pick the former server consistently. + for i := 0; i < 10; i++ { + session.Refresh() + err = session.Run("serverStatus", &result) + c.Assert(err, IsNil) + c.Assert(hostPort(result.Host), Equals, hostPort(rs1b)) + } +} + +func (s *S) TestConnectCloseConcurrency(c *C) { + restore := mgo.HackPingDelay(500 * time.Millisecond) + defer restore() + var wg sync.WaitGroup + const n = 500 + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + defer wg.Done() + session, err := mgo.Dial("localhost:40001") + if err != nil { + c.Fatal(err) + } + time.Sleep(1) + session.Close() + }() + } + wg.Wait() +} + +func (s *S) TestSelectServers(c *C) { + if !s.versionAtLeast(2, 2) { + c.Skip("read preferences introduced in 2.2") + } + + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + session.SetMode(mgo.Eventual, true) + + var result struct{ Host string } + + session.Refresh() + session.SelectServers(bson.D{{"rs1", "b"}}) + err = session.Run("serverStatus", &result) + c.Assert(err, IsNil) + c.Assert(hostPort(result.Host), Equals, "40012") + + session.Refresh() + session.SelectServers(bson.D{{"rs1", "c"}}) + err = session.Run("serverStatus", &result) + c.Assert(err, IsNil) + c.Assert(hostPort(result.Host), Equals, "40013") +} + +func (s *S) TestSelectServersWithMongos(c *C) { + if !s.versionAtLeast(2, 2) { + c.Skip("read preferences introduced in 2.2") + } + + session, err := mgo.Dial("localhost:40021") + c.Assert(err, IsNil) + defer session.Close() + + ssresult := &struct{ Host string }{} + imresult := &struct{ IsMaster bool }{} + + // Figure the master while still using the strong session. + err = session.Run("serverStatus", ssresult) + c.Assert(err, IsNil) + err = session.Run("isMaster", imresult) + c.Assert(err, IsNil) + master := ssresult.Host + c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) + + var slave1, slave2 string + switch hostPort(master) { + case "40021": + slave1, slave2 = "b", "c" + case "40022": + slave1, slave2 = "a", "c" + case "40023": + slave1, slave2 = "a", "b" + } + + // Collect op counters for everyone. + opc21a, err := getOpCounters("localhost:40021") + c.Assert(err, IsNil) + opc22a, err := getOpCounters("localhost:40022") + c.Assert(err, IsNil) + opc23a, err := getOpCounters("localhost:40023") + c.Assert(err, IsNil) + + // Do a SlaveOk query through MongoS + mongos, err := mgo.Dial("localhost:40202") + c.Assert(err, IsNil) + defer mongos.Close() + + mongos.SetMode(mgo.Monotonic, true) + + mongos.Refresh() + mongos.SelectServers(bson.D{{"rs2", slave1}}) + coll := mongos.DB("mydb").C("mycoll") + result := &struct{}{} + for i := 0; i != 5; i++ { + err := coll.Find(nil).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) + } + + mongos.Refresh() + mongos.SelectServers(bson.D{{"rs2", slave2}}) + coll = mongos.DB("mydb").C("mycoll") + for i := 0; i != 7; i++ { + err := coll.Find(nil).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) + } + + // Collect op counters for everyone again. + opc21b, err := getOpCounters("localhost:40021") + c.Assert(err, IsNil) + opc22b, err := getOpCounters("localhost:40022") + c.Assert(err, IsNil) + opc23b, err := getOpCounters("localhost:40023") + c.Assert(err, IsNil) + + switch hostPort(master) { + case "40021": + c.Check(opc21b.Query-opc21a.Query, Equals, 0) + c.Check(opc22b.Query-opc22a.Query, Equals, 5) + c.Check(opc23b.Query-opc23a.Query, Equals, 7) + case "40022": + c.Check(opc21b.Query-opc21a.Query, Equals, 5) + c.Check(opc22b.Query-opc22a.Query, Equals, 0) + c.Check(opc23b.Query-opc23a.Query, Equals, 7) + case "40023": + c.Check(opc21b.Query-opc21a.Query, Equals, 5) + c.Check(opc22b.Query-opc22a.Query, Equals, 7) + c.Check(opc23b.Query-opc23a.Query, Equals, 0) + default: + c.Fatal("Uh?") + } +} diff --git a/vendor/labix.org/v2/mgo/doc.go b/vendor/labix.org/v2/mgo/doc.go new file mode 100644 index 0000000..9316c55 --- /dev/null +++ b/vendor/labix.org/v2/mgo/doc.go @@ -0,0 +1,31 @@ +// Package mgo offers a rich MongoDB driver for Go. +// +// Details about the mgo project (pronounced as "mango") are found +// in its web page: +// +// http://labix.org/mgo +// +// Usage of the driver revolves around the concept of sessions. To +// get started, obtain a session using the Dial function: +// +// session, err := mgo.Dial(url) +// +// This will establish one or more connections with the cluster of +// servers defined by the url parameter. From then on, the cluster +// may be queried with multiple consistency rules (see SetMode) and +// documents retrieved with statements such as: +// +// c := session.DB(database).C(collection) +// err := c.Find(query).One(&result) +// +// New sessions are typically created by calling session.Copy on the +// initial session obtained at dial time. These new sessions will share +// the same cluster information and connection cache, and may be easily +// handed into other methods and functions for organizing logic. +// Every session created must have its Close method called at the end +// of its life time, so its resources may be put back in the pool or +// collected, depending on the case. +// +// For more details, see the documentation for the types and methods. +// +package mgo diff --git a/vendor/labix.org/v2/mgo/export_test.go b/vendor/labix.org/v2/mgo/export_test.go new file mode 100644 index 0000000..b6bfcbc --- /dev/null +++ b/vendor/labix.org/v2/mgo/export_test.go @@ -0,0 +1,42 @@ +package mgo + +import ( + "time" +) + +func HackSocketsPerServer(newLimit int) (restore func()) { + oldLimit := newLimit + restore = func() { + socketsPerServer = oldLimit + } + socketsPerServer = newLimit + return +} + +func HackPingDelay(newDelay time.Duration) (restore func()) { + globalMutex.Lock() + defer globalMutex.Unlock() + + oldDelay := pingDelay + restore = func() { + globalMutex.Lock() + pingDelay = oldDelay + globalMutex.Unlock() + } + pingDelay = newDelay + return +} + +func HackSyncSocketTimeout(newTimeout time.Duration) (restore func()) { + globalMutex.Lock() + defer globalMutex.Unlock() + + oldTimeout := syncSocketTimeout + restore = func() { + globalMutex.Lock() + syncSocketTimeout = oldTimeout + globalMutex.Unlock() + } + syncSocketTimeout = newTimeout + return +} diff --git a/vendor/labix.org/v2/mgo/gridfs.go b/vendor/labix.org/v2/mgo/gridfs.go new file mode 100644 index 0000000..312f8fb --- /dev/null +++ b/vendor/labix.org/v2/mgo/gridfs.go @@ -0,0 +1,732 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "hash" + "io" + "labix.org/v2/mgo/bson" + "os" + "sync" + "time" +) + +type GridFS struct { + Files *Collection + Chunks *Collection +} + +type gfsFileMode int + +const ( + gfsClosed gfsFileMode = 0 + gfsReading gfsFileMode = 1 + gfsWriting gfsFileMode = 2 +) + +type GridFile struct { + m sync.Mutex + c sync.Cond + gfs *GridFS + mode gfsFileMode + err error + + chunk int + offset int64 + + wpending int + wbuf []byte + wsum hash.Hash + + rbuf []byte + rcache *gfsCachedChunk + + doc gfsFile +} + +type gfsFile struct { + Id interface{} "_id" + ChunkSize int "chunkSize" + UploadDate time.Time "uploadDate" + Length int64 ",minsize" + MD5 string + Filename string ",omitempty" + ContentType string "contentType,omitempty" + Metadata *bson.Raw ",omitempty" +} + +type gfsChunk struct { + Id interface{} "_id" + FilesId interface{} "files_id" + N int + Data []byte +} + +type gfsCachedChunk struct { + wait sync.Mutex + n int + data []byte + err error +} + +func newGridFS(db *Database, prefix string) *GridFS { + return &GridFS{db.C(prefix + ".files"), db.C(prefix + ".chunks")} +} + +func (gfs *GridFS) newFile() *GridFile { + file := &GridFile{gfs: gfs} + file.c.L = &file.m + //runtime.SetFinalizer(file, finalizeFile) + return file +} + +func finalizeFile(file *GridFile) { + file.Close() +} + +// Create creates a new file with the provided name in the GridFS. If the file +// name already exists, a new version will be inserted with an up-to-date +// uploadDate that will cause it to be atomically visible to the Open and +// OpenId methods. If the file name is not important, an empty name may be +// provided and the file Id used instead. +// +// It's important to Close files whether they are being written to +// or read from, and to check the err result to ensure the operation +// completed successfully. +// +// A simple example inserting a new file: +// +// func check(err error) { +// if err != nil { +// panic(err.String()) +// } +// } +// file, err := db.GridFS("fs").Create("myfile.txt") +// check(err) +// n, err := file.Write([]byte("Hello world!") +// check(err) +// err = file.Close() +// check(err) +// fmt.Printf("%d bytes written\n", n) +// +// The io.Writer interface is implemented by *GridFile and may be used to +// help on the file creation. For example: +// +// file, err := db.GridFS("fs").Create("myfile.txt") +// check(err) +// messages, err := os.Open("/var/log/messages") +// check(err) +// defer messages.Close() +// err = io.Copy(file, messages) +// check(err) +// err = file.Close() +// check(err) +// +func (gfs *GridFS) Create(name string) (file *GridFile, err error) { + file = gfs.newFile() + file.mode = gfsWriting + file.wsum = md5.New() + file.doc = gfsFile{Id: bson.NewObjectId(), ChunkSize: 256 * 1024, Filename: name} + return +} + +// OpenId returns the file with the provided id, for reading. +// If the file isn't found, err will be set to mgo.ErrNotFound. +// +// It's important to Close files whether they are being written to +// or read from, and to check the err result to ensure the operation +// completed successfully. +// +// The following example will print the first 8192 bytes from the file: +// +// func check(err error) { +// if err != nil { +// panic(err.String()) +// } +// } +// file, err := db.GridFS("fs").OpenId(objid) +// check(err) +// b := make([]byte, 8192) +// n, err := file.Read(b) +// check(err) +// fmt.Println(string(b)) +// check(err) +// err = file.Close() +// check(err) +// fmt.Printf("%d bytes read\n", n) +// +// The io.Reader interface is implemented by *GridFile and may be used to +// deal with it. As an example, the following snippet will dump the whole +// file into the standard output: +// +// file, err := db.GridFS("fs").OpenId(objid) +// check(err) +// err = io.Copy(os.Stdout, file) +// check(err) +// err = file.Close() +// check(err) +// +func (gfs *GridFS) OpenId(id interface{}) (file *GridFile, err error) { + var doc gfsFile + err = gfs.Files.Find(bson.M{"_id": id}).One(&doc) + if err != nil { + return + } + file = gfs.newFile() + file.mode = gfsReading + file.doc = doc + return +} + +// Open returns the most recently uploaded file with the provided +// name, for reading. If the file isn't found, err will be set +// to mgo.ErrNotFound. +// +// It's important to Close files whether they are being written to +// or read from, and to check the err result to ensure the operation +// completed successfully. +// +// The following example will print the first 8192 bytes from the file: +// +// file, err := db.GridFS("fs").Open("myfile.txt") +// check(err) +// b := make([]byte, 8192) +// n, err := file.Read(b) +// check(err) +// fmt.Println(string(b)) +// check(err) +// err = file.Close() +// check(err) +// fmt.Printf("%d bytes read\n", n) +// +// The io.Reader interface is implemented by *GridFile and may be used to +// deal with it. As an example, the following snippet will dump the whole +// file into the standard output: +// +// file, err := db.GridFS("fs").Open("myfile.txt") +// check(err) +// err = io.Copy(os.Stdout, file) +// check(err) +// err = file.Close() +// check(err) +// +func (gfs *GridFS) Open(name string) (file *GridFile, err error) { + var doc gfsFile + err = gfs.Files.Find(bson.M{"filename": name}).Sort("-uploadDate").One(&doc) + if err != nil { + return + } + file = gfs.newFile() + file.mode = gfsReading + file.doc = doc + return +} + +// OpenNext opens the next file from iter for reading, sets *file to it, +// and returns true on the success case. If no more documents are available +// on iter or an error occurred, *file is set to nil and the result is false. +// Errors will be available via iter.Err(). +// +// The iter parameter must be an iterator on the GridFS files collection. +// Using the GridFS.Find method is an easy way to obtain such an iterator, +// but any iterator on the collection will work. +// +// If the provided *file is non-nil, OpenNext will close it before attempting +// to iterate to the next element. This means that in a loop one only +// has to worry about closing files when breaking out of the loop early +// (break, return, or panic). +// +// For example: +// +// gfs := db.GridFS("fs") +// query := gfs.Find(nil).Sort("filename") +// iter := query.Iter() +// var f *mgo.GridFile +// for gfs.OpenNext(iter, &f) { +// fmt.Printf("Filename: %s\n", f.Name()) +// } +// if iter.Close() != nil { +// panic(iter.Close()) +// } +// +func (gfs *GridFS) OpenNext(iter *Iter, file **GridFile) bool { + if *file != nil { + // Ignoring the error here shouldn't be a big deal + // as we're reading the file and the loop iteration + // for this file is finished. + _ = (*file).Close() + } + var doc gfsFile + if !iter.Next(&doc) { + *file = nil + return false + } + f := gfs.newFile() + f.mode = gfsReading + f.doc = doc + *file = f + return true +} + +// Find runs query on GridFS's files collection and returns +// the resulting Query. +// +// This logic: +// +// gfs := db.GridFS("fs") +// iter := gfs.Find(nil).Iter() +// +// Is equivalent to: +// +// files := db.C("fs" + ".files") +// iter := files.Find(nil).Iter() +// +func (gfs *GridFS) Find(query interface{}) *Query { + return gfs.Files.Find(query) +} + +// RemoveId deletes the file with the provided id from the GridFS. +func (gfs *GridFS) RemoveId(id interface{}) error { + err := gfs.Files.Remove(bson.M{"_id": id}) + if err != nil { + return err + } + _, err = gfs.Chunks.RemoveAll(bson.D{{"files_id", id}}) + return err +} + +type gfsDocId struct { + Id interface{} "_id" +} + +// Remove deletes all files with the provided name from the GridFS. +func (gfs *GridFS) Remove(name string) (err error) { + iter := gfs.Files.Find(bson.M{"filename": name}).Select(bson.M{"_id": 1}).Iter() + var doc gfsDocId + for iter.Next(&doc) { + if e := gfs.RemoveId(doc.Id); e != nil { + err = e + } + } + if err == nil { + err = iter.Close() + } + return err +} + +func (file *GridFile) assertMode(mode gfsFileMode) { + switch file.mode { + case mode: + return + case gfsWriting: + panic("GridFile is open for writing") + case gfsReading: + panic("GridFile is open for reading") + case gfsClosed: + panic("GridFile is closed") + default: + panic("internal error: missing GridFile mode") + } +} + +// SetChunkSize sets size of saved chunks. Once the file is written to, it +// will be split in blocks of that size and each block saved into an +// independent chunk document. The default chunk size is 256kb. +// +// It is a runtime error to call this function once the file has started +// being written to. +func (file *GridFile) SetChunkSize(bytes int) { + file.assertMode(gfsWriting) + debugf("GridFile %p: setting chunk size to %d", file, bytes) + file.m.Lock() + file.doc.ChunkSize = bytes + file.m.Unlock() +} + +// Id returns the current file Id. +func (file *GridFile) Id() interface{} { + return file.doc.Id +} + +// SetId changes the current file Id. +// +// It is a runtime error to call this function once the file has started +// being written to, or when the file is not open for writing. +func (file *GridFile) SetId(id interface{}) { + file.assertMode(gfsWriting) + file.m.Lock() + file.doc.Id = id + file.m.Unlock() +} + +// Name returns the optional file name. An empty string will be returned +// in case it is unset. +func (file *GridFile) Name() string { + return file.doc.Filename +} + +// SetName changes the optional file name. An empty string may be used to +// unset it. +// +// It is a runtime error to call this function when the file is not open +// for writing. +func (file *GridFile) SetName(name string) { + file.assertMode(gfsWriting) + file.m.Lock() + file.doc.Filename = name + file.m.Unlock() +} + +// ContentType returns the optional file content type. An empty string will be +// returned in case it is unset. +func (file *GridFile) ContentType() string { + return file.doc.ContentType +} + +// ContentType changes the optional file content type. An empty string may be +// used to unset it. +// +// It is a runtime error to call this function when the file is not open +// for writing. +func (file *GridFile) SetContentType(ctype string) { + file.assertMode(gfsWriting) + file.m.Lock() + file.doc.ContentType = ctype + file.m.Unlock() +} + +// GetMeta unmarshals the optional "metadata" field associated with the +// file into the result parameter. The meaning of keys under that field +// is user-defined. For example: +// +// result := struct{ INode int }{} +// err = file.GetMeta(&result) +// if err != nil { +// panic(err.String()) +// } +// fmt.Printf("inode: %d\n", result.INode) +// +func (file *GridFile) GetMeta(result interface{}) (err error) { + file.m.Lock() + if file.doc.Metadata != nil { + err = bson.Unmarshal(file.doc.Metadata.Data, result) + } + file.m.Unlock() + return +} + +// SetMeta changes the optional "metadata" field associated with the +// file. The meaning of keys under that field is user-defined. +// For example: +// +// file.SetMeta(bson.M{"inode": inode}) +// +// It is a runtime error to call this function when the file is not open +// for writing. +func (file *GridFile) SetMeta(metadata interface{}) { + file.assertMode(gfsWriting) + data, err := bson.Marshal(metadata) + file.m.Lock() + if err != nil && file.err == nil { + file.err = err + } else { + file.doc.Metadata = &bson.Raw{Data: data} + } + file.m.Unlock() +} + +// Size returns the file size in bytes. +func (file *GridFile) Size() (bytes int64) { + file.m.Lock() + bytes = file.doc.Length + file.m.Unlock() + return +} + +// MD5 returns the file MD5 as a hex-encoded string. +func (file *GridFile) MD5() (md5 string) { + return file.doc.MD5 +} + +// UploadDate returns the file upload time. +func (file *GridFile) UploadDate() time.Time { + return file.doc.UploadDate +} + +// Close flushes any pending changes in case the file is being written +// to, waits for any background operations to finish, and closes the file. +// +// It's important to Close files whether they are being written to +// or read from, and to check the err result to ensure the operation +// completed successfully. +func (file *GridFile) Close() (err error) { + file.m.Lock() + defer file.m.Unlock() + if file.mode == gfsWriting { + if len(file.wbuf) > 0 && file.err == nil { + file.insertChunk(file.wbuf) + file.wbuf = file.wbuf[0:0] + } + file.completeWrite() + } else if file.mode == gfsReading && file.rcache != nil { + file.rcache.wait.Lock() + file.rcache = nil + } + file.mode = gfsClosed + debugf("GridFile %p: closed", file) + return file.err +} + +func (file *GridFile) completeWrite() { + for file.wpending > 0 { + debugf("GridFile %p: waiting for %d pending chunks to complete file write", file, file.wpending) + file.c.Wait() + } + if file.err != nil { + file.gfs.Chunks.RemoveAll(bson.D{{"files_id", file.doc.Id}}) + return + } + hexsum := hex.EncodeToString(file.wsum.Sum(nil)) + file.doc.UploadDate = bson.Now() + file.doc.MD5 = hexsum + file.err = file.gfs.Files.Insert(file.doc) + file.gfs.Chunks.EnsureIndexKey("files_id", "n") +} + +// Abort cancels an in-progress write, preventing the file from being +// automically created and ensuring previously written chunks are +// removed when the file is closed. +// +// It is a runtime error to call Abort when the file was not opened +// for writing. +func (file *GridFile) Abort() { + if file.mode != gfsWriting { + panic("file.Abort must be called on file opened for writing") + } + file.err = errors.New("write aborted") +} + +// Write writes the provided data to the file and returns the +// number of bytes written and an error in case something +// wrong happened. +// +// The file will internally cache the data so that all but the last +// chunk sent to the database have the size defined by SetChunkSize. +// This also means that errors may be deferred until a future call +// to Write or Close. +// +// The parameters and behavior of this function turn the file +// into an io.Writer. +func (file *GridFile) Write(data []byte) (n int, err error) { + file.assertMode(gfsWriting) + file.m.Lock() + debugf("GridFile %p: writing %d bytes", file, len(data)) + defer file.m.Unlock() + + if file.err != nil { + return 0, file.err + } + + n = len(data) + file.doc.Length += int64(n) + chunkSize := file.doc.ChunkSize + + if len(file.wbuf)+len(data) < chunkSize { + file.wbuf = append(file.wbuf, data...) + return + } + + // First, flush file.wbuf complementing with data. + if len(file.wbuf) > 0 { + missing := chunkSize - len(file.wbuf) + if missing > len(data) { + missing = len(data) + } + file.wbuf = append(file.wbuf, data[:missing]...) + data = data[missing:] + file.insertChunk(file.wbuf) + file.wbuf = file.wbuf[0:0] + } + + // Then, flush all chunks from data without copying. + for len(data) > chunkSize { + size := chunkSize + if size > len(data) { + size = len(data) + } + file.insertChunk(data[:size]) + data = data[size:] + } + + // And append the rest for a future call. + file.wbuf = append(file.wbuf, data...) + + return n, file.err +} + +func (file *GridFile) insertChunk(data []byte) { + n := file.chunk + file.chunk++ + debugf("GridFile %p: adding to checksum: %q", file, string(data)) + file.wsum.Write(data) + + for file.doc.ChunkSize*file.wpending >= 1024*1024 { + // Hold on.. we got a MB pending. + file.c.Wait() + if file.err != nil { + return + } + } + + file.wpending++ + + debugf("GridFile %p: inserting chunk %d with %d bytes", file, n, len(data)) + + // We may not own the memory of data, so rather than + // simply copying it, we'll marshal the document ahead of time. + data, err := bson.Marshal(gfsChunk{bson.NewObjectId(), file.doc.Id, n, data}) + if err != nil { + file.err = err + return + } + + go func() { + err := file.gfs.Chunks.Insert(bson.Raw{Data: data}) + file.m.Lock() + file.wpending-- + if err != nil && file.err == nil { + file.err = err + } + file.c.Broadcast() + file.m.Unlock() + }() +} + +// Seek sets the offset for the next Read or Write on file to +// offset, interpreted according to whence: 0 means relative to +// the origin of the file, 1 means relative to the current offset, +// and 2 means relative to the end. It returns the new offset and +// an error, if any. +func (file *GridFile) Seek(offset int64, whence int) (pos int64, err error) { + file.m.Lock() + debugf("GridFile %p: seeking for %s (whence=%d)", file, offset, whence) + defer file.m.Unlock() + switch whence { + case os.SEEK_SET: + case os.SEEK_CUR: + offset += file.offset + case os.SEEK_END: + offset += file.doc.Length + default: + panic("unsupported whence value") + } + if offset > file.doc.Length { + return file.offset, errors.New("seek past end of file") + } + chunk := int(offset / int64(file.doc.ChunkSize)) + if chunk+1 == file.chunk && offset >= file.offset { + file.rbuf = file.rbuf[int(offset-file.offset):] + file.offset = offset + return file.offset, nil + } + file.offset = offset + file.chunk = chunk + file.rbuf = nil + file.rbuf, err = file.getChunk() + if err == nil { + file.rbuf = file.rbuf[int(file.offset-int64(chunk)*int64(file.doc.ChunkSize)):] + } + return file.offset, err +} + +// Read reads into b the next available data from the file and +// returns the number of bytes written and an error in case +// something wrong happened. At the end of the file, n will +// be zero and err will be set to os.EOF. +// +// The parameters and behavior of this function turn the file +// into an io.Reader. +func (file *GridFile) Read(b []byte) (n int, err error) { + file.assertMode(gfsReading) + file.m.Lock() + debugf("GridFile %p: reading at offset %d into buffer of length %d", file, file.offset, len(b)) + defer file.m.Unlock() + if file.offset == file.doc.Length { + return 0, io.EOF + } + for err == nil { + i := copy(b, file.rbuf) + n += i + file.offset += int64(i) + file.rbuf = file.rbuf[i:] + if i == len(b) || file.offset == file.doc.Length { + break + } + b = b[i:] + file.rbuf, err = file.getChunk() + } + return n, err +} + +func (file *GridFile) getChunk() (data []byte, err error) { + cache := file.rcache + file.rcache = nil + if cache != nil && cache.n == file.chunk { + debugf("GridFile %p: Getting chunk %d from cache", file, file.chunk) + cache.wait.Lock() + data, err = cache.data, cache.err + } else { + debugf("GridFile %p: Fetching chunk %d", file, file.chunk) + var doc gfsChunk + err = file.gfs.Chunks.Find(bson.D{{"files_id", file.doc.Id}, {"n", file.chunk}}).One(&doc) + data = doc.Data + } + file.chunk++ + if int64(file.chunk)*int64(file.doc.ChunkSize) < file.doc.Length { + // Read the next one in background. + cache = &gfsCachedChunk{n: file.chunk} + cache.wait.Lock() + debugf("GridFile %p: Scheduling chunk %d for background caching", file, file.chunk) + // Clone the session to avoid having it closed in between. + chunks := file.gfs.Chunks + session := chunks.Database.Session.Clone() + go func(id interface{}, n int) { + defer session.Close() + chunks = chunks.With(session) + var doc gfsChunk + cache.err = chunks.Find(bson.D{{"files_id", id}, {"n", n}}).One(&doc) + cache.data = doc.Data + cache.wait.Unlock() + }(file.doc.Id, file.chunk) + file.rcache = cache + } + debugf("Returning err: %#v", err) + return +} diff --git a/vendor/labix.org/v2/mgo/gridfs_test.go b/vendor/labix.org/v2/mgo/gridfs_test.go new file mode 100644 index 0000000..fbdd5b0 --- /dev/null +++ b/vendor/labix.org/v2/mgo/gridfs_test.go @@ -0,0 +1,644 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "io" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" + "os" + "time" +) + +func (s *S) TestGridFSCreate(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + before := bson.Now() + + gfs := db.GridFS("fs") + file, err := gfs.Create("") + c.Assert(err, IsNil) + + n, err := file.Write([]byte("some data")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 9) + + err = file.Close() + c.Assert(err, IsNil) + + after := bson.Now() + + // Check the file information. + result := M{} + err = db.C("fs.files").Find(nil).One(result) + c.Assert(err, IsNil) + + fileId, ok := result["_id"].(bson.ObjectId) + c.Assert(ok, Equals, true) + c.Assert(fileId.Valid(), Equals, true) + result["_id"] = "" + + ud, ok := result["uploadDate"].(time.Time) + c.Assert(ok, Equals, true) + c.Assert(ud.After(before) && ud.Before(after), Equals, true) + result["uploadDate"] = "" + + expected := M{ + "_id": "", + "length": 9, + "chunkSize": 262144, + "uploadDate": "", + "md5": "1e50210a0202497fb79bc38b6ade6c34", + } + c.Assert(result, DeepEquals, expected) + + // Check the chunk. + result = M{} + err = db.C("fs.chunks").Find(nil).One(result) + c.Assert(err, IsNil) + + chunkId, ok := result["_id"].(bson.ObjectId) + c.Assert(ok, Equals, true) + c.Assert(chunkId.Valid(), Equals, true) + result["_id"] = "" + + expected = M{ + "_id": "", + "files_id": fileId, + "n": 0, + "data": []byte("some data"), + } + c.Assert(result, DeepEquals, expected) + + // Check that an index was created. + indexes, err := db.C("fs.chunks").Indexes() + c.Assert(err, IsNil) + c.Assert(len(indexes), Equals, 2) + c.Assert(indexes[1].Key, DeepEquals, []string{"files_id", "n"}) +} + +func (s *S) TestGridFSFileDetails(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("myfile1.txt") + c.Assert(err, IsNil) + + n, err := file.Write([]byte("some")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 4) + + c.Assert(file.Size(), Equals, int64(4)) + + n, err = file.Write([]byte(" data")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 5) + + c.Assert(file.Size(), Equals, int64(9)) + + id, _ := file.Id().(bson.ObjectId) + c.Assert(id.Valid(), Equals, true) + c.Assert(file.Name(), Equals, "myfile1.txt") + c.Assert(file.ContentType(), Equals, "") + + var info interface{} + err = file.GetMeta(&info) + c.Assert(err, IsNil) + c.Assert(info, IsNil) + + file.SetId("myid") + file.SetName("myfile2.txt") + file.SetContentType("text/plain") + file.SetMeta(M{"any": "thing"}) + + c.Assert(file.Id(), Equals, "myid") + c.Assert(file.Name(), Equals, "myfile2.txt") + c.Assert(file.ContentType(), Equals, "text/plain") + + err = file.GetMeta(&info) + c.Assert(err, IsNil) + c.Assert(info, DeepEquals, bson.M{"any": "thing"}) + + err = file.Close() + c.Assert(err, IsNil) + + c.Assert(file.MD5(), Equals, "1e50210a0202497fb79bc38b6ade6c34") + + ud := file.UploadDate() + now := time.Now() + c.Assert(ud.Before(now), Equals, true) + c.Assert(ud.After(now.Add(-3*time.Second)), Equals, true) + + result := M{} + err = db.C("fs.files").Find(nil).One(result) + c.Assert(err, IsNil) + + result["uploadDate"] = "" + + expected := M{ + "_id": "myid", + "length": 9, + "chunkSize": 262144, + "uploadDate": "", + "md5": "1e50210a0202497fb79bc38b6ade6c34", + "filename": "myfile2.txt", + "contentType": "text/plain", + "metadata": M{"any": "thing"}, + } + c.Assert(result, DeepEquals, expected) +} + +func (s *S) TestGridFSCreateWithChunking(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("") + c.Assert(err, IsNil) + + file.SetChunkSize(5) + + // Smaller than the chunk size. + n, err := file.Write([]byte("abc")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) + + // Boundary in the middle. + n, err = file.Write([]byte("defg")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 4) + + // Boundary at the end. + n, err = file.Write([]byte("hij")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) + + // Larger than the chunk size, with 3 chunks. + n, err = file.Write([]byte("klmnopqrstuv")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 12) + + err = file.Close() + c.Assert(err, IsNil) + + // Check the file information. + result := M{} + err = db.C("fs.files").Find(nil).One(result) + c.Assert(err, IsNil) + + fileId, _ := result["_id"].(bson.ObjectId) + c.Assert(fileId.Valid(), Equals, true) + result["_id"] = "" + result["uploadDate"] = "" + + expected := M{ + "_id": "", + "length": 22, + "chunkSize": 5, + "uploadDate": "", + "md5": "44a66044834cbe55040089cabfc102d5", + } + c.Assert(result, DeepEquals, expected) + + // Check the chunks. + iter := db.C("fs.chunks").Find(nil).Sort("n").Iter() + dataChunks := []string{"abcde", "fghij", "klmno", "pqrst", "uv"} + for i := 0; ; i++ { + result = M{} + if !iter.Next(result) { + if i != 5 { + c.Fatalf("Expected 5 chunks, got %d", i) + } + break + } + c.Assert(iter.Close(), IsNil) + + result["_id"] = "" + + expected = M{ + "_id": "", + "files_id": fileId, + "n": i, + "data": []byte(dataChunks[i]), + } + c.Assert(result, DeepEquals, expected) + } +} + +func (s *S) TestGridFSAbort(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + file, err := gfs.Create("") + c.Assert(err, IsNil) + + file.SetChunkSize(5) + + n, err := file.Write([]byte("some data")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 9) + + var count int + for i := 0; i < 10; i++ { + count, err = db.C("fs.chunks").Count() + if count > 0 || err != nil { + break + } + } + c.Assert(err, IsNil) + c.Assert(count, Equals, 1) + + file.Abort() + + err = file.Close() + c.Assert(err, ErrorMatches, "write aborted") + + count, err = db.C("fs.chunks").Count() + c.Assert(err, IsNil) + c.Assert(count, Equals, 0) +} + +func (s *S) TestGridFSOpenNotFound(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + file, err := gfs.OpenId("non-existent") + c.Assert(err == mgo.ErrNotFound, Equals, true) + c.Assert(file, IsNil) + + file, err = gfs.Open("non-existent") + c.Assert(err == mgo.ErrNotFound, Equals, true) + c.Assert(file, IsNil) +} + +func (s *S) TestGridFSReadAll(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + file, err := gfs.Create("") + c.Assert(err, IsNil) + id := file.Id() + + file.SetChunkSize(5) + + n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 22) + + err = file.Close() + c.Assert(err, IsNil) + + file, err = gfs.OpenId(id) + c.Assert(err, IsNil) + + b := make([]byte, 30) + n, err = file.Read(b) + c.Assert(n, Equals, 22) + c.Assert(err, IsNil) + + n, err = file.Read(b) + c.Assert(n, Equals, 0) + c.Assert(err == io.EOF, Equals, true) + + err = file.Close() + c.Assert(err, IsNil) +} + +func (s *S) TestGridFSReadChunking(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("") + c.Assert(err, IsNil) + + id := file.Id() + + file.SetChunkSize(5) + + n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 22) + + err = file.Close() + c.Assert(err, IsNil) + + file, err = gfs.OpenId(id) + c.Assert(err, IsNil) + + b := make([]byte, 30) + + // Smaller than the chunk size. + n, err = file.Read(b[:3]) + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) + c.Assert(b[:3], DeepEquals, []byte("abc")) + + // Boundary in the middle. + n, err = file.Read(b[:4]) + c.Assert(err, IsNil) + c.Assert(n, Equals, 4) + c.Assert(b[:4], DeepEquals, []byte("defg")) + + // Boundary at the end. + n, err = file.Read(b[:3]) + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) + c.Assert(b[:3], DeepEquals, []byte("hij")) + + // Larger than the chunk size, with 3 chunks. + n, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(n, Equals, 12) + c.Assert(b[:12], DeepEquals, []byte("klmnopqrstuv")) + + n, err = file.Read(b) + c.Assert(n, Equals, 0) + c.Assert(err == io.EOF, Equals, true) + + err = file.Close() + c.Assert(err, IsNil) +} + +func (s *S) TestGridFSOpen(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'1'}) + file.Close() + + file, err = gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'2'}) + file.Close() + + file, err = gfs.Open("myfile.txt") + c.Assert(err, IsNil) + defer file.Close() + + var b [1]byte + + _, err = file.Read(b[:]) + c.Assert(err, IsNil) + c.Assert(string(b[:]), Equals, "2") +} + +func (s *S) TestGridFSSeek(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + file, err := gfs.Create("") + c.Assert(err, IsNil) + id := file.Id() + + file.SetChunkSize(5) + + n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) + c.Assert(err, IsNil) + c.Assert(n, Equals, 22) + + err = file.Close() + c.Assert(err, IsNil) + + b := make([]byte, 5) + + file, err = gfs.OpenId(id) + c.Assert(err, IsNil) + + o, err := file.Seek(3, os.SEEK_SET) + c.Assert(err, IsNil) + c.Assert(o, Equals, int64(3)) + _, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(b, DeepEquals, []byte("defgh")) + + o, err = file.Seek(5, os.SEEK_CUR) + c.Assert(err, IsNil) + c.Assert(o, Equals, int64(13)) + _, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(b, DeepEquals, []byte("nopqr")) + + o, err = file.Seek(-10, os.SEEK_END) + c.Assert(err, IsNil) + c.Assert(o, Equals, int64(12)) + _, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(b, DeepEquals, []byte("mnopq")) + + o, err = file.Seek(8, os.SEEK_SET) + c.Assert(err, IsNil) + c.Assert(o, Equals, int64(8)) + _, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(b, DeepEquals, []byte("ijklm")) + + // Trivial seek forward within same chunk. Already + // got the data, shouldn't touch the database. + sent := mgo.GetStats().SentOps + o, err = file.Seek(1, os.SEEK_CUR) + c.Assert(err, IsNil) + c.Assert(o, Equals, int64(14)) + c.Assert(mgo.GetStats().SentOps, Equals, sent) + _, err = file.Read(b) + c.Assert(err, IsNil) + c.Assert(b, DeepEquals, []byte("opqrs")) + + // Try seeking past end of file. + file.Seek(3, os.SEEK_SET) + o, err = file.Seek(23, os.SEEK_SET) + c.Assert(err, ErrorMatches, "seek past end of file") + c.Assert(o, Equals, int64(3)) +} + +func (s *S) TestGridFSRemoveId(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'1'}) + file.Close() + + file, err = gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'2'}) + id := file.Id() + file.Close() + + err = gfs.RemoveId(id) + c.Assert(err, IsNil) + + file, err = gfs.Open("myfile.txt") + c.Assert(err, IsNil) + defer file.Close() + + var b [1]byte + + _, err = file.Read(b[:]) + c.Assert(err, IsNil) + c.Assert(string(b[:]), Equals, "1") + + n, err := db.C("fs.chunks").Find(M{"files_id": id}).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 0) +} + +func (s *S) TestGridFSRemove(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'1'}) + file.Close() + + file, err = gfs.Create("myfile.txt") + c.Assert(err, IsNil) + file.Write([]byte{'2'}) + file.Close() + + err = gfs.Remove("myfile.txt") + c.Assert(err, IsNil) + + _, err = gfs.Open("myfile.txt") + c.Assert(err == mgo.ErrNotFound, Equals, true) + + n, err := db.C("fs.chunks").Find(nil).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 0) +} + +func (s *S) TestGridFSOpenNext(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("mydb") + + gfs := db.GridFS("fs") + + file, err := gfs.Create("myfile1.txt") + c.Assert(err, IsNil) + file.Write([]byte{'1'}) + file.Close() + + file, err = gfs.Create("myfile2.txt") + c.Assert(err, IsNil) + file.Write([]byte{'2'}) + file.Close() + + var f *mgo.GridFile + var b [1]byte + + iter := gfs.Find(nil).Sort("-filename").Iter() + + ok := gfs.OpenNext(iter, &f) + c.Assert(ok, Equals, true) + c.Check(f.Name(), Equals, "myfile2.txt") + + _, err = f.Read(b[:]) + c.Assert(err, IsNil) + c.Assert(string(b[:]), Equals, "2") + + ok = gfs.OpenNext(iter, &f) + c.Assert(ok, Equals, true) + c.Check(f.Name(), Equals, "myfile1.txt") + + _, err = f.Read(b[:]) + c.Assert(err, IsNil) + c.Assert(string(b[:]), Equals, "1") + + ok = gfs.OpenNext(iter, &f) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + c.Assert(f, IsNil) + + // Do it again with a more restrictive query to make sure + // it's actually taken into account. + iter = gfs.Find(bson.M{"filename": "myfile1.txt"}).Iter() + + ok = gfs.OpenNext(iter, &f) + c.Assert(ok, Equals, true) + c.Check(f.Name(), Equals, "myfile1.txt") + + ok = gfs.OpenNext(iter, &f) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + c.Assert(f, IsNil) +} diff --git a/vendor/labix.org/v2/mgo/log.go b/vendor/labix.org/v2/mgo/log.go new file mode 100644 index 0000000..9abbe21 --- /dev/null +++ b/vendor/labix.org/v2/mgo/log.go @@ -0,0 +1,133 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "fmt" + "sync" +) + +// --------------------------------------------------------------------------- +// Logging integration. + +// Avoid importing the log type information unnecessarily. There's a small cost +// associated with using an interface rather than the type. Depending on how +// often the logger is plugged in, it would be worth using the type instead. +type log_Logger interface { + Output(calldepth int, s string) error +} + +var ( + globalLogger log_Logger + globalDebug bool + globalMutex sync.Mutex +) + +// RACE WARNING: There are known data races when logging, which are manually +// silenced when the race detector is in use. These data races won't be +// observed in typical use, because logging is supposed to be set up once when +// the application starts. Having raceDetector as a constant, the compiler +// should elide the locks altogether in actual use. + +// Specify the *log.Logger object where log messages should be sent to. +func SetLogger(logger log_Logger) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + globalLogger = logger +} + +// Enable the delivery of debug messages to the logger. Only meaningful +// if a logger is also set. +func SetDebug(debug bool) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + globalDebug = debug +} + +func log(v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalLogger != nil { + globalLogger.Output(2, fmt.Sprint(v...)) + } +} + +func logln(v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalLogger != nil { + globalLogger.Output(2, fmt.Sprintln(v...)) + } +} + +func logf(format string, v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalLogger != nil { + globalLogger.Output(2, fmt.Sprintf(format, v...)) + } +} + +func debug(v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalDebug && globalLogger != nil { + globalLogger.Output(2, fmt.Sprint(v...)) + } +} + +func debugln(v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalDebug && globalLogger != nil { + globalLogger.Output(2, fmt.Sprintln(v...)) + } +} + +func debugf(format string, v ...interface{}) { + if raceDetector { + globalMutex.Lock() + defer globalMutex.Unlock() + } + if globalDebug && globalLogger != nil { + globalLogger.Output(2, fmt.Sprintf(format, v...)) + } +} diff --git a/vendor/labix.org/v2/mgo/queue.go b/vendor/labix.org/v2/mgo/queue.go new file mode 100644 index 0000000..e9245de --- /dev/null +++ b/vendor/labix.org/v2/mgo/queue.go @@ -0,0 +1,91 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +type queue struct { + elems []interface{} + nelems, popi, pushi int +} + +func (q *queue) Len() int { + return q.nelems +} + +func (q *queue) Push(elem interface{}) { + //debugf("Pushing(pushi=%d popi=%d cap=%d): %#v\n", + // q.pushi, q.popi, len(q.elems), elem) + if q.nelems == len(q.elems) { + q.expand() + } + q.elems[q.pushi] = elem + q.nelems++ + q.pushi = (q.pushi + 1) % len(q.elems) + //debugf(" Pushed(pushi=%d popi=%d cap=%d): %#v\n", + // q.pushi, q.popi, len(q.elems), elem) +} + +func (q *queue) Pop() (elem interface{}) { + //debugf("Popping(pushi=%d popi=%d cap=%d)\n", + // q.pushi, q.popi, len(q.elems)) + if q.nelems == 0 { + return nil + } + elem = q.elems[q.popi] + q.elems[q.popi] = nil // Help GC. + q.nelems-- + q.popi = (q.popi + 1) % len(q.elems) + //debugf(" Popped(pushi=%d popi=%d cap=%d): %#v\n", + // q.pushi, q.popi, len(q.elems), elem) + return elem +} + +func (q *queue) expand() { + curcap := len(q.elems) + var newcap int + if curcap == 0 { + newcap = 8 + } else if curcap < 1024 { + newcap = curcap * 2 + } else { + newcap = curcap + (curcap / 4) + } + elems := make([]interface{}, newcap) + + if q.popi == 0 { + copy(elems, q.elems) + q.pushi = curcap + } else { + newpopi := newcap - (curcap - q.popi) + copy(elems, q.elems[:q.popi]) + copy(elems[newpopi:], q.elems[q.popi:]) + q.popi = newpopi + } + for i := range q.elems { + q.elems[i] = nil // Help GC. + } + q.elems = elems +} diff --git a/vendor/labix.org/v2/mgo/queue_test.go b/vendor/labix.org/v2/mgo/queue_test.go new file mode 100644 index 0000000..38b0325 --- /dev/null +++ b/vendor/labix.org/v2/mgo/queue_test.go @@ -0,0 +1,104 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "launchpad.net/gocheck" +) + +type QS struct{} + +var _ = gocheck.Suite(&QS{}) + +func (s *QS) TestSequentialGrowth(c *gocheck.C) { + q := queue{} + n := 2048 + for i := 0; i != n; i++ { + q.Push(i) + } + for i := 0; i != n; i++ { + c.Assert(q.Pop(), gocheck.Equals, i) + } +} + +var queueTestLists = [][]int{ + // {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + + // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} + {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, 8, 9, 10, 11}, + + // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} + {0, 1, 2, 3, -1, -1, 4, 5, 6, 7, 8, 9, 10, 11}, + + // {0, 1, 2, 3, 4, 5, 6, 7, 8} + {0, 1, 2, 3, 4, 5, 6, 7, 8, + -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8}, +} + +func (s *QS) TestQueueTestLists(c *gocheck.C) { + test := []int{} + testi := 0 + reset := func() { + test = test[0:0] + testi = 0 + } + push := func(i int) { + test = append(test, i) + } + pop := func() (i int) { + if testi == len(test) { + return -1 + } + i = test[testi] + testi++ + return + } + + for _, list := range queueTestLists { + reset() + q := queue{} + for _, n := range list { + if n == -1 { + c.Assert(q.Pop(), gocheck.Equals, pop(), + gocheck.Commentf("With list %#v", list)) + } else { + q.Push(n) + push(n) + } + } + + for n := pop(); n != -1; n = pop() { + c.Assert(q.Pop(), gocheck.Equals, n, + gocheck.Commentf("With list %#v", list)) + } + + c.Assert(q.Pop(), gocheck.Equals, nil, + gocheck.Commentf("With list %#v", list)) + } +} diff --git a/vendor/labix.org/v2/mgo/raceoff.go b/vendor/labix.org/v2/mgo/raceoff.go new file mode 100644 index 0000000..7470dd6 --- /dev/null +++ b/vendor/labix.org/v2/mgo/raceoff.go @@ -0,0 +1,6 @@ +// +build !race + +package mgo + +const raceDetector = false + diff --git a/vendor/labix.org/v2/mgo/raceon.go b/vendor/labix.org/v2/mgo/raceon.go new file mode 100644 index 0000000..737b08e --- /dev/null +++ b/vendor/labix.org/v2/mgo/raceon.go @@ -0,0 +1,5 @@ +// +build race + +package mgo + +const raceDetector = true diff --git a/vendor/labix.org/v2/mgo/saslimpl.go b/vendor/labix.org/v2/mgo/saslimpl.go new file mode 100644 index 0000000..3b255de --- /dev/null +++ b/vendor/labix.org/v2/mgo/saslimpl.go @@ -0,0 +1,11 @@ +//+build sasl + +package mgo + +import ( + "labix.org/v2/mgo/sasl" +) + +func saslNew(cred Credential, host string) (saslStepper, error) { + return sasl.New(cred.Username, cred.Password, cred.Mechanism, cred.Service, host) +} diff --git a/vendor/labix.org/v2/mgo/saslstub.go b/vendor/labix.org/v2/mgo/saslstub.go new file mode 100644 index 0000000..6e9e309 --- /dev/null +++ b/vendor/labix.org/v2/mgo/saslstub.go @@ -0,0 +1,11 @@ +//+build !sasl + +package mgo + +import ( + "fmt" +) + +func saslNew(cred Credential, host string) (saslStepper, error) { + return nil, fmt.Errorf("SASL support not enabled during build (-tags sasl)") +} diff --git a/vendor/labix.org/v2/mgo/server.go b/vendor/labix.org/v2/mgo/server.go new file mode 100644 index 0000000..d61f018 --- /dev/null +++ b/vendor/labix.org/v2/mgo/server.go @@ -0,0 +1,444 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "errors" + "labix.org/v2/mgo/bson" + "net" + "sort" + "sync" + "time" +) + +// --------------------------------------------------------------------------- +// Mongo server encapsulation. + +type mongoServer struct { + sync.RWMutex + Addr string + ResolvedAddr string + tcpaddr *net.TCPAddr + unusedSockets []*mongoSocket + liveSockets []*mongoSocket + closed bool + abended bool + sync chan bool + dial dialer + pingValue time.Duration + pingIndex int + pingCount uint32 + pingWindow [6]time.Duration + info *mongoServerInfo +} + +type dialer struct { + old func(addr net.Addr) (net.Conn, error) + new func(addr *ServerAddr) (net.Conn, error) +} + +func (dial dialer) isSet() bool { + return dial.old != nil || dial.new != nil +} + +type mongoServerInfo struct { + Master bool + Mongos bool + Tags bson.D +} + +var defaultServerInfo mongoServerInfo + +func newServer(addr string, tcpaddr *net.TCPAddr, sync chan bool, dial dialer) *mongoServer { + server := &mongoServer{ + Addr: addr, + ResolvedAddr: tcpaddr.String(), + tcpaddr: tcpaddr, + sync: sync, + dial: dial, + info: &defaultServerInfo, + } + // Once so the server gets a ping value, then loop in background. + server.pinger(false) + go server.pinger(true) + return server +} + +var errSocketLimit = errors.New("per-server connection limit reached") +var errServerClosed = errors.New("server was closed") + +// AcquireSocket returns a socket for communicating with the server. +// This will attempt to reuse an old connection, if one is available. Otherwise, +// it will establish a new one. The returned socket is owned by the call site, +// and will return to the cache when the socket has its Release method called +// the same number of times as AcquireSocket + Acquire were called for it. +// If the limit argument is not zero, a socket will only be returned if the +// number of sockets in use for this server is under the provided limit. +func (server *mongoServer) AcquireSocket(limit int, timeout time.Duration) (socket *mongoSocket, abended bool, err error) { + for { + server.Lock() + abended = server.abended + if server.closed { + server.Unlock() + return nil, abended, errServerClosed + } + n := len(server.unusedSockets) + if limit > 0 && len(server.liveSockets)-n >= limit { + server.Unlock() + return nil, false, errSocketLimit + } + if n > 0 { + socket = server.unusedSockets[n-1] + server.unusedSockets[n-1] = nil // Help GC. + server.unusedSockets = server.unusedSockets[:n-1] + info := server.info + server.Unlock() + err = socket.InitialAcquire(info, timeout) + if err != nil { + continue + } + } else { + server.Unlock() + socket, err = server.Connect(timeout) + if err == nil { + server.Lock() + // We've waited for the Connect, see if we got + // closed in the meantime + if server.closed { + server.Unlock() + socket.Release() + socket.Close() + return nil, abended, errServerClosed + } + server.liveSockets = append(server.liveSockets, socket) + server.Unlock() + } + } + return + } + panic("unreachable") +} + +// Connect establishes a new connection to the server. This should +// generally be done through server.AcquireSocket(). +func (server *mongoServer) Connect(timeout time.Duration) (*mongoSocket, error) { + server.RLock() + master := server.info.Master + dial := server.dial + server.RUnlock() + + logf("Establishing new connection to %s (timeout=%s)...", server.Addr, timeout) + var conn net.Conn + var err error + switch { + case !dial.isSet(): + // Cannot do this because it lacks timeout support. :-( + //conn, err = net.DialTCP("tcp", nil, server.tcpaddr) + conn, err = net.DialTimeout("tcp", server.ResolvedAddr, timeout) + case dial.old != nil: + conn, err = dial.old(server.tcpaddr) + case dial.new != nil: + conn, err = dial.new(&ServerAddr{server.Addr, server.tcpaddr}) + default: + panic("dialer is set, but both dial.old and dial.new are nil") + } + if err != nil { + logf("Connection to %s failed: %v", server.Addr, err.Error()) + return nil, err + } + logf("Connection to %s established.", server.Addr) + + stats.conn(+1, master) + return newSocket(server, conn, timeout), nil +} + +// Close forces closing all sockets that are alive, whether +// they're currently in use or not. +func (server *mongoServer) Close() { + server.Lock() + server.closed = true + liveSockets := server.liveSockets + unusedSockets := server.unusedSockets + server.liveSockets = nil + server.unusedSockets = nil + server.Unlock() + logf("Connections to %s closing (%d live sockets).", server.Addr, len(liveSockets)) + for i, s := range liveSockets { + s.Close() + liveSockets[i] = nil + } + for i := range unusedSockets { + unusedSockets[i] = nil + } +} + +// RecycleSocket puts socket back into the unused cache. +func (server *mongoServer) RecycleSocket(socket *mongoSocket) { + server.Lock() + if !server.closed { + server.unusedSockets = append(server.unusedSockets, socket) + } + server.Unlock() +} + +func removeSocket(sockets []*mongoSocket, socket *mongoSocket) []*mongoSocket { + for i, s := range sockets { + if s == socket { + copy(sockets[i:], sockets[i+1:]) + n := len(sockets) - 1 + sockets[n] = nil + sockets = sockets[:n] + break + } + } + return sockets +} + +// AbendSocket notifies the server that the given socket has terminated +// abnormally, and thus should be discarded rather than cached. +func (server *mongoServer) AbendSocket(socket *mongoSocket) { + server.Lock() + server.abended = true + if server.closed { + server.Unlock() + return + } + server.liveSockets = removeSocket(server.liveSockets, socket) + server.unusedSockets = removeSocket(server.unusedSockets, socket) + server.Unlock() + // Maybe just a timeout, but suggest a cluster sync up just in case. + select { + case server.sync <- true: + default: + } +} + +func (server *mongoServer) SetInfo(info *mongoServerInfo) { + server.Lock() + server.info = info + server.Unlock() +} + +func (server *mongoServer) Info() *mongoServerInfo { + server.Lock() + info := server.info + server.Unlock() + return info +} + +func (server *mongoServer) hasTags(serverTags []bson.D) bool { +NextTagSet: + for _, tags := range serverTags { + NextReqTag: + for _, req := range tags { + for _, has := range server.info.Tags { + if req.Name == has.Name { + if req.Value == has.Value { + continue NextReqTag + } + continue NextTagSet + } + } + continue NextTagSet + } + return true + } + return false +} + +var pingDelay = 5 * time.Second + +func (server *mongoServer) pinger(loop bool) { + var delay time.Duration + if raceDetector { + // This variable is only ever touched by tests. + globalMutex.Lock() + delay = pingDelay + globalMutex.Unlock() + } else { + delay = pingDelay + } + op := queryOp{ + collection: "admin.$cmd", + query: bson.D{{"ping", 1}}, + flags: flagSlaveOk, + limit: -1, + } + for { + if loop { + time.Sleep(delay) + } + op := op + socket, _, err := server.AcquireSocket(0, 3 * delay) + if err == nil { + start := time.Now() + _, _ = socket.SimpleQuery(&op) + delay := time.Now().Sub(start) + + server.pingWindow[server.pingIndex] = delay + server.pingIndex = (server.pingIndex + 1) % len(server.pingWindow) + server.pingCount++ + var max time.Duration + for i := 0; i < len(server.pingWindow) && uint32(i) < server.pingCount; i++ { + if server.pingWindow[i] > max { + max = server.pingWindow[i] + } + } + socket.Release() + server.Lock() + if server.closed { + loop = false + } + server.pingValue = max + server.Unlock() + logf("Ping for %s is %d ms", server.Addr, max/time.Millisecond) + } else if err == errServerClosed { + return + } + if !loop { + return + } + } +} + +type mongoServerSlice []*mongoServer + +func (s mongoServerSlice) Len() int { + return len(s) +} + +func (s mongoServerSlice) Less(i, j int) bool { + return s[i].ResolvedAddr < s[j].ResolvedAddr +} + +func (s mongoServerSlice) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s mongoServerSlice) Sort() { + sort.Sort(s) +} + +func (s mongoServerSlice) Search(resolvedAddr string) (i int, ok bool) { + n := len(s) + i = sort.Search(n, func(i int) bool { + return s[i].ResolvedAddr >= resolvedAddr + }) + return i, i != n && s[i].ResolvedAddr == resolvedAddr +} + +type mongoServers struct { + slice mongoServerSlice +} + +func (servers *mongoServers) Search(resolvedAddr string) (server *mongoServer) { + if i, ok := servers.slice.Search(resolvedAddr); ok { + return servers.slice[i] + } + return nil +} + +func (servers *mongoServers) Add(server *mongoServer) { + servers.slice = append(servers.slice, server) + servers.slice.Sort() +} + +func (servers *mongoServers) Remove(other *mongoServer) (server *mongoServer) { + if i, found := servers.slice.Search(other.ResolvedAddr); found { + server = servers.slice[i] + copy(servers.slice[i:], servers.slice[i+1:]) + n := len(servers.slice) - 1 + servers.slice[n] = nil // Help GC. + servers.slice = servers.slice[:n] + } + return +} + +func (servers *mongoServers) Slice() []*mongoServer { + return ([]*mongoServer)(servers.slice) +} + +func (servers *mongoServers) Get(i int) *mongoServer { + return servers.slice[i] +} + +func (servers *mongoServers) Len() int { + return len(servers.slice) +} + +func (servers *mongoServers) Empty() bool { + return len(servers.slice) == 0 +} + +// BestFit returns the best guess of what would be the most interesting +// server to perform operations on at this point in time. +func (servers *mongoServers) BestFit(serverTags []bson.D) *mongoServer { + var best *mongoServer + for _, next := range servers.slice { + if best == nil { + best = next + best.RLock() + if serverTags != nil && !next.info.Mongos && !best.hasTags(serverTags) { + best.RUnlock() + best = nil + } + continue + } + next.RLock() + swap := false + switch { + case serverTags != nil && !next.info.Mongos && !next.hasTags(serverTags): + // Must have requested tags. + case next.info.Master != best.info.Master: + // Prefer slaves. + swap = best.info.Master + case absDuration(next.pingValue-best.pingValue) > 15*time.Millisecond: + // Prefer nearest server. + swap = next.pingValue < best.pingValue + case len(next.liveSockets)-len(next.unusedSockets) < len(best.liveSockets)-len(best.unusedSockets): + // Prefer servers with less connections. + swap = true + } + if swap { + best.RUnlock() + best = next + } else { + next.RUnlock() + } + } + if best != nil { + best.RUnlock() + } + return best +} + +func absDuration(d time.Duration) time.Duration { + if d < 0 { + return -d + } + return d +} diff --git a/vendor/labix.org/v2/mgo/session.go b/vendor/labix.org/v2/mgo/session.go new file mode 100644 index 0000000..0ca86e8 --- /dev/null +++ b/vendor/labix.org/v2/mgo/session.go @@ -0,0 +1,3517 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "labix.org/v2/mgo/bson" + "math" + "net" + "net/url" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "time" +) + +type mode int + +const ( + Eventual mode = 0 + Monotonic mode = 1 + Strong mode = 2 +) + +// When changing the Session type, check if newSession and copySession +// need to be updated too. + +type Session struct { + m sync.RWMutex + cluster_ *mongoCluster + slaveSocket *mongoSocket + masterSocket *mongoSocket + slaveOk bool + consistency mode + queryConfig query + safeOp *queryOp + syncTimeout time.Duration + sockTimeout time.Duration + defaultdb string + sourcedb string + dialCred *Credential + creds []Credential +} + +type Database struct { + Session *Session + Name string +} + +type Collection struct { + Database *Database + Name string // "collection" + FullName string // "db.collection" +} + +type Query struct { + m sync.Mutex + session *Session + query // Enables default settings in session. +} + +type query struct { + op queryOp + prefetch float64 + limit int32 +} + +type getLastError struct { + CmdName int "getLastError" + W interface{} "w,omitempty" + WTimeout int "wtimeout,omitempty" + FSync bool "fsync,omitempty" + J bool "j,omitempty" +} + +type Iter struct { + m sync.Mutex + gotReply sync.Cond + session *Session + server *mongoServer + docData queue + err error + op getMoreOp + prefetch float64 + limit int32 + docsToReceive int + docsBeforeMore int + timeout time.Duration + timedout bool +} + +var ErrNotFound = errors.New("not found") + +const defaultPrefetch = 0.25 + +// Dial establishes a new session to the cluster identified by the given seed +// server(s). The session will enable communication with all of the servers in +// the cluster, so the seed servers are used only to find out about the cluster +// topology. +// +// Dial will timeout after 10 seconds if a server isn't reached. The returned +// session will timeout operations after one minute by default if servers +// aren't available. To customize the timeout, see DialWithTimeout, +// SetSyncTimeout, and SetSocketTimeout. +// +// This method is generally called just once for a given cluster. Further +// sessions to the same cluster are then established using the New or Copy +// methods on the obtained session. This will make them share the underlying +// cluster, and manage the pool of connections appropriately. +// +// Once the session is not useful anymore, Close must be called to release the +// resources appropriately. +// +// The seed servers must be provided in the following format: +// +// [mongodb://][user:pass@]host1[:port1][,host2[:port2],...][/database][?options] +// +// For example, it may be as simple as: +// +// localhost +// +// Or more involved like: +// +// mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb +// +// If the port number is not provided for a server, it defaults to 27017. +// +// The username and password provided in the URL will be used to authenticate +// into the database named after the slash at the end of the host names, or +// into the "admin" database if none is provided. The authentication information +// will persist in sessions obtained through the New method as well. +// +// The following connection options are supported after the question mark: +// +// connect=direct +// +// Disables the automatic replica set server discovery logic, and +// forces the use of servers provided only (even if secondaries). +// Note that to talk to a secondary the consistency requirements +// must be relaxed to Monotonic or Eventual via SetMode. +// +// +// authSource= +// +// Informs the database used to establish credentials and privileges +// with a MongoDB server. Defaults to the database name provided via +// the URL path, and "admin" if that's unset. +// +// +// authMechanism= +// +// Defines the protocol for credential negotiation. Defaults to "MONGODB-CR", +// which is the default username/password challenge-response mechanism. +// +// +// gssapiServiceName= +// +// Defines the service name to use when authenticating with the GSSAPI +// mechanism. Defaults to "mongodb". +// +// +// Relevant documentation: +// +// http://docs.mongodb.org/manual/reference/connection-string/ +// +func Dial(url string) (*Session, error) { + session, err := DialWithTimeout(url, 10*time.Second) + if err == nil { + session.SetSyncTimeout(1 * time.Minute) + session.SetSocketTimeout(1 * time.Minute) + } + return session, err +} + +// DialWithTimeout works like Dial, but uses timeout as the amount of time to +// wait for a server to respond when first connecting and also on follow up +// operations in the session. If timeout is zero, the call may block +// forever waiting for a connection to be made. +// +// See SetSyncTimeout for customizing the timeout for the session. +func DialWithTimeout(url string, timeout time.Duration) (*Session, error) { + uinfo, err := parseURL(url) + if err != nil { + return nil, err + } + direct := false + mechanism := "" + service := "" + source := "" + for k, v := range uinfo.options { + switch k { + case "authSource": + source = v + case "authMechanism": + mechanism = v + case "gssapiServiceName": + service = v + case "connect": + if v == "direct" { + direct = true + break + } + if v == "replicaSet" { + break + } + fallthrough + default: + return nil, errors.New("unsupported connection URL option: " + k + "=" + v) + } + } + info := DialInfo{ + Addrs: uinfo.addrs, + Direct: direct, + Timeout: timeout, + Database: uinfo.db, + Username: uinfo.user, + Password: uinfo.pass, + Mechanism: mechanism, + Service: service, + Source: source, + } + return DialWithInfo(&info) +} + +// DialInfo holds options for establishing a session with a MongoDB cluster. +// To use a URL, see the Dial function. +type DialInfo struct { + // Addrs holds the addresses for the seed servers. + Addrs []string + + // Direct informs whether to establish connections only with the + // specified seed servers, or to obtain information for the whole + // cluster and establish connections with further servers too. + Direct bool + + // Timeout is the amount of time to wait for a server to respond when + // first connecting and on follow up operations in the session. If + // timeout is zero, the call may block forever waiting for a connection + // to be established. + Timeout time.Duration + + // FailFast will cause connection and query attempts to fail faster when + // the server is unavailable, instead of retrying until the configured + // timeout period. Note that an unavailable server may silently drop + // packets instead of rejecting them, in which case it's impossible to + // distinguish it from a slow server, so the timeout stays relevant. + FailFast bool + + // Database is the default database name used when the Session.DB method + // is called with an empty name, and is also used during the intial + // authenticatoin if Source is unset. + Database string + + // Source is the database used to establish credentials and privileges + // with a MongoDB server. Defaults to the value of Database, if that is + // set, or "admin" otherwise. + Source string + + // Service defines the service name to use when authenticating with the GSSAPI + // mechanism. Defaults to "mongodb". + Service string + + // Mechanism defines the protocol for credential negotiation. + // Defaults to "MONGODB-CR". + Mechanism string + + // Username and Password inform the credentials for the initial authentication + // done on the database defined by the Source field. See Session.Login. + Username string + Password string + + // DialServer optionally specifies the dial function for establishing + // connections with the MongoDB servers. + DialServer func(addr *ServerAddr) (net.Conn, error) + + // WARNING: This field is obsolete. See DialServer above. + Dial func(addr net.Addr) (net.Conn, error) +} + +// ServerAddr represents the address for establishing a connection to an +// individual MongoDB server. +type ServerAddr struct { + str string + tcp *net.TCPAddr +} + +// String returns the address that was provided for the server before resolution. +func (addr *ServerAddr) String() string { + return addr.str +} + +// TCPAddr returns the resolved TCP address for the server. +func (addr *ServerAddr) TCPAddr() *net.TCPAddr { + return addr.tcp +} + +// DialWithInfo establishes a new session to the cluster identified by info. +func DialWithInfo(info *DialInfo) (*Session, error) { + addrs := make([]string, len(info.Addrs)) + for i, addr := range info.Addrs { + p := strings.LastIndexAny(addr, "]:") + if p == -1 || addr[p] != ':' { + // XXX This is untested. The test suite doesn't use the standard port. + addr += ":27017" + } + addrs[i] = addr + } + cluster := newCluster(addrs, info.Direct, info.FailFast, dialer{info.Dial, info.DialServer}) + session := newSession(Eventual, cluster, info.Timeout) + session.defaultdb = info.Database + if session.defaultdb == "" { + session.defaultdb = "test" + } + session.sourcedb = info.Source + if session.sourcedb == "" { + session.sourcedb = info.Database + if session.sourcedb == "" { + session.sourcedb = "admin" + } + } + if info.Username != "" { + source := session.sourcedb + if info.Source == "" && (info.Mechanism == "GSSAPI" || info.Mechanism == "PLAIN") { + source = "$external" + } + session.dialCred = &Credential{ + Username: info.Username, + Password: info.Password, + Mechanism: info.Mechanism, + Service: info.Service, + Source: source, + } + session.creds = []Credential{*session.dialCred} + } + cluster.Release() + + // People get confused when we return a session that is not actually + // established to any servers yet (e.g. what if url was wrong). So, + // ping the server to ensure there's someone there, and abort if it + // fails. + if err := session.Ping(); err != nil { + session.Close() + return nil, err + } + session.SetMode(Strong, true) + return session, nil +} + +func isOptSep(c rune) bool { + return c == ';' || c == '&' +} + +type urlInfo struct { + addrs []string + user string + pass string + db string + options map[string]string +} + +func parseURL(s string) (*urlInfo, error) { + if strings.HasPrefix(s, "mongodb://") { + s = s[10:] + } + info := &urlInfo{options: make(map[string]string)} + if c := strings.Index(s, "?"); c != -1 { + for _, pair := range strings.FieldsFunc(s[c+1:], isOptSep) { + l := strings.SplitN(pair, "=", 2) + if len(l) != 2 || l[0] == "" || l[1] == "" { + return nil, errors.New("connection option must be key=value: " + pair) + } + info.options[l[0]] = l[1] + } + s = s[:c] + } + if c := strings.Index(s, "@"); c != -1 { + pair := strings.SplitN(s[:c], ":", 2) + if len(pair) > 2 || pair[0] == "" { + return nil, errors.New("credentials must be provided as user:pass@host") + } + var err error + info.user, err = url.QueryUnescape(pair[0]) + if err != nil { + return nil, fmt.Errorf("cannot unescape username in URL: %q", pair[0]) + } + if len(pair) > 1 { + info.pass, err = url.QueryUnescape(pair[1]) + if err != nil { + return nil, fmt.Errorf("cannot unescape password in URL") + } + } + s = s[c+1:] + } + if c := strings.Index(s, "/"); c != -1 { + info.db = s[c+1:] + s = s[:c] + } + info.addrs = strings.Split(s, ",") + return info, nil +} + +func newSession(consistency mode, cluster *mongoCluster, timeout time.Duration) (session *Session) { + cluster.Acquire() + session = &Session{cluster_: cluster, syncTimeout: timeout, sockTimeout: timeout} + debugf("New session %p on cluster %p", session, cluster) + session.SetMode(consistency, true) + session.SetSafe(&Safe{}) + session.queryConfig.prefetch = defaultPrefetch + return session +} + +func copySession(session *Session, keepCreds bool) (s *Session) { + cluster := session.cluster() + cluster.Acquire() + if session.masterSocket != nil { + session.masterSocket.Acquire() + } + if session.slaveSocket != nil { + session.slaveSocket.Acquire() + } + var creds []Credential + if keepCreds { + creds = make([]Credential, len(session.creds)) + copy(creds, session.creds) + } else if session.dialCred != nil { + creds = []Credential{*session.dialCred} + } + scopy := *session + scopy.m = sync.RWMutex{} + scopy.creds = creds + s = &scopy + debugf("New session %p on cluster %p (copy from %p)", s, cluster, session) + return s +} + +// LiveServers returns a list of server addresses which are +// currently known to be alive. +func (s *Session) LiveServers() (addrs []string) { + s.m.RLock() + addrs = s.cluster().LiveServers() + s.m.RUnlock() + return addrs +} + +// DB returns a value representing the named database. If name +// is empty, the database name provided in the dialed URL is +// used instead. If that is also empty, "test" is used as a +// fallback in a way equivalent to the mongo shell. +// +// Creating this value is a very lightweight operation, and +// involves no network communication. +func (s *Session) DB(name string) *Database { + if name == "" { + name = s.defaultdb + } + return &Database{s, name} +} + +// C returns a value representing the named collection. +// +// Creating this value is a very lightweight operation, and +// involves no network communication. +func (db *Database) C(name string) *Collection { + return &Collection{db, name, db.Name + "." + name} +} + +// With returns a copy of db that uses session s. +func (db *Database) With(s *Session) *Database { + newdb := *db + newdb.Session = s + return &newdb +} + +// With returns a copy of c that uses session s. +func (c *Collection) With(s *Session) *Collection { + newdb := *c.Database + newdb.Session = s + newc := *c + newc.Database = &newdb + return &newc +} + +// GridFS returns a GridFS value representing collections in db that +// follow the standard GridFS specification. +// The provided prefix (sometimes known as root) will determine which +// collections to use, and is usually set to "fs" when there is a +// single GridFS in the database. +// +// See the GridFS Create, Open, and OpenId methods for more details. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/GridFS +// http://www.mongodb.org/display/DOCS/GridFS+Tools +// http://www.mongodb.org/display/DOCS/GridFS+Specification +// +func (db *Database) GridFS(prefix string) *GridFS { + return newGridFS(db, prefix) +} + +// Run issues the provided command on the db database and unmarshals +// its result in the respective argument. The cmd argument may be either +// a string with the command name itself, in which case an empty document of +// the form bson.M{cmd: 1} will be used, or it may be a full command document. +// +// Note that MongoDB considers the first marshalled key as the command +// name, so when providing a command with options, it's important to +// use an ordering-preserving document, such as a struct value or an +// instance of bson.D. For instance: +// +// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) +// +// For privilleged commands typically run on the "admin" database, see +// the Run method in the Session type. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Commands +// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips +// +func (db *Database) Run(cmd interface{}, result interface{}) error { + if name, ok := cmd.(string); ok { + cmd = bson.D{{name, 1}} + } + return db.C("$cmd").Find(cmd).One(result) +} + +// Credential holds details to authenticate with a MongoDB server. +type Credential struct { + // Username and Password hold the basic details for authentication. + // Password is optional with some authentication mechanisms. + Username string + Password string + + // Source is the database used to establish credentials and privileges + // with a MongoDB server. Defaults to the default database provided + // during dial, or "admin" if that was unset. + Source string + + // Service defines the service name to use when authenticating with the GSSAPI + // mechanism. Defaults to "mongodb". + Service string + + // Mechanism defines the protocol for credential negotiation. + // Defaults to "MONGODB-CR". + Mechanism string +} + +// Login authenticates with MongoDB using the provided credential. The +// authentication is valid for the whole session and will stay valid until +// Logout is explicitly called for the same database, or the session is +// closed. +func (db *Database) Login(user, pass string) error { + return db.Session.Login(&Credential{Username: user, Password: pass, Source: db.Name}) +} + +// Login authenticates with MongoDB using the provided credential. The +// authentication is valid for the whole session and will stay valid until +// Logout is explicitly called for the same database, or the session is +// closed. +func (s *Session) Login(cred *Credential) error { + socket, err := s.acquireSocket(true) + if err != nil { + return err + } + defer socket.Release() + + credCopy := *cred + if cred.Source == "" { + if cred.Mechanism == "GSSAPI" { + credCopy.Source = "$external" + } else { + credCopy.Source = s.sourcedb + } + } + err = socket.Login(credCopy) + if err != nil { + return err + } + + s.m.Lock() + s.creds = append(s.creds, credCopy) + s.m.Unlock() + return nil +} + +func (s *Session) socketLogin(socket *mongoSocket) error { + for _, cred := range s.creds { + if err := socket.Login(cred); err != nil { + return err + } + } + return nil +} + +// Logout removes any established authentication credentials for the database. +func (db *Database) Logout() { + session := db.Session + dbname := db.Name + session.m.Lock() + found := false + for i, cred := range session.creds { + if cred.Source == dbname { + copy(session.creds[i:], session.creds[i+1:]) + session.creds = session.creds[:len(session.creds)-1] + found = true + break + } + } + if found { + if session.masterSocket != nil { + session.masterSocket.Logout(dbname) + } + if session.slaveSocket != nil { + session.slaveSocket.Logout(dbname) + } + } + session.m.Unlock() +} + +// LogoutAll removes all established authentication credentials for the session. +func (s *Session) LogoutAll() { + s.m.Lock() + for _, cred := range s.creds { + if s.masterSocket != nil { + s.masterSocket.Logout(cred.Source) + } + if s.slaveSocket != nil { + s.slaveSocket.Logout(cred.Source) + } + } + s.creds = s.creds[0:0] + s.m.Unlock() +} + +// User represents a MongoDB user. +// +// Relevant documentation: +// +// http://docs.mongodb.org/manual/reference/privilege-documents/ +// http://docs.mongodb.org/manual/reference/user-privileges/ +// +type User struct { + // Username is how the user identifies itself to the system. + Username string `bson:"user"` + + // Password is the plaintext password for the user. If set, + // the UpsertUser method will hash it into PasswordHash and + // unset it before the user is added to the database. + Password string `bson:",omitempty"` + + // PasswordHash is the MD5 hash of Username+":mongo:"+Password. + PasswordHash string `bson:"pwd,omitempty"` + + // CustomData holds arbitrary data admins decide to associate + // with this user, such as the full name or employee id. + CustomData interface{} `bson:"customData,omitempty"` + + // Roles indicates the set of roles the user will be provided. + // See the Role constants. + Roles []Role `bson:"roles"` + + // OtherDBRoles allows assigning roles in other databases from + // user documents inserted in the admin database. This field + // only works in the admin database. + OtherDBRoles map[string][]Role `bson:"otherDBRoles,omitempty"` + + // UserSource indicates where to look for this user's credentials. + // It may be set to a database name, or to "$external" for + // consulting an external resource such as Kerberos. UserSource + // must not be set if Password or PasswordHash are present. + // + // WARNING: This setting was only ever supported in MongoDB 2.4, + // and is now obsolete. + UserSource string `bson:"userSource,omitempty"` +} + +type Role string + +const ( + // Relevant documentation: + // + // http://docs.mongodb.org/manual/reference/user-privileges/ + // + RoleRoot Role = "root" + RoleRead Role = "read" + RoleReadAny Role = "readAnyDatabase" + RoleReadWrite Role = "readWrite" + RoleReadWriteAny Role = "readWriteAnyDatabase" + RoleDBAdmin Role = "dbAdmin" + RoleDBAdminAny Role = "dbAdminAnyDatabase" + RoleUserAdmin Role = "userAdmin" + RoleUserAdminAny Role = "userAdminAnyDatabase" + RoleClusterAdmin Role = "clusterAdmin" +) + +// UpsertUser updates the authentication credentials and the roles for +// a MongoDB user within the db database. If the named user doesn't exist +// it will be created. +// +// This method should only be used from MongoDB 2.4 and on. For older +// MongoDB releases, use the obsolete AddUser method instead. +// +// Relevant documentation: +// +// http://docs.mongodb.org/manual/reference/user-privileges/ +// http://docs.mongodb.org/manual/reference/privilege-documents/ +// +func (db *Database) UpsertUser(user *User) error { + if user.Username == "" { + return fmt.Errorf("user has no Username") + } + if (user.Password != "" || user.PasswordHash != "") && user.UserSource != "" { + return fmt.Errorf("user has both Password/PasswordHash and UserSource set") + } + if len(user.OtherDBRoles) > 0 && db.Name != "admin" { + return fmt.Errorf("user with OtherDBRoles is only supported in admin database") + } + + // Attempt to run this using 2.6+ commands. + rundb := db + if user.UserSource != "" { + // Compatibility logic for the userSource field of MongoDB <= 2.4.X + rundb = db.Session.DB(user.UserSource) + } + err := rundb.runUserCmd("updateUser", user) + if e, ok := err.(*QueryError); ok && e.Code == 11 { + return rundb.runUserCmd("createUser", user) + } + if !isNoCmd(err) { + return err + } + + // Command does not exist. Fallback to pre-2.6 behavior. + var set, unset bson.D + if user.Password != "" { + psum := md5.New() + psum.Write([]byte(user.Username + ":mongo:" + user.Password)) + set = append(set, bson.DocElem{"pwd", hex.EncodeToString(psum.Sum(nil))}) + unset = append(unset, bson.DocElem{"userSource", 1}) + } else if user.PasswordHash != "" { + set = append(set, bson.DocElem{"pwd", user.PasswordHash}) + unset = append(unset, bson.DocElem{"userSource", 1}) + } + if user.UserSource != "" { + set = append(set, bson.DocElem{"userSource", user.UserSource}) + unset = append(unset, bson.DocElem{"pwd", 1}) + } + if user.Roles != nil || user.OtherDBRoles != nil { + set = append(set, bson.DocElem{"roles", user.Roles}) + if len(user.OtherDBRoles) > 0 { + set = append(set, bson.DocElem{"otherDBRoles", user.OtherDBRoles}) + } else { + unset = append(unset, bson.DocElem{"otherDBRoles", 1}) + } + } + users := db.C("system.users") + err = users.Update(bson.D{{"user", user.Username}}, bson.D{{"$unset", unset}, {"$set", set}}) + if err == ErrNotFound { + set = append(set, bson.DocElem{"user", user.Username}) + if user.Roles == nil && user.OtherDBRoles == nil { + // Roles must be sent, as it's the way MongoDB distinguishes + // old-style documents from new-style documents in pre-2.6. + set = append(set, bson.DocElem{"roles", user.Roles}) + } + err = users.Insert(set) + } + return err +} + +func isNoCmd(err error) bool { + e, ok := err.(*QueryError) + return ok && strings.HasPrefix(e.Message, "no such cmd:") +} + +func (db *Database) runUserCmd(cmdName string, user *User) error { + //if user.UserSource != "" && (user.UserSource != "$external" || db.Name != "$external") { + // return fmt.Errorf("MongoDB 2.6+ does not support the UserSource setting") + //} + + cmd := make(bson.D, 0, 16) + cmd = append(cmd, bson.DocElem{cmdName, user.Username}) + if user.Password != "" { + cmd = append(cmd, bson.DocElem{"pwd", user.Password}) + } + var roles []interface{} + for _, role := range user.Roles { + roles = append(roles, role) + } + for db, dbroles := range user.OtherDBRoles { + for _, role := range dbroles { + roles = append(roles, bson.D{{"role", role}, {"db", db}}) + } + } + if roles != nil || user.Roles != nil || cmdName == "createUser" { + cmd = append(cmd, bson.DocElem{"roles", roles}) + } + return db.Run(cmd, nil) +} + +// AddUser creates or updates the authentication credentials of user within +// the db database. +// +// WARNING: This method is obsolete and should only be used with MongoDB 2.2 +// or earlier. For MongoDB 2.4 and on, use UpsertUser instead. +func (db *Database) AddUser(username, password string, readOnly bool) error { + // Try to emulate the old behavior on 2.6+ + user := &User{Username: username, Password: password} + if db.Name == "admin" { + if readOnly { + user.Roles = []Role{RoleReadAny} + } else { + user.Roles = []Role{RoleReadWriteAny} + } + } else { + if readOnly { + user.Roles = []Role{RoleRead} + } else { + user.Roles = []Role{RoleReadWrite} + } + } + err := db.runUserCmd("updateUser", user) + if e, ok := err.(*QueryError); ok && e.Code == 11 { + return db.runUserCmd("createUser", user) + } + if !isNoCmd(err) { + return err + } + + // Command doesn't exist. Fallback to pre-2.6 behavior. + psum := md5.New() + psum.Write([]byte(username + ":mongo:" + password)) + digest := hex.EncodeToString(psum.Sum(nil)) + c := db.C("system.users") + _, err = c.Upsert(bson.M{"user": username}, bson.M{"$set": bson.M{"user": username, "pwd": digest, "readOnly": readOnly}}) + return err +} + +// RemoveUser removes the authentication credentials of user from the database. +func (db *Database) RemoveUser(user string) error { + err := db.Run(bson.D{{"dropUser", user}}, nil) + if isNoCmd(err) { + users := db.C("system.users") + return users.Remove(bson.M{"user": user}) + } + return err +} + +type indexSpec struct { + Name, NS string + Key bson.D + Unique bool ",omitempty" + DropDups bool "dropDups,omitempty" + Background bool ",omitempty" + Sparse bool ",omitempty" + Bits, Min, Max int ",omitempty" + ExpireAfter int "expireAfterSeconds,omitempty" +} + +type Index struct { + Key []string // Index key fields; prefix name with dash (-) for descending order + Unique bool // Prevent two documents from having the same index key + DropDups bool // Drop documents with the same index key as a previously indexed one + Background bool // Build index in background and return immediately + Sparse bool // Only index documents containing the Key fields + + ExpireAfter time.Duration // Periodically delete docs with indexed time.Time older than that. + + Name string // Index name, computed by EnsureIndex + + Bits, Min, Max int // Properties for spatial indexes +} + +func parseIndexKey(key []string) (name string, realKey bson.D, err error) { + var order interface{} + for _, field := range key { + raw := field + if name != "" { + name += "_" + } + var kind string + if field != "" { + if field[0] == '$' { + if c := strings.Index(field, ":"); c > 1 && c < len(field)-1 { + kind = field[1:c] + field = field[c+1:] + name += field + "_" + kind + } + } + switch field[0] { + case '$': + // Logic above failed. Reset and error. + field = "" + case '@': + order = "2d" + field = field[1:] + // The shell used to render this field as key_ instead of key_2d, + // and mgo followed suit. This has been fixed in recent server + // releases, and mgo followed as well. + name += field + "_2d" + case '-': + order = -1 + field = field[1:] + name += field + "_-1" + case '+': + field = field[1:] + fallthrough + default: + if kind == "" { + order = 1 + name += field + "_1" + } else { + order = kind + } + } + } + if field == "" || kind != "" && order != kind { + return "", nil, fmt.Errorf(`invalid index key: want "[$:][-]", got %q`, raw) + } + realKey = append(realKey, bson.DocElem{field, order}) + } + if name == "" { + return "", nil, errors.New("invalid index key: no fields provided") + } + return +} + +// EnsureIndexKey ensures an index with the given key exists, creating it +// if necessary. +// +// This example: +// +// err := collection.EnsureIndexKey("a", "b") +// +// Is equivalent to: +// +// err := collection.EnsureIndex(mgo.Index{Key: []string{"a", "b"}}) +// +// See the EnsureIndex method for more details. +func (c *Collection) EnsureIndexKey(key ...string) error { + return c.EnsureIndex(Index{Key: key}) +} + +// EnsureIndex ensures an index with the given key exists, creating it with +// the provided parameters if necessary. +// +// Once EnsureIndex returns successfully, following requests for the same index +// will not contact the server unless Collection.DropIndex is used to drop the +// same index, or Session.ResetIndexCache is called. +// +// For example: +// +// index := Index{ +// Key: []string{"lastname", "firstname"}, +// Unique: true, +// DropDups: true, +// Background: true, // See notes. +// Sparse: true, +// } +// err := collection.EnsureIndex(index) +// +// The Key value determines which fields compose the index. The index ordering +// will be ascending by default. To obtain an index with a descending order, +// the field name should be prefixed by a dash (e.g. []string{"-time"}). +// +// If Unique is true, the index must necessarily contain only a single +// document per Key. With DropDups set to true, documents with the same key +// as a previously indexed one will be dropped rather than an error returned. +// +// If Background is true, other connections will be allowed to proceed using +// the collection without the index while it's being built. Note that the +// session executing EnsureIndex will be blocked for as long as it takes for +// the index to be built. +// +// If Sparse is true, only documents containing the provided Key fields will be +// included in the index. When using a sparse index for sorting, only indexed +// documents will be returned. +// +// If ExpireAfter is non-zero, the server will periodically scan the collection +// and remove documents containing an indexed time.Time field with a value +// older than ExpireAfter. See the documentation for details: +// +// http://docs.mongodb.org/manual/tutorial/expire-data +// +// Other kinds of indexes are also supported through that API. Here is an example: +// +// index := Index{ +// Key: []string{"$2d:loc"}, +// Bits: 26, +// } +// err := collection.EnsureIndex(index) +// +// The example above requests the creation of a "2d" index for the "loc" field. +// +// The 2D index bounds may be changed using the Min and Max attributes of the +// Index value. The default bound setting of (-180, 180) is suitable for +// latitude/longitude pairs. +// +// The Bits parameter sets the precision of the 2D geohash values. If not +// provided, 26 bits are used, which is roughly equivalent to 1 foot of +// precision for the default (-180, 180) index bounds. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Indexes +// http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ +// http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation +// http://www.mongodb.org/display/DOCS/Geospatial+Indexing +// http://www.mongodb.org/display/DOCS/Multikeys +// +func (c *Collection) EnsureIndex(index Index) error { + name, realKey, err := parseIndexKey(index.Key) + if err != nil { + return err + } + + session := c.Database.Session + cacheKey := c.FullName + "\x00" + name + if session.cluster().HasCachedIndex(cacheKey) { + return nil + } + + spec := indexSpec{ + Name: name, + NS: c.FullName, + Key: realKey, + Unique: index.Unique, + DropDups: index.DropDups, + Background: index.Background, + Sparse: index.Sparse, + Bits: index.Bits, + Min: index.Min, + Max: index.Max, + ExpireAfter: int(index.ExpireAfter / time.Second), + } + + session = session.Clone() + defer session.Close() + session.SetMode(Strong, false) + session.EnsureSafe(&Safe{}) + + db := c.Database.With(session) + err = db.C("system.indexes").Insert(&spec) + if err == nil { + session.cluster().CacheIndex(cacheKey, true) + } + session.Close() + return err +} + +// DropIndex removes the index with key from the collection. +// +// The key value determines which fields compose the index. The index ordering +// will be ascending by default. To obtain an index with a descending order, +// the field name should be prefixed by a dash (e.g. []string{"-time"}). +// +// For example: +// +// err := collection.DropIndex("lastname", "firstname") +// +// See the EnsureIndex method for more details on indexes. +func (c *Collection) DropIndex(key ...string) error { + name, _, err := parseIndexKey(key) + if err != nil { + return err + } + + session := c.Database.Session + cacheKey := c.FullName + "\x00" + name + session.cluster().CacheIndex(cacheKey, false) + + session = session.Clone() + defer session.Close() + session.SetMode(Strong, false) + + db := c.Database.With(session) + result := struct { + ErrMsg string + Ok bool + }{} + err = db.Run(bson.D{{"dropIndexes", c.Name}, {"index", name}}, &result) + if err != nil { + return err + } + if !result.Ok { + return errors.New(result.ErrMsg) + } + return nil +} + +// Indexes returns a list of all indexes for the collection. +// +// For example, this snippet would drop all available indexes: +// +// indexes, err := collection.Indexes() +// if err != nil { +// return err +// } +// for _, index := range indexes { +// err = collection.DropIndex(index.Key...) +// if err != nil { +// return err +// } +// } +// +// See the EnsureIndex method for more details on indexes. +func (c *Collection) Indexes() (indexes []Index, err error) { + query := c.Database.C("system.indexes").Find(bson.M{"ns": c.FullName}) + iter := query.Sort("name").Iter() + for { + var spec indexSpec + if !iter.Next(&spec) { + break + } + index := Index{ + Name: spec.Name, + Key: simpleIndexKey(spec.Key), + Unique: spec.Unique, + DropDups: spec.DropDups, + Background: spec.Background, + Sparse: spec.Sparse, + ExpireAfter: time.Duration(spec.ExpireAfter) * time.Second, + } + indexes = append(indexes, index) + } + err = iter.Close() + return +} + +func simpleIndexKey(realKey bson.D) (key []string) { + for i := range realKey { + field := realKey[i].Name + vi, ok := realKey[i].Value.(int) + if !ok { + vf, _ := realKey[i].Value.(float64) + vi = int(vf) + } + if vi == 1 { + key = append(key, field) + continue + } + if vi == -1 { + key = append(key, "-"+field) + continue + } + if vs, ok := realKey[i].Value.(string); ok { + key = append(key, "$"+vs+":"+field) + continue + } + panic("Got unknown index key type for field " + field) + } + return +} + +// ResetIndexCache() clears the cache of previously ensured indexes. +// Following requests to EnsureIndex will contact the server. +func (s *Session) ResetIndexCache() { + s.cluster().ResetIndexCache() +} + +// New creates a new session with the same parameters as the original +// session, including consistency, batch size, prefetching, safety mode, +// etc. The returned session will use sockets from the pool, so there's +// a chance that writes just performed in another session may not yet +// be visible. +// +// Login information from the original session will not be copied over +// into the new session unless it was provided through the initial URL +// for the Dial function. +// +// See the Copy and Clone methods. +// +func (s *Session) New() *Session { + s.m.Lock() + scopy := copySession(s, false) + s.m.Unlock() + scopy.Refresh() + return scopy +} + +// Copy works just like New, but preserves the exact authentication +// information from the original session. +func (s *Session) Copy() *Session { + s.m.Lock() + scopy := copySession(s, true) + s.m.Unlock() + scopy.Refresh() + return scopy +} + +// Clone works just like Copy, but also reuses the same socket as the original +// session, in case it had already reserved one due to its consistency +// guarantees. This behavior ensures that writes performed in the old session +// are necessarily observed when using the new session, as long as it was a +// strong or monotonic session. That said, it also means that long operations +// may cause other goroutines using the original session to wait. +func (s *Session) Clone() *Session { + s.m.Lock() + scopy := copySession(s, true) + s.m.Unlock() + return scopy +} + +// Close terminates the session. It's a runtime error to use a session +// after it has been closed. +func (s *Session) Close() { + s.m.Lock() + if s.cluster_ != nil { + debugf("Closing session %p", s) + s.unsetSocket() + s.cluster_.Release() + s.cluster_ = nil + } + s.m.Unlock() +} + +func (s *Session) cluster() *mongoCluster { + if s.cluster_ == nil { + panic("Session already closed") + } + return s.cluster_ +} + +// Refresh puts back any reserved sockets in use and restarts the consistency +// guarantees according to the current consistency setting for the session. +func (s *Session) Refresh() { + s.m.Lock() + s.slaveOk = s.consistency != Strong + s.unsetSocket() + s.m.Unlock() +} + +// SetMode changes the consistency mode for the session. +// +// In the Strong consistency mode reads and writes will always be made to +// the primary server using a unique connection so that reads and writes are +// fully consistent, ordered, and observing the most up-to-date data. +// This offers the least benefits in terms of distributing load, but the +// most guarantees. See also Monotonic and Eventual. +// +// In the Monotonic consistency mode reads may not be entirely up-to-date, +// but they will always see the history of changes moving forward, the data +// read will be consistent across sequential queries in the same session, +// and modifications made within the session will be observed in following +// queries (read-your-writes). +// +// In practice, the Monotonic mode is obtained by performing initial reads +// on a unique connection to an arbitrary secondary, if one is available, +// and once the first write happens, the session connection is switched over +// to the primary server. This manages to distribute some of the reading +// load with secondaries, while maintaining some useful guarantees. +// +// In the Eventual consistency mode reads will be made to any secondary in the +// cluster, if one is available, and sequential reads will not necessarily +// be made with the same connection. This means that data may be observed +// out of order. Writes will of course be issued to the primary, but +// independent writes in the same Eventual session may also be made with +// independent connections, so there are also no guarantees in terms of +// write ordering (no read-your-writes guarantees either). +// +// The Eventual mode is the fastest and most resource-friendly, but is +// also the one offering the least guarantees about ordering of the data +// read and written. +// +// If refresh is true, in addition to ensuring the session is in the given +// consistency mode, the consistency guarantees will also be reset (e.g. +// a Monotonic session will be allowed to read from secondaries again). +// This is equivalent to calling the Refresh function. +// +// Shifting between Monotonic and Strong modes will keep a previously +// reserved connection for the session unless refresh is true or the +// connection is unsuitable (to a secondary server in a Strong session). +func (s *Session) SetMode(consistency mode, refresh bool) { + s.m.Lock() + debugf("Session %p: setting mode %d with refresh=%v (master=%p, slave=%p)", s, consistency, refresh, s.masterSocket, s.slaveSocket) + s.consistency = consistency + if refresh { + s.slaveOk = s.consistency != Strong + s.unsetSocket() + } else if s.consistency == Strong { + s.slaveOk = false + } else if s.masterSocket == nil { + s.slaveOk = true + } + s.m.Unlock() +} + +// Mode returns the current consistency mode for the session. +func (s *Session) Mode() mode { + s.m.RLock() + mode := s.consistency + s.m.RUnlock() + return mode +} + +// SetSyncTimeout sets the amount of time an operation with this session +// will wait before returning an error in case a connection to a usable +// server can't be established. Set it to zero to wait forever. The +// default value is 7 seconds. +func (s *Session) SetSyncTimeout(d time.Duration) { + s.m.Lock() + s.syncTimeout = d + s.m.Unlock() +} + +// SetSocketTimeout sets the amount of time to wait for a non-responding +// socket to the database before it is forcefully closed. +func (s *Session) SetSocketTimeout(d time.Duration) { + s.m.Lock() + s.sockTimeout = d + if s.masterSocket != nil { + s.masterSocket.SetTimeout(d) + } + if s.slaveSocket != nil { + s.slaveSocket.SetTimeout(d) + } + s.m.Unlock() +} + +// SetCursorTimeout changes the standard timeout period that the server +// enforces on created cursors. The only supported value right now is +// 0, which disables the timeout. The standard server timeout is 10 minutes. +func (s *Session) SetCursorTimeout(d time.Duration) { + s.m.Lock() + if d == 0 { + s.queryConfig.op.flags |= flagNoCursorTimeout + } else { + panic("SetCursorTimeout: only 0 (disable timeout) supported for now") + } + s.m.Unlock() +} + +// SetBatch sets the default batch size used when fetching documents from the +// database. It's possible to change this setting on a per-query basis as +// well, using the Query.Batch method. +// +// The default batch size is defined by the database itself. As of this +// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the +// first batch, and 4MB on remaining ones. +func (s *Session) SetBatch(n int) { + if n == 1 { + // Server interprets 1 as -1 and closes the cursor (!?) + n = 2 + } + s.m.Lock() + s.queryConfig.op.limit = int32(n) + s.m.Unlock() +} + +// SetPrefetch sets the default point at which the next batch of results will be +// requested. When there are p*batch_size remaining documents cached in an +// Iter, the next batch will be requested in background. For instance, when +// using this: +// +// session.SetBatch(200) +// session.SetPrefetch(0.25) +// +// and there are only 50 documents cached in the Iter to be processed, the +// next batch of 200 will be requested. It's possible to change this setting on +// a per-query basis as well, using the Prefetch method of Query. +// +// The default prefetch value is 0.25. +func (s *Session) SetPrefetch(p float64) { + s.m.Lock() + s.queryConfig.prefetch = p + s.m.Unlock() +} + +// See SetSafe for details on the Safe type. +type Safe struct { + W int // Min # of servers to ack before success + WMode string // Write mode for MongoDB 2.0+ (e.g. "majority") + WTimeout int // Milliseconds to wait for W before timing out + FSync bool // Should servers sync to disk before returning success + J bool // Wait for next group commit if journaling; no effect otherwise +} + +// Safe returns the current safety mode for the session. +func (s *Session) Safe() (safe *Safe) { + s.m.Lock() + defer s.m.Unlock() + if s.safeOp != nil { + cmd := s.safeOp.query.(*getLastError) + safe = &Safe{WTimeout: cmd.WTimeout, FSync: cmd.FSync, J: cmd.J} + switch w := cmd.W.(type) { + case string: + safe.WMode = w + case int: + safe.W = w + } + } + return +} + +// SetSafe changes the session safety mode. +// +// If the safe parameter is nil, the session is put in unsafe mode, and writes +// become fire-and-forget, without error checking. The unsafe mode is faster +// since operations won't hold on waiting for a confirmation. +// +// If the safe parameter is not nil, any changing query (insert, update, ...) +// will be followed by a getLastError command with the specified parameters, +// to ensure the request was correctly processed. +// +// The safe.W parameter determines how many servers should confirm a write +// before the operation is considered successful. If set to 0 or 1, the +// command will return as soon as the primary is done with the request. +// If safe.WTimeout is greater than zero, it determines how many milliseconds +// to wait for the safe.W servers to respond before returning an error. +// +// Starting with MongoDB 2.0.0 the safe.WMode parameter can be used instead +// of W to request for richer semantics. If set to "majority" the server will +// wait for a majority of members from the replica set to respond before +// returning. Custom modes may also be defined within the server to create +// very detailed placement schemas. See the data awareness documentation in +// the links below for more details (note that MongoDB internally reuses the +// "w" field name for WMode). +// +// If safe.FSync is true and journaling is disabled, the servers will be +// forced to sync all files to disk immediately before returning. If the +// same option is true but journaling is enabled, the server will instead +// await for the next group commit before returning. +// +// Since MongoDB 2.0.0, the safe.J option can also be used instead of FSync +// to force the server to wait for a group commit in case journaling is +// enabled. The option has no effect if the server has journaling disabled. +// +// For example, the following statement will make the session check for +// errors, without imposing further constraints: +// +// session.SetSafe(&mgo.Safe{}) +// +// The following statement will force the server to wait for a majority of +// members of a replica set to return (MongoDB 2.0+ only): +// +// session.SetSafe(&mgo.Safe{WMode: "majority"}) +// +// The following statement, on the other hand, ensures that at least two +// servers have flushed the change to disk before confirming the success +// of operations: +// +// session.EnsureSafe(&mgo.Safe{W: 2, FSync: true}) +// +// The following statement, on the other hand, disables the verification +// of errors entirely: +// +// session.SetSafe(nil) +// +// See also the EnsureSafe method. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/getLastError+Command +// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError +// http://www.mongodb.org/display/DOCS/Data+Center+Awareness +// +func (s *Session) SetSafe(safe *Safe) { + s.m.Lock() + s.safeOp = nil + s.ensureSafe(safe) + s.m.Unlock() +} + +// EnsureSafe compares the provided safety parameters with the ones +// currently in use by the session and picks the most conservative +// choice for each setting. +// +// That is: +// +// - safe.WMode is always used if set. +// - safe.W is used if larger than the current W and WMode is empty. +// - safe.FSync is always used if true. +// - safe.J is used if FSync is false. +// - safe.WTimeout is used if set and smaller than the current WTimeout. +// +// For example, the following statement will ensure the session is +// at least checking for errors, without enforcing further constraints. +// If a more conservative SetSafe or EnsureSafe call was previously done, +// the following call will be ignored. +// +// session.EnsureSafe(&mgo.Safe{}) +// +// See also the SetSafe method for details on what each option means. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/getLastError+Command +// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError +// http://www.mongodb.org/display/DOCS/Data+Center+Awareness +// +func (s *Session) EnsureSafe(safe *Safe) { + s.m.Lock() + s.ensureSafe(safe) + s.m.Unlock() +} + +func (s *Session) ensureSafe(safe *Safe) { + if safe == nil { + return + } + + var w interface{} + if safe.WMode != "" { + w = safe.WMode + } else if safe.W > 0 { + w = safe.W + } + + var cmd getLastError + if s.safeOp == nil { + cmd = getLastError{1, w, safe.WTimeout, safe.FSync, safe.J} + } else { + // Copy. We don't want to mutate the existing query. + cmd = *(s.safeOp.query.(*getLastError)) + if cmd.W == nil { + cmd.W = w + } else if safe.WMode != "" { + cmd.W = safe.WMode + } else if i, ok := cmd.W.(int); ok && safe.W > i { + cmd.W = safe.W + } + if safe.WTimeout > 0 && safe.WTimeout < cmd.WTimeout { + cmd.WTimeout = safe.WTimeout + } + if safe.FSync { + cmd.FSync = true + cmd.J = false + } else if safe.J && !cmd.FSync { + cmd.J = true + } + } + s.safeOp = &queryOp{ + query: &cmd, + collection: "admin.$cmd", + limit: -1, + } +} + +// Run issues the provided command on the "admin" database and +// and unmarshals its result in the respective argument. The cmd +// argument may be either a string with the command name itself, in +// which case an empty document of the form bson.M{cmd: 1} will be used, +// or it may be a full command document. +// +// Note that MongoDB considers the first marshalled key as the command +// name, so when providing a command with options, it's important to +// use an ordering-preserving document, such as a struct value or an +// instance of bson.D. For instance: +// +// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) +// +// For commands on arbitrary databases, see the Run method in +// the Database type. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Commands +// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips +// +func (s *Session) Run(cmd interface{}, result interface{}) error { + return s.DB("admin").Run(cmd, result) +} + +// SelectServers restricts communication to servers configured with the +// given tags. For example, the following statement restricts servers +// used for reading operations to those with both tag "disk" set to +// "ssd" and tag "rack" set to 1: +// +// session.SelectSlaves(bson.D{{"disk", "ssd"}, {"rack", 1}}) +// +// Multiple sets of tags may be provided, in which case the used server +// must match all tags within any one set. +// +// If a connection was previously assigned to the session due to the +// current session mode (see Session.SetMode), the tag selection will +// only be enforced after the session is refreshed. +// +// Relevant documentation: +// +// http://docs.mongodb.org/manual/tutorial/configure-replica-set-tag-sets +// +func (s *Session) SelectServers(tags ...bson.D) { + s.m.Lock() + s.queryConfig.op.serverTags = tags + s.m.Unlock() +} + +// Ping runs a trivial ping command just to get in touch with the server. +func (s *Session) Ping() error { + return s.Run("ping", nil) +} + +// Fsync flushes in-memory writes to disk on the server the session +// is established with. If async is true, the call returns immediately, +// otherwise it returns after the flush has been made. +func (s *Session) Fsync(async bool) error { + return s.Run(bson.D{{"fsync", 1}, {"async", async}}, nil) +} + +// FsyncLock locks all writes in the specific server the session is +// established with and returns. Any writes attempted to the server +// after it is successfully locked will block until FsyncUnlock is +// called for the same server. +// +// This method works on secondaries as well, preventing the oplog from +// being flushed while the server is locked, but since only the server +// connected to is locked, for locking specific secondaries it may be +// necessary to establish a connection directly to the secondary (see +// Dial's connect=direct option). +// +// As an important caveat, note that once a write is attempted and +// blocks, follow up reads will block as well due to the way the +// lock is internally implemented in the server. More details at: +// +// https://jira.mongodb.org/browse/SERVER-4243 +// +// FsyncLock is often used for performing consistent backups of +// the database files on disk. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/fsync+Command +// http://www.mongodb.org/display/DOCS/Backups +// +func (s *Session) FsyncLock() error { + return s.Run(bson.D{{"fsync", 1}, {"lock", true}}, nil) +} + +// FsyncUnlock releases the server for writes. See FsyncLock for details. +func (s *Session) FsyncUnlock() error { + return s.DB("admin").C("$cmd.sys.unlock").Find(nil).One(nil) // WTF? +} + +// Find prepares a query using the provided document. The document may be a +// map or a struct value capable of being marshalled with bson. The map +// may be a generic one using interface{} for its key and/or values, such as +// bson.M, or it may be a properly typed map. Providing nil as the document +// is equivalent to providing an empty document such as bson.M{}. +// +// Further details of the query may be tweaked using the resulting Query value, +// and then executed to retrieve results using methods such as One, For, +// Iter, or Tail. +// +// In case the resulting document includes a field named $err or errmsg, which +// are standard ways for MongoDB to return query errors, the returned err will +// be set to a *QueryError value including the Err message and the Code. In +// those cases, the result argument is still unmarshalled into with the +// received document so that any other custom values may be obtained if +// desired. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Querying +// http://www.mongodb.org/display/DOCS/Advanced+Queries +// +func (c *Collection) Find(query interface{}) *Query { + session := c.Database.Session + session.m.RLock() + q := &Query{session: session, query: session.queryConfig} + session.m.RUnlock() + q.op.query = query + q.op.collection = c.FullName + return q +} + +// FindId is a convenience helper equivalent to: +// +// query := collection.Find(bson.M{"_id": id}) +// +// See the Find method for more details. +func (c *Collection) FindId(id interface{}) *Query { + return c.Find(bson.D{{"_id", id}}) +} + +type Pipe struct { + session *Session + collection *Collection + pipeline interface{} +} + +// Pipe prepares a pipeline to aggregate. The pipeline document +// must be a slice built in terms of the aggregation framework language. +// +// For example: +// +// pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}}) +// iter := pipe.Iter() +// +// Relevant documentation: +// +// http://docs.mongodb.org/manual/reference/aggregation +// http://docs.mongodb.org/manual/applications/aggregation +// http://docs.mongodb.org/manual/tutorial/aggregation-examples +// +func (c *Collection) Pipe(pipeline interface{}) *Pipe { + session := c.Database.Session + return &Pipe{ + session: session, + collection: c, + pipeline: pipeline, + } +} + +// Iter executes the pipeline and returns an iterator capable of going +// over all the generated results. +func (p *Pipe) Iter() *Iter { + iter := &Iter{ + session: p.session, + timeout: -1, + } + iter.gotReply.L = &iter.m + var result struct{ Result []bson.Raw } + c := p.collection + iter.err = c.Database.Run(bson.D{{"aggregate", c.Name}, {"pipeline", p.pipeline}}, &result) + if iter.err != nil { + return iter + } + for i := range result.Result { + iter.docData.Push(result.Result[i].Data) + } + return iter +} + +// All works like Iter.All. +func (p *Pipe) All(result interface{}) error { + return p.Iter().All(result) +} + +// One executes the pipeline and unmarshals the first item from the +// result set into the result parameter. +// It returns ErrNotFound if no items are generated by the pipeline. +func (p *Pipe) One(result interface{}) error { + iter := p.Iter() + if iter.Next(result) { + return nil + } + if err := iter.Err(); err != nil { + return err + } + return ErrNotFound +} + +type LastError struct { + Err string + Code, N, Waited int + FSyncFiles int `bson:"fsyncFiles"` + WTimeout bool + UpdatedExisting bool `bson:"updatedExisting"` + UpsertedId interface{} `bson:"upserted"` +} + +func (err *LastError) Error() string { + return err.Err +} + +type queryError struct { + Err string "$err" + ErrMsg string + Assertion string + Code int + AssertionCode int "assertionCode" + LastError *LastError "lastErrorObject" +} + +type QueryError struct { + Code int + Message string + Assertion bool +} + +func (err *QueryError) Error() string { + return err.Message +} + +// IsDup returns whether err informs of a duplicate key error because +// a primary key index or a secondary unique index already has an entry +// with the given value. +func IsDup(err error) bool { + // Besides being handy, helps with MongoDB bugs SERVER-7164 and SERVER-11493. + // What follows makes me sad. Hopefully conventions will be more clear over time. + switch e := err.(type) { + case *LastError: + return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 || e.Code == 16460 && strings.Contains(e.Err, " E11000 ") + case *QueryError: + return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 + } + return false +} + +// Insert inserts one or more documents in the respective collection. In +// case the session is in safe mode (see the SetSafe method) and an error +// happens while inserting the provided documents, the returned error will +// be of type *LastError. +func (c *Collection) Insert(docs ...interface{}) error { + _, err := c.writeQuery(&insertOp{c.FullName, docs, 0}) + return err +} + +// Update finds a single document matching the provided selector document +// and modifies it according to the update document. +// If the session is in safe mode (see SetSafe) a ErrNotFound error is +// returned if a document isn't found, or a value of type *LastError +// when some other error is detected. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Updating +// http://www.mongodb.org/display/DOCS/Atomic+Operations +// +func (c *Collection) Update(selector interface{}, update interface{}) error { + lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 0}) + if err == nil && lerr != nil && !lerr.UpdatedExisting { + return ErrNotFound + } + return err +} + +// UpdateId is a convenience helper equivalent to: +// +// err := collection.Update(bson.M{"_id": id}, update) +// +// See the Update method for more details. +func (c *Collection) UpdateId(id interface{}, update interface{}) error { + return c.Update(bson.D{{"_id", id}}, update) +} + +// ChangeInfo holds details about the outcome of an update operation. +type ChangeInfo struct { + Updated int // Number of existing documents updated + Removed int // Number of documents removed + UpsertedId interface{} // Upserted _id field, when not explicitly provided +} + +// UpdateAll finds all documents matching the provided selector document +// and modifies them according to the update document. +// If the session is in safe mode (see SetSafe) details of the executed +// operation are returned in info or an error of type *LastError when +// some problem is detected. It is not an error for the update to not be +// applied on any documents because the selector doesn't match. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Updating +// http://www.mongodb.org/display/DOCS/Atomic+Operations +// +func (c *Collection) UpdateAll(selector interface{}, update interface{}) (info *ChangeInfo, err error) { + lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 2}) + if err == nil && lerr != nil { + info = &ChangeInfo{Updated: lerr.N} + } + return info, err +} + +// Upsert finds a single document matching the provided selector document +// and modifies it according to the update document. If no document matching +// the selector is found, the update document is applied to the selector +// document and the result is inserted in the collection. +// If the session is in safe mode (see SetSafe) details of the executed +// operation are returned in info, or an error of type *LastError when +// some problem is detected. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Updating +// http://www.mongodb.org/display/DOCS/Atomic+Operations +// +func (c *Collection) Upsert(selector interface{}, update interface{}) (info *ChangeInfo, err error) { + lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 1}) + if err == nil && lerr != nil { + info = &ChangeInfo{} + if lerr.UpdatedExisting { + info.Updated = lerr.N + } else { + info.UpsertedId = lerr.UpsertedId + } + } + return info, err +} + +// UpsertId is a convenience helper equivalent to: +// +// info, err := collection.Upsert(bson.M{"_id": id}, update) +// +// See the Upsert method for more details. +func (c *Collection) UpsertId(id interface{}, update interface{}) (info *ChangeInfo, err error) { + return c.Upsert(bson.D{{"_id", id}}, update) +} + +// Remove finds a single document matching the provided selector document +// and removes it from the database. +// If the session is in safe mode (see SetSafe) a ErrNotFound error is +// returned if a document isn't found, or a value of type *LastError +// when some other error is detected. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Removing +// +func (c *Collection) Remove(selector interface{}) error { + lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 1}) + if err == nil && lerr != nil && lerr.N == 0 { + return ErrNotFound + } + return err +} + +// RemoveId is a convenience helper equivalent to: +// +// err := collection.Remove(bson.M{"_id": id}) +// +// See the Remove method for more details. +func (c *Collection) RemoveId(id interface{}) error { + return c.Remove(bson.D{{"_id", id}}) +} + +// RemoveAll finds all documents matching the provided selector document +// and removes them from the database. In case the session is in safe mode +// (see the SetSafe method) and an error happens when attempting the change, +// the returned error will be of type *LastError. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Removing +// +func (c *Collection) RemoveAll(selector interface{}) (info *ChangeInfo, err error) { + lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 0}) + if err == nil && lerr != nil { + info = &ChangeInfo{Removed: lerr.N} + } + return info, err +} + +// DropDatabase removes the entire database including all of its collections. +func (db *Database) DropDatabase() error { + return db.Run(bson.D{{"dropDatabase", 1}}, nil) +} + +// DropCollection removes the entire collection including all of its documents. +func (c *Collection) DropCollection() error { + return c.Database.Run(bson.D{{"drop", c.Name}}, nil) +} + +// The CollectionInfo type holds metadata about a collection. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/createCollection+Command +// http://www.mongodb.org/display/DOCS/Capped+Collections +// +type CollectionInfo struct { + // DisableIdIndex prevents the automatic creation of the index + // on the _id field for the collection. + DisableIdIndex bool + + // ForceIdIndex enforces the automatic creation of the index + // on the _id field for the collection. Capped collections, + // for example, do not have such an index by default. + ForceIdIndex bool + + // If Capped is true new documents will replace old ones when + // the collection is full. MaxBytes must necessarily be set + // to define the size when the collection wraps around. + // MaxDocs optionally defines the number of documents when it + // wraps, but MaxBytes still needs to be set. + Capped bool + MaxBytes int + MaxDocs int +} + +// Create explicitly creates the c collection with details of info. +// MongoDB creates collections automatically on use, so this method +// is only necessary when creating collection with non-default +// characteristics, such as capped collections. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/createCollection+Command +// http://www.mongodb.org/display/DOCS/Capped+Collections +// +func (c *Collection) Create(info *CollectionInfo) error { + cmd := make(bson.D, 0, 4) + cmd = append(cmd, bson.DocElem{"create", c.Name}) + if info.Capped { + if info.MaxBytes < 1 { + return fmt.Errorf("Collection.Create: with Capped, MaxBytes must also be set") + } + cmd = append(cmd, bson.DocElem{"capped", true}) + cmd = append(cmd, bson.DocElem{"size", info.MaxBytes}) + if info.MaxDocs > 0 { + cmd = append(cmd, bson.DocElem{"max", info.MaxDocs}) + } + } + if info.DisableIdIndex { + cmd = append(cmd, bson.DocElem{"autoIndexId", false}) + } + if info.ForceIdIndex { + cmd = append(cmd, bson.DocElem{"autoIndexId", true}) + } + return c.Database.Run(cmd, nil) +} + +// Batch sets the batch size used when fetching documents from the database. +// It's possible to change this setting on a per-session basis as well, using +// the Batch method of Session. +// +// The default batch size is defined by the database itself. As of this +// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the +// first batch, and 4MB on remaining ones. +func (q *Query) Batch(n int) *Query { + if n == 1 { + // Server interprets 1 as -1 and closes the cursor (!?) + n = 2 + } + q.m.Lock() + q.op.limit = int32(n) + q.m.Unlock() + return q +} + +// Prefetch sets the point at which the next batch of results will be requested. +// When there are p*batch_size remaining documents cached in an Iter, the next +// batch will be requested in background. For instance, when using this: +// +// query.Batch(200).Prefetch(0.25) +// +// and there are only 50 documents cached in the Iter to be processed, the +// next batch of 200 will be requested. It's possible to change this setting on +// a per-session basis as well, using the SetPrefetch method of Session. +// +// The default prefetch value is 0.25. +func (q *Query) Prefetch(p float64) *Query { + q.m.Lock() + q.prefetch = p + q.m.Unlock() + return q +} + +// Skip skips over the n initial documents from the query results. Note that +// this only makes sense with capped collections where documents are naturally +// ordered by insertion time, or with sorted results. +func (q *Query) Skip(n int) *Query { + q.m.Lock() + q.op.skip = int32(n) + q.m.Unlock() + return q +} + +// Limit restricts the maximum number of documents retrieved to n, and also +// changes the batch size to the same value. Once n documents have been +// returned by Next, the following call will return ErrNotFound. +func (q *Query) Limit(n int) *Query { + q.m.Lock() + switch { + case n == 1: + q.limit = 1 + q.op.limit = -1 + case n == math.MinInt32: // -MinInt32 == -MinInt32 + q.limit = math.MaxInt32 + q.op.limit = math.MinInt32 + 1 + case n < 0: + q.limit = int32(-n) + q.op.limit = int32(n) + default: + q.limit = int32(n) + q.op.limit = int32(n) + } + q.m.Unlock() + return q +} + +// Select enables selecting which fields should be retrieved for the results +// found. For example, the following query would only retrieve the name field: +// +// err := collection.Find(nil).Select(bson.M{"name": 1}).One(&result) +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields +// +func (q *Query) Select(selector interface{}) *Query { + q.m.Lock() + q.op.selector = selector + q.m.Unlock() + return q +} + +// Sort asks the database to order returned documents according to the +// provided field names. A field name may be prefixed by - (minus) for +// it to be sorted in reverse order. +// +// For example: +// +// query1 := collection.Find(nil).Sort("firstname", "lastname") +// query2 := collection.Find(nil).Sort("-age") +// query3 := collection.Find(nil).Sort("$natural") +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order +// +func (q *Query) Sort(fields ...string) *Query { + // TODO // query4 := collection.Find(nil).Sort("score:{$meta:textScore}") + q.m.Lock() + var order bson.D + for _, field := range fields { + n := 1 + if field != "" { + switch field[0] { + case '+': + field = field[1:] + case '-': + n = -1 + field = field[1:] + } + } + if field == "" { + panic("Sort: empty field name") + } + order = append(order, bson.DocElem{field, n}) + } + q.op.options.OrderBy = order + q.op.hasOptions = true + q.m.Unlock() + return q +} + +// Explain returns a number of details about how the MongoDB server would +// execute the requested query, such as the number of objects examined, +// the number of time the read lock was yielded to allow writes to go in, +// and so on. +// +// For example: +// +// m := bson.M{} +// err := collection.Find(bson.M{"filename": name}).Explain(m) +// if err == nil { +// fmt.Printf("Explain: %#v\n", m) +// } +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Optimization +// http://www.mongodb.org/display/DOCS/Query+Optimizer +// +func (q *Query) Explain(result interface{}) error { + q.m.Lock() + clone := &Query{session: q.session, query: q.query} + q.m.Unlock() + clone.op.options.Explain = true + clone.op.hasOptions = true + if clone.op.limit > 0 { + clone.op.limit = -q.op.limit + } + iter := clone.Iter() + if iter.Next(result) { + return nil + } + return iter.Close() +} + +// Hint will include an explicit "hint" in the query to force the server +// to use a specified index, potentially improving performance in some +// situations. The provided parameters are the fields that compose the +// key of the index to be used. For details on how the indexKey may be +// built, see the EnsureIndex method. +// +// For example: +// +// query := collection.Find(bson.M{"firstname": "Joe", "lastname": "Winter"}) +// query.Hint("lastname", "firstname") +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Optimization +// http://www.mongodb.org/display/DOCS/Query+Optimizer +// +func (q *Query) Hint(indexKey ...string) *Query { + q.m.Lock() + _, realKey, err := parseIndexKey(indexKey) + q.op.options.Hint = realKey + q.op.hasOptions = true + q.m.Unlock() + if err != nil { + panic(err) + } + return q +} + +// Snapshot will force the performed query to make use of an available +// index on the _id field to prevent the same document from being returned +// more than once in a single iteration. This might happen without this +// setting in situations when the document changes in size and thus has to +// be moved while the iteration is running. +// +// Because snapshot mode traverses the _id index, it may not be used with +// sorting or explicit hints. It also cannot use any other index for the +// query. +// +// Even with snapshot mode, items inserted or deleted during the query may +// or may not be returned; that is, this mode is not a true point-in-time +// snapshot. +// +// The same effect of Snapshot may be obtained by using any unique index on +// field(s) that will not be modified (best to use Hint explicitly too). +// A non-unique index (such as creation time) may be made unique by +// appending _id to the index when creating it. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database +// +func (q *Query) Snapshot() *Query { + q.m.Lock() + q.op.options.Snapshot = true + q.op.hasOptions = true + q.m.Unlock() + return q +} + +// LogReplay enables an option that optimizes queries that are typically +// made on the MongoDB oplog for replaying it. This is an internal +// implementation aspect and most likely uninteresting for other uses. +// It has seen at least one use case, though, so it's exposed via the API. +func (q *Query) LogReplay() *Query { + q.m.Lock() + q.op.flags |= flagLogReplay + q.m.Unlock() + return q +} + +func checkQueryError(fullname string, d []byte) error { + l := len(d) + if l < 16 { + return nil + } + if d[5] == '$' && d[6] == 'e' && d[7] == 'r' && d[8] == 'r' && d[9] == '\x00' && d[4] == '\x02' { + goto Error + } + if len(fullname) < 5 || fullname[len(fullname)-5:] != ".$cmd" { + return nil + } + for i := 0; i+8 < l; i++ { + if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { + goto Error + } + } + return nil + +Error: + result := &queryError{} + bson.Unmarshal(d, result) + logf("queryError: %#v\n", result) + if result.LastError != nil { + return result.LastError + } + if result.Err == "" && result.ErrMsg == "" { + return nil + } + if result.AssertionCode != 0 && result.Assertion != "" { + return &QueryError{Code: result.AssertionCode, Message: result.Assertion, Assertion: true} + } + if result.Err != "" { + return &QueryError{Code: result.Code, Message: result.Err} + } + return &QueryError{Code: result.Code, Message: result.ErrMsg} +} + +// One executes the query and unmarshals the first obtained document into the +// result argument. The result must be a struct or map value capable of being +// unmarshalled into by gobson. This function blocks until either a result +// is available or an error happens. For example: +// +// err := collection.Find(bson.M{"a", 1}).One(&result) +// +// In case the resulting document includes a field named $err or errmsg, which +// are standard ways for MongoDB to return query errors, the returned err will +// be set to a *QueryError value including the Err message and the Code. In +// those cases, the result argument is still unmarshalled into with the +// received document so that any other custom values may be obtained if +// desired. +// +func (q *Query) One(result interface{}) (err error) { + q.m.Lock() + session := q.session + op := q.op // Copy. + q.m.Unlock() + + socket, err := session.acquireSocket(true) + if err != nil { + return err + } + defer socket.Release() + + op.flags |= session.slaveOkFlag() + op.limit = -1 + + data, err := socket.SimpleQuery(&op) + if err != nil { + return err + } + if data == nil { + return ErrNotFound + } + if result != nil { + err = bson.Unmarshal(data, result) + if err == nil { + debugf("Query %p document unmarshaled: %#v", q, result) + } else { + debugf("Query %p document unmarshaling failed: %#v", q, err) + return err + } + } + return checkQueryError(op.collection, data) +} + +// The DBRef type implements support for the database reference MongoDB +// convention as supported by multiple drivers. This convention enables +// cross-referencing documents between collections and databases using +// a structure which includes a collection name, a document id, and +// optionally a database name. +// +// See the FindRef methods on Session and on Database. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Database+References +// +type DBRef struct { + Collection string `bson:"$ref"` + Id interface{} `bson:"$id"` + Database string `bson:"$db,omitempty"` +} + +// NOTE: Order of fields for DBRef above does matter, per documentation. + +// FindRef returns a query that looks for the document in the provided +// reference. If the reference includes the DB field, the document will +// be retrieved from the respective database. +// +// See also the DBRef type and the FindRef method on Session. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Database+References +// +func (db *Database) FindRef(ref *DBRef) *Query { + var c *Collection + if ref.Database == "" { + c = db.C(ref.Collection) + } else { + c = db.Session.DB(ref.Database).C(ref.Collection) + } + return c.FindId(ref.Id) +} + +// FindRef returns a query that looks for the document in the provided +// reference. For a DBRef to be resolved correctly at the session level +// it must necessarily have the optional DB field defined. +// +// See also the DBRef type and the FindRef method on Database. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Database+References +// +func (s *Session) FindRef(ref *DBRef) *Query { + if ref.Database == "" { + panic(errors.New(fmt.Sprintf("Can't resolve database for %#v", ref))) + } + c := s.DB(ref.Database).C(ref.Collection) + return c.FindId(ref.Id) +} + +// CollectionNames returns the collection names present in database. +func (db *Database) CollectionNames() (names []string, err error) { + c := len(db.Name) + 1 + iter := db.C("system.namespaces").Find(nil).Iter() + var result *struct{ Name string } + for iter.Next(&result) { + if strings.Index(result.Name, "$") < 0 || strings.Index(result.Name, ".oplog.$") >= 0 { + names = append(names, result.Name[c:]) + } + } + if err := iter.Close(); err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +type dbNames struct { + Databases []struct { + Name string + Empty bool + } +} + +// DatabaseNames returns the names of non-empty databases present in the cluster. +func (s *Session) DatabaseNames() (names []string, err error) { + var result dbNames + err = s.Run("listDatabases", &result) + if err != nil { + return nil, err + } + for _, db := range result.Databases { + if !db.Empty { + names = append(names, db.Name) + } + } + sort.Strings(names) + return names, nil +} + +// Iter executes the query and returns an iterator capable of going over all +// the results. Results will be returned in batches of configurable +// size (see the Batch method) and more documents will be requested when a +// configurable number of documents is iterated over (see the Prefetch method). +func (q *Query) Iter() *Iter { + q.m.Lock() + session := q.session + op := q.op + prefetch := q.prefetch + limit := q.limit + q.m.Unlock() + + iter := &Iter{ + session: session, + prefetch: prefetch, + limit: limit, + timeout: -1, + } + iter.gotReply.L = &iter.m + iter.op.collection = op.collection + iter.op.limit = op.limit + iter.op.replyFunc = iter.replyFunc() + iter.docsToReceive++ + op.replyFunc = iter.op.replyFunc + op.flags |= session.slaveOkFlag() + + socket, err := session.acquireSocket(true) + if err != nil { + iter.err = err + } else { + iter.server = socket.Server() + err = socket.Query(&op) + if err != nil { + // Must lock as the query above may call replyFunc. + iter.m.Lock() + iter.err = err + iter.m.Unlock() + } + socket.Release() + } + return iter +} + +// Tail returns a tailable iterator. Unlike a normal iterator, a +// tailable iterator may wait for new values to be inserted in the +// collection once the end of the current result set is reached, +// A tailable iterator may only be used with capped collections. +// +// The timeout parameter indicates how long Next will block waiting +// for a result before timing out. If set to -1, Next will not +// timeout, and will continue waiting for a result for as long as +// the cursor is valid and the session is not closed. If set to 0, +// Next times out as soon as it reaches the end of the result set. +// Otherwise, Next will wait for at least the given number of +// seconds for a new document to be available before timing out. +// +// On timeouts, Next will unblock and return false, and the Timeout +// method will return true if called. In these cases, Next may still +// be called again on the same iterator to check if a new value is +// available at the current cursor position, and again it will block +// according to the specified timeoutSecs. If the cursor becomes +// invalid, though, both Next and Timeout will return false and +// the query must be restarted. +// +// The following example demonstrates timeout handling and query +// restarting: +// +// iter := collection.Find(nil).Sort("$natural").Tail(5 * time.Second) +// for { +// for iter.Next(&result) { +// fmt.Println(result.Id) +// lastId = result.Id +// } +// if iter.Err() != nil { +// return iter.Close() +// } +// if iter.Timeout() { +// continue +// } +// query := collection.Find(bson.M{"_id": bson.M{"$gt": lastId}}) +// iter = query.Sort("$natural").Tail(5 * time.Second) +// } +// iter.Close() +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Tailable+Cursors +// http://www.mongodb.org/display/DOCS/Capped+Collections +// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order +// +func (q *Query) Tail(timeout time.Duration) *Iter { + q.m.Lock() + session := q.session + op := q.op + prefetch := q.prefetch + q.m.Unlock() + + iter := &Iter{session: session, prefetch: prefetch} + iter.gotReply.L = &iter.m + iter.timeout = timeout + iter.op.collection = op.collection + iter.op.limit = op.limit + iter.op.replyFunc = iter.replyFunc() + iter.docsToReceive++ + op.replyFunc = iter.op.replyFunc + op.flags |= flagTailable | flagAwaitData | session.slaveOkFlag() + + socket, err := session.acquireSocket(true) + if err != nil { + iter.err = err + } else { + iter.server = socket.Server() + err = socket.Query(&op) + if err != nil { + // Must lock as the query above may call replyFunc. + iter.m.Lock() + iter.err = err + iter.m.Unlock() + } + socket.Release() + } + return iter +} + +func (s *Session) slaveOkFlag() (flag queryOpFlags) { + s.m.RLock() + if s.slaveOk { + flag = flagSlaveOk + } + s.m.RUnlock() + return +} + +// Err returns nil if no errors happened during iteration, or the actual +// error otherwise. +// +// In case a resulting document included a field named $err or errmsg, which are +// standard ways for MongoDB to report an improper query, the returned value has +// a *QueryError type, and includes the Err message and the Code. +func (iter *Iter) Err() error { + iter.m.Lock() + err := iter.err + iter.m.Unlock() + if err == ErrNotFound { + return nil + } + return err +} + +// Close kills the server cursor used by the iterator, if any, and returns +// nil if no errors happened during iteration, or the actual error otherwise. +// +// Server cursors are automatically closed at the end of an iteration, which +// means close will do nothing unless the iteration was interrupted before +// the server finished sending results to the driver. If Close is not called +// in such a situation, the cursor will remain available at the server until +// the default cursor timeout period is reached. No further problems arise. +// +// Close is idempotent. That means it can be called repeatedly and will +// return the same result every time. +// +// In case a resulting document included a field named $err or errmsg, which are +// standard ways for MongoDB to report an improper query, the returned value has +// a *QueryError type. +func (iter *Iter) Close() error { + iter.m.Lock() + iter.killCursor() + err := iter.err + iter.m.Unlock() + if err == ErrNotFound { + return nil + } + return err +} + +func (iter *Iter) killCursor() error { + if iter.op.cursorId != 0 { + socket, err := iter.acquireSocket() + if err == nil { + // TODO Batch kills. + err = socket.Query(&killCursorsOp{[]int64{iter.op.cursorId}}) + socket.Release() + } + if err != nil && (iter.err == nil || iter.err == ErrNotFound) { + iter.err = err + } + iter.op.cursorId = 0 + return err + } + return nil +} + +// Timeout returns true if Next returned false due to a timeout of +// a tailable cursor. In those cases, Next may be called again to continue +// the iteration at the previous cursor position. +func (iter *Iter) Timeout() bool { + iter.m.Lock() + result := iter.timedout + iter.m.Unlock() + return result +} + +// Next retrieves the next document from the result set, blocking if necessary. +// This method will also automatically retrieve another batch of documents from +// the server when the current one is exhausted, or before that in background +// if pre-fetching is enabled (see the Query.Prefetch and Session.SetPrefetch +// methods). +// +// Next returns true if a document was successfully unmarshalled onto result, +// and false at the end of the result set or if an error happened. +// When Next returns false, the Err method should be called to verify if +// there was an error during iteration. +// +// For example: +// +// iter := collection.Find(nil).Iter() +// for iter.Next(&result) { +// fmt.Printf("Result: %v\n", result.Id) +// } +// if err := iter.Close(); err != nil { +// return err +// } +// +func (iter *Iter) Next(result interface{}) bool { + iter.m.Lock() + iter.timedout = false + timeout := time.Time{} + for iter.err == nil && iter.docData.Len() == 0 && (iter.docsToReceive > 0 || iter.op.cursorId != 0) { + if iter.docsToReceive == 0 { + if iter.timeout >= 0 { + if timeout.IsZero() { + timeout = time.Now().Add(iter.timeout) + } + if time.Now().After(timeout) { + iter.timedout = true + iter.m.Unlock() + return false + } + } + iter.getMore() + if iter.err != nil { + break + } + } + iter.gotReply.Wait() + } + + // Exhaust available data before reporting any errors. + if docData, ok := iter.docData.Pop().([]byte); ok { + if iter.limit > 0 { + iter.limit-- + if iter.limit == 0 { + if iter.docData.Len() > 0 { + iter.m.Unlock() + panic(fmt.Errorf("data remains after limit exhausted: %d", iter.docData.Len())) + } + iter.err = ErrNotFound + if iter.killCursor() != nil { + iter.m.Unlock() + return false + } + } + } + if iter.op.cursorId != 0 && iter.err == nil { + if iter.docsBeforeMore == 0 { + iter.getMore() + } + iter.docsBeforeMore-- // Goes negative. + } + iter.m.Unlock() + err := bson.Unmarshal(docData, result) + if err != nil { + debugf("Iter %p document unmarshaling failed: %#v", iter, err) + iter.m.Lock() + if iter.err == nil { + iter.err = err + } + iter.m.Unlock() + return false + } + debugf("Iter %p document unmarshaled: %#v", iter, result) + // XXX Only have to check first document for a query error? + err = checkQueryError(iter.op.collection, docData) + if err != nil { + iter.m.Lock() + if iter.err == nil { + iter.err = err + } + iter.m.Unlock() + return false + } + return true + } else if iter.err != nil { + debugf("Iter %p returning false: %s", iter, iter.err) + iter.m.Unlock() + return false + } else if iter.op.cursorId == 0 { + iter.err = ErrNotFound + debugf("Iter %p exhausted with cursor=0", iter) + iter.m.Unlock() + return false + } + + panic("unreachable") +} + +// All retrieves all documents from the result set into the provided slice +// and closes the iterator. +// +// The result argument must necessarily be the address for a slice. The slice +// may be nil or previously allocated. +// +// WARNING: Obviously, All must not be used with result sets that may be +// potentially large, since it may consume all memory until the system +// crashes. Consider building the query with a Limit clause to ensure the +// result size is bounded. +// +// For instance: +// +// var result []struct{ Value int } +// iter := collection.Find(nil).Limit(100).Iter() +// err := iter.All(&result) +// if err != nil { +// return err +// } +// +func (iter *Iter) All(result interface{}) error { + resultv := reflect.ValueOf(result) + if resultv.Kind() != reflect.Ptr || resultv.Elem().Kind() != reflect.Slice { + panic("result argument must be a slice address") + } + slicev := resultv.Elem() + slicev = slicev.Slice(0, slicev.Cap()) + elemt := slicev.Type().Elem() + i := 0 + for { + if slicev.Len() == i { + elemp := reflect.New(elemt) + if !iter.Next(elemp.Interface()) { + break + } + slicev = reflect.Append(slicev, elemp.Elem()) + slicev = slicev.Slice(0, slicev.Cap()) + } else { + if !iter.Next(slicev.Index(i).Addr().Interface()) { + break + } + } + i++ + } + resultv.Elem().Set(slicev.Slice(0, i)) + return iter.Close() +} + +// All works like Iter.All. +func (q *Query) All(result interface{}) error { + return q.Iter().All(result) +} + +// The For method is obsolete and will be removed in a future release. +// See Iter as an elegant replacement. +func (q *Query) For(result interface{}, f func() error) error { + return q.Iter().For(result, f) +} + +// The For method is obsolete and will be removed in a future release. +// See Iter as an elegant replacement. +func (iter *Iter) For(result interface{}, f func() error) (err error) { + valid := false + v := reflect.ValueOf(result) + if v.Kind() == reflect.Ptr { + v = v.Elem() + switch v.Kind() { + case reflect.Map, reflect.Ptr, reflect.Interface, reflect.Slice: + valid = v.IsNil() + } + } + if !valid { + panic("For needs a pointer to nil reference value. See the documentation.") + } + zero := reflect.Zero(v.Type()) + for { + v.Set(zero) + if !iter.Next(result) { + break + } + err = f() + if err != nil { + return err + } + } + return iter.Err() +} + +func (iter *Iter) acquireSocket() (*mongoSocket, error) { + socket, err := iter.session.acquireSocket(true) + if err != nil { + return nil, err + } + if socket.Server() != iter.server { + // Socket server changed during iteration. This may happen + // with Eventual sessions, if a Refresh is done, or if a + // monotonic session gets a write and shifts from secondary + // to primary. Our cursor is in a specific server, though. + iter.session.m.Lock() + sockTimeout := iter.session.sockTimeout + iter.session.m.Unlock() + socket.Release() + socket, _, err = iter.server.AcquireSocket(0, sockTimeout) + if err != nil { + return nil, err + } + err := iter.session.socketLogin(socket) + if err != nil { + socket.Release() + return nil, err + } + } + return socket, nil +} + +func (iter *Iter) getMore() { + socket, err := iter.acquireSocket() + if err != nil { + iter.err = err + return + } + defer socket.Release() + + debugf("Iter %p requesting more documents", iter) + if iter.limit > 0 { + limit := iter.limit - int32(iter.docsToReceive) - int32(iter.docData.Len()) + if limit < iter.op.limit { + iter.op.limit = limit + } + } + if err := socket.Query(&iter.op); err != nil { + iter.err = err + } + iter.docsToReceive++ +} + +type countCmd struct { + Count string + Query interface{} + Limit int32 ",omitempty" + Skip int32 ",omitempty" +} + +// Count returns the total number of documents in the result set. +func (q *Query) Count() (n int, err error) { + q.m.Lock() + session := q.session + op := q.op + limit := q.limit + q.m.Unlock() + + c := strings.Index(op.collection, ".") + if c < 0 { + return 0, errors.New("Bad collection name: " + op.collection) + } + + dbname := op.collection[:c] + cname := op.collection[c+1:] + + result := struct{ N int }{} + err = session.DB(dbname).Run(countCmd{cname, op.query, limit, op.skip}, &result) + return result.N, err +} + +// Count returns the total number of documents in the collection. +func (c *Collection) Count() (n int, err error) { + return c.Find(nil).Count() +} + +type distinctCmd struct { + Collection string "distinct" + Key string + Query interface{} ",omitempty" +} + +// Distinct returns a list of distinct values for the given key within +// the result set. The list of distinct values will be unmarshalled +// in the "values" key of the provided result parameter. +// +// For example: +// +// var result []int +// err := collection.Find(bson.M{"gender": "F"}).Distinct("age", &result) +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/Aggregation +// +func (q *Query) Distinct(key string, result interface{}) error { + q.m.Lock() + session := q.session + op := q.op // Copy. + q.m.Unlock() + + c := strings.Index(op.collection, ".") + if c < 0 { + return errors.New("Bad collection name: " + op.collection) + } + + dbname := op.collection[:c] + cname := op.collection[c+1:] + + var doc struct{ Values bson.Raw } + err := session.DB(dbname).Run(distinctCmd{cname, key, op.query}, &doc) + if err != nil { + return err + } + return doc.Values.Unmarshal(result) +} + +type mapReduceCmd struct { + Collection string "mapreduce" + Map string ",omitempty" + Reduce string ",omitempty" + Finalize string ",omitempty" + Limit int32 ",omitempty" + Out interface{} + Query interface{} ",omitempty" + Sort interface{} ",omitempty" + Scope interface{} ",omitempty" + Verbose bool ",omitempty" +} + +type mapReduceResult struct { + Results bson.Raw + Result bson.Raw + TimeMillis int64 "timeMillis" + Counts struct{ Input, Emit, Output int } + Ok bool + Err string + Timing *MapReduceTime +} + +type MapReduce struct { + Map string // Map Javascript function code (required) + Reduce string // Reduce Javascript function code (required) + Finalize string // Finalize Javascript function code (optional) + Out interface{} // Output collection name or document. If nil, results are inlined into the result parameter. + Scope interface{} // Optional global scope for Javascript functions + Verbose bool +} + +type MapReduceInfo struct { + InputCount int // Number of documents mapped + EmitCount int // Number of times reduce called emit + OutputCount int // Number of documents in resulting collection + Database string // Output database, if results are not inlined + Collection string // Output collection, if results are not inlined + Time int64 // Time to run the job, in nanoseconds + VerboseTime *MapReduceTime // Only defined if Verbose was true +} + +type MapReduceTime struct { + Total int64 // Total time, in nanoseconds + Map int64 "mapTime" // Time within map function, in nanoseconds + EmitLoop int64 "emitLoop" // Time within the emit/map loop, in nanoseconds +} + +// MapReduce executes a map/reduce job for documents covered by the query. +// That kind of job is suitable for very flexible bulk aggregation of data +// performed at the server side via Javascript functions. +// +// Results from the job may be returned as a result of the query itself +// through the result parameter in case they'll certainly fit in memory +// and in a single document. If there's the possibility that the amount +// of data might be too large, results must be stored back in an alternative +// collection or even a separate database, by setting the Out field of the +// provided MapReduce job. In that case, provide nil as the result parameter. +// +// These are some of the ways to set Out: +// +// nil +// Inline results into the result parameter. +// +// bson.M{"replace": "mycollection"} +// The output will be inserted into a collection which replaces any +// existing collection with the same name. +// +// bson.M{"merge": "mycollection"} +// This option will merge new data into the old output collection. In +// other words, if the same key exists in both the result set and the +// old collection, the new key will overwrite the old one. +// +// bson.M{"reduce": "mycollection"} +// If documents exist for a given key in the result set and in the old +// collection, then a reduce operation (using the specified reduce +// function) will be performed on the two values and the result will be +// written to the output collection. If a finalize function was +// provided, this will be run after the reduce as well. +// +// bson.M{...., "db": "mydb"} +// Any of the above options can have the "db" key included for doing +// the respective action in a separate database. +// +// The following is a trivial example which will count the number of +// occurrences of a field named n on each document in a collection, and +// will return results inline: +// +// job := &mgo.MapReduce{ +// Map: "function() { emit(this.n, 1) }", +// Reduce: "function(key, values) { return Array.sum(values) }", +// } +// var result []struct { Id int "_id"; Value int } +// _, err := collection.Find(nil).MapReduce(job, &result) +// if err != nil { +// return err +// } +// for _, item := range result { +// fmt.Println(item.Value) +// } +// +// This function is compatible with MongoDB 1.7.4+. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/MapReduce +// +func (q *Query) MapReduce(job *MapReduce, result interface{}) (info *MapReduceInfo, err error) { + q.m.Lock() + session := q.session + op := q.op // Copy. + limit := q.limit + q.m.Unlock() + + c := strings.Index(op.collection, ".") + if c < 0 { + return nil, errors.New("Bad collection name: " + op.collection) + } + + dbname := op.collection[:c] + cname := op.collection[c+1:] + + cmd := mapReduceCmd{ + Collection: cname, + Map: job.Map, + Reduce: job.Reduce, + Finalize: job.Finalize, + Out: fixMROut(job.Out), + Scope: job.Scope, + Verbose: job.Verbose, + Query: op.query, + Sort: op.options.OrderBy, + Limit: limit, + } + + if cmd.Out == nil { + cmd.Out = bson.M{"inline": 1} + } + + var doc mapReduceResult + err = session.DB(dbname).Run(&cmd, &doc) + if err != nil { + return nil, err + } + if doc.Err != "" { + return nil, errors.New(doc.Err) + } + + info = &MapReduceInfo{ + InputCount: doc.Counts.Input, + EmitCount: doc.Counts.Emit, + OutputCount: doc.Counts.Output, + Time: doc.TimeMillis * 1e6, + } + + if doc.Result.Kind == 0x02 { + err = doc.Result.Unmarshal(&info.Collection) + info.Database = dbname + } else if doc.Result.Kind == 0x03 { + var v struct{ Collection, Db string } + err = doc.Result.Unmarshal(&v) + info.Collection = v.Collection + info.Database = v.Db + } + + if doc.Timing != nil { + info.VerboseTime = doc.Timing + info.VerboseTime.Total *= 1e6 + info.VerboseTime.Map *= 1e6 + info.VerboseTime.EmitLoop *= 1e6 + } + + if err != nil { + return nil, err + } + if result != nil { + return info, doc.Results.Unmarshal(result) + } + return info, nil +} + +// The "out" option in the MapReduce command must be ordered. This was +// found after the implementation was accepting maps for a long time, +// so rather than breaking the API, we'll fix the order if necessary. +// Details about the order requirement may be seen in MongoDB's code: +// +// http://goo.gl/L8jwJX +// +func fixMROut(out interface{}) interface{} { + outv := reflect.ValueOf(out) + if outv.Kind() != reflect.Map || outv.Type().Key() != reflect.TypeOf("") { + return out + } + outs := make(bson.D, outv.Len()) + + outTypeIndex := -1 + for i, k := range outv.MapKeys() { + ks := k.String() + outs[i].Name = ks + outs[i].Value = outv.MapIndex(k).Interface() + switch ks { + case "normal", "replace", "merge", "reduce", "inline": + outTypeIndex = i + } + } + if outTypeIndex > 0 { + outs[0], outs[outTypeIndex] = outs[outTypeIndex], outs[0] + } + return outs +} + +// Change holds fields for running a findAndModify MongoDB command via +// the Query.Apply method. +type Change struct { + Update interface{} // The update document + Upsert bool // Whether to insert in case the document isn't found + Remove bool // Whether to remove the document found rather than updating + ReturnNew bool // Should the modified document be returned rather than the old one +} + +type findModifyCmd struct { + Collection string "findAndModify" + Query, Update, Sort, Fields interface{} ",omitempty" + Upsert, Remove, New bool ",omitempty" +} + +type valueResult struct { + Value bson.Raw + LastError LastError "lastErrorObject" +} + +// Apply runs the findAndModify MongoDB command, which allows updating, upserting +// or removing a document matching a query and atomically returning either the old +// version (the default) or the new version of the document (when ReturnNew is true). +// If no objects are found Apply returns ErrNotFound. +// +// The Sort and Select query methods affect the result of Apply. In case +// multiple documents match the query, Sort enables selecting which document to +// act upon by ordering it first. Select enables retrieving only a selection +// of fields of the new or old document. +// +// This simple example increments a counter and prints its new value: +// +// change := mgo.Change{ +// Update: bson.M{"$inc": bson.M{"n": 1}}, +// ReturnNew: true, +// } +// info, err = col.Find(M{"_id": id}).Apply(change, &doc) +// fmt.Println(doc.N) +// +// This method depends on MongoDB >= 2.0 to work properly. +// +// Relevant documentation: +// +// http://www.mongodb.org/display/DOCS/findAndModify+Command +// http://www.mongodb.org/display/DOCS/Updating +// http://www.mongodb.org/display/DOCS/Atomic+Operations +// +func (q *Query) Apply(change Change, result interface{}) (info *ChangeInfo, err error) { + q.m.Lock() + session := q.session + op := q.op // Copy. + q.m.Unlock() + + c := strings.Index(op.collection, ".") + if c < 0 { + return nil, errors.New("bad collection name: " + op.collection) + } + + dbname := op.collection[:c] + cname := op.collection[c+1:] + + cmd := findModifyCmd{ + Collection: cname, + Update: change.Update, + Upsert: change.Upsert, + Remove: change.Remove, + New: change.ReturnNew, + Query: op.query, + Sort: op.options.OrderBy, + Fields: op.selector, + } + + session = session.Clone() + defer session.Close() + session.SetMode(Strong, false) + + var doc valueResult + err = session.DB(dbname).Run(&cmd, &doc) + if err != nil { + if qerr, ok := err.(*QueryError); ok && qerr.Message == "No matching object found" { + return nil, ErrNotFound + } + return nil, err + } + if doc.LastError.N == 0 { + return nil, ErrNotFound + } + if doc.Value.Kind != 0x0A { + err = doc.Value.Unmarshal(result) + if err != nil { + return nil, err + } + } + info = &ChangeInfo{} + lerr := &doc.LastError + if lerr.UpdatedExisting { + info.Updated = lerr.N + } else if change.Remove { + info.Removed = lerr.N + } else if change.Upsert { + info.UpsertedId = lerr.UpsertedId + } + return info, nil +} + +// The BuildInfo type encapsulates details about the running MongoDB server. +// +// Note that the VersionArray field was introduced in MongoDB 2.0+, but it is +// internally assembled from the Version information for previous versions. +// In both cases, VersionArray is guaranteed to have at least 4 entries. +type BuildInfo struct { + Version string + VersionArray []int `bson:"versionArray"` // On MongoDB 2.0+; assembled from Version otherwise + GitVersion string `bson:"gitVersion"` + SysInfo string `bson:"sysInfo"` + Bits int + Debug bool + MaxObjectSize int `bson:"maxBsonObjectSize"` +} + +// VersionAtLeast returns whether the BuildInfo version is greater than or +// equal to the provided version number. If more than one number is +// provided, numbers will be considered as major, minor, and so on. +func (bi *BuildInfo) VersionAtLeast(version ...int) bool { + for i := range version { + if i == len(bi.VersionArray) { + return false + } + if bi.VersionArray[i] < version[i] { + return false + } + } + return true +} + +// BuildInfo retrieves the version and other details about the +// running MongoDB server. +func (s *Session) BuildInfo() (info BuildInfo, err error) { + err = s.Run(bson.D{{"buildInfo", "1"}}, &info) + if len(info.VersionArray) == 0 { + for _, a := range strings.Split(info.Version, ".") { + i, err := strconv.Atoi(a) + if err != nil { + break + } + info.VersionArray = append(info.VersionArray, i) + } + } + for len(info.VersionArray) < 4 { + info.VersionArray = append(info.VersionArray, 0) + } + return +} + +// --------------------------------------------------------------------------- +// Internal session handling helpers. + +func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) { + + // Read-only lock to check for previously reserved socket. + s.m.RLock() + if s.masterSocket != nil { + socket := s.masterSocket + socket.Acquire() + s.m.RUnlock() + return socket, nil + } + if s.slaveSocket != nil && s.slaveOk && slaveOk { + socket := s.slaveSocket + socket.Acquire() + s.m.RUnlock() + return socket, nil + } + s.m.RUnlock() + + // No go. We may have to request a new socket and change the session, + // so try again but with an exclusive lock now. + s.m.Lock() + defer s.m.Unlock() + + if s.masterSocket != nil { + s.masterSocket.Acquire() + return s.masterSocket, nil + } + if s.slaveSocket != nil && s.slaveOk && slaveOk { + s.slaveSocket.Acquire() + return s.slaveSocket, nil + } + + // Still not good. We need a new socket. + sock, err := s.cluster().AcquireSocket(slaveOk && s.slaveOk, s.syncTimeout, s.sockTimeout, s.queryConfig.op.serverTags) + if err != nil { + return nil, err + } + + // Authenticate the new socket. + if err = s.socketLogin(sock); err != nil { + sock.Release() + return nil, err + } + + // Keep track of the new socket, if necessary. + // Note that, as a special case, if the Eventual session was + // not refreshed (s.slaveSocket != nil), it means the developer + // asked to preserve an existing reserved socket, so we'll + // keep a master one around too before a Refresh happens. + if s.consistency != Eventual || s.slaveSocket != nil { + s.setSocket(sock) + } + + // Switch over a Monotonic session to the master. + if !slaveOk && s.consistency == Monotonic { + s.slaveOk = false + } + + return sock, nil +} + +// setSocket binds socket to this section. +func (s *Session) setSocket(socket *mongoSocket) { + info := socket.Acquire() + if info.Master { + if s.masterSocket != nil { + panic("setSocket(master) with existing master socket reserved") + } + s.masterSocket = socket + } else { + if s.slaveSocket != nil { + panic("setSocket(slave) with existing slave socket reserved") + } + s.slaveSocket = socket + } +} + +// unsetSocket releases any slave and/or master sockets reserved. +func (s *Session) unsetSocket() { + if s.masterSocket != nil { + s.masterSocket.Release() + } + if s.slaveSocket != nil { + s.slaveSocket.Release() + } + s.masterSocket = nil + s.slaveSocket = nil +} + +func (iter *Iter) replyFunc() replyFunc { + return func(err error, op *replyOp, docNum int, docData []byte) { + iter.m.Lock() + iter.docsToReceive-- + if err != nil { + iter.err = err + debugf("Iter %p received an error: %s", iter, err.Error()) + } else if docNum == -1 { + debugf("Iter %p received no documents (cursor=%d).", iter, op.cursorId) + if op != nil && op.cursorId != 0 { + // It's a tailable cursor. + iter.op.cursorId = op.cursorId + } else { + iter.err = ErrNotFound + } + } else { + rdocs := int(op.replyDocs) + if docNum == 0 { + iter.docsToReceive += rdocs - 1 + docsToProcess := iter.docData.Len() + rdocs + if iter.limit == 0 || int32(docsToProcess) < iter.limit { + iter.docsBeforeMore = docsToProcess - int(iter.prefetch*float64(rdocs)) + } else { + iter.docsBeforeMore = -1 + } + iter.op.cursorId = op.cursorId + } + // XXX Handle errors and flags. + debugf("Iter %p received reply document %d/%d (cursor=%d)", iter, docNum+1, rdocs, op.cursorId) + iter.docData.Push(docData) + } + iter.gotReply.Broadcast() + iter.m.Unlock() + } +} + +// writeQuery runs the given modifying operation, potentially followed up +// by a getLastError command in case the session is in safe mode. The +// LastError result is made available in lerr, and if lerr.Err is set it +// will also be returned as err. +func (c *Collection) writeQuery(op interface{}) (lerr *LastError, err error) { + s := c.Database.Session + dbname := c.Database.Name + socket, err := s.acquireSocket(dbname == "local") + if err != nil { + return nil, err + } + defer socket.Release() + + s.m.RLock() + safeOp := s.safeOp + s.m.RUnlock() + + if safeOp == nil { + return nil, socket.Query(op) + } else { + var mutex sync.Mutex + var replyData []byte + var replyErr error + mutex.Lock() + query := *safeOp // Copy the data. + query.collection = dbname + ".$cmd" + query.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { + replyData = docData + replyErr = err + mutex.Unlock() + } + err = socket.Query(op, &query) + if err != nil { + return nil, err + } + mutex.Lock() // Wait. + if replyErr != nil { + return nil, replyErr // XXX TESTME + } + if hasErrMsg(replyData) { + // Looks like getLastError itself failed. + err = checkQueryError(query.collection, replyData) + if err != nil { + return nil, err + } + } + result := &LastError{} + bson.Unmarshal(replyData, &result) + debugf("Result from writing query: %#v", result) + if result.Err != "" { + return result, result + } + return result, nil + } + panic("unreachable") +} + +func hasErrMsg(d []byte) bool { + l := len(d) + for i := 0; i+8 < l; i++ { + if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { + return true + } + } + return false +} diff --git a/vendor/labix.org/v2/mgo/session_test.go b/vendor/labix.org/v2/mgo/session_test.go new file mode 100644 index 0000000..e9f90f5 --- /dev/null +++ b/vendor/labix.org/v2/mgo/session_test.go @@ -0,0 +1,3260 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "flag" + "fmt" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" + "math" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "time" +) + +func (s *S) TestRunString(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + result := struct{ Ok int }{} + err = session.Run("ping", &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, 1) +} + +func (s *S) TestRunValue(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + result := struct{ Ok int }{} + err = session.Run(M{"ping": 1}, &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, 1) +} + +func (s *S) TestPing(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Just ensure the nonce has been received. + result := struct{}{} + err = session.Run("ping", &result) + + mgo.ResetStats() + + err = session.Ping() + c.Assert(err, IsNil) + + // Pretty boring. + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 1) + c.Assert(stats.ReceivedOps, Equals, 1) +} + +func (s *S) TestURLSingle(c *C) { + session, err := mgo.Dial("mongodb://localhost:40001/") + c.Assert(err, IsNil) + defer session.Close() + + result := struct{ Ok int }{} + err = session.Run("ping", &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, 1) +} + +func (s *S) TestURLMany(c *C) { + session, err := mgo.Dial("mongodb://localhost:40011,localhost:40012/") + c.Assert(err, IsNil) + defer session.Close() + + result := struct{ Ok int }{} + err = session.Run("ping", &result) + c.Assert(err, IsNil) + c.Assert(result.Ok, Equals, 1) +} + +func (s *S) TestURLParsing(c *C) { + urls := []string{ + "localhost:40001?foo=1&bar=2", + "localhost:40001?foo=1;bar=2", + } + for _, url := range urls { + session, err := mgo.Dial(url) + if session != nil { + session.Close() + } + c.Assert(err, ErrorMatches, "unsupported connection URL option: (foo=1|bar=2)") + } +} + +func (s *S) TestInsertFindOne(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1, "b": 2}) + c.Assert(err, IsNil) + err = coll.Insert(M{"a": 1, "b": 3}) + c.Assert(err, IsNil) + + result := struct{ A, B int }{} + + err = coll.Find(M{"a": 1}).Sort("b").One(&result) + c.Assert(err, IsNil) + c.Assert(result.A, Equals, 1) + c.Assert(result.B, Equals, 2) +} + +func (s *S) TestInsertFindOneNil(c *C) { + session, err := mgo.Dial("localhost:40002") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Find(nil).One(nil) + c.Assert(err, ErrorMatches, "unauthorized.*|not authorized.*") +} + +func (s *S) TestInsertFindOneMap(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1, "b": 2}) + c.Assert(err, IsNil) + result := make(M) + err = coll.Find(M{"a": 1}).One(result) + c.Assert(err, IsNil) + c.Assert(result["a"], Equals, 1) + c.Assert(result["b"], Equals, 2) +} + +func (s *S) TestInsertFindAll(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"a": 1, "b": 2}) + c.Assert(err, IsNil) + err = coll.Insert(M{"a": 3, "b": 4}) + c.Assert(err, IsNil) + + type R struct{ A, B int } + var result []R + + assertResult := func() { + c.Assert(len(result), Equals, 2) + c.Assert(result[0].A, Equals, 1) + c.Assert(result[0].B, Equals, 2) + c.Assert(result[1].A, Equals, 3) + c.Assert(result[1].B, Equals, 4) + } + + // nil slice + err = coll.Find(nil).Sort("a").All(&result) + c.Assert(err, IsNil) + assertResult() + + // Previously allocated slice + allocd := make([]R, 5) + result = allocd + err = coll.Find(nil).Sort("a").All(&result) + c.Assert(err, IsNil) + assertResult() + + // Ensure result is backed by the originally allocated array + c.Assert(&result[0], Equals, &allocd[0]) + + // Non-pointer slice error + f := func() { coll.Find(nil).All(result) } + c.Assert(f, Panics, "result argument must be a slice address") + + // Non-slice error + f = func() { coll.Find(nil).All(new(int)) } + c.Assert(f, Panics, "result argument must be a slice address") +} + +func (s *S) TestFindRef(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + db1 := session.DB("db1") + db1col1 := db1.C("col1") + + db2 := session.DB("db2") + db2col1 := db2.C("col1") + + err = db1col1.Insert(M{"_id": 1, "n": 1}) + c.Assert(err, IsNil) + err = db1col1.Insert(M{"_id": 2, "n": 2}) + c.Assert(err, IsNil) + err = db2col1.Insert(M{"_id": 2, "n": 3}) + c.Assert(err, IsNil) + + result := struct{ N int }{} + + ref1 := &mgo.DBRef{Collection: "col1", Id: 1} + ref2 := &mgo.DBRef{Collection: "col1", Id: 2, Database: "db2"} + + err = db1.FindRef(ref1).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 1) + + err = db1.FindRef(ref2).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 3) + + err = db2.FindRef(ref1).One(&result) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = db2.FindRef(ref2).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 3) + + err = session.FindRef(ref2).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 3) + + f := func() { session.FindRef(ref1).One(&result) } + c.Assert(f, PanicMatches, "Can't resolve database for &mgo.DBRef{Collection:\"col1\", Id:1, Database:\"\"}") +} + +func (s *S) TestDatabaseAndCollectionNames(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + db1 := session.DB("db1") + db1col1 := db1.C("col1") + db1col2 := db1.C("col2") + + db2 := session.DB("db2") + db2col1 := db2.C("col3") + + err = db1col1.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + err = db1col2.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + err = db2col1.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + names, err := session.DatabaseNames() + c.Assert(err, IsNil) + if !reflect.DeepEqual(names, []string{"db1", "db2"}) { + // 2.4+ has "local" as well. + c.Assert(names, DeepEquals, []string{"db1", "db2", "local"}) + } + + names, err = db1.CollectionNames() + c.Assert(err, IsNil) + c.Assert(names, DeepEquals, []string{"col1", "col2", "system.indexes"}) + + names, err = db2.CollectionNames() + c.Assert(err, IsNil) + c.Assert(names, DeepEquals, []string{"col3", "system.indexes"}) +} + +func (s *S) TestSelect(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"a": 1, "b": 2}) + + result := struct{ A, B int }{} + + err = coll.Find(M{"a": 1}).Select(M{"b": 1}).One(&result) + c.Assert(err, IsNil) + c.Assert(result.A, Equals, 0) + c.Assert(result.B, Equals, 2) +} + +func (s *S) TestInlineMap(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + var v, result1 struct { + A int + M map[string]int ",inline" + } + + v.A = 1 + v.M = map[string]int{"b": 2} + err = coll.Insert(v) + c.Assert(err, IsNil) + + noId := M{"_id": 0} + + err = coll.Find(nil).Select(noId).One(&result1) + c.Assert(err, IsNil) + c.Assert(result1.A, Equals, 1) + c.Assert(result1.M, DeepEquals, map[string]int{"b": 2}) + + var result2 M + err = coll.Find(nil).Select(noId).One(&result2) + c.Assert(err, IsNil) + c.Assert(result2, DeepEquals, M{"a": 1, "b": 2}) + +} + +func (s *S) TestUpdate(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"k": n, "n": n}) + c.Assert(err, IsNil) + } + + err = coll.Update(M{"k": 42}, M{"$inc": M{"n": 1}}) + c.Assert(err, IsNil) + + result := make(M) + err = coll.Find(M{"k": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 43) + + err = coll.Update(M{"k": 47}, M{"k": 47, "n": 47}) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.Find(M{"k": 47}).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestUpdateId(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"_id": n, "n": n}) + c.Assert(err, IsNil) + } + + err = coll.UpdateId(42, M{"$inc": M{"n": 1}}) + c.Assert(err, IsNil) + + result := make(M) + err = coll.FindId(42).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 43) + + err = coll.UpdateId(47, M{"k": 47, "n": 47}) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.FindId(47).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestUpdateNil(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"k": 42, "n": 42}) + c.Assert(err, IsNil) + err = coll.Update(nil, M{"$inc": M{"n": 1}}) + c.Assert(err, IsNil) + + result := make(M) + err = coll.Find(M{"k": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 43) + + err = coll.Insert(M{"k": 45, "n": 45}) + c.Assert(err, IsNil) + _, err = coll.UpdateAll(nil, M{"$inc": M{"n": 1}}) + c.Assert(err, IsNil) + + err = coll.Find(M{"k": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 44) + err = coll.Find(M{"k": 45}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 46) + +} + +func (s *S) TestUpsert(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"k": n, "n": n}) + c.Assert(err, IsNil) + } + + info, err := coll.Upsert(M{"k": 42}, M{"k": 42, "n": 24}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 1) + c.Assert(info.UpsertedId, IsNil) + + result := M{} + err = coll.Find(M{"k": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 24) + + // Insert with internally created id. + info, err = coll.Upsert(M{"k": 47}, M{"k": 47, "n": 47}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 0) + c.Assert(info.UpsertedId, NotNil) + + err = coll.Find(M{"k": 47}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 47) + + result = M{} + err = coll.Find(M{"_id": info.UpsertedId}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 47) + + // Insert with provided id. + info, err = coll.Upsert(M{"k": 48}, M{"k": 48, "n": 48, "_id": 48}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 0) + if s.versionAtLeast(2, 6) { + c.Assert(info.UpsertedId, Equals, 48) + } else { + c.Assert(info.UpsertedId, IsNil) // Unfortunate, but that's what Mongo gave us. + } + + err = coll.Find(M{"k": 48}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 48) +} + +func (s *S) TestUpsertId(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"_id": n, "n": n}) + c.Assert(err, IsNil) + } + + info, err := coll.UpsertId(42, M{"n": 24}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 1) + c.Assert(info.UpsertedId, IsNil) + + result := M{} + err = coll.FindId(42).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 24) + + info, err = coll.UpsertId(47, M{"_id": 47, "n": 47}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 0) + if s.versionAtLeast(2, 6) { + c.Assert(info.UpsertedId, Equals, 47) + } else { + c.Assert(info.UpsertedId, IsNil) + } + + err = coll.FindId(47).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 47) +} + +func (s *S) TestUpdateAll(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"k": n, "n": n}) + c.Assert(err, IsNil) + } + + info, err := coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$inc": M{"n": 1}}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 4) + + result := make(M) + err = coll.Find(M{"k": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 42) + + err = coll.Find(M{"k": 43}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 44) + + err = coll.Find(M{"k": 44}).One(result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 45) + + if !s.versionAtLeast(2, 6) { + // 2.6 made this invalid. + info, err = coll.UpdateAll(M{"k": 47}, M{"k": 47, "n": 47}) + c.Assert(err, Equals, nil) + c.Assert(info.Updated, Equals, 0) + } +} + +func (s *S) TestRemove(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + err = coll.Remove(M{"n": M{"$gt": 42}}) + c.Assert(err, IsNil) + + result := &struct{ N int }{} + err = coll.Find(M{"n": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 42) + + err = coll.Find(M{"n": 43}).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.Find(M{"n": 44}).One(result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 44) +} + +func (s *S) TestRemoveId(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"_id": 40}, M{"_id": 41}, M{"_id": 42}) + c.Assert(err, IsNil) + + err = coll.RemoveId(41) + c.Assert(err, IsNil) + + c.Assert(coll.FindId(40).One(nil), IsNil) + c.Assert(coll.FindId(41).One(nil), Equals, mgo.ErrNotFound) + c.Assert(coll.FindId(42).One(nil), IsNil) +} + +func (s *S) TestRemoveAll(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + info, err := coll.RemoveAll(M{"n": M{"$gt": 42}}) + c.Assert(err, IsNil) + c.Assert(info.Updated, Equals, 0) + c.Assert(info.Removed, Equals, 4) + c.Assert(info.UpsertedId, IsNil) + + result := &struct{ N int }{} + err = coll.Find(M{"n": 42}).One(result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 42) + + err = coll.Find(M{"n": 43}).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.Find(M{"n": 44}).One(result) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestDropDatabase(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + db1 := session.DB("db1") + db1.C("col").Insert(M{"_id": 1}) + + db2 := session.DB("db2") + db2.C("col").Insert(M{"_id": 1}) + + err = db1.DropDatabase() + c.Assert(err, IsNil) + + names, err := session.DatabaseNames() + c.Assert(err, IsNil) + if !reflect.DeepEqual(names, []string{"db2"}) { + // 2.4+ has "local" as well. + c.Assert(names, DeepEquals, []string{"db2", "local"}) + } + + err = db2.DropDatabase() + c.Assert(err, IsNil) + + names, err = session.DatabaseNames() + c.Assert(err, IsNil) + if !reflect.DeepEqual(names, []string(nil)) { + // 2.4+ has "local" as well. + c.Assert(names, DeepEquals, []string{"local"}) + } +} + +func (s *S) TestDropCollection(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("db1") + db.C("col1").Insert(M{"_id": 1}) + db.C("col2").Insert(M{"_id": 1}) + + err = db.C("col1").DropCollection() + c.Assert(err, IsNil) + + names, err := db.CollectionNames() + c.Assert(err, IsNil) + c.Assert(names, DeepEquals, []string{"col2", "system.indexes"}) + + err = db.C("col2").DropCollection() + c.Assert(err, IsNil) + + names, err = db.CollectionNames() + c.Assert(err, IsNil) + c.Assert(names, DeepEquals, []string{"system.indexes"}) +} + +func (s *S) TestCreateCollectionCapped(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + info := &mgo.CollectionInfo{ + Capped: true, + MaxBytes: 1024, + MaxDocs: 3, + } + err = coll.Create(info) + c.Assert(err, IsNil) + + ns := []int{1, 2, 3, 4, 5} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + n, err := coll.Find(nil).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) +} + +func (s *S) TestCreateCollectionNoIndex(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + info := &mgo.CollectionInfo{ + DisableIdIndex: true, + } + err = coll.Create(info) + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + + indexes, err := coll.Indexes() + c.Assert(indexes, HasLen, 0) +} + +func (s *S) TestCreateCollectionForceIndex(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + info := &mgo.CollectionInfo{ + ForceIdIndex: true, + Capped: true, + MaxBytes: 1024, + } + err = coll.Create(info) + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + + indexes, err := coll.Indexes() + c.Assert(indexes, HasLen, 1) +} + +func (s *S) TestIsDupValues(c *C) { + c.Assert(mgo.IsDup(nil), Equals, false) + c.Assert(mgo.IsDup(&mgo.LastError{Code: 1}), Equals, false) + c.Assert(mgo.IsDup(&mgo.QueryError{Code: 1}), Equals, false) + c.Assert(mgo.IsDup(&mgo.LastError{Code: 11000}), Equals, true) + c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11000}), Equals, true) + c.Assert(mgo.IsDup(&mgo.LastError{Code: 11001}), Equals, true) + c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11001}), Equals, true) + c.Assert(mgo.IsDup(&mgo.LastError{Code: 12582}), Equals, true) + c.Assert(mgo.IsDup(&mgo.QueryError{Code: 12582}), Equals, true) + lerr := &mgo.LastError{Code: 16460, Err:"error inserting 1 documents to shard ... caused by :: E11000 duplicate key error index: ..."} + c.Assert(mgo.IsDup(lerr), Equals, true) +} + +func (s *S) TestIsDupPrimary(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + err = coll.Insert(M{"_id": 1}) + c.Assert(err, ErrorMatches, ".*duplicate key error.*") + c.Assert(mgo.IsDup(err), Equals, true) +} + +func (s *S) TestIsDupUnique(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + index := mgo.Index{ + Key: []string{"a", "b"}, + Unique: true, + } + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndex(index) + c.Assert(err, IsNil) + + err = coll.Insert(M{"a": 1, "b": 1}) + c.Assert(err, IsNil) + err = coll.Insert(M{"a": 1, "b": 1}) + c.Assert(err, ErrorMatches, ".*duplicate key error.*") + c.Assert(mgo.IsDup(err), Equals, true) +} + +func (s *S) TestIsDupCapped(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + info := &mgo.CollectionInfo{ + ForceIdIndex: true, + Capped: true, + MaxBytes: 1024, + } + err = coll.Create(info) + c.Assert(err, IsNil) + + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + err = coll.Insert(M{"_id": 1}) + // The error was different for capped collections before 2.6. + c.Assert(err, ErrorMatches, ".*duplicate key.*") + // The issue is reduced by using IsDup. + c.Assert(mgo.IsDup(err), Equals, true) +} + +func (s *S) TestIsDupFindAndModify(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndex(mgo.Index{Key: []string{"n"}, Unique: true}) + c.Assert(err, IsNil) + + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + err = coll.Insert(M{"n": 2}) + c.Assert(err, IsNil) + _, err = coll.Find(M{"n": 1}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, bson.M{}) + c.Assert(err, ErrorMatches, ".*duplicate key error.*") + c.Assert(mgo.IsDup(err), Equals, true) +} + +func (s *S) TestFindAndModify(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"n": 42}) + + session.SetMode(mgo.Monotonic, true) + + result := M{} + info, err := coll.Find(M{"n": 42}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 42) + c.Assert(info.Updated, Equals, 1) + c.Assert(info.Removed, Equals, 0) + c.Assert(info.UpsertedId, IsNil) + + result = M{} + info, err = coll.Find(M{"n": 43}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 44) + c.Assert(info.Updated, Equals, 1) + c.Assert(info.Removed, Equals, 0) + c.Assert(info.UpsertedId, IsNil) + + result = M{} + info, err = coll.Find(M{"n": 50}).Apply(mgo.Change{Upsert: true, Update: M{"n": 51, "o": 52}}, result) + c.Assert(err, IsNil) + c.Assert(result["n"], IsNil) + c.Assert(info.Updated, Equals, 0) + c.Assert(info.Removed, Equals, 0) + c.Assert(info.UpsertedId, NotNil) + + result = M{} + info, err = coll.Find(nil).Sort("-n").Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) + c.Assert(err, IsNil) + c.Assert(result["n"], Equals, 52) + c.Assert(info.Updated, Equals, 1) + c.Assert(info.Removed, Equals, 0) + c.Assert(info.UpsertedId, IsNil) + + result = M{} + info, err = coll.Find(M{"n": 52}).Select(M{"o": 1}).Apply(mgo.Change{Remove: true}, result) + c.Assert(err, IsNil) + c.Assert(result["n"], IsNil) + c.Assert(result["o"], Equals, 52) + c.Assert(info.Updated, Equals, 0) + c.Assert(info.Removed, Equals, 1) + c.Assert(info.UpsertedId, IsNil) + + result = M{} + info, err = coll.Find(M{"n": 60}).Apply(mgo.Change{Remove: true}, result) + c.Assert(err, Equals, mgo.ErrNotFound) + c.Assert(len(result), Equals, 0) + c.Assert(info, IsNil) +} + +func (s *S) TestFindAndModifyBug997828(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"n": "not-a-number"}) + + result := make(M) + _, err = coll.Find(M{"n": "not-a-number"}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) + c.Assert(err, ErrorMatches, `(exception: )?Cannot apply \$inc .*`) + if s.versionAtLeast(2, 1) { + qerr, _ := err.(*mgo.QueryError) + c.Assert(qerr, NotNil, Commentf("err: %#v", err)) + if s.versionAtLeast(2, 6) { + // Oh, the dance of error codes. :-( + c.Assert(qerr.Code, Equals, 16837) + } else { + c.Assert(qerr.Code, Equals, 10140) + } + } else { + lerr, _ := err.(*mgo.LastError) + c.Assert(lerr, NotNil, Commentf("err: %#v", err)) + c.Assert(lerr.Code, Equals, 10140) + } +} + +func (s *S) TestCountCollection(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + n, err := coll.Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) +} + +func (s *S) TestCountQuery(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + n, err := coll.Find(M{"n": M{"$gt": 40}}).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 2) +} + +func (s *S) TestCountQuerySorted(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + n, err := coll.Find(M{"n": M{"$gt": 40}}).Sort("n").Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 2) +} + +func (s *S) TestCountSkipLimit(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + n, err := coll.Find(nil).Skip(1).Limit(3).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 3) + + n, err = coll.Find(nil).Skip(1).Limit(5).Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, 4) +} + +func (s *S) TestQueryExplain(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + m := M{} + query := coll.Find(nil).Limit(2) + err = query.Explain(m) + c.Assert(err, IsNil) + c.Assert(m["cursor"], Equals, "BasicCursor") + c.Assert(m["nscanned"], Equals, 2) + c.Assert(m["n"], Equals, 2) + + n := 0 + var result M + iter := query.Iter() + for iter.Next(&result) { + n++ + } + c.Assert(iter.Close(), IsNil) + c.Assert(n, Equals, 2) +} + +func (s *S) TestQueryHint(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + coll.EnsureIndexKey("a") + + m := M{} + err = coll.Find(nil).Hint("a").Explain(m) + c.Assert(err, IsNil) + c.Assert(m["indexBounds"], NotNil) + c.Assert(m["indexBounds"].(M)["a"], NotNil) +} + +func (s *S) TestFindOneNotFound(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + result := struct{ A, B int }{} + err = coll.Find(M{"a": 1}).One(&result) + c.Assert(err, Equals, mgo.ErrNotFound) + c.Assert(err, ErrorMatches, "not found") + c.Assert(err == mgo.ErrNotFound, Equals, true) +} + +func (s *S) TestFindNil(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 1}) + c.Assert(err, IsNil) + + result := struct{ N int }{} + + err = coll.Find(nil).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 1) +} + +func (s *S) TestFindId(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"_id": 41, "n": 41}) + c.Assert(err, IsNil) + err = coll.Insert(M{"_id": 42, "n": 42}) + c.Assert(err, IsNil) + + result := struct{ N int }{} + + err = coll.FindId(42).One(&result) + c.Assert(err, IsNil) + c.Assert(result.N, Equals, 42) +} + +func (s *S) TestFindIterAll(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + iter := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2).Iter() + result := struct{ N int }{} + for i := 2; i < 7; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 1 { + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP + c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. + c.Assert(stats.ReceivedDocs, Equals, 5) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestFindIterTwiceWithSameQuery(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for i := 40; i != 47; i++ { + coll.Insert(M{"n": i}) + } + + query := coll.Find(M{}).Sort("n") + + result1 := query.Skip(1).Iter() + result2 := query.Skip(2).Iter() + + result := struct{ N int }{} + ok := result2.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, 42) + ok = result1.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, 41) +} + +func (s *S) TestFindIterWithoutResults(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"n": 42}) + + iter := coll.Find(M{"n": 0}).Iter() + + result := struct{ N int }{} + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + c.Assert(result.N, Equals, 0) +} + +func (s *S) TestFindIterLimit(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3) + iter := query.Iter() + + result := struct{ N int }{} + for i := 2; i < 5; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + } + + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 2) // 1*QUERY_OP + 1*KILL_CURSORS_OP + c.Assert(stats.ReceivedOps, Equals, 1) // and its REPLY_OP + c.Assert(stats.ReceivedDocs, Equals, 3) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestTooManyItemsLimitBug(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) + + mgo.SetDebug(false) + coll := session.DB("mydb").C("mycoll") + words := strings.Split("foo bar baz", " ") + for i := 0; i < 5; i++ { + words = append(words, words...) + } + doc := bson.D{{"words", words}} + inserts := 10000 + limit := 5000 + iters := 0 + c.Assert(inserts > limit, Equals, true) + for i := 0; i < inserts; i++ { + err := coll.Insert(&doc) + c.Assert(err, IsNil) + } + iter := coll.Find(nil).Limit(limit).Iter() + for iter.Next(&doc) { + if iters%100 == 0 { + c.Logf("Seen %d docments", iters) + } + iters++ + } + c.Assert(iter.Close(), IsNil) + c.Assert(iters, Equals, limit) +} + +func serverCursorsOpen(session *mgo.Session) int { + var result struct { + Cursors struct { + TotalOpen int `bson:"totalOpen"` + TimedOut int `bson:"timedOut"` + } + } + err := session.Run("serverStatus", &result) + if err != nil { + panic(err) + } + return result.Cursors.TotalOpen +} + +func (s *S) TestFindIterLimitWithMore(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + // Insane amounts of logging otherwise due to the + // amount of data being shuffled. + mgo.SetDebug(false) + defer mgo.SetDebug(true) + + // Should amount to more than 4MB bson payload, + // the default limit per result chunk. + const total = 4096 + var d struct{ A [1024]byte } + docs := make([]interface{}, total) + for i := 0; i < total; i++ { + docs[i] = &d + } + err = coll.Insert(docs...) + c.Assert(err, IsNil) + + n, err := coll.Count() + c.Assert(err, IsNil) + c.Assert(n, Equals, total) + + // First, try restricting to a single chunk with a negative limit. + nresults := 0 + iter := coll.Find(nil).Limit(-total).Iter() + var discard struct{} + for iter.Next(&discard) { + nresults++ + } + if nresults < total/2 || nresults >= total { + c.Fatalf("Bad result size with negative limit: %d", nresults) + } + + cursorsOpen := serverCursorsOpen(session) + + // Try again, with a positive limit. Should reach the end now, + // using multiple chunks. + nresults = 0 + iter = coll.Find(nil).Limit(total).Iter() + for iter.Next(&discard) { + nresults++ + } + c.Assert(nresults, Equals, total) + + // Ensure the cursor used is properly killed. + c.Assert(serverCursorsOpen(session), Equals, cursorsOpen) + + // Edge case, -MinInt == -MinInt. + nresults = 0 + iter = coll.Find(nil).Limit(math.MinInt32).Iter() + for iter.Next(&discard) { + nresults++ + } + if nresults < total/2 || nresults >= total { + c.Fatalf("Bad result size with MinInt32 limit: %d", nresults) + } +} + +func (s *S) TestFindIterLimitWithBatch(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + // Ping the database to ensure the nonce has been received already. + c.Assert(session.Ping(), IsNil) + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3).Batch(2) + iter := query.Iter() + result := struct{ N int }{} + for i := 2; i < 5; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 1*GET_MORE_OP + 1*KILL_CURSORS_OP + c.Assert(stats.ReceivedOps, Equals, 2) // and its REPLY_OPs + c.Assert(stats.ReceivedDocs, Equals, 3) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestFindIterSortWithBatch(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + // Without this, the logic above breaks because Mongo refuses to + // return a cursor with an in-memory sort. + coll.EnsureIndexKey("n") + + // Ping the database to ensure the nonce has been received already. + c.Assert(session.Ping(), IsNil) + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$lte": 44}}).Sort("-n").Batch(2) + iter := query.Iter() + ns = []int{46, 45, 44, 43, 42, 41, 40} + result := struct{ N int }{} + for i := 2; i < len(ns); i++ { + c.Logf("i=%d", i) + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Close(), IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP + c.Assert(stats.ReceivedOps, Equals, 3) // and its REPLY_OPs + c.Assert(stats.ReceivedDocs, Equals, 5) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +// Test tailable cursors in a situation where Next has to sleep to +// respect the timeout requested on Tail. +func (s *S) TestFindTailTimeoutWithSleep(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + cresult := struct{ ErrMsg string }{} + + db := session.DB("mydb") + err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) + c.Assert(err, IsNil) + c.Assert(cresult.ErrMsg, Equals, "") + coll := db.C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + timeout := 3 * time.Second + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) + iter := query.Tail(timeout) + + n := len(ns) + result := struct{ N int }{} + for i := 2; i != n; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { // The batch boundary. + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + mgo.ResetStats() + + // The following call to Next will block. + go func() { + // The internal AwaitData timing of MongoDB is around 2 seconds, + // so this should force mgo to sleep at least once by itself to + // respect the requested timeout. + time.Sleep(timeout + 5e8*time.Nanosecond) + session := session.New() + defer session.Close() + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"n": 47}) + }() + + c.Log("Will wait for Next with N=47...") + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, 47) + c.Log("Got Next with N=47!") + + // The following may break because it depends a bit on the internal + // timing used by MongoDB's AwaitData logic. If it does, the problem + // will be observed as more GET_MORE_OPs than predicted: + // 1*QUERY for nonce + 1*GET_MORE_OP on Next + 1*GET_MORE_OP on Next after sleep + + // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 5) + c.Assert(stats.ReceivedOps, Equals, 4) // REPLY_OPs for 1*QUERY_OP for nonce + 2*GET_MORE_OPs + 1*QUERY_OP + c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response + + c.Log("Will wait for a result which will never come...") + + started := time.Now() + ok = iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, true) + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + + c.Log("Will now reuse the timed out tail cursor...") + + coll.Insert(M{"n": 48}) + ok = iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Close(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, 48) +} + +// Test tailable cursors in a situation where Next never gets to sleep once +// to respect the timeout requested on Tail. +func (s *S) TestFindTailTimeoutNoSleep(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + cresult := struct{ ErrMsg string }{} + + db := session.DB("mydb") + err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) + c.Assert(err, IsNil) + c.Assert(cresult.ErrMsg, Equals, "") + coll := db.C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + timeout := 1 * time.Second + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) + iter := query.Tail(timeout) + + n := len(ns) + result := struct{ N int }{} + for i := 2; i != n; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { // The batch boundary. + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + mgo.ResetStats() + + // The following call to Next will block. + go func() { + // The internal AwaitData timing of MongoDB is around 2 seconds, + // so this item should arrive within the AwaitData threshold. + time.Sleep(5e8) + session := session.New() + defer session.Close() + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"n": 47}) + }() + + c.Log("Will wait for Next with N=47...") + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, 47) + c.Log("Got Next with N=47!") + + // The following may break because it depends a bit on the internal + // timing used by MongoDB's AwaitData logic. If it does, the problem + // will be observed as more GET_MORE_OPs than predicted: + // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + + // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 4) + c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP + c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response + + c.Log("Will wait for a result which will never come...") + + started := time.Now() + ok = iter.Next(&result) + c.Assert(ok, Equals, false) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, true) + c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) + + c.Log("Will now reuse the timed out tail cursor...") + + coll.Insert(M{"n": 48}) + ok = iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Close(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, 48) +} + +// Test tailable cursors in a situation where Next never gets to sleep once +// to respect the timeout requested on Tail. +func (s *S) TestFindTailNoTimeout(c *C) { + if *fast { + c.Skip("-fast") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + cresult := struct{ ErrMsg string }{} + + db := session.DB("mydb") + err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) + c.Assert(err, IsNil) + c.Assert(cresult.ErrMsg, Equals, "") + coll := db.C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) + iter := query.Tail(-1) + c.Assert(err, IsNil) + + n := len(ns) + result := struct{ N int }{} + for i := 2; i != n; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { // The batch boundary. + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + } + + mgo.ResetStats() + + // The following call to Next will block. + go func() { + time.Sleep(5e8) + session := session.New() + defer session.Close() + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"n": 47}) + }() + + c.Log("Will wait for Next with N=47...") + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(iter.Err(), IsNil) + c.Assert(iter.Timeout(), Equals, false) + c.Assert(result.N, Equals, 47) + c.Log("Got Next with N=47!") + + // The following may break because it depends a bit on the internal + // timing used by MongoDB's AwaitData logic. If it does, the problem + // will be observed as more GET_MORE_OPs than predicted: + // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + + // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 4) + c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP + c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response + + c.Log("Will wait for a result which will never come...") + + gotNext := make(chan bool) + go func() { + ok := iter.Next(&result) + gotNext <- ok + }() + + select { + case ok := <-gotNext: + c.Fatalf("Next returned: %v", ok) + case <-time.After(3e9): + // Good. Should still be sleeping at that point. + } + + // Closing the session should cause Next to return. + session.Close() + + select { + case ok := <-gotNext: + c.Assert(ok, Equals, false) + c.Assert(iter.Err(), ErrorMatches, "Closed explicitly") + c.Assert(iter.Timeout(), Equals, false) + case <-time.After(1e9): + c.Fatal("Closing the session did not unblock Next") + } +} + +func (s *S) TestIterNextResetsResult(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{1, 2, 3} + for _, n := range ns { + coll.Insert(M{"n" + strconv.Itoa(n): n}) + } + + query := coll.Find(nil).Sort("$natural") + + i := 0 + var sresult *struct{ N1, N2, N3 int } + iter := query.Iter() + for iter.Next(&sresult) { + switch i { + case 0: + c.Assert(sresult.N1, Equals, 1) + c.Assert(sresult.N2+sresult.N3, Equals, 0) + case 1: + c.Assert(sresult.N2, Equals, 2) + c.Assert(sresult.N1+sresult.N3, Equals, 0) + case 2: + c.Assert(sresult.N3, Equals, 3) + c.Assert(sresult.N1+sresult.N2, Equals, 0) + } + i++ + } + c.Assert(iter.Close(), IsNil) + + i = 0 + var mresult M + iter = query.Iter() + for iter.Next(&mresult) { + delete(mresult, "_id") + switch i { + case 0: + c.Assert(mresult, DeepEquals, M{"n1": 1}) + case 1: + c.Assert(mresult, DeepEquals, M{"n2": 2}) + case 2: + c.Assert(mresult, DeepEquals, M{"n3": 3}) + } + i++ + } + c.Assert(iter.Close(), IsNil) + + i = 0 + var iresult interface{} + iter = query.Iter() + for iter.Next(&iresult) { + mresult, ok := iresult.(bson.M) + c.Assert(ok, Equals, true, Commentf("%#v", iresult)) + delete(mresult, "_id") + switch i { + case 0: + c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) + case 1: + c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) + case 2: + c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) + } + i++ + } + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestFindForOnIter(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) + iter := query.Iter() + + i := 2 + var result *struct{ N int } + err = iter.For(&result, func() error { + c.Assert(i < 7, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 1 { + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + i++ + return nil + }) + c.Assert(err, IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP + c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. + c.Assert(stats.ReceivedDocs, Equals, 5) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestFindFor(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + session.Refresh() // Release socket. + + mgo.ResetStats() + + query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) + + i := 2 + var result *struct{ N int } + err = query.For(&result, func() error { + c.Assert(i < 7, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 1 { + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, 2) + } + i++ + return nil + }) + c.Assert(err, IsNil) + + session.Refresh() // Release socket. + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP + c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. + c.Assert(stats.ReceivedDocs, Equals, 5) + c.Assert(stats.SocketsInUse, Equals, 0) +} + +func (s *S) TestFindForStopOnError(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + query := coll.Find(M{"n": M{"$gte": 42}}) + i := 2 + var result *struct{ N int } + err = query.For(&result, func() error { + c.Assert(i < 4, Equals, true) + c.Assert(result.N, Equals, ns[i]) + if i == 3 { + return fmt.Errorf("stop!") + } + i++ + return nil + }) + c.Assert(err, ErrorMatches, "stop!") +} + +func (s *S) TestFindForResetsResult(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{1, 2, 3} + for _, n := range ns { + coll.Insert(M{"n" + strconv.Itoa(n): n}) + } + + query := coll.Find(nil).Sort("$natural") + + i := 0 + var sresult *struct{ N1, N2, N3 int } + err = query.For(&sresult, func() error { + switch i { + case 0: + c.Assert(sresult.N1, Equals, 1) + c.Assert(sresult.N2+sresult.N3, Equals, 0) + case 1: + c.Assert(sresult.N2, Equals, 2) + c.Assert(sresult.N1+sresult.N3, Equals, 0) + case 2: + c.Assert(sresult.N3, Equals, 3) + c.Assert(sresult.N1+sresult.N2, Equals, 0) + } + i++ + return nil + }) + c.Assert(err, IsNil) + + i = 0 + var mresult M + err = query.For(&mresult, func() error { + delete(mresult, "_id") + switch i { + case 0: + c.Assert(mresult, DeepEquals, M{"n1": 1}) + case 1: + c.Assert(mresult, DeepEquals, M{"n2": 2}) + case 2: + c.Assert(mresult, DeepEquals, M{"n3": 3}) + } + i++ + return nil + }) + c.Assert(err, IsNil) + + i = 0 + var iresult interface{} + err = query.For(&iresult, func() error { + mresult, ok := iresult.(bson.M) + c.Assert(ok, Equals, true, Commentf("%#v", iresult)) + delete(mresult, "_id") + switch i { + case 0: + c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) + case 1: + c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) + case 2: + c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) + } + i++ + return nil + }) + c.Assert(err, IsNil) +} + +func (s *S) TestFindIterSnapshot(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Insane amounts of logging otherwise due to the + // amount of data being shuffled. + mgo.SetDebug(false) + defer mgo.SetDebug(true) + + coll := session.DB("mydb").C("mycoll") + + var a [1024000]byte + + for n := 0; n < 10; n++ { + err := coll.Insert(M{"_id": n, "n": n, "a1": &a}) + c.Assert(err, IsNil) + } + + query := coll.Find(M{"n": M{"$gt": -1}}).Batch(2).Prefetch(0) + query.Snapshot() + iter := query.Iter() + + seen := map[int]bool{} + result := struct { + Id int "_id" + }{} + for iter.Next(&result) { + if len(seen) == 2 { + // Grow all entries so that they have to move. + // Backwards so that the order is inverted. + for n := 10; n >= 0; n-- { + _, err := coll.Upsert(M{"_id": n}, M{"$set": M{"a2": &a}}) + c.Assert(err, IsNil) + } + } + if seen[result.Id] { + c.Fatalf("seen duplicated key: %d", result.Id) + } + seen[result.Id] = true + } + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestSort(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + coll.Insert(M{"a": 1, "b": 1}) + coll.Insert(M{"a": 2, "b": 2}) + coll.Insert(M{"a": 2, "b": 1}) + coll.Insert(M{"a": 0, "b": 1}) + coll.Insert(M{"a": 2, "b": 0}) + coll.Insert(M{"a": 0, "b": 2}) + coll.Insert(M{"a": 1, "b": 2}) + coll.Insert(M{"a": 0, "b": 0}) + coll.Insert(M{"a": 1, "b": 0}) + + query := coll.Find(M{}) + query.Sort("-a") // Should be ignored. + query.Sort("-b", "a") + iter := query.Iter() + + l := make([]int, 18) + r := struct{ A, B int }{} + for i := 0; i != len(l); i += 2 { + ok := iter.Next(&r) + c.Assert(ok, Equals, true) + c.Assert(err, IsNil) + l[i] = r.A + l[i+1] = r.B + } + + c.Assert(l, DeepEquals, []int{0, 2, 1, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 0, 1, 0, 2, 0}) +} + +func (s *S) TestSortWithBadArgs(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + f1 := func() { coll.Find(nil).Sort("") } + f2 := func() { coll.Find(nil).Sort("+") } + f3 := func() { coll.Find(nil).Sort("foo", "-") } + + for _, f := range []func(){f1, f2, f3} { + c.Assert(f, PanicMatches, "Sort: empty field name") + } +} + +func (s *S) TestPrefetching(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + mgo.SetDebug(false) + docs := make([]interface{}, 800) + for i := 0; i != 600; i++ { + docs[i] = bson.D{{"n", i}} + } + coll.Insert(docs...) + + for testi := 0; testi < 5; testi++ { + mgo.ResetStats() + + var iter *mgo.Iter + var beforeMore int + + switch testi { + case 0: // The default session value. + session.SetBatch(100) + iter = coll.Find(M{}).Iter() + beforeMore = 75 + + case 2: // Changing the session value. + session.SetBatch(100) + session.SetPrefetch(0.27) + iter = coll.Find(M{}).Iter() + beforeMore = 73 + + case 1: // Changing via query methods. + iter = coll.Find(M{}).Prefetch(0.27).Batch(100).Iter() + beforeMore = 73 + + case 3: // With prefetch on first document. + iter = coll.Find(M{}).Prefetch(1.0).Batch(100).Iter() + beforeMore = 0 + + case 4: // Without prefetch. + iter = coll.Find(M{}).Prefetch(0).Batch(100).Iter() + beforeMore = 100 + } + + pings := 0 + for batchi := 0; batchi < len(docs)/100-1; batchi++ { + c.Logf("Iterating over %d documents on batch %d", beforeMore, batchi) + var result struct{ N int } + for i := 0; i < beforeMore; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) + } + beforeMore = 99 + c.Logf("Done iterating.") + + session.Run("ping", nil) // Roundtrip to settle down. + pings++ + + stats := mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, (batchi+1)*100+pings) + + c.Logf("Iterating over one more document on batch %d", batchi) + ok := iter.Next(&result) + c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) + c.Logf("Done iterating.") + + session.Run("ping", nil) // Roundtrip to settle down. + pings++ + + stats = mgo.GetStats() + c.Assert(stats.ReceivedDocs, Equals, (batchi+2)*100+pings) + } + } +} + +func (s *S) TestSafeSetting(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Check the default + safe := session.Safe() + c.Assert(safe.W, Equals, 0) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 0) + c.Assert(safe.FSync, Equals, false) + c.Assert(safe.J, Equals, false) + + // Tweak it + session.SetSafe(&mgo.Safe{W: 1, WTimeout: 2, FSync: true}) + safe = session.Safe() + c.Assert(safe.W, Equals, 1) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 2) + c.Assert(safe.FSync, Equals, true) + c.Assert(safe.J, Equals, false) + + // Reset it again. + session.SetSafe(&mgo.Safe{}) + safe = session.Safe() + c.Assert(safe.W, Equals, 0) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 0) + c.Assert(safe.FSync, Equals, false) + c.Assert(safe.J, Equals, false) + + // Ensure safety to something more conservative. + session.SetSafe(&mgo.Safe{W: 5, WTimeout: 6, J: true}) + safe = session.Safe() + c.Assert(safe.W, Equals, 5) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 6) + c.Assert(safe.FSync, Equals, false) + c.Assert(safe.J, Equals, true) + + // Ensure safety to something less conservative won't change it. + session.EnsureSafe(&mgo.Safe{W: 4, WTimeout: 7}) + safe = session.Safe() + c.Assert(safe.W, Equals, 5) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 6) + c.Assert(safe.FSync, Equals, false) + c.Assert(safe.J, Equals, true) + + // But to something more conservative will. + session.EnsureSafe(&mgo.Safe{W: 6, WTimeout: 4, FSync: true}) + safe = session.Safe() + c.Assert(safe.W, Equals, 6) + c.Assert(safe.WMode, Equals, "") + c.Assert(safe.WTimeout, Equals, 4) + c.Assert(safe.FSync, Equals, true) + c.Assert(safe.J, Equals, false) + + // Even more conservative. + session.EnsureSafe(&mgo.Safe{WMode: "majority", WTimeout: 2}) + safe = session.Safe() + c.Assert(safe.W, Equals, 0) + c.Assert(safe.WMode, Equals, "majority") + c.Assert(safe.WTimeout, Equals, 2) + c.Assert(safe.FSync, Equals, true) + c.Assert(safe.J, Equals, false) + + // WMode always overrides, whatever it is, but J doesn't. + session.EnsureSafe(&mgo.Safe{WMode: "something", J: true}) + safe = session.Safe() + c.Assert(safe.W, Equals, 0) + c.Assert(safe.WMode, Equals, "something") + c.Assert(safe.WTimeout, Equals, 2) + c.Assert(safe.FSync, Equals, true) + c.Assert(safe.J, Equals, false) + + // EnsureSafe with nil does nothing. + session.EnsureSafe(nil) + safe = session.Safe() + c.Assert(safe.W, Equals, 0) + c.Assert(safe.WMode, Equals, "something") + c.Assert(safe.WTimeout, Equals, 2) + c.Assert(safe.FSync, Equals, true) + c.Assert(safe.J, Equals, false) + + // Changing the safety of a cloned session doesn't touch the original. + clone := session.Clone() + defer clone.Close() + clone.EnsureSafe(&mgo.Safe{WMode: "foo"}) + safe = session.Safe() + c.Assert(safe.WMode, Equals, "something") +} + +func (s *S) TestSafeInsert(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + // Insert an element with a predefined key. + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + mgo.ResetStats() + + // Session should be safe by default, so inserting it again must fail. + err = coll.Insert(M{"_id": 1}) + c.Assert(err, ErrorMatches, ".*E11000 duplicate.*") + c.Assert(err.(*mgo.LastError).Code, Equals, 11000) + + // It must have sent two operations (INSERT_OP + getLastError QUERY_OP) + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 2) + + mgo.ResetStats() + + // If we disable safety, though, it won't complain. + session.SetSafe(nil) + err = coll.Insert(M{"_id": 1}) + c.Assert(err, IsNil) + + // Must have sent a single operation this time (just the INSERT_OP) + stats = mgo.GetStats() + c.Assert(stats.SentOps, Equals, 1) +} + +func (s *S) TestSafeParameters(c *C) { + session, err := mgo.Dial("localhost:40011") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + // Tweak the safety parameters to something unachievable. + session.SetSafe(&mgo.Safe{W: 4, WTimeout: 100}) + err = coll.Insert(M{"_id": 1}) + c.Assert(err, ErrorMatches, "timeout|timed out waiting for slaves") + if !s.versionAtLeast(2, 6) { + // 2.6 turned it into a query error. + c.Assert(err.(*mgo.LastError).WTimeout, Equals, true) + } +} + +func (s *S) TestQueryErrorOne(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + result := struct { + Err string "$err" + }{} + + err = coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).One(&result) + c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") + c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") + if s.versionAtLeast(2, 6) { + // Oh, the dance of error codes. :-( + c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) + } else { + c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) + } + + // The result should be properly unmarshalled with QueryError + c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") +} + +func (s *S) TestQueryErrorNext(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + result := struct { + Err string "$err" + }{} + + iter := coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).Iter() + + ok := iter.Next(&result) + c.Assert(ok, Equals, false) + + err = iter.Close() + c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") + c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") + if s.versionAtLeast(2, 6) { + // Oh, the dance of error codes. :-( + c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) + } else { + c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) + } + c.Assert(iter.Err(), Equals, err) + + // The result should be properly unmarshalled with QueryError + c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") +} + +func (s *S) TestEnsureIndex(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + index1 := mgo.Index{ + Key: []string{"a"}, + Background: true, + } + + index2 := mgo.Index{ + Key: []string{"a", "-b"}, + Unique: true, + DropDups: true, + } + + // Obsolete: + index3 := mgo.Index{ + Key: []string{"@loc_old"}, + Min: -500, + Max: 500, + Bits: 32, + } + + index4 := mgo.Index{ + Key: []string{"$2d:loc"}, + Min: -500, + Max: 500, + Bits: 32, + } + + coll := session.DB("mydb").C("mycoll") + + for _, index := range []mgo.Index{index1, index2, index3, index4} { + err = coll.EnsureIndex(index) + c.Assert(err, IsNil) + } + + sysidx := session.DB("mydb").C("system.indexes") + + result1 := M{} + err = sysidx.Find(M{"name": "a_1"}).One(result1) + c.Assert(err, IsNil) + + result2 := M{} + err = sysidx.Find(M{"name": "a_1_b_-1"}).One(result2) + c.Assert(err, IsNil) + + result3 := M{} + err = sysidx.Find(M{"name": "loc_old_2d"}).One(result3) + c.Assert(err, IsNil) + + result4 := M{} + err = sysidx.Find(M{"name": "loc_2d"}).One(result4) + c.Assert(err, IsNil) + + delete(result1, "v") + expected1 := M{ + "name": "a_1", + "key": M{"a": 1}, + "ns": "mydb.mycoll", + "background": true, + } + c.Assert(result1, DeepEquals, expected1) + + delete(result2, "v") + expected2 := M{ + "name": "a_1_b_-1", + "key": M{"a": 1, "b": -1}, + "ns": "mydb.mycoll", + "unique": true, + "dropDups": true, + } + c.Assert(result2, DeepEquals, expected2) + + delete(result3, "v") + expected3 := M{ + "name": "loc_old_2d", + "key": M{"loc_old": "2d"}, + "ns": "mydb.mycoll", + "min": -500, + "max": 500, + "bits": 32, + } + c.Assert(result3, DeepEquals, expected3) + + delete(result4, "v") + expected4 := M{ + "name": "loc_2d", + "key": M{"loc": "2d"}, + "ns": "mydb.mycoll", + "min": -500, + "max": 500, + "bits": 32, + } + c.Assert(result4, DeepEquals, expected4) + + // Ensure the index actually works for real. + err = coll.Insert(M{"a": 1, "b": 1}) + c.Assert(err, IsNil) + err = coll.Insert(M{"a": 1, "b": 1}) + c.Assert(err, ErrorMatches, ".*duplicate key error.*") + c.Assert(mgo.IsDup(err), Equals, true) +} + +func (s *S) TestEnsureIndexWithBadInfo(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndex(mgo.Index{}) + c.Assert(err, ErrorMatches, "invalid index key:.*") + + err = coll.EnsureIndex(mgo.Index{Key: []string{""}}) + c.Assert(err, ErrorMatches, "invalid index key:.*") +} + +func (s *S) TestEnsureIndexWithUnsafeSession(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + session.SetSafe(nil) + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + err = coll.Insert(M{"a": 1}) + c.Assert(err, IsNil) + + // Should fail since there are duplicated entries. + index := mgo.Index{ + Key: []string{"a"}, + Unique: true, + } + + err = coll.EnsureIndex(index) + c.Assert(err, ErrorMatches, ".*duplicate key error.*") +} + +func (s *S) TestEnsureIndexKey(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + err = coll.EnsureIndexKey("a", "-b") + c.Assert(err, IsNil) + + sysidx := session.DB("mydb").C("system.indexes") + + result1 := M{} + err = sysidx.Find(M{"name": "a_1"}).One(result1) + c.Assert(err, IsNil) + + result2 := M{} + err = sysidx.Find(M{"name": "a_1_b_-1"}).One(result2) + c.Assert(err, IsNil) + + delete(result1, "v") + expected1 := M{ + "name": "a_1", + "key": M{"a": 1}, + "ns": "mydb.mycoll", + } + c.Assert(result1, DeepEquals, expected1) + + delete(result2, "v") + expected2 := M{ + "name": "a_1_b_-1", + "key": M{"a": 1, "b": -1}, + "ns": "mydb.mycoll", + } + c.Assert(result2, DeepEquals, expected2) +} + +func (s *S) TestEnsureIndexDropIndex(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + err = coll.EnsureIndexKey("-b") + c.Assert(err, IsNil) + + err = coll.DropIndex("-b") + c.Assert(err, IsNil) + + sysidx := session.DB("mydb").C("system.indexes") + dummy := &struct{}{} + + err = sysidx.Find(M{"name": "a_1"}).One(dummy) + c.Assert(err, IsNil) + + err = sysidx.Find(M{"name": "b_1"}).One(dummy) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.DropIndex("a") + c.Assert(err, IsNil) + + err = sysidx.Find(M{"name": "a_1"}).One(dummy) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = coll.DropIndex("a") + c.Assert(err, ErrorMatches, "index not found.*") +} + +func (s *S) TestEnsureIndexCaching(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + mgo.ResetStats() + + // Second EnsureIndex should be cached and do nothing. + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + stats := mgo.GetStats() + c.Assert(stats.SentOps, Equals, 0) + + // Resetting the cache should make it contact the server again. + session.ResetIndexCache() + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + stats = mgo.GetStats() + c.Assert(stats.SentOps, Equals, 2) + + // Dropping the index should also drop the cached index key. + err = coll.DropIndex("a") + c.Assert(err, IsNil) + + mgo.ResetStats() + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + stats = mgo.GetStats() + c.Assert(stats.SentOps, Equals, 2) +} + +func (s *S) TestEnsureIndexGetIndexes(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = coll.EnsureIndexKey("-b") + c.Assert(err, IsNil) + + err = coll.EnsureIndexKey("a") + c.Assert(err, IsNil) + + // Obsolete. + err = coll.EnsureIndexKey("@c") + c.Assert(err, IsNil) + + err = coll.EnsureIndexKey("$2d:d") + c.Assert(err, IsNil) + + indexes, err := coll.Indexes() + c.Assert(err, IsNil) + + c.Assert(indexes[0].Name, Equals, "_id_") + c.Assert(indexes[1].Name, Equals, "a_1") + c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) + c.Assert(indexes[2].Name, Equals, "b_-1") + c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) + c.Assert(indexes[3].Name, Equals, "c_2d") + c.Assert(indexes[3].Key, DeepEquals, []string{"$2d:c"}) + c.Assert(indexes[4].Name, Equals, "d_2d") + c.Assert(indexes[4].Key, DeepEquals, []string{"$2d:d"}) +} + +func (s *S) TestEnsureIndexEvalGetIndexes(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({b: -1})"}}, nil) + c.Assert(err, IsNil) + err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({a: 1})"}}, nil) + c.Assert(err, IsNil) + err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({c: '2d'})"}}, nil) + c.Assert(err, IsNil) + err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({d: -1, e: 1})"}}, nil) + c.Assert(err, IsNil) + + indexes, err := coll.Indexes() + c.Assert(err, IsNil) + + c.Assert(indexes[0].Name, Equals, "_id_") + c.Assert(indexes[1].Name, Equals, "a_1") + c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) + c.Assert(indexes[2].Name, Equals, "b_-1") + c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) + c.Assert(indexes[3].Name, Equals, "c_2d") + c.Assert(indexes[3].Key, DeepEquals, []string{"$2d:c"}) + c.Assert(indexes[4].Name, Equals, "d_-1_e_1") + c.Assert(indexes[4].Key, DeepEquals, []string{"-d", "e"}) +} + +var testTTL = flag.Bool("test-ttl", false, "test TTL collections (may take 1 minute)") + +func (s *S) TestEnsureIndexExpireAfter(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + session.SetSafe(nil) + + coll := session.DB("mydb").C("mycoll") + + err = coll.Insert(M{"n": 1, "t": time.Now().Add(-120 * time.Second)}) + c.Assert(err, IsNil) + err = coll.Insert(M{"n": 2, "t": time.Now()}) + c.Assert(err, IsNil) + + // Should fail since there are duplicated entries. + index := mgo.Index{ + Key: []string{"t"}, + ExpireAfter: 1 * time.Minute, + } + + err = coll.EnsureIndex(index) + c.Assert(err, IsNil) + + indexes, err := coll.Indexes() + c.Assert(err, IsNil) + c.Assert(indexes[1].Name, Equals, "t_1") + c.Assert(indexes[1].ExpireAfter, Equals, 1*time.Minute) + + if *testTTL { + worked := false + stop := time.Now().Add(70 * time.Second) + for time.Now().Before(stop) { + n, err := coll.Count() + c.Assert(err, IsNil) + if n == 1 { + worked = true + break + } + c.Assert(n, Equals, 2) + c.Logf("Still has 2 entries...") + time.Sleep(1 * time.Second) + } + if !worked { + c.Fatalf("TTL index didn't work") + } + } +} + +func (s *S) TestDistinct(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + var result []int + err = coll.Find(M{"n": M{"$gt": 2}}).Sort("n").Distinct("n", &result) + + sort.IntSlice(result).Sort() + c.Assert(result, DeepEquals, []int{3, 4, 6}) +} + +func (s *S) TestMapReduce(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + } + var result []struct { + Id int "_id" + Value int + } + + info, err := coll.Find(M{"n": M{"$gt": 2}}).MapReduce(job, &result) + c.Assert(err, IsNil) + c.Assert(info.InputCount, Equals, 4) + c.Assert(info.EmitCount, Equals, 4) + c.Assert(info.OutputCount, Equals, 3) + c.Assert(info.VerboseTime, IsNil) + + expected := map[int]int{3: 1, 4: 2, 6: 1} + for _, item := range result { + c.Logf("Item: %#v", &item) + c.Assert(item.Value, Equals, expected[item.Id]) + expected[item.Id] = -1 + } + + // Weak attempt of testing that Sort gets delivered. + _, err = coll.Find(nil).Sort("-n").MapReduce(job, &result) + _, isQueryError := err.(*mgo.QueryError) + c.Assert(isQueryError, Equals, true) +} + +func (s *S) TestMapReduceFinalize(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1) }", + Reduce: "function(key, values) { return Array.sum(values) }", + Finalize: "function(key, count) { return {count: count} }", + } + var result []struct { + Id int "_id" + Value struct{ Count int } + } + _, err = coll.Find(nil).MapReduce(job, &result) + c.Assert(err, IsNil) + + expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} + for _, item := range result { + c.Logf("Item: %#v", &item) + c.Assert(item.Value.Count, Equals, expected[item.Id]) + expected[item.Id] = -1 + } +} + +func (s *S) TestMapReduceToCollection(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + Out: "mr", + } + + info, err := coll.Find(nil).MapReduce(job, nil) + c.Assert(err, IsNil) + c.Assert(info.InputCount, Equals, 7) + c.Assert(info.EmitCount, Equals, 7) + c.Assert(info.OutputCount, Equals, 5) + c.Assert(info.Collection, Equals, "mr") + c.Assert(info.Database, Equals, "mydb") + + expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} + var item *struct { + Id int "_id" + Value int + } + mr := session.DB("mydb").C("mr") + iter := mr.Find(nil).Iter() + for iter.Next(&item) { + c.Logf("Item: %#v", &item) + c.Assert(item.Value, Equals, expected[item.Id]) + expected[item.Id] = -1 + } + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestMapReduceToOtherDb(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + Out: bson.D{{"replace", "mr"}, {"db", "otherdb"}}, + } + + info, err := coll.Find(nil).MapReduce(job, nil) + c.Assert(err, IsNil) + c.Assert(info.InputCount, Equals, 7) + c.Assert(info.EmitCount, Equals, 7) + c.Assert(info.OutputCount, Equals, 5) + c.Assert(info.Collection, Equals, "mr") + c.Assert(info.Database, Equals, "otherdb") + + expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} + var item *struct { + Id int "_id" + Value int + } + mr := session.DB("otherdb").C("mr") + iter := mr.Find(nil).Iter() + for iter.Next(&item) { + c.Logf("Item: %#v", &item) + c.Assert(item.Value, Equals, expected[item.Id]) + expected[item.Id] = -1 + } + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestMapReduceOutOfOrder(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + Out: bson.M{"a": "a", "z": "z", "replace": "mr", "db": "otherdb", "b": "b", "y": "y"}, + } + + info, err := coll.Find(nil).MapReduce(job, nil) + c.Assert(err, IsNil) + c.Assert(info.Collection, Equals, "mr") + c.Assert(info.Database, Equals, "otherdb") +} + +func (s *S) TestMapReduceScope(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + coll.Insert(M{"n": 1}) + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, x); }", + Reduce: "function(key, values) { return Array.sum(values); }", + Scope: M{"x": 42}, + } + + var result []bson.M + _, err = coll.Find(nil).MapReduce(job, &result) + c.Assert(len(result), Equals, 1) + c.Assert(result[0]["value"], Equals, 42.0) +} + +func (s *S) TestMapReduceVerbose(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for i := 0; i < 100; i++ { + err = coll.Insert(M{"n": i}) + c.Assert(err, IsNil) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + Verbose: true, + } + + info, err := coll.Find(nil).MapReduce(job, nil) + c.Assert(err, IsNil) + c.Assert(info.VerboseTime, NotNil) +} + +func (s *S) TestMapReduceLimit(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { + coll.Insert(M{"n": i}) + } + + job := &mgo.MapReduce{ + Map: "function() { emit(this.n, 1); }", + Reduce: "function(key, values) { return Array.sum(values); }", + } + + var result []bson.M + _, err = coll.Find(nil).Limit(3).MapReduce(job, &result) + c.Assert(err, IsNil) + c.Assert(len(result), Equals, 3) +} + +func (s *S) TestBuildInfo(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + info, err := session.BuildInfo() + c.Assert(err, IsNil) + + var v []int + for i, a := range strings.Split(info.Version, ".") { + for _, token := range []string{"-rc", "-pre"} { + if i == 2 && strings.Contains(a, token) { + a = a[:strings.Index(a, token)] + info.VersionArray[len(info.VersionArray)-1] = 0 + } + } + n, err := strconv.Atoi(a) + c.Assert(err, IsNil) + v = append(v, n) + } + for len(v) < 4 { + v = append(v, 0) + } + + c.Assert(info.VersionArray, DeepEquals, v) + c.Assert(info.GitVersion, Matches, "[a-z0-9]+") + c.Assert(info.SysInfo, Matches, ".*[0-9:]+.*") + if info.Bits != 32 && info.Bits != 64 { + c.Fatalf("info.Bits is %d", info.Bits) + } + if info.MaxObjectSize < 8192 { + c.Fatalf("info.MaxObjectSize seems too small: %d", info.MaxObjectSize) + } +} + +func (s *S) TestZeroTimeRoundtrip(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + var d struct{ T time.Time } + conn := session.DB("mydb").C("mycoll") + err = conn.Insert(d) + c.Assert(err, IsNil) + + var result bson.M + err = conn.Find(nil).One(&result) + c.Assert(err, IsNil) + t, isTime := result["t"].(time.Time) + c.Assert(isTime, Equals, true) + c.Assert(t, Equals, time.Time{}) +} + +func (s *S) TestFsyncLock(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + clone := session.Clone() + defer clone.Close() + + err = session.FsyncLock() + c.Assert(err, IsNil) + + done := make(chan time.Time) + go func() { + time.Sleep(3e9) + now := time.Now() + err := session.FsyncUnlock() + c.Check(err, IsNil) + done <- now + }() + + err = clone.DB("mydb").C("mycoll").Insert(bson.M{"n": 1}) + unlocked := time.Now() + unlocking := <-done + c.Assert(err, IsNil) + + c.Assert(unlocked.After(unlocking), Equals, true) + c.Assert(unlocked.Sub(unlocking) < 1e9, Equals, true) +} + +func (s *S) TestFsync(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + // Not much to do here. Just a smoke check. + err = session.Fsync(false) + c.Assert(err, IsNil) + err = session.Fsync(true) + c.Assert(err, IsNil) +} + +func (s *S) TestPipeIter(c *C) { + if !s.versionAtLeast(2, 1) { + c.Skip("Pipe only works on 2.1+") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + coll.Insert(M{"n": n}) + } + + iter := coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}).Iter() + result := struct{ N int }{} + for i := 2; i < 7; i++ { + ok := iter.Next(&result) + c.Assert(ok, Equals, true) + c.Assert(result.N, Equals, ns[i]) + } + + c.Assert(iter.Next(&result), Equals, false) + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestPipeAll(c *C) { + if !s.versionAtLeast(2, 1) { + c.Skip("Pipe only works on 2.1+") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err := coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + var result []struct{ N int } + err = coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}).All(&result) + c.Assert(err, IsNil) + for i := 2; i < 7; i++ { + c.Assert(result[i-2].N, Equals, ns[i]) + } +} + +func (s *S) TestPipeOne(c *C) { + if !s.versionAtLeast(2, 1) { + c.Skip("Pipe only works on 2.1+") + } + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + coll.Insert(M{"a": 1, "b": 2}) + + result := struct{ A, B int }{} + + pipe := coll.Pipe([]M{{"$project": M{"a": 1, "b": M{"$add": []interface{}{"$b", 1}}}}}) + err = pipe.One(&result) + c.Assert(err, IsNil) + c.Assert(result.A, Equals, 1) + c.Assert(result.B, Equals, 3) + + pipe = coll.Pipe([]M{{"$match": M{"a": 2}}}) + err = pipe.One(&result) + c.Assert(err, Equals, mgo.ErrNotFound) +} + +func (s *S) TestBatch1Bug(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for i := 0; i < 3; i++ { + err := coll.Insert(M{"n": i}) + c.Assert(err, IsNil) + } + + var ns []struct{ N int } + err = coll.Find(nil).Batch(1).All(&ns) + c.Assert(err, IsNil) + c.Assert(len(ns), Equals, 3) + + session.SetBatch(1) + err = coll.Find(nil).All(&ns) + c.Assert(err, IsNil) + c.Assert(len(ns), Equals, 3) +} + +func (s *S) TestInterfaceIterBug(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + + for i := 0; i < 3; i++ { + err := coll.Insert(M{"n": i}) + c.Assert(err, IsNil) + } + + var result interface{} + + i := 0 + iter := coll.Find(nil).Sort("n").Iter() + for iter.Next(&result) { + c.Assert(result.(bson.M)["n"], Equals, i) + i++ + } + c.Assert(iter.Close(), IsNil) +} + +func (s *S) TestFindIterCloseKillsCursor(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + cursors := serverCursorsOpen(session) + + coll := session.DB("mydb").C("mycoll") + ns := []int{40, 41, 42, 43, 44, 45, 46} + for _, n := range ns { + err = coll.Insert(M{"n": n}) + c.Assert(err, IsNil) + } + + iter := coll.Find(nil).Batch(2).Iter() + c.Assert(iter.Next(bson.M{}), Equals, true) + + c.Assert(iter.Close(), IsNil) + c.Assert(serverCursorsOpen(session), Equals, cursors) +} + +func (s *S) TestLogReplay(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + for i := 0; i < 5; i++ { + err = coll.Insert(M{"ts": time.Now()}) + c.Assert(err, IsNil) + } + + iter := coll.Find(nil).LogReplay().Iter() + if s.versionAtLeast(2, 6) { + // This used to fail in 2.4. Now it's just a smoke test. + c.Assert(iter.Err(), IsNil) + } else { + c.Assert(iter.Next(bson.M{}), Equals, false) + c.Assert(iter.Err(), ErrorMatches, "no ts field in query") + } +} + +func (s *S) TestSetCursorTimeout(c *C) { + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + defer session.Close() + + coll := session.DB("mydb").C("mycoll") + err = coll.Insert(M{"n": 42}) + + // This is just a smoke test. Won't wait 10 minutes for an actual timeout. + + session.SetCursorTimeout(0) + + var result struct{ N int } + iter := coll.Find(nil).Iter() + c.Assert(iter.Next(&result), Equals, true) + c.Assert(result.N, Equals, 42) + c.Assert(iter.Next(&result), Equals, false) +} diff --git a/vendor/labix.org/v2/mgo/socket.go b/vendor/labix.org/v2/mgo/socket.go new file mode 100644 index 0000000..97c2fd7 --- /dev/null +++ b/vendor/labix.org/v2/mgo/socket.go @@ -0,0 +1,673 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "errors" + "labix.org/v2/mgo/bson" + "net" + "sync" + "time" +) + +type replyFunc func(err error, reply *replyOp, docNum int, docData []byte) + +type mongoSocket struct { + sync.Mutex + server *mongoServer // nil when cached + conn net.Conn + timeout time.Duration + addr string // For debugging only. + nextRequestId uint32 + replyFuncs map[uint32]replyFunc + references int + creds []Credential + logout []Credential + cachedNonce string + gotNonce sync.Cond + dead error + serverInfo *mongoServerInfo +} + +type queryOpFlags uint32 + +const ( + _ queryOpFlags = 1 << iota + flagTailable + flagSlaveOk + flagLogReplay + flagNoCursorTimeout + flagAwaitData +) + +type queryOp struct { + collection string + query interface{} + skip int32 + limit int32 + selector interface{} + flags queryOpFlags + replyFunc replyFunc + + options queryWrapper + hasOptions bool + serverTags []bson.D +} + +type queryWrapper struct { + Query interface{} "$query" + OrderBy interface{} "$orderby,omitempty" + Hint interface{} "$hint,omitempty" + Explain bool "$explain,omitempty" + Snapshot bool "$snapshot,omitempty" + ReadPreference bson.D "$readPreference,omitempty" +} + +func (op *queryOp) finalQuery(socket *mongoSocket) interface{} { + if op.flags&flagSlaveOk != 0 && len(op.serverTags) > 0 && socket.ServerInfo().Mongos { + op.hasOptions = true + op.options.ReadPreference = bson.D{{"mode", "secondaryPreferred"}, {"tags", op.serverTags}} + } + if op.hasOptions { + if op.query == nil { + var empty bson.D + op.options.Query = empty + } else { + op.options.Query = op.query + } + debugf("final query is %#v\n", &op.options) + return &op.options + } + return op.query +} + +type getMoreOp struct { + collection string + limit int32 + cursorId int64 + replyFunc replyFunc +} + +type replyOp struct { + flags uint32 + cursorId int64 + firstDoc int32 + replyDocs int32 +} + +type insertOp struct { + collection string // "database.collection" + documents []interface{} // One or more documents to insert + flags uint32 +} + +type updateOp struct { + collection string // "database.collection" + selector interface{} + update interface{} + flags uint32 +} + +type deleteOp struct { + collection string // "database.collection" + selector interface{} + flags uint32 +} + +type killCursorsOp struct { + cursorIds []int64 +} + +type requestInfo struct { + bufferPos int + replyFunc replyFunc +} + +func newSocket(server *mongoServer, conn net.Conn, timeout time.Duration) *mongoSocket { + socket := &mongoSocket{ + conn: conn, + addr: server.Addr, + server: server, + replyFuncs: make(map[uint32]replyFunc), + } + socket.gotNonce.L = &socket.Mutex + if err := socket.InitialAcquire(server.Info(), timeout); err != nil { + panic("newSocket: InitialAcquire returned error: " + err.Error()) + } + stats.socketsAlive(+1) + debugf("Socket %p to %s: initialized", socket, socket.addr) + socket.resetNonce() + go socket.readLoop() + return socket +} + +// Server returns the server that the socket is associated with. +// It returns nil while the socket is cached in its respective server. +func (socket *mongoSocket) Server() *mongoServer { + socket.Lock() + server := socket.server + socket.Unlock() + return server +} + +// ServerInfo returns details for the server at the time the socket +// was initially acquired. +func (socket *mongoSocket) ServerInfo() *mongoServerInfo { + socket.Lock() + serverInfo := socket.serverInfo + socket.Unlock() + return serverInfo +} + +// InitialAcquire obtains the first reference to the socket, either +// right after the connection is made or once a recycled socket is +// being put back in use. +func (socket *mongoSocket) InitialAcquire(serverInfo *mongoServerInfo, timeout time.Duration) error { + socket.Lock() + if socket.references > 0 { + panic("Socket acquired out of cache with references") + } + if socket.dead != nil { + dead := socket.dead + socket.Unlock() + return dead + } + socket.references++ + socket.serverInfo = serverInfo + socket.timeout = timeout + stats.socketsInUse(+1) + stats.socketRefs(+1) + socket.Unlock() + return nil +} + +// Acquire obtains an additional reference to the socket. +// The socket will only be recycled when it's released as many +// times as it's been acquired. +func (socket *mongoSocket) Acquire() (info *mongoServerInfo) { + socket.Lock() + if socket.references == 0 { + panic("Socket got non-initial acquire with references == 0") + } + // We'll track references to dead sockets as well. + // Caller is still supposed to release the socket. + socket.references++ + stats.socketRefs(+1) + serverInfo := socket.serverInfo + socket.Unlock() + return serverInfo +} + +// Release decrements a socket reference. The socket will be +// recycled once its released as many times as it's been acquired. +func (socket *mongoSocket) Release() { + socket.Lock() + if socket.references == 0 { + panic("socket.Release() with references == 0") + } + socket.references-- + stats.socketRefs(-1) + if socket.references == 0 { + stats.socketsInUse(-1) + server := socket.server + socket.Unlock() + socket.LogoutAll() + // If the socket is dead server is nil. + if server != nil { + server.RecycleSocket(socket) + } + } else { + socket.Unlock() + } +} + +// SetTimeout changes the timeout used on socket operations. +func (socket *mongoSocket) SetTimeout(d time.Duration) { + socket.Lock() + socket.timeout = d + socket.Unlock() +} + +type deadlineType int + +const ( + readDeadline deadlineType = 1 + writeDeadline deadlineType = 2 +) + +func (socket *mongoSocket) updateDeadline(which deadlineType) { + var when time.Time + if socket.timeout > 0 { + when = time.Now().Add(socket.timeout) + } + whichstr := "" + switch which { + case readDeadline | writeDeadline: + whichstr = "read/write" + socket.conn.SetDeadline(when) + case readDeadline: + whichstr = "read" + socket.conn.SetReadDeadline(when) + case writeDeadline: + whichstr = "write" + socket.conn.SetWriteDeadline(when) + default: + panic("invalid parameter to updateDeadline") + } + debugf("Socket %p to %s: updated %s deadline to %s ahead (%s)", socket, socket.addr, whichstr, socket.timeout, when) +} + +// Close terminates the socket use. +func (socket *mongoSocket) Close() { + socket.kill(errors.New("Closed explicitly"), false) +} + +func (socket *mongoSocket) kill(err error, abend bool) { + socket.Lock() + if socket.dead != nil { + debugf("Socket %p to %s: killed again: %s (previously: %s)", socket, socket.addr, err.Error(), socket.dead.Error()) + socket.Unlock() + return + } + logf("Socket %p to %s: closing: %s (abend=%v)", socket, socket.addr, err.Error(), abend) + socket.dead = err + socket.conn.Close() + stats.socketsAlive(-1) + replyFuncs := socket.replyFuncs + socket.replyFuncs = make(map[uint32]replyFunc) + server := socket.server + socket.server = nil + socket.gotNonce.Broadcast() + socket.Unlock() + for _, replyFunc := range replyFuncs { + logf("Socket %p to %s: notifying replyFunc of closed socket: %s", socket, socket.addr, err.Error()) + replyFunc(err, nil, -1, nil) + } + if abend { + server.AbendSocket(socket) + } +} + +func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) { + var wait, change sync.Mutex + var replyDone bool + var replyData []byte + var replyErr error + wait.Lock() + op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { + change.Lock() + if !replyDone { + replyDone = true + replyErr = err + if err == nil { + replyData = docData + } + } + change.Unlock() + wait.Unlock() + } + err = socket.Query(op) + if err != nil { + return nil, err + } + wait.Lock() + change.Lock() + data = replyData + err = replyErr + change.Unlock() + return data, err +} + +func (socket *mongoSocket) Query(ops ...interface{}) (err error) { + + if lops := socket.flushLogout(); len(lops) > 0 { + ops = append(lops, ops...) + } + + buf := make([]byte, 0, 256) + + // Serialize operations synchronously to avoid interrupting + // other goroutines while we can't really be sending data. + // Also, record id positions so that we can compute request + // ids at once later with the lock already held. + requests := make([]requestInfo, len(ops)) + requestCount := 0 + + for _, op := range ops { + debugf("Socket %p to %s: serializing op: %#v", socket, socket.addr, op) + start := len(buf) + var replyFunc replyFunc + switch op := op.(type) { + + case *updateOp: + buf = addHeader(buf, 2001) + buf = addInt32(buf, 0) // Reserved + buf = addCString(buf, op.collection) + buf = addInt32(buf, int32(op.flags)) + debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) + buf, err = addBSON(buf, op.selector) + if err != nil { + return err + } + debugf("Socket %p to %s: serializing update document: %#v", socket, socket.addr, op.update) + buf, err = addBSON(buf, op.update) + if err != nil { + return err + } + + case *insertOp: + buf = addHeader(buf, 2002) + buf = addInt32(buf, int32(op.flags)) + buf = addCString(buf, op.collection) + for _, doc := range op.documents { + debugf("Socket %p to %s: serializing document for insertion: %#v", socket, socket.addr, doc) + buf, err = addBSON(buf, doc) + if err != nil { + return err + } + } + + case *queryOp: + buf = addHeader(buf, 2004) + buf = addInt32(buf, int32(op.flags)) + buf = addCString(buf, op.collection) + buf = addInt32(buf, op.skip) + buf = addInt32(buf, op.limit) + buf, err = addBSON(buf, op.finalQuery(socket)) + if err != nil { + return err + } + if op.selector != nil { + buf, err = addBSON(buf, op.selector) + if err != nil { + return err + } + } + replyFunc = op.replyFunc + + case *getMoreOp: + buf = addHeader(buf, 2005) + buf = addInt32(buf, 0) // Reserved + buf = addCString(buf, op.collection) + buf = addInt32(buf, op.limit) + buf = addInt64(buf, op.cursorId) + replyFunc = op.replyFunc + + case *deleteOp: + buf = addHeader(buf, 2006) + buf = addInt32(buf, 0) // Reserved + buf = addCString(buf, op.collection) + buf = addInt32(buf, int32(op.flags)) + debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) + buf, err = addBSON(buf, op.selector) + if err != nil { + return err + } + + case *killCursorsOp: + buf = addHeader(buf, 2007) + buf = addInt32(buf, 0) // Reserved + buf = addInt32(buf, int32(len(op.cursorIds))) + for _, cursorId := range op.cursorIds { + buf = addInt64(buf, cursorId) + } + + default: + panic("internal error: unknown operation type") + } + + setInt32(buf, start, int32(len(buf)-start)) + + if replyFunc != nil { + request := &requests[requestCount] + request.replyFunc = replyFunc + request.bufferPos = start + requestCount++ + } + } + + // Buffer is ready for the pipe. Lock, allocate ids, and enqueue. + + socket.Lock() + if socket.dead != nil { + dead := socket.dead + socket.Unlock() + debugf("Socket %p to %s: failing query, already closed: %s", socket, socket.addr, socket.dead.Error()) + // XXX This seems necessary in case the session is closed concurrently + // with a query being performed, but it's not yet tested: + for i := 0; i != requestCount; i++ { + request := &requests[i] + if request.replyFunc != nil { + request.replyFunc(dead, nil, -1, nil) + } + } + return dead + } + + wasWaiting := len(socket.replyFuncs) > 0 + + // Reserve id 0 for requests which should have no responses. + requestId := socket.nextRequestId + 1 + if requestId == 0 { + requestId++ + } + socket.nextRequestId = requestId + uint32(requestCount) + for i := 0; i != requestCount; i++ { + request := &requests[i] + setInt32(buf, request.bufferPos+4, int32(requestId)) + socket.replyFuncs[requestId] = request.replyFunc + requestId++ + } + + debugf("Socket %p to %s: sending %d op(s) (%d bytes)", socket, socket.addr, len(ops), len(buf)) + stats.sentOps(len(ops)) + + socket.updateDeadline(writeDeadline) + _, err = socket.conn.Write(buf) + if !wasWaiting && requestCount > 0 { + socket.updateDeadline(readDeadline) + } + socket.Unlock() + return err +} + +func fill(r net.Conn, b []byte) error { + l := len(b) + n, err := r.Read(b) + for n != l && err == nil { + var ni int + ni, err = r.Read(b[n:]) + n += ni + } + return err +} + +// Estimated minimum cost per socket: 1 goroutine + memory for the largest +// document ever seen. +func (socket *mongoSocket) readLoop() { + p := make([]byte, 36) // 16 from header + 20 from OP_REPLY fixed fields + s := make([]byte, 4) + conn := socket.conn // No locking, conn never changes. + for { + // XXX Handle timeouts, , etc + err := fill(conn, p) + if err != nil { + socket.kill(err, true) + return + } + + totalLen := getInt32(p, 0) + responseTo := getInt32(p, 8) + opCode := getInt32(p, 12) + + // Don't use socket.server.Addr here. socket is not + // locked and socket.server may go away. + debugf("Socket %p to %s: got reply (%d bytes)", socket, socket.addr, totalLen) + + _ = totalLen + + if opCode != 1 { + socket.kill(errors.New("opcode != 1, corrupted data?"), true) + return + } + + reply := replyOp{ + flags: uint32(getInt32(p, 16)), + cursorId: getInt64(p, 20), + firstDoc: getInt32(p, 28), + replyDocs: getInt32(p, 32), + } + + stats.receivedOps(+1) + stats.receivedDocs(int(reply.replyDocs)) + + socket.Lock() + replyFunc, ok := socket.replyFuncs[uint32(responseTo)] + if ok { + delete(socket.replyFuncs, uint32(responseTo)) + } + socket.Unlock() + + if replyFunc != nil && reply.replyDocs == 0 { + replyFunc(nil, &reply, -1, nil) + } else { + for i := 0; i != int(reply.replyDocs); i++ { + err := fill(conn, s) + if err != nil { + if replyFunc != nil { + replyFunc(err, nil, -1, nil) + } + socket.kill(err, true) + return + } + + b := make([]byte, int(getInt32(s, 0))) + + // copy(b, s) in an efficient way. + b[0] = s[0] + b[1] = s[1] + b[2] = s[2] + b[3] = s[3] + + err = fill(conn, b[4:]) + if err != nil { + if replyFunc != nil { + replyFunc(err, nil, -1, nil) + } + socket.kill(err, true) + return + } + + if globalDebug && globalLogger != nil { + m := bson.M{} + if err := bson.Unmarshal(b, m); err == nil { + debugf("Socket %p to %s: received document: %#v", socket, socket.addr, m) + } + } + + if replyFunc != nil { + replyFunc(nil, &reply, i, b) + } + + // XXX Do bound checking against totalLen. + } + } + + socket.Lock() + if len(socket.replyFuncs) == 0 { + // Nothing else to read for now. Disable deadline. + socket.conn.SetReadDeadline(time.Time{}) + } else { + socket.updateDeadline(readDeadline) + } + socket.Unlock() + + // XXX Do bound checking against totalLen. + } +} + +var emptyHeader = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +func addHeader(b []byte, opcode int) []byte { + i := len(b) + b = append(b, emptyHeader...) + // Enough for current opcodes. + b[i+12] = byte(opcode) + b[i+13] = byte(opcode >> 8) + return b +} + +func addInt32(b []byte, i int32) []byte { + return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24)) +} + +func addInt64(b []byte, i int64) []byte { + return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24), + byte(i>>32), byte(i>>40), byte(i>>48), byte(i>>56)) +} + +func addCString(b []byte, s string) []byte { + b = append(b, []byte(s)...) + b = append(b, 0) + return b +} + +func addBSON(b []byte, doc interface{}) ([]byte, error) { + if doc == nil { + return append(b, 5, 0, 0, 0, 0), nil + } + data, err := bson.Marshal(doc) + if err != nil { + return b, err + } + return append(b, data...), nil +} + +func setInt32(b []byte, pos int, i int32) { + b[pos] = byte(i) + b[pos+1] = byte(i >> 8) + b[pos+2] = byte(i >> 16) + b[pos+3] = byte(i >> 24) +} + +func getInt32(b []byte, pos int) int32 { + return (int32(b[pos+0])) | + (int32(b[pos+1]) << 8) | + (int32(b[pos+2]) << 16) | + (int32(b[pos+3]) << 24) +} + +func getInt64(b []byte, pos int) int64 { + return (int64(b[pos+0])) | + (int64(b[pos+1]) << 8) | + (int64(b[pos+2]) << 16) | + (int64(b[pos+3]) << 24) | + (int64(b[pos+4]) << 32) | + (int64(b[pos+5]) << 40) | + (int64(b[pos+6]) << 48) | + (int64(b[pos+7]) << 56) +} diff --git a/vendor/labix.org/v2/mgo/stats.go b/vendor/labix.org/v2/mgo/stats.go new file mode 100644 index 0000000..59723e6 --- /dev/null +++ b/vendor/labix.org/v2/mgo/stats.go @@ -0,0 +1,147 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo + +import ( + "sync" +) + +var stats *Stats +var statsMutex sync.Mutex + +func SetStats(enabled bool) { + statsMutex.Lock() + if enabled { + if stats == nil { + stats = &Stats{} + } + } else { + stats = nil + } + statsMutex.Unlock() +} + +func GetStats() (snapshot Stats) { + statsMutex.Lock() + snapshot = *stats + statsMutex.Unlock() + return +} + +func ResetStats() { + statsMutex.Lock() + debug("Resetting stats") + old := stats + stats = &Stats{} + // These are absolute values: + stats.Clusters = old.Clusters + stats.SocketsInUse = old.SocketsInUse + stats.SocketsAlive = old.SocketsAlive + stats.SocketRefs = old.SocketRefs + statsMutex.Unlock() + return +} + +type Stats struct { + Clusters int + MasterConns int + SlaveConns int + SentOps int + ReceivedOps int + ReceivedDocs int + SocketsAlive int + SocketsInUse int + SocketRefs int +} + +func (stats *Stats) cluster(delta int) { + if stats != nil { + statsMutex.Lock() + stats.Clusters += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) conn(delta int, master bool) { + if stats != nil { + statsMutex.Lock() + if master { + stats.MasterConns += delta + } else { + stats.SlaveConns += delta + } + statsMutex.Unlock() + } +} + +func (stats *Stats) sentOps(delta int) { + if stats != nil { + statsMutex.Lock() + stats.SentOps += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) receivedOps(delta int) { + if stats != nil { + statsMutex.Lock() + stats.ReceivedOps += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) receivedDocs(delta int) { + if stats != nil { + statsMutex.Lock() + stats.ReceivedDocs += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) socketsInUse(delta int) { + if stats != nil { + statsMutex.Lock() + stats.SocketsInUse += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) socketsAlive(delta int) { + if stats != nil { + statsMutex.Lock() + stats.SocketsAlive += delta + statsMutex.Unlock() + } +} + +func (stats *Stats) socketRefs(delta int) { + if stats != nil { + statsMutex.Lock() + stats.SocketRefs += delta + statsMutex.Unlock() + } +} diff --git a/vendor/labix.org/v2/mgo/suite_test.go b/vendor/labix.org/v2/mgo/suite_test.go new file mode 100644 index 0000000..a846c51 --- /dev/null +++ b/vendor/labix.org/v2/mgo/suite_test.go @@ -0,0 +1,240 @@ +// mgo - MongoDB driver for Go +// +// Copyright (c) 2010-2012 - Gustavo Niemeyer +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package mgo_test + +import ( + "errors" + "flag" + "fmt" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" + "net" + "os/exec" + "strconv" + "syscall" + + "testing" + "time" +) + +var fast = flag.Bool("fast", false, "Skip slow tests") + +type M bson.M + +type cLogger C + +func (c *cLogger) Output(calldepth int, s string) error { + ns := time.Now().UnixNano() + t := float64(ns%100e9) / 1e9 + ((*C)(c)).Logf("[LOG] %.05f %s", t, s) + return nil +} + +func TestAll(t *testing.T) { + TestingT(t) +} + +type S struct { + session *mgo.Session + stopped bool + build mgo.BuildInfo + frozen []string +} + +func (s *S) versionAtLeast(v ...int) bool { + for i := range v { + if i == len(s.build.VersionArray) { + return false + } + if s.build.VersionArray[i] < v[i] { + return false + } + } + return true +} + +var _ = Suite(&S{}) + +func (s *S) SetUpSuite(c *C) { + mgo.SetDebug(true) + mgo.SetStats(true) + s.StartAll() + + session, err := mgo.Dial("localhost:40001") + c.Assert(err, IsNil) + s.build, err = session.BuildInfo() + c.Check(err, IsNil) + session.Close() +} + +func (s *S) SetUpTest(c *C) { + err := run("mongo --nodb testdb/dropall.js") + if err != nil { + panic(err.Error()) + } + mgo.SetLogger((*cLogger)(c)) + mgo.ResetStats() +} + +func (s *S) TearDownTest(c *C) { + if s.stopped { + s.StartAll() + } + for _, host := range s.frozen { + if host != "" { + s.Thaw(host) + } + } + var stats mgo.Stats + for i := 0; ; i++ { + stats = mgo.GetStats() + if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { + break + } + if i == 20 { + c.Fatal("Test left sockets in a dirty state") + } + c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) + time.Sleep(500 * time.Millisecond) + } + for i := 0; ; i++ { + stats = mgo.GetStats() + if stats.Clusters == 0 { + break + } + if i == 60 { + c.Fatal("Test left clusters alive") + } + c.Logf("Waiting for clusters to die: %d alive", stats.Clusters) + time.Sleep(1 * time.Second) + } +} + +func (s *S) Stop(host string) { + // Give a moment for slaves to sync and avoid getting rollback issues. + time.Sleep(2 * time.Second) + err := run("cd _testdb && supervisorctl stop " + supvName(host)) + if err != nil { + panic(err) + } + s.stopped = true +} + +func (s *S) pid(host string) int { + output, err := exec.Command("lsof", "-iTCP:"+hostPort(host), "-sTCP:LISTEN", "-Fp").CombinedOutput() + if err != nil { + panic(err) + } + pidstr := string(output[1 : len(output)-1]) + pid, err := strconv.Atoi(pidstr) + if err != nil { + panic("cannot convert pid to int: " + pidstr) + } + return pid +} + +func (s *S) Freeze(host string) { + err := syscall.Kill(s.pid(host), syscall.SIGSTOP) + if err != nil { + panic(err) + } + s.frozen = append(s.frozen, host) +} + +func (s *S) Thaw(host string) { + err := syscall.Kill(s.pid(host), syscall.SIGCONT) + if err != nil { + panic(err) + } + for i, frozen := range s.frozen { + if frozen == host { + s.frozen[i] = "" + } + } +} + +func (s *S) StartAll() { + // Restart any stopped nodes. + run("cd _testdb && supervisorctl start all") + err := run("cd testdb && mongo --nodb wait.js") + if err != nil { + panic(err) + } + s.stopped = false +} + +func run(command string) error { + output, err := exec.Command("/bin/sh", "-c", command).CombinedOutput() + if err != nil { + msg := fmt.Sprintf("Failed to execute: %s: %s\n%s", command, err.Error(), string(output)) + return errors.New(msg) + } + return nil +} + +var supvNames = map[string]string{ + "40001": "db1", + "40002": "db2", + "40011": "rs1a", + "40012": "rs1b", + "40013": "rs1c", + "40021": "rs2a", + "40022": "rs2b", + "40023": "rs2c", + "40031": "rs3a", + "40032": "rs3b", + "40033": "rs3c", + "40041": "rs4a", + "40101": "cfg1", + "40102": "cfg2", + "40103": "cfg3", + "40201": "s1", + "40202": "s2", + "40203": "s3", +} + +// supvName returns the supervisord name for the given host address. +func supvName(host string) string { + host, port, err := net.SplitHostPort(host) + if err != nil { + panic(err) + } + name, ok := supvNames[port] + if !ok { + panic("Unknown host: " + host) + } + return name +} + +func hostPort(host string) string { + _, port, err := net.SplitHostPort(host) + if err != nil { + panic(err) + } + return port +} diff --git a/vendor/labix.org/v2/mgo/testdb/dropall.js b/vendor/labix.org/v2/mgo/testdb/dropall.js new file mode 100644 index 0000000..ca12892 --- /dev/null +++ b/vendor/labix.org/v2/mgo/testdb/dropall.js @@ -0,0 +1,47 @@ + +var ports = [40001, 40002, 40011, 40012, 40013, 40021, 40022, 40023, 40041, 40101, 40102, 40103, 40201, 40202, 40203] +var auth = [40002, 40103, 40203, 40031] + +for (var i in ports) { + var port = ports[i] + var server = "localhost:" + port + var mongo = new Mongo("localhost:" + port) + var admin = mongo.getDB("admin") + + for (var j in auth) { + if (auth[j] == port) { + admin.auth("root", "rapadura") + admin.system.users.find().forEach(function(u) { + if (u.user == "root" || u.user == "reader") { + return; + } + if (typeof admin.dropUser == "function") { + mongo.getDB(u.db).dropUser(u.user); + } else { + admin.removeUser(u.user); + } + }) + break + } + } + var result = admin.runCommand({"listDatabases": 1}) + // Why is the command returning undefined!? + while (typeof result.databases == "undefined") { + print("dropall.js: listing databases of :" + port + " got:", result) + result = admin.runCommand({"listDatabases": 1}) + } + var dbs = result.databases + for (var j = 0; j != dbs.length; j++) { + var db = dbs[j] + switch (db.name) { + case "admin": + case "local": + case "config": + break + default: + mongo.getDB(db.name).dropDatabase() + } + } +} + +// vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/init.js b/vendor/labix.org/v2/mgo/testdb/init.js new file mode 100644 index 0000000..02a6c61 --- /dev/null +++ b/vendor/labix.org/v2/mgo/testdb/init.js @@ -0,0 +1,103 @@ +//var settings = {heartbeatSleep: 0.05, heartbeatTimeout: 0.5} +var settings = {}; + +// We know the master of the first set (pri=1), but not of the second. +var rs1cfg = {_id: "rs1", + members: [{_id: 1, host: "127.0.0.1:40011", priority: 1, tags: {rs1: "a"}}, + {_id: 2, host: "127.0.0.1:40012", priority: 0, tags: {rs1: "b"}}, + {_id: 3, host: "127.0.0.1:40013", priority: 0, tags: {rs1: "c"}}], + settings: settings} +var rs2cfg = {_id: "rs2", + members: [{_id: 1, host: "127.0.0.1:40021", priority: 1, tags: {rs2: "a"}}, + {_id: 2, host: "127.0.0.1:40022", priority: 1, tags: {rs2: "b"}}, + {_id: 3, host: "127.0.0.1:40023", priority: 1, tags: {rs2: "c"}}], + settings: settings} +var rs3cfg = {_id: "rs3", + members: [{_id: 1, host: "127.0.0.1:40031", priority: 1, tags: {rs3: "a"}}, + {_id: 2, host: "127.0.0.1:40032", priority: 1, tags: {rs3: "b"}}, + {_id: 3, host: "127.0.0.1:40033", priority: 1, tags: {rs3: "c"}}], + settings: settings} + +for (var i = 0; i != 60; i++) { + try { + db1 = new Mongo("127.0.0.1:40001").getDB("admin") + db2 = new Mongo("127.0.0.1:40002").getDB("admin") + rs1a = new Mongo("127.0.0.1:40011").getDB("admin") + rs2a = new Mongo("127.0.0.1:40021").getDB("admin") + rs3a = new Mongo("127.0.0.1:40031").getDB("admin") + break + } catch(err) { + print("Can't connect yet...") + } + sleep(1000) +} + +rs1a.runCommand({replSetInitiate: rs1cfg}) +rs2a.runCommand({replSetInitiate: rs2cfg}) +rs3a.runCommand({replSetInitiate: rs3cfg}) + +function configShards() { + cfg1 = new Mongo("127.0.0.1:40201").getDB("admin") + cfg1.runCommand({addshard: "127.0.0.1:40001"}) + cfg1.runCommand({addshard: "rs1/127.0.0.1:40011"}) + + cfg2 = new Mongo("127.0.0.1:40202").getDB("admin") + cfg2.runCommand({addshard: "rs2/127.0.0.1:40021"}) + + cfg3 = new Mongo("127.0.0.1:40203").getDB("admin") + cfg3.runCommand({addshard: "rs3/127.0.0.1:40031"}) +} + +function configAuth() { + var addrs = ["127.0.0.1:40002", "127.0.0.1:40203", "127.0.0.1:40031"] + for (var i in addrs) { + var db = new Mongo(addrs[i]).getDB("admin") + var v = db.serverBuildInfo().versionArray + if (v < [2, 5]) { + db.addUser("root", "rapadura") + } else { + db.createUser({user: "root", pwd: "rapadura", roles: ["root"]}) + } + db.auth("root", "rapadura") + if (v >= [2, 6]) { + db.createUser({user: "reader", pwd: "rapadura", roles: ["readAnyDatabase"]}) + } else if (v >= [2, 4]) { + db.addUser({user: "reader", pwd: "rapadura", roles: ["readAnyDatabase"]}) + } else { + db.addUser("reader", "rapadura", true) + } + } +} + +function countHealthy(rs) { + var status = rs.runCommand({replSetGetStatus: 1}) + var count = 0 + if (typeof status.members != "undefined") { + for (var i = 0; i != status.members.length; i++) { + var m = status.members[i] + if (m.health == 1 && (m.state == 1 || m.state == 2)) { + count += 1 + } + } + } + return count +} + +var totalRSMembers = rs1cfg.members.length + rs2cfg.members.length + rs3cfg.members.length + +for (var i = 0; i != 60; i++) { + var count = countHealthy(rs1a) + countHealthy(rs2a) + countHealthy(rs3a) + print("Replica sets have", count, "healthy nodes.") + if (count == totalRSMembers) { + sleep(2000) + configShards() + configAuth() + quit(0) + } + sleep(1000) +} + +print("Replica sets didn't sync up properly.") +quit(12) + +// vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/setup.sh b/vendor/labix.org/v2/mgo/testdb/setup.sh new file mode 100755 index 0000000..ab841da --- /dev/null +++ b/vendor/labix.org/v2/mgo/testdb/setup.sh @@ -0,0 +1,54 @@ +#!/bin/sh -e + +start() { + mkdir _testdb + cd _testdb + mkdir db1 db2 rs1a rs1b rs1c rs2a rs2b rs2c rs3a rs3b rs3c rs4a cfg1 cfg2 cfg3 + ln -s ../testdb/supervisord.conf supervisord.conf + echo keyfile > keyfile + chmod 600 keyfile + echo "Running supervisord..." + supervisord || ( echo "Supervisord failed executing ($?)" && exit 1 ) + COUNT=$(grep '^\[program' supervisord.conf | wc -l) + echo "Supervisord is up, starting $COUNT processes..." + for i in $(seq 10); do + RUNNING=$(supervisorctl status | grep RUNNING | wc -l) + echo "$RUNNING processes running..." + if [ x$COUNT = x$RUNNING ]; then + echo "Running setup.js with mongo..." + mongo --nodb ../testdb/init.js + exit 0 + fi + sleep 1 + done + echo "Failed to start all processes. Check out what's up at $PWD now!" + exit 1 +} + +stop() { + if [ -d _testdb ]; then + echo "Shutting down test cluster..." + (cd _testdb && supervisorctl shutdown) + rm -rf _testdb + fi +} + + +if [ ! -f suite_test.go ]; then + echo "This script must be run from within the source directory." + exit 1 +fi + +case "$1" in + + start) + start + ;; + + stop) + stop + ;; + +esac + +# vim:ts=4:sw=4:et diff --git a/vendor/labix.org/v2/mgo/testdb/supervisord.conf b/vendor/labix.org/v2/mgo/testdb/supervisord.conf new file mode 100644 index 0000000..b0aca01 --- /dev/null +++ b/vendor/labix.org/v2/mgo/testdb/supervisord.conf @@ -0,0 +1,62 @@ +[supervisord] +logfile = %(here)s/supervisord.log +pidfile = %(here)s/supervisord.pid +directory = %(here)s +#nodaemon = true + +[inet_http_server] +port = 127.0.0.1:9001 + +[supervisorctl] +serverurl = http://127.0.0.1:9001 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[program:db1] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --dbpath %(here)s/db1 --bind_ip=127.0.0.1 --port 40001 + +[program:db2] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --dbpath %(here)s/db2 --bind_ip=127.0.0.1 --port 40002 --auth + +[program:rs1a] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1a --bind_ip=127.0.0.1 --port 40011 +[program:rs1b] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1b --bind_ip=127.0.0.1 --port 40012 +[program:rs1c] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs1 --dbpath %(here)s/rs1c --bind_ip=127.0.0.1 --port 40013 + +[program:rs2a] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2a --bind_ip=127.0.0.1 --port 40021 +[program:rs2b] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2b --bind_ip=127.0.0.1 --port 40022 +[program:rs2c] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs2 --dbpath %(here)s/rs2c --bind_ip=127.0.0.1 --port 40023 + +[program:rs3a] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3a --bind_ip=127.0.0.1 --port 40031 --auth --keyFile=%(here)s/keyfile +[program:rs3b] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3b --bind_ip=127.0.0.1 --port 40032 --auth --keyFile=%(here)s/keyfile +[program:rs3c] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs3 --dbpath %(here)s/rs3c --bind_ip=127.0.0.1 --port 40033 --auth --keyFile=%(here)s/keyfile + +[program:rs4a] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --shardsvr --replSet rs4 --dbpath %(here)s/rs4a --bind_ip=127.0.0.1 --port 40041 + +[program:cfg1] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg1 --bind_ip=127.0.0.1 --port 40101 + +[program:cfg2] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg2 --bind_ip=127.0.0.1 --port 40102 + +[program:cfg3] +command = mongod --nohttpinterface --noprealloc --nojournal --smallfiles --nssize=1 --oplogSize=1 --configsvr --dbpath %(here)s/cfg3 --bind_ip=127.0.0.1 --port 40103 --auth --keyFile=%(here)s/keyfile + +[program:s1] +command = mongos --configdb 127.0.0.1:40101 --bind_ip=127.0.0.1 --port 40201 --chunkSize 1 + +[program:s2] +command = mongos --configdb 127.0.0.1:40102 --bind_ip=127.0.0.1 --port 40202 --chunkSize 1 + +[program:s3] +command = mongos --configdb 127.0.0.1:40103 --bind_ip=127.0.0.1 --port 40203 --chunkSize 1 --keyFile=%(here)s/keyfile diff --git a/vendor/labix.org/v2/mgo/testdb/wait.js b/vendor/labix.org/v2/mgo/testdb/wait.js new file mode 100644 index 0000000..de0d660 --- /dev/null +++ b/vendor/labix.org/v2/mgo/testdb/wait.js @@ -0,0 +1,58 @@ +// We know the master of the first set (pri=1), but not of the second. +var settings = {} +var rs1cfg = {_id: "rs1", + members: [{_id: 1, host: "127.0.0.1:40011", priority: 1}, + {_id: 2, host: "127.0.0.1:40012", priority: 0}, + {_id: 3, host: "127.0.0.1:40013", priority: 0}]} +var rs2cfg = {_id: "rs2", + members: [{_id: 1, host: "127.0.0.1:40021", priority: 1}, + {_id: 2, host: "127.0.0.1:40022", priority: 1}, + {_id: 3, host: "127.0.0.1:40023", priority: 0}]} +var rs3cfg = {_id: "rs3", + members: [{_id: 1, host: "127.0.0.1:40031", priority: 1}, + {_id: 2, host: "127.0.0.1:40032", priority: 1}, + {_id: 3, host: "127.0.0.1:40033", priority: 1}], + settings: settings} + +for (var i = 0; i != 60; i++) { + try { + rs1a = new Mongo("127.0.0.1:40011").getDB("admin") + rs2a = new Mongo("127.0.0.1:40021").getDB("admin") + rs3a = new Mongo("127.0.0.1:40031").getDB("admin") + rs3a.auth("root", "rapadura") + db1 = new Mongo("127.0.0.1:40001").getDB("admin") + db2 = new Mongo("127.0.0.1:40002").getDB("admin") + break + } catch(err) { + print("Can't connect yet...") + } + sleep(1000) +} + +function countHealthy(rs) { + var status = rs.runCommand({replSetGetStatus: 1}) + var count = 0 + if (typeof status.members != "undefined") { + for (var i = 0; i != status.members.length; i++) { + var m = status.members[i] + if (m.health == 1 && (m.state == 1 || m.state == 2)) { + count += 1 + } + } + } + return count +} + +var totalRSMembers = rs1cfg.members.length + rs2cfg.members.length + rs3cfg.members.length + +for (var i = 0; i != 60; i++) { + var count = countHealthy(rs1a) + countHealthy(rs2a) + countHealthy(rs3a) + print("Replica sets have", count, "healthy nodes.") + if (count == totalRSMembers) { + quit(0) + } + sleep(1000) +} + +print("Replica sets didn't sync up properly.") +quit(12) diff --git a/vendor/labix.org/v2/mgo/txn/chaos.go b/vendor/labix.org/v2/mgo/txn/chaos.go new file mode 100644 index 0000000..a9258fa --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/chaos.go @@ -0,0 +1,68 @@ +package txn + +import ( + mrand "math/rand" + "time" +) + +var chaosEnabled = false +var chaosSetting Chaos + +// Chaos holds parameters for the failure injection mechanism. +type Chaos struct { + // KillChance is the 0.0 to 1.0 chance that a given checkpoint + // within the algorithm will raise an interruption that will + // stop the procedure. + KillChance float64 + + // SlowdownChance is the 0.0 to 1.0 chance that a given checkpoint + // within the algorithm will be delayed by Slowdown before + // continuing. + SlowdownChance float64 + Slowdown time.Duration + + // If Breakpoint is set, the above settings will only affect the + // named breakpoint. + Breakpoint string +} + +// SetChaos sets the failure injection parameters to c. +func SetChaos(c Chaos) { + chaosSetting = c + chaosEnabled = c.KillChance > 0 || c.SlowdownChance > 0 +} + +func chaos(bpname string) { + if !chaosEnabled { + return + } + switch chaosSetting.Breakpoint { + case "", bpname: + kc := chaosSetting.KillChance + if kc > 0 && mrand.Intn(1000) < int(kc*1000) { + panic(chaosError{}) + } + if bpname == "insert" { + return + } + sc := chaosSetting.SlowdownChance + if sc > 0 && mrand.Intn(1000) < int(kc*1000) { + time.Sleep(chaosSetting.Slowdown) + } + } +} + +type chaosError struct{} + +func (f *flusher) handleChaos(err *error) { + v := recover() + if v == nil { + return + } + if _, ok := v.(chaosError); ok { + f.debugf("Killed by chaos!") + *err = ErrChaos + return + } + panic(v) +} diff --git a/vendor/labix.org/v2/mgo/txn/debug.go b/vendor/labix.org/v2/mgo/txn/debug.go new file mode 100644 index 0000000..7f67f4e --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/debug.go @@ -0,0 +1,108 @@ +package txn + +import ( + "bytes" + "fmt" + "labix.org/v2/mgo/bson" + "sort" + "sync/atomic" +) + +var ( + debugEnabled bool + logger log_Logger +) + +type log_Logger interface { + Output(calldepth int, s string) error +} + +// Specify the *log.Logger where logged messages should be sent to. +func SetLogger(l log_Logger) { + logger = l +} + +// SetDebug enables or disables debugging. +func SetDebug(debug bool) { + debugEnabled = debug +} + +var ErrChaos = fmt.Errorf("interrupted by chaos") + +var debugId uint32 + +func debugPrefix() string { + d := atomic.AddUint32(&debugId, 1) - 1 + s := make([]byte, 0, 10) + for i := uint(0); i < 8; i++ { + s = append(s, "abcdefghijklmnop"[(d>>(4*i))&0xf]) + if d>>(4*(i+1)) == 0 { + break + } + } + s = append(s, ')', ' ') + return string(s) +} + +func logf(format string, args ...interface{}) { + if logger != nil { + logger.Output(2, fmt.Sprintf(format, argsForLog(args)...)) + } +} + +func debugf(format string, args ...interface{}) { + if debugEnabled && logger != nil { + logger.Output(2, fmt.Sprintf(format, argsForLog(args)...)) + } +} + +func argsForLog(args []interface{}) []interface{} { + for i, arg := range args { + switch v := arg.(type) { + case bson.ObjectId: + args[i] = v.Hex() + case []bson.ObjectId: + lst := make([]string, len(v)) + for j, id := range v { + lst[j] = id.Hex() + } + args[i] = lst + case map[docKey][]bson.ObjectId: + buf := &bytes.Buffer{} + var dkeys docKeys + for dkey := range v { + dkeys = append(dkeys, dkey) + } + sort.Sort(dkeys) + for i, dkey := range dkeys { + if i > 0 { + buf.WriteByte(' ') + } + buf.WriteString(fmt.Sprintf("%v: {", dkey)) + for j, id := range v[dkey] { + if j > 0 { + buf.WriteByte(' ') + } + buf.WriteString(id.Hex()) + } + buf.WriteByte('}') + } + args[i] = buf.String() + case map[docKey][]int64: + buf := &bytes.Buffer{} + var dkeys docKeys + for dkey := range v { + dkeys = append(dkeys, dkey) + } + sort.Sort(dkeys) + for i, dkey := range dkeys { + if i > 0 { + buf.WriteByte(' ') + } + buf.WriteString(fmt.Sprintf("%v: %v", dkey, v[dkey])) + } + args[i] = buf.String() + } + } + return args +} diff --git a/vendor/labix.org/v2/mgo/txn/flusher.go b/vendor/labix.org/v2/mgo/txn/flusher.go new file mode 100644 index 0000000..846eefe --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/flusher.go @@ -0,0 +1,996 @@ +package txn + +import ( + "fmt" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + "sort" +) + +func flush(r *Runner, t *transaction) error { + f := &flusher{ + Runner: r, + goal: t, + goalKeys: make(map[docKey]bool), + queue: make(map[docKey][]token), + debugId: debugPrefix(), + } + for _, dkey := range f.goal.docKeys() { + f.goalKeys[dkey] = true + } + return f.run() +} + +type flusher struct { + *Runner + goal *transaction + goalKeys map[docKey]bool + queue map[docKey][]token + debugId string +} + +func (f *flusher) run() (err error) { + if chaosEnabled { + defer f.handleChaos(&err) + } + + f.debugf("Processing %s", f.goal) + seen := make(map[bson.ObjectId]*transaction) + if err := f.recurse(f.goal, seen); err != nil { + return err + } + if f.goal.done() { + return nil + } + + // Sparse workloads will generally be managed entirely by recurse. + // Getting here means one or more transactions have dependencies + // and perhaps cycles. + + // Build successors data for Tarjan's sort. Must consider + // that entries in txn-queue are not necessarily valid. + successors := make(map[bson.ObjectId][]bson.ObjectId) + ready := true + for _, dqueue := range f.queue { + NextPair: + for i := 0; i < len(dqueue); i++ { + pred := dqueue[i] + predid := pred.id() + predt := seen[predid] + if predt == nil || predt.Nonce != pred.nonce() { + continue + } + predsuccids, ok := successors[predid] + if !ok { + successors[predid] = nil + } + + for j := i + 1; j < len(dqueue); j++ { + succ := dqueue[j] + succid := succ.id() + succt := seen[succid] + if succt == nil || succt.Nonce != succ.nonce() { + continue + } + if _, ok := successors[succid]; !ok { + successors[succid] = nil + } + + // Found a valid pred/succ pair. + i = j - 1 + for _, predsuccid := range predsuccids { + if predsuccid == succid { + continue NextPair + } + } + successors[predid] = append(predsuccids, succid) + if succid == f.goal.Id { + // There are still pre-requisites to handle. + ready = false + } + continue NextPair + } + } + } + f.debugf("Queues: %v", f.queue) + f.debugf("Successors: %v", successors) + if ready { + f.debugf("Goal %s has no real pre-requisites", f.goal) + return f.advance(f.goal, nil, true) + } + + // Robert Tarjan's algorithm for detecting strongly-connected + // components is used for topological sorting and detecting + // cycles at once. The order in which transactions are applied + // in commonly affected documents must be a global agreement. + sorted := tarjanSort(successors) + if debugEnabled { + f.debugf("Tarjan output: %v", sorted) + } + pull := make(map[bson.ObjectId]*transaction) + for i := len(sorted) - 1; i >= 0; i-- { + scc := sorted[i] + f.debugf("Flushing %v", scc) + if len(scc) == 1 { + pull[scc[0]] = seen[scc[0]] + } + for _, id := range scc { + if err := f.advance(seen[id], pull, true); err != nil { + return err + } + } + if len(scc) > 1 { + for _, id := range scc { + pull[id] = seen[id] + } + } + } + return nil +} + +func (f *flusher) recurse(t *transaction, seen map[bson.ObjectId]*transaction) error { + seen[t.Id] = t + err := f.advance(t, nil, false) + if err != errPreReqs { + return err + } + for _, dkey := range t.docKeys() { + for _, dtt := range f.queue[dkey] { + id := dtt.id() + if seen[id] != nil { + continue + } + qt, err := f.load(id) + if err != nil { + return err + } + err = f.recurse(qt, seen) + if err != nil { + return err + } + } + } + return nil +} + +func (f *flusher) advance(t *transaction, pull map[bson.ObjectId]*transaction, force bool) error { + for { + switch t.State { + case tpreparing, tprepared: + revnos, err := f.prepare(t, force) + if err != nil { + return err + } + if t.State != tprepared { + continue + } + if err = f.assert(t, revnos, pull); err != nil { + return err + } + if t.State != tprepared { + continue + } + if err = f.checkpoint(t, revnos); err != nil { + return err + } + case tapplying: + return f.apply(t, pull) + case taborting: + return f.abortOrReload(t, nil, pull) + case tapplied, taborted: + return nil + default: + panic(fmt.Errorf("transaction in unknown state: %q", t.State)) + } + } + panic("unreachable") +} + +type stash string + +const ( + stashStable stash = "" + stashInsert stash = "insert" + stashRemove stash = "remove" +) + +type txnInfo struct { + Queue []token `bson:"txn-queue"` + Revno int64 `bson:"txn-revno,omitempty"` + Insert bson.ObjectId `bson:"txn-insert,omitempty"` + Remove bson.ObjectId `bson:"txn-remove,omitempty"` +} + +type stashState string + +const ( + stashNew stashState = "" + stashInserting stashState = "inserting" +) + +var txnFields = bson.D{{"txn-queue", 1}, {"txn-revno", 1}, {"txn-remove", 1}, {"txn-insert", 1}} + +var errPreReqs = fmt.Errorf("transaction has pre-requisites and force is false") + +// prepare injects t's id onto txn-queue for all affected documents +// and collects the current txn-queue and txn-revno values during +// the process. If the prepared txn-queue indicates that there are +// pre-requisite transactions to be applied and the force parameter +// is false, errPreReqs will be returned. Otherwise, the current +// tip revision numbers for all the documents are returned. +func (f *flusher) prepare(t *transaction, force bool) (revnos []int64, err error) { + if t.State != tpreparing { + return f.rescan(t, force) + } + f.debugf("Preparing %s", t) + + // Iterate in a stable way across all runners. This isn't + // strictly required, but reduces the chances of cycles. + dkeys := t.docKeys() + sort.Sort(dkeys) + + revno := make(map[docKey]int64) + info := txnInfo{} + tt := tokenFor(t) +NextDoc: + for _, dkey := range dkeys { + change := mgo.Change{ + Update: bson.D{{"$addToSet", bson.D{{"txn-queue", tt}}}}, + ReturnNew: true, + } + c := f.tc.Database.C(dkey.C) + cquery := c.FindId(dkey.Id).Select(txnFields) + + RetryDoc: + change.Upsert = false + chaos("") + if _, err := cquery.Apply(change, &info); err == nil { + if info.Remove == "" { + // Fast path, unless workload is insert/remove heavy. + revno[dkey] = info.Revno + f.queue[dkey] = info.Queue + f.debugf("[A] Prepared document %v with revno %d and queue: %v", dkey, info.Revno, info.Queue) + continue NextDoc + } else { + // Handle remove in progress before preparing it. + if err := f.loadAndApply(info.Remove); err != nil { + return nil, err + } + goto RetryDoc + } + } else if err != mgo.ErrNotFound { + return nil, err + } + + // Document missing. Use stash collection. + change.Upsert = true + chaos("") + _, err := f.sc.FindId(dkey).Apply(change, &info) + if err != nil { + return nil, err + } + if info.Insert != "" { + // Handle insert in progress before preparing it. + if err := f.loadAndApply(info.Insert); err != nil { + return nil, err + } + goto RetryDoc + } + + // Must confirm stash is still in use and is the same one + // prepared, since applying a remove overwrites the stash. + docFound := false + stashFound := false + if err = c.FindId(dkey.Id).Select(txnFields).One(&info); err == nil { + docFound = true + } else if err != mgo.ErrNotFound { + return nil, err + } else if err = f.sc.FindId(dkey).One(&info); err == nil { + stashFound = true + if info.Revno == 0 { + // Missing revno in the stash only happens when it + // has been upserted, in which case it defaults to -1. + // Txn-inserted documents get revno -1 while in the stash + // for the first time, and -revno-1 == 2 when they go live. + info.Revno = -1 + } + } else if err != mgo.ErrNotFound { + return nil, err + } + + if docFound && info.Remove == "" || stashFound && info.Insert == "" { + for _, dtt := range info.Queue { + if dtt != tt { + continue + } + // Found tt properly prepared. + if stashFound { + f.debugf("[B] Prepared document %v on stash with revno %d and queue: %v", dkey, info.Revno, info.Queue) + } else { + f.debugf("[B] Prepared document %v with revno %d and queue: %v", dkey, info.Revno, info.Queue) + } + revno[dkey] = info.Revno + f.queue[dkey] = info.Queue + continue NextDoc + } + } + + // The stash wasn't valid and tt got overwriten. Try again. + f.unstashToken(tt, dkey) + goto RetryDoc + } + + // Save the prepared nonce onto t. + nonce := tt.nonce() + qdoc := bson.D{{"_id", t.Id}, {"s", tpreparing}} + udoc := bson.D{{"$set", bson.D{{"s", tprepared}, {"n", nonce}}}} + chaos("set-prepared") + err = f.tc.Update(qdoc, udoc) + if err == nil { + t.State = tprepared + t.Nonce = nonce + } else if err == mgo.ErrNotFound { + f.debugf("Can't save nonce of %s: LOST RACE", tt) + if err := f.reload(t); err != nil { + return nil, err + } else if t.State == tpreparing { + panic("can't save nonce yet transaction is still preparing") + } else if t.State != tprepared { + return t.Revnos, nil + } + tt = t.token() + } else if err != nil { + return nil, err + } + + prereqs, found := f.hasPreReqs(tt, dkeys) + if !found { + // Must only happen when reloading above. + return f.rescan(t, force) + } else if prereqs && !force { + f.debugf("Prepared queue with %s [has prereqs & not forced].", tt) + return nil, errPreReqs + } + for _, op := range t.Ops { + dkey := op.docKey() + revnos = append(revnos, revno[dkey]) + drevno := revno[dkey] + switch { + case op.Insert != nil && drevno < 0: + revno[dkey] = -drevno+1 + case op.Update != nil && drevno >= 0: + revno[dkey] = drevno+1 + case op.Remove && drevno >= 0: + revno[dkey] = -drevno-1 + } + } + if !prereqs { + f.debugf("Prepared queue with %s [no prereqs]. Revnos: %v", tt, revnos) + } else { + f.debugf("Prepared queue with %s [forced] Revnos: %v", tt, revnos) + } + return revnos, nil +} + +func (f *flusher) unstashToken(tt token, dkey docKey) error { + qdoc := bson.D{{"_id", dkey}, {"txn-queue", tt}} + udoc := bson.D{{"$pull", bson.D{{"txn-queue", tt}}}} + chaos("") + if err := f.sc.Update(qdoc, udoc); err == nil { + chaos("") + err = f.sc.Remove(bson.D{{"_id", dkey}, {"txn-queue", bson.D{}}}) + } else if err != mgo.ErrNotFound { + return err + } + return nil +} + +func (f *flusher) rescan(t *transaction, force bool) (revnos []int64, err error) { + f.debugf("Rescanning %s", t) + if t.State != tprepared { + panic(fmt.Errorf("rescanning transaction in invalid state: %q", t.State)) + } + + // Iterate in a stable way across all runners. This isn't + // strictly required, but reduces the chances of cycles. + dkeys := t.docKeys() + sort.Sort(dkeys) + + tt := t.token() + if !force { + prereqs, found := f.hasPreReqs(tt, dkeys) + if found && prereqs { + // Its state is already known. + return nil, errPreReqs + } + } + + revno := make(map[docKey]int64) + info := txnInfo{} + for _, dkey := range dkeys { + retry := 0 + + RetryDoc: + c := f.tc.Database.C(dkey.C) + if err := c.FindId(dkey.Id).Select(txnFields).One(&info); err == mgo.ErrNotFound { + // Document is missing. Look in stash. + if err := f.sc.FindId(dkey).One(&info); err == mgo.ErrNotFound { + // Stash also doesn't exist. Maybe someone applied it. + if err := f.reload(t); err != nil { + return nil, err + } else if t.State != tprepared { + return t.Revnos, err + } + // Not applying either. + retry++ + if retry < 3 { + // Retry since there might be an insert/remove race. + goto RetryDoc + } + // Neither the doc nor the stash seem to exist. + return nil, fmt.Errorf("cannot find document %v for applying transaction %s", dkey, t) + } else if err != nil { + return nil, err + } + // Stash found. + if info.Insert != "" { + // Handle insert in progress before assuming ordering is good. + if err := f.loadAndApply(info.Insert); err != nil { + return nil, err + } + goto RetryDoc + } + if info.Revno == 0 { + // Missing revno in the stash means -1. + info.Revno = -1 + } + } else if err != nil { + return nil, err + } else if info.Remove != "" { + // Handle remove in progress before assuming ordering is good. + if err := f.loadAndApply(info.Remove); err != nil { + return nil, err + } + goto RetryDoc + } + revno[dkey] = info.Revno + + found := false + for _, id := range info.Queue { + if id == tt { + found = true + break + } + } + f.queue[dkey] = info.Queue + if !found { + // Previously set txn-queue was popped by someone. + // Transaction is being/has been applied elsewhere. + f.debugf("Rescanned document %v misses %s in queue: %v", dkey, tt, info.Queue) + err := f.reload(t) + if t.State == tpreparing || t.State == tprepared { + panic("rescanned document misses transaction in queue") + } + return t.Revnos, err + } + } + + prereqs, found := f.hasPreReqs(tt, dkeys) + if !found { + panic("rescanning loop guarantees that this can't happen") + } else if prereqs && !force { + f.debugf("Rescanned queue with %s: has prereqs, not forced", tt) + return nil, errPreReqs + } + for _, op := range t.Ops { + dkey := op.docKey() + revnos = append(revnos, revno[dkey]) + if op.isChange() { + revno[dkey] += 1 + } + } + if !prereqs { + f.debugf("Rescanned queue with %s: no prereqs, revnos: %v", tt, revnos) + } else { + f.debugf("Rescanned queue with %s: has prereqs, forced, revnos: %v", tt, revnos) + } + return revnos, nil +} + +func (f *flusher) hasPreReqs(tt token, dkeys docKeys) (prereqs, found bool) { + found = true +NextDoc: + for _, dkey := range dkeys { + for _, dtt := range f.queue[dkey] { + if dtt == tt { + continue NextDoc + } else if dtt.id() != tt.id() { + prereqs = true + } + } + found = false + } + return +} + +func (f *flusher) reload(t *transaction) error { + var newt transaction + query := f.tc.FindId(t.Id) + query.Select(bson.D{{"s", 1}, {"n", 1}, {"r", 1}}) + if err := query.One(&newt); err != nil { + return fmt.Errorf("failed to reload transaction: %v", err) + } + t.State = newt.State + t.Nonce = newt.Nonce + t.Revnos = newt.Revnos + f.debugf("Reloaded %s: %q", t, t.State) + return nil +} + +func (f *flusher) loadAndApply(id bson.ObjectId) error { + t, err := f.load(id) + if err != nil { + return err + } + return f.advance(t, nil, true) +} + +// assert verifies that all assertions in t match the content that t +// will be applied upon. If an assertion fails, the transaction state +// is changed to aborted. +func (f *flusher) assert(t *transaction, revnos []int64, pull map[bson.ObjectId]*transaction) error { + f.debugf("Asserting %s with revnos %v", t, revnos) + if t.State != tprepared { + panic(fmt.Errorf("asserting transaction in invalid state: %q", t.State)) + } + qdoc := make(bson.D, 3) + revno := make(map[docKey]int64) + for i, op := range t.Ops { + dkey := op.docKey() + if _, ok := revno[dkey]; !ok { + revno[dkey] = revnos[i] + } + if op.Assert == nil { + continue + } + if op.Assert == DocMissing { + if revnos[i] >= 0 { + return f.abortOrReload(t, revnos, pull) + } + continue + } + if op.Insert != nil { + return fmt.Errorf("Insert can only Assert txn.DocMissing", op.Assert) + } + // if revnos[i] < 0 { abort }? + + qdoc = append(qdoc[:0], bson.DocElem{"_id", op.Id}) + if op.Assert != DocMissing { + var revnoq interface{} + if n := revno[dkey]; n == 0 { + revnoq = bson.D{{"$exists", false}} + } else { + revnoq = n + } + // XXX Add tt to the query here, once we're sure it's all working. + // Not having it increases the chances of breaking on bad logic. + qdoc = append(qdoc, bson.DocElem{"txn-revno", revnoq}) + if op.Assert != DocExists { + qdoc = append(qdoc, bson.DocElem{"$or", []interface{}{op.Assert}}) + } + } + + c := f.tc.Database.C(op.C) + if err := c.Find(qdoc).Select(bson.D{{"_id", 1}}).One(nil); err == mgo.ErrNotFound { + // Assertion failed or someone else started applying. + return f.abortOrReload(t, revnos, pull) + } else if err != nil { + return err + } + } + f.debugf("Asserting %s succeeded", t) + return nil +} + +func (f *flusher) abortOrReload(t *transaction, revnos []int64, pull map[bson.ObjectId]*transaction) (err error) { + f.debugf("Aborting or reloading %s (was %q)", t, t.State) + if t.State == tprepared { + qdoc := bson.D{{"_id", t.Id}, {"s", tprepared}} + udoc := bson.D{{"$set", bson.D{{"s", taborting}}}} + chaos("set-aborting") + if err = f.tc.Update(qdoc, udoc); err == nil { + t.State = taborting + } else if err == mgo.ErrNotFound { + if err = f.reload(t); err != nil || t.State != taborting { + f.debugf("Won't abort %s. Reloaded state: %q", t, t.State) + return err + } + } else { + return err + } + } else if t.State != taborting { + panic(fmt.Errorf("aborting transaction in invalid state: %q", t.State)) + } + + if len(revnos) > 0 { + if pull == nil { + pull = map[bson.ObjectId]*transaction{t.Id: t} + } + seen := make(map[docKey]bool) + for i, op := range t.Ops { + dkey := op.docKey() + if seen[op.docKey()] { + continue + } + seen[dkey] = true + + pullAll := tokensToPull(f.queue[dkey], pull, "") + if len(pullAll) == 0 { + continue + } + udoc := bson.D{{"$pullAll", bson.D{{"txn-queue", pullAll}}}} + chaos("") + if revnos[i] < 0 { + err = f.sc.UpdateId(dkey, udoc) + } else { + c := f.tc.Database.C(dkey.C) + err = c.UpdateId(dkey.Id, udoc) + } + if err != nil && err != mgo.ErrNotFound { + return err + } + } + } + udoc := bson.D{{"$set", bson.D{{"s", taborted}}}} + chaos("set-aborted") + if err := f.tc.UpdateId(t.Id, udoc); err != nil && err != mgo.ErrNotFound { + return err + } + t.State = taborted + f.debugf("Aborted %s", t) + return nil +} + +func (f *flusher) checkpoint(t *transaction, revnos []int64) error { + var debugRevnos map[docKey][]int64 + if debugEnabled { + debugRevnos = make(map[docKey][]int64) + for i, op := range t.Ops { + dkey := op.docKey() + debugRevnos[dkey] = append(debugRevnos[dkey], revnos[i]) + } + f.debugf("Ready to apply %s. Saving revnos %v", t, debugRevnos) + } + + // Save in t the txn-revno values the transaction must run on. + qdoc := bson.D{{"_id", t.Id}, {"s", tprepared}} + udoc := bson.D{{"$set", bson.D{{"s", tapplying}, {"r", revnos}}}} + chaos("set-applying") + err := f.tc.Update(qdoc, udoc) + if err == nil { + t.State = tapplying + t.Revnos = revnos + f.debugf("Ready to apply %s. Saving revnos %v: DONE", t, debugRevnos) + } else if err == mgo.ErrNotFound { + f.debugf("Ready to apply %s. Saving revnos %v: LOST RACE", t, debugRevnos) + return f.reload(t) + } + return nil +} + +func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) error { + f.debugf("Applying transaction %s", t) + if t.State != tapplying { + panic(fmt.Errorf("applying transaction in invalid state: %q", t.State)) + } + if pull == nil { + pull = map[bson.ObjectId]*transaction{t.Id: t} + } + + // Compute the operation in which t's id may be pulled + // out of txn-queue. That's on its last change, or the + // first assertion. + pullOp := make(map[docKey]int) + for i := range t.Ops { + op := &t.Ops[i] + dkey := op.docKey() + if _, ok := pullOp[dkey]; !ok || op.isChange() { + pullOp[dkey] = i + } + } + + logRevnos := append([]int64(nil), t.Revnos...) + logDoc := bson.D{{"_id", t.Id}} + + tt := tokenFor(t) + for i := range t.Ops { + op := &t.Ops[i] + dkey := op.docKey() + dqueue := f.queue[dkey] + revno := t.Revnos[i] + + var opName string + if debugEnabled { + opName = op.name() + f.debugf("Applying %s op %d (%s) on %v with txn-revno %d", t, i, opName, dkey, revno) + } + + c := f.tc.Database.C(op.C) + + qdoc := bson.D{{"_id", dkey.Id}, {"txn-revno", revno}, {"txn-queue", tt}} + if op.Insert != nil { + qdoc[0].Value = dkey + if revno == -1 { + qdoc[1].Value = bson.D{{"$exists", false}} + } + } else if revno == 0 { + // There's no document with revno 0. The only way to see it is + // when an existent document participates in a transaction the + // first time. Txn-inserted documents get revno -1 while in the + // stash for the first time, and -revno-1 == 2 when they go live. + qdoc[1].Value = bson.D{{"$exists", false}} + } + + dontPull := tt + isPullOp := pullOp[dkey] == i + if isPullOp { + dontPull = "" + } + pullAll := tokensToPull(dqueue, pull, dontPull) + + var d bson.D + var outcome string + var err error + switch { + case op.Update != nil: + if revno < 0 { + err = mgo.ErrNotFound + f.debugf("Won't try to apply update op; negative revision means the document is missing or stashed"); + } else { + newRevno := revno + 1 + logRevnos[i] = newRevno + if d, err = objToDoc(op.Update); err != nil { + return err + } + if d, err = addToDoc(d, "$pullAll", bson.D{{"txn-queue", pullAll}}); err != nil { + return err + } + if d, err = addToDoc(d, "$set", bson.D{{"txn-revno", newRevno}}); err != nil { + return err + } + chaos("") + err = c.Update(qdoc, d) + } + case op.Remove: + if revno < 0 { + err = mgo.ErrNotFound + } else { + newRevno := -revno - 1 + logRevnos[i] = newRevno + nonce := newNonce() + stash := txnInfo{} + change := mgo.Change{ + Update: bson.D{{"$push", bson.D{{"n", nonce}}}}, + Upsert: true, + ReturnNew: true, + } + if _, err = f.sc.FindId(dkey).Apply(change, &stash); err != nil { + return err + } + change = mgo.Change{ + Update: bson.D{{"$set", bson.D{{"txn-remove", t.Id}}}}, + ReturnNew: true, + } + var info txnInfo + if _, err = c.Find(qdoc).Apply(change, &info); err == nil { + // The document still exists so the stash previously + // observed was either out of date or necessarily + // contained the token being applied. + f.debugf("Marked document %v to be removed on revno %d with queue: %v", dkey, info.Revno, info.Queue) + updated := false + if !hasToken(stash.Queue, tt) { + var set, unset bson.D + if revno == 0 { + // Missing revno in stash means -1. + set = bson.D{{"txn-queue", info.Queue}} + unset = bson.D{{"n", 1}, {"txn-revno", 1}} + } else { + set = bson.D{{"txn-queue", info.Queue}, {"txn-revno", newRevno}} + unset = bson.D{{"n", 1}} + } + qdoc := bson.D{{"_id", dkey}, {"n", nonce}} + udoc := bson.D{{"$set", set}, {"$unset", unset}} + if err = f.sc.Update(qdoc, udoc); err == nil { + updated = true + } else if err != mgo.ErrNotFound { + return err + } + } + if updated { + f.debugf("Updated stash for document %v with revno %d and queue: %v", dkey, newRevno, info.Queue) + } else { + f.debugf("Stash for document %v was up-to-date", dkey) + } + err = c.Remove(qdoc) + } + } + case op.Insert != nil: + if revno >= 0 { + err = mgo.ErrNotFound + } else { + newRevno := -revno + 1 + logRevnos[i] = newRevno + if d, err = objToDoc(op.Insert); err != nil { + return err + } + change := mgo.Change{ + Update: bson.D{{"$set", bson.D{{"txn-insert", t.Id}}}}, + ReturnNew: true, + } + chaos("") + var info txnInfo + if _, err = f.sc.Find(qdoc).Apply(change, &info); err == nil { + f.debugf("Stash for document %v has revno %d and queue: %v", dkey, info.Revno, info.Queue) + d = setInDoc(d, bson.D{{"_id", op.Id}, {"txn-revno", newRevno}, {"txn-queue", info.Queue}}) + // Unlikely yet unfortunate race in here if this gets seriously + // delayed. If someone inserts+removes meanwhile, this will + // reinsert, and there's no way to avoid that while keeping the + // collection clean or compromising sharding. applyOps can solve + // the former, but it can't shard (SERVER-1439). + chaos("insert") + err = c.Insert(d) + if err == nil || mgo.IsDup(err) { + if err == nil { + f.debugf("New document %v inserted with revno %d and queue: %v", dkey, info.Revno, info.Queue) + } else { + f.debugf("Document %v already existed", dkey) + } + chaos("") + if err = f.sc.Remove(qdoc); err == nil { + f.debugf("Stash for document %v removed", dkey) + } + } + if pullOp[dkey] == i && len(pullAll) > 0 { + _ = f.sc.UpdateId(dkey, bson.D{{"$pullAll", bson.D{{"txn-queue", pullAll}}}}) + } + } + } + case op.Assert != nil: + // TODO pullAll if pullOp[dkey] == i + } + if err == nil { + outcome = "DONE" + } else if err == mgo.ErrNotFound || mgo.IsDup(err) { + outcome = "MISS" + err = nil + } else { + outcome = err.Error() + } + if debugEnabled { + f.debugf("Applying %s op %d (%s) on %v with txn-revno %d: %s", t, i, opName, dkey, revno, outcome) + } + if err != nil { + return err + } + + if f.lc != nil && op.isChange() { + // Add change to the log document. + var dr bson.D + for li := range logDoc { + elem := &logDoc[li] + if elem.Name == op.C { + dr = elem.Value.(bson.D) + break + } + } + if dr == nil { + logDoc = append(logDoc, bson.DocElem{op.C, bson.D{{"d", []interface{}{}}, {"r", []int64{}}}}) + dr = logDoc[len(logDoc)-1].Value.(bson.D) + } + dr[0].Value = append(dr[0].Value.([]interface{}), op.Id) + dr[1].Value = append(dr[1].Value.([]int64), logRevnos[i]) + } + } + t.State = tapplied + + if f.lc != nil { + // Insert log document into the changelog collection. + f.debugf("Inserting %s into change log", t) + err := f.lc.Insert(logDoc) + if err != nil && !mgo.IsDup(err) { + return err + } + } + + // It's been applied, so errors are ignored here. It's fine for someone + // else to win the race and mark it as applied, and it's also fine for + // it to remain pending until a later point when someone will perceive + // it has been applied and mark it at such. + f.debugf("Marking %s as applied", t) + chaos("set-applied") + f.tc.Update(bson.D{{"_id", t.Id}, {"s", tapplying}}, bson.D{{"$set", bson.D{{"s", tapplied}}}}) + return nil +} + +func tokensToPull(dqueue []token, pull map[bson.ObjectId]*transaction, dontPull token) []token { + var result []token + for j := len(dqueue) - 1; j >= 0; j-- { + dtt := dqueue[j] + if dt, ok := pull[dtt.id()]; ok { + if dt.Nonce == dtt.nonce() { + // It's valid and is being pulled out, so everything + // preceding it must have been handled already. + if dtt == dontPull { + // Not time to pull this one out yet. + j-- + } + result = append(result, dqueue[:j+1]...) + break + } + // It was handled before and this is a leftover invalid + // nonce in the queue. Cherry-pick it out. + result = append(result, dtt) + } + } + return result +} + +func objToDoc(obj interface{}) (d bson.D, err error) { + data, err := bson.Marshal(obj) + if err != nil { + return nil, err + } + err = bson.Unmarshal(data, &d) + if err != nil { + return nil, err + } + return d, err +} + +func addToDoc(doc bson.D, key string, add bson.D) (bson.D, error) { + for i := range doc { + elem := &doc[i] + if elem.Name != key { + continue + } + if old, ok := elem.Value.(bson.D); ok { + elem.Value = append(old, add...) + return doc, nil + } else { + return nil, fmt.Errorf("invalid %q value in change document: %#v", key, elem.Value) + } + } + return append(doc, bson.DocElem{key, add}), nil +} + +func setInDoc(doc bson.D, set bson.D) bson.D { + dlen := len(doc) +NextS: + for s := range set { + sname := set[s].Name + for d := 0; d < dlen; d++ { + if doc[d].Name == sname { + doc[d].Value = set[s].Value + continue NextS + } + } + doc = append(doc, set[s]) + } + return doc +} + +func hasToken(tokens []token, tt token) bool { + for _, ttt := range tokens { + if ttt == tt { + return true + } + } + return false +} + +func (f *flusher) debugf(format string, args ...interface{}) { + if !debugEnabled { + return + } + debugf(f.debugId+format, args...) +} diff --git a/vendor/labix.org/v2/mgo/txn/mgo_test.go b/vendor/labix.org/v2/mgo/txn/mgo_test.go new file mode 100644 index 0000000..ce5d9d0 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/mgo_test.go @@ -0,0 +1,101 @@ +package txn_test + +import ( + "bytes" + "labix.org/v2/mgo" + . "launchpad.net/gocheck" + "os/exec" + "time" +) + +// ---------------------------------------------------------------------------- +// The mgo test suite + +type MgoSuite struct { + output bytes.Buffer + server *exec.Cmd + session *mgo.Session +} + +var mgoaddr = "127.0.0.1:50017" + +func (s *MgoSuite) SetUpSuite(c *C) { + //mgo.SetDebug(true) + mgo.SetStats(true) + dbdir := c.MkDir() + args := []string{ + "--dbpath", dbdir, + "--bind_ip", "127.0.0.1", + "--port", "50017", + "--nssize", "1", + "--noprealloc", + "--smallfiles", + "--nojournal", + "-vvvvv", + } + s.server = exec.Command("mongod", args...) + s.server.Stdout = &s.output + s.server.Stderr = &s.output + err := s.server.Start() + if err != nil { + panic(err) + } +} + +func (s *MgoSuite) TearDownSuite(c *C) { + s.server.Process.Kill() + s.server.Process.Wait() +} + +func (s *MgoSuite) SetUpTest(c *C) { + err := DropAll(mgoaddr) + if err != nil { + panic(err) + } + mgo.SetLogger(c) + mgo.ResetStats() + + s.session, err = mgo.Dial(mgoaddr) + c.Assert(err, IsNil) +} + +func (s *MgoSuite) TearDownTest(c *C) { + if s.session != nil { + s.session.Close() + } + for i := 0; ; i++ { + stats := mgo.GetStats() + if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { + break + } + if i == 20 { + c.Fatal("Test left sockets in a dirty state") + } + c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) + time.Sleep(500 * time.Millisecond) + } +} + +func DropAll(mongourl string) (err error) { + session, err := mgo.Dial(mongourl) + if err != nil { + return err + } + defer session.Close() + + names, err := session.DatabaseNames() + if err != nil { + return err + } + for _, name := range names { + switch name { + case "admin", "local", "config": + default: + err = session.DB(name).DropDatabase() + if err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/labix.org/v2/mgo/txn/sim_test.go b/vendor/labix.org/v2/mgo/txn/sim_test.go new file mode 100644 index 0000000..312eed9 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/sim_test.go @@ -0,0 +1,389 @@ +package txn_test + +import ( + "flag" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + "labix.org/v2/mgo/txn" + . "launchpad.net/gocheck" + "math/rand" + "time" +) + +var ( + duration = flag.Duration("duration", 200*time.Millisecond, "duration for each simulation") + seed = flag.Int64("seed", 0, "seed for rand") +) + +type params struct { + killChance float64 + slowdownChance float64 + slowdown time.Duration + + unsafe bool + workers int + accounts int + changeHalf bool + reinsertCopy bool + reinsertZeroed bool + changelog bool + + changes int +} + +func (s *S) TestSim1Worker(c *C) { + simulate(c, params{ + workers: 1, + accounts: 4, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSim4WorkersDense(c *C) { + simulate(c, params{ + workers: 4, + accounts: 2, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSim4WorkersSparse(c *C) { + simulate(c, params{ + workers: 4, + accounts: 10, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimHalf1Worker(c *C) { + simulate(c, params{ + workers: 1, + accounts: 4, + changeHalf: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimHalf4WorkersDense(c *C) { + simulate(c, params{ + workers: 4, + accounts: 2, + changeHalf: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimHalf4WorkersSparse(c *C) { + simulate(c, params{ + workers: 4, + accounts: 10, + changeHalf: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimReinsertCopy1Worker(c *C) { + simulate(c, params{ + workers: 1, + accounts: 10, + reinsertCopy: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimReinsertCopy4Workers(c *C) { + simulate(c, params{ + workers: 4, + accounts: 10, + reinsertCopy: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimReinsertZeroed1Worker(c *C) { + simulate(c, params{ + workers: 1, + accounts: 10, + reinsertZeroed: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimReinsertZeroed4Workers(c *C) { + simulate(c, params{ + workers: 4, + accounts: 10, + reinsertZeroed: true, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + }) +} + +func (s *S) TestSimChangeLog(c *C) { + simulate(c, params{ + workers: 4, + accounts: 10, + killChance: 0.01, + slowdownChance: 0.3, + slowdown: 100 * time.Millisecond, + changelog: true, + }) +} + + +type balanceChange struct { + id bson.ObjectId + origin int + target int + amount int +} + +func simulate(c *C, params params) { + seed := *seed + if seed == 0 { + seed = time.Now().UnixNano() + } + rand.Seed(seed) + c.Logf("Seed: %v", seed) + + txn.SetChaos(txn.Chaos{ + KillChance: params.killChance, + SlowdownChance: params.slowdownChance, + Slowdown: params.slowdown, + }) + defer txn.SetChaos(txn.Chaos{}) + + session, err := mgo.Dial(mgoaddr) + c.Assert(err, IsNil) + defer session.Close() + + db := session.DB("test") + tc := db.C("tc") + + runner := txn.NewRunner(tc) + + tclog := db.C("tc.log") + if params.changelog { + info := mgo.CollectionInfo{ + Capped: true, + MaxBytes: 1000000, + } + err := tclog.Create(&info) + c.Assert(err, IsNil) + runner.ChangeLog(tclog) + } + + accounts := db.C("accounts") + for i := 0; i < params.accounts; i++ { + err := accounts.Insert(M{"_id": i, "balance": 300}) + c.Assert(err, IsNil) + } + var stop time.Time + if params.changes <= 0 { + stop = time.Now().Add(*duration) + } + + max := params.accounts + if params.reinsertCopy || params.reinsertZeroed { + max = int(float64(params.accounts) * 1.5) + } + + changes := make(chan balanceChange, 1024) + + //session.SetMode(mgo.Eventual, true) + for i := 0; i < params.workers; i++ { + go func() { + n := 0 + for { + if n > 0 && n == params.changes { + break + } + if !stop.IsZero() && time.Now().After(stop) { + break + } + + change := balanceChange{ + id: bson.NewObjectId(), + origin: rand.Intn(max), + target: rand.Intn(max), + amount: 100, + } + + var old Account + var oldExists bool + if params.reinsertCopy || params.reinsertZeroed { + if err := accounts.FindId(change.origin).One(&old); err != mgo.ErrNotFound { + c.Check(err, IsNil) + change.amount = old.Balance + oldExists = true + } + } + + var ops []txn.Op + switch { + case params.reinsertCopy && oldExists: + ops = []txn.Op{{ + C: "accounts", + Id: change.origin, + Assert: M{"balance": change.amount}, + Remove: true, + }, { + C: "accounts", + Id: change.target, + Assert: txn.DocMissing, + Insert: M{"balance": change.amount}, + }} + case params.reinsertZeroed && oldExists: + ops = []txn.Op{{ + C: "accounts", + Id: change.target, + Assert: txn.DocMissing, + Insert: M{"balance": 0}, + }, { + C: "accounts", + Id: change.origin, + Assert: M{"balance": change.amount}, + Remove: true, + }, { + C: "accounts", + Id: change.target, + Assert: txn.DocExists, + Update: M{"$inc": M{"balance": change.amount}}, + }} + case params.changeHalf: + ops = []txn.Op{{ + C: "accounts", + Id: change.origin, + Assert: M{"balance": M{"$gte": change.amount}}, + Update: M{"$inc": M{"balance": -change.amount / 2}}, + }, { + C: "accounts", + Id: change.target, + Assert: txn.DocExists, + Update: M{"$inc": M{"balance": change.amount / 2}}, + }, { + C: "accounts", + Id: change.origin, + Update: M{"$inc": M{"balance": -change.amount / 2}}, + }, { + C: "accounts", + Id: change.target, + Update: M{"$inc": M{"balance": change.amount / 2}}, + }} + default: + ops = []txn.Op{{ + C: "accounts", + Id: change.origin, + Assert: M{"balance": M{"$gte": change.amount}}, + Update: M{"$inc": M{"balance": -change.amount}}, + }, { + C: "accounts", + Id: change.target, + Assert: txn.DocExists, + Update: M{"$inc": M{"balance": change.amount}}, + }} + } + + err = runner.Run(ops, change.id, nil) + if err != nil && err != txn.ErrAborted && err != txn.ErrChaos { + c.Check(err, IsNil) + } + n++ + changes <- change + } + changes <- balanceChange{} + }() + } + + alive := params.workers + changeLog := make([]balanceChange, 0, 1024) + for alive > 0 { + change := <-changes + if change.id == "" { + alive-- + } else { + changeLog = append(changeLog, change) + } + } + c.Check(len(changeLog), Not(Equals), 0, Commentf("No operations were even attempted.")) + + txn.SetChaos(txn.Chaos{}) + err = runner.ResumeAll() + c.Assert(err, IsNil) + + n, err := accounts.Count() + c.Check(err, IsNil) + c.Check(n, Equals, params.accounts, Commentf("Number of accounts has changed.")) + + n, err = accounts.Find(M{"balance": M{"$lt": 0}}).Count() + c.Check(err, IsNil) + c.Check(n, Equals, 0, Commentf("There are %d accounts with negative balance.", n)) + + globalBalance := 0 + iter := accounts.Find(nil).Iter() + account := Account{} + for iter.Next(&account) { + globalBalance += account.Balance + } + c.Check(iter.Close(), IsNil) + c.Check(globalBalance, Equals, params.accounts*300, Commentf("Total amount of money should be constant.")) + + // Compute and verify the exact final state of all accounts. + balance := make(map[int]int) + for i := 0; i < params.accounts; i++ { + balance[i] += 300 + } + var applied, aborted int + for _, change := range changeLog { + err := runner.Resume(change.id) + if err == txn.ErrAborted { + aborted++ + continue + } else if err != nil { + c.Fatalf("resuming %s failed: %v", change.id, err) + } + balance[change.origin] -= change.amount + balance[change.target] += change.amount + applied++ + } + iter = accounts.Find(nil).Iter() + for iter.Next(&account) { + c.Assert(account.Balance, Equals, balance[account.Id]) + } + c.Check(iter.Close(), IsNil) + c.Logf("Total transactions: %d (%d applied, %d aborted)", len(changeLog), applied, aborted) + + if params.changelog { + n, err := tclog.Count() + c.Assert(err, IsNil) + // Check if the capped collection is full. + dummy := make([]byte, 1024) + tclog.Insert(M{"_id": bson.NewObjectId(), "dummy": dummy}) + m, err := tclog.Count() + c.Assert(err, IsNil) + if m == n+1 { + // Wasn't full, so it must have seen it all. + c.Assert(err, IsNil) + c.Assert(n, Equals, applied) + } + } +} diff --git a/vendor/labix.org/v2/mgo/txn/tarjan.go b/vendor/labix.org/v2/mgo/txn/tarjan.go new file mode 100644 index 0000000..a5ac0b0 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/tarjan.go @@ -0,0 +1,96 @@ +package txn + +import ( + "labix.org/v2/mgo/bson" + "sort" +) + +func tarjanSort(successors map[bson.ObjectId][]bson.ObjectId) [][]bson.ObjectId { + // http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + data := &tarjanData{ + successors: successors, + nodes: make([]tarjanNode, 0, len(successors)), + index: make(map[bson.ObjectId]int, len(successors)), + } + + // Sort all nodes to stabilize the logic. + var all []string + for id := range successors { + all = append(all, string(id)) + } + sort.Strings(all) + for _, strid := range all { + id := bson.ObjectId(strid) + if _, seen := data.index[id]; !seen { + data.strongConnect(id) + } + } + return data.output +} + +type tarjanData struct { + successors map[bson.ObjectId][]bson.ObjectId + output [][]bson.ObjectId + + nodes []tarjanNode + stack []bson.ObjectId + index map[bson.ObjectId]int +} + +type tarjanNode struct { + lowlink int + stacked bool +} + +type idList []bson.ObjectId + +func (l idList) Len() int { return len(l) } +func (l idList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l idList) Less(i, j int) bool { return l[i] < l[j] } + +func (data *tarjanData) strongConnect(id bson.ObjectId) *tarjanNode { + index := len(data.nodes) + data.index[id] = index + data.stack = append(data.stack, id) + data.nodes = append(data.nodes, tarjanNode{index, true}) + node := &data.nodes[index] + + // Sort to stabilize the algorithm. + succids := idList(data.successors[id]) + sort.Sort(succids) + for _, succid := range succids { + succindex, seen := data.index[succid] + if !seen { + succnode := data.strongConnect(succid) + if succnode.lowlink < node.lowlink { + node.lowlink = succnode.lowlink + } + } else if data.nodes[succindex].stacked { + // Part of the current strongly-connected component. + if succindex < node.lowlink { + node.lowlink = succindex + } + } + } + + if node.lowlink == index { + // Root node; pop stack and output new + // strongly-connected component. + var scc []bson.ObjectId + i := len(data.stack) - 1 + for { + stackid := data.stack[i] + stackindex := data.index[stackid] + data.nodes[stackindex].stacked = false + scc = append(scc, stackid) + if stackindex == index { + break + } + i-- + } + data.stack = data.stack[:i] + data.output = append(data.output, scc) + } + + return node +} diff --git a/vendor/labix.org/v2/mgo/txn/tarjan_test.go b/vendor/labix.org/v2/mgo/txn/tarjan_test.go new file mode 100644 index 0000000..c422605 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/tarjan_test.go @@ -0,0 +1,44 @@ +package txn + +import ( + "fmt" + "labix.org/v2/mgo/bson" + . "launchpad.net/gocheck" +) + +type TarjanSuite struct{} + +var _ = Suite(TarjanSuite{}) + +func bid(n int) bson.ObjectId { + return bson.ObjectId(fmt.Sprintf("%024d", n)) +} + +func bids(ns ...int) (ids []bson.ObjectId) { + for _, n := range ns { + ids = append(ids, bid(n)) + } + return +} + +func (TarjanSuite) TestExample(c *C) { + successors := map[bson.ObjectId][]bson.ObjectId{ + bid(1): bids(2), + bid(2): bids(1, 5), + bid(3): bids(4), + bid(4): bids(3, 5), + bid(5): bids(6), + bid(6): bids(7), + bid(7): bids(8), + bid(8): bids(6, 9), + bid(9): bids(), + } + + c.Assert(tarjanSort(successors), DeepEquals, [][]bson.ObjectId{ + bids(9), + bids(8, 7, 6), + bids(5), + bids(2, 1), + bids(4, 3), + }) +} diff --git a/vendor/labix.org/v2/mgo/txn/txn.go b/vendor/labix.org/v2/mgo/txn/txn.go new file mode 100644 index 0000000..e798e65 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/txn.go @@ -0,0 +1,518 @@ +// The txn package implements support for multi-document transactions. +// +// For details check the following blog post: +// +// http://blog.labix.org/2012/08/22/multi-doc-transactions-for-mongodb +// +package txn + +import ( + "encoding/binary" + "fmt" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + "reflect" + "sort" + "sync" + + crand "crypto/rand" + mrand "math/rand" +) + +type state int + +const ( + tpreparing state = 1 // One or more documents not prepared + tprepared state = 2 // Prepared but not yet ready to run + taborting state = 3 // Assertions failed, cleaning up + tapplying state = 4 // Changes are in progress + taborted state = 5 // Pre-conditions failed, nothing done + tapplied state = 6 // All changes applied +) + +func (s state) String() string { + switch s { + case tpreparing: + return "preparing" + case tprepared: + return "prepared" + case taborting: + return "aborting" + case tapplying: + return "applying" + case taborted: + return "aborted" + case tapplied: + return "applied" + } + panic(fmt.Errorf("unknown state: %d", s)) +} + +var rand *mrand.Rand +var randmu sync.Mutex + +func init() { + var seed int64 + err := binary.Read(crand.Reader, binary.BigEndian, &seed) + if err != nil { + panic(err) + } + rand = mrand.New(mrand.NewSource(seed)) +} + +type transaction struct { + Id bson.ObjectId `bson:"_id"` + State state `bson:"s"` + Info interface{} `bson:"i,omitempty"` + Ops []Op `bson:"o"` + Nonce string `bson:"n,omitempty"` + Revnos []int64 `bson:"r,omitempty"` + + docKeysCached docKeys +} + +func (t *transaction) String() string { + if t.Nonce == "" { + return t.Id.Hex() + } + return string(t.token()) +} + +func (t *transaction) done() bool { + return t.State == tapplied || t.State == taborted +} + +func (t *transaction) token() token { + if t.Nonce == "" { + panic("transaction has no nonce") + } + return tokenFor(t) +} + +func (t *transaction) docKeys() docKeys { + if t.docKeysCached != nil { + return t.docKeysCached + } + dkeys := make(docKeys, 0, len(t.Ops)) +NextOp: + for _, op := range t.Ops { + dkey := op.docKey() + for i := range dkeys { + if dkey == dkeys[i] { + continue NextOp + } + } + dkeys = append(dkeys, dkey) + } + sort.Sort(dkeys) + t.docKeysCached = dkeys + return dkeys +} + +// tokenFor returns a unique transaction token that +// is composed by t's id and a nonce. If t already has +// a nonce assigned to it, it will be used, otherwise +// a new nonce will be generated. +func tokenFor(t *transaction) token { + nonce := t.Nonce + if nonce == "" { + nonce = newNonce() + } + return token(t.Id.Hex() + "_" + nonce) +} + +func newNonce() string { + randmu.Lock() + r := rand.Uint32() + randmu.Unlock() + n := make([]byte, 8) + for i := uint(0); i < 8; i++ { + n[i] = "0123456789abcdef"[(r>>(4*i))&0xf] + } + return string(n) +} + +type token string + +func (tt token) id() bson.ObjectId { return bson.ObjectIdHex(string(tt[:24])) } +func (tt token) nonce() string { return string(tt[25:]) } + +// Op represents an operation to a single document that may be +// applied as part of a transaction with other operations. +type Op struct { + // C and Id identify the collection and document this operation + // refers to. Id is matched against the "_id" document field. + C string `bson:"c"` + Id interface{} `bson:"d"` + + // Assert optionally holds a query document that is used to + // test the operation document at the time the transaction is + // going to be applied. The assertions for all operations in + // a transaction are tested before any changes take place, + // and the transaction is entirely aborted if any of them + // fails. This is also the only way to prevent a transaction + // from being being applied (the transaction continues despite + // the outcome of Insert, Update, and Remove). + Assert interface{} `bson:"a,omitempty"` + + // The Insert, Update and Remove fields describe the mutation + // intended by the operation. At most one of them may be set + // per operation. If none are set, Assert must be set and the + // operation becomes a read-only test. + // + // Insert holds the document to be inserted at the time the + // transaction is applied. The Id field will be inserted + // into the document automatically as its _id field. The + // transaction will continue even if the document already + // exists. Use Assert with txn.DocMissing if the insertion is + // required. + // + // Update holds the update document to be applied at the time + // the transaction is applied. The transaction will continue + // even if a document with Id is missing. Use Assert to + // test for the document presence or its contents. + // + // Remove indicates whether to remove the document with Id. + // The transaction continues even if the document doesn't yet + // exist at the time the transaction is applied. Use Assert + // with txn.DocExists to make sure it will be removed. + Insert interface{} `bson:"i,omitempty"` + Update interface{} `bson:"u,omitempty"` + Remove bool `bson:"r,omitempty"` +} + +func (op *Op) isChange() bool { + return op.Update != nil || op.Insert != nil || op.Remove +} + +func (op *Op) docKey() docKey { + return docKey{op.C, op.Id} +} + +func (op *Op) name() string { + switch { + case op.Update != nil: + return "update" + case op.Insert != nil: + return "insert" + case op.Remove: + return "remove" + case op.Assert != nil: + return "assert" + } + return "none" +} + +const ( + // DocExists and DocMissing may be used on an operation's + // Assert value to assert that the document with the given + // Id exists or does not exist, respectively. + DocExists = "d+" + DocMissing = "d-" +) + +// A Runner applies operations as part of a transaction onto any number +// of collections within a database. See the Run method for details. +type Runner struct { + tc *mgo.Collection // txns + sc *mgo.Collection // stash + lc *mgo.Collection // log +} + +// NewRunner returns a new transaction runner that uses tc to hold its +// transactions. +// +// Multiple transaction collections may exist in a single database, but +// all collections that are touched by operations in a given transaction +// collection must be handled exclusively by it. +// +// A second collection with the same name of tc but suffixed by ".stash" +// will be used for implementing the transactional behavior of insert +// and remove operations. +func NewRunner(tc *mgo.Collection) *Runner { + return &Runner{tc, tc.Database.C(tc.Name + ".stash"), nil} +} + +var ErrAborted = fmt.Errorf("transaction aborted") + +// Run creates a new transaction with ops and runs it immediately. +// The id parameter specifies the transaction id, and may be written +// down ahead of time to later verify the success of the change and +// resume it, when the procedure is interrupted for any reason. If +// empty, a random id will be generated. +// The info parameter, if not nil, is included under the "i" +// field of the transaction document. +// +// Operations across documents are not atomically applied, but are +// guaranteed to be eventually all applied in the order provided or +// all aborted, as long as the affected documents are only modified +// through transactions. If documents are simultaneously modified +// by transactions and out of transactions the behavior is undefined. +// +// If Run returns no errors, all operations were applied successfully. +// If it returns ErrAborted, one or more operations can't be applied +// and the transaction was entirely aborted with no changes performed. +// Otherwise, if the transaction is interrupted while running for any +// reason, it may be resumed explicitly or by attempting to apply +// another transaction on any of the documents targeted by ops, as +// long as the interruption was made after the transaction document +// itself was inserted. Run Resume with the obtained transaction id +// to confirm whether the transaction was applied or not. +// +// Any number of transactions may be run concurrently, with one +// runner or many. +func (r *Runner) Run(ops []Op, id bson.ObjectId, info interface{}) (err error) { + const efmt = "error in transaction op %d: %s" + for i := range ops { + op := &ops[i] + if op.C == "" || op.Id == nil { + return fmt.Errorf(efmt, i, "C or Id missing") + } + changes := 0 + if op.Insert != nil { + changes++ + } + if op.Update != nil { + changes++ + } + if op.Remove { + changes++ + } + if changes > 1 { + return fmt.Errorf(efmt, i, "more than one of Insert/Update/Remove set") + } + if changes == 0 && op.Assert == nil { + return fmt.Errorf(efmt, i, "none of Assert/Insert/Update/Remove set") + } + } + if id == "" { + id = bson.NewObjectId() + } + + // Insert transaction sooner rather than later, to stay on the safer side. + t := transaction{ + Id: id, + Ops: ops, + State: tpreparing, + Info: info, + } + if err = r.tc.Insert(&t); err != nil { + return err + } + if err = flush(r, &t); err != nil { + return err + } + if t.State == taborted { + return ErrAborted + } else if t.State != tapplied { + panic(fmt.Errorf("invalid state for %s after flush: %q", &t, t.State)) + } + return nil +} + +// ResumeAll resumes all pending transactions. All ErrAborted errors +// from individual transactions are ignored. +func (r *Runner) ResumeAll() (err error) { + debugf("Resuming all unfinished transactions") + iter := r.tc.Find(bson.D{{"s", bson.D{{"$in", []state{tpreparing, tprepared, tapplying}}}}}).Iter() + var t transaction + for iter.Next(&t) { + if t.State == tapplied || t.State == taborted { + continue + } + debugf("Resuming %s from %q", t.Id, t.State) + if err := flush(r, &t); err != nil { + return err + } + if !t.done() { + panic(fmt.Errorf("invalid state for %s after flush: %q", &t, t.State)) + } + } + return nil +} + +// Resume resumes the transaction with id. It returns mgo.ErrNotFound +// if the transaction is not found. Otherwise, it has the same semantics +// of the Run method after the transaction is inserted. +func (r *Runner) Resume(id bson.ObjectId) (err error) { + t, err := r.load(id) + if err != nil { + return err + } + if !t.done() { + debugf("Resuming %s from %q", t, t.State) + if err := flush(r, t); err != nil { + return err + } + } + if t.State == taborted { + return ErrAborted + } else if t.State != tapplied { + panic(fmt.Errorf("invalid state for %s after flush: %q", t, t.State)) + } + return nil +} + +// ChangeLog enables logging of changes to the given collection +// every time a transaction that modifies content is done being +// applied. +// +// Saved documents are in the format: +// +// {"_id": , : {"d": [, ...], "r": [, ...]}} +// +// The document revision is the value of the txn-revno field after +// the change has been applied. Negative values indicate the document +// was not present in the collection. Revisions will not change when +// updates or removes are applied to missing documents or inserts are +// attempted when the document isn't present. +func (r *Runner) ChangeLog(logc *mgo.Collection) { + r.lc = logc +} + +// PurgeMissing removes from collections any state that refers to transaction +// documents that for whatever reason have been lost from the system (removed +// by accident or lost in a hard crash, for example). +// +// This method should very rarely be needed, if at all, and should never be +// used during the normal operation of an application. Its purpose is to put +// a system that has seen unavoidable corruption back in a working state. +func (r *Runner) PurgeMissing(collections ...string) error { + type M map[string]interface{} + type S []interface{} + pipeline := []M{ + {"$project": M{"_id": 1, "txn-queue": 1}}, + {"$unwind": "$txn-queue"}, + {"$sort": M{"_id": 1, "txn-queue": 1}}, + //{"$group": M{"_id": M{"$substr": S{"$txn-queue", 0, 24}}, "docids": M{"$push": "$_id"}}}, + } + + type TRef struct { + DocId interface{} "_id" + TxnId string "txn-queue" + } + + found := make(map[bson.ObjectId]bool) + colls := make(map[string]bool) + + sort.Strings(collections) + for _, collection := range collections { + c := r.tc.Database.C(collection) + iter := c.Pipe(pipeline).Iter() + var tref TRef + for iter.Next(&tref) { + txnId := bson.ObjectIdHex(tref.TxnId[:24]) + if found[txnId] { + continue + } + if r.tc.FindId(txnId).One(nil) == nil { + found[txnId] = true + continue + } + logf("WARNING: purging from document %s/%v the missing transaction id %s", collection, tref.DocId, txnId) + err := c.UpdateId(tref.DocId, M{"$pull": M{"txn-queue": M{"$regex": "^" + txnId.Hex() + "_*"}}}) + if err != nil { + return fmt.Errorf("error purging missing transaction %s: %v", txnId.Hex(), err) + } + } + colls[collection] = true + } + + type StashTRef struct { + Id docKey "_id" + TxnId string "txn-queue" + } + + iter := r.sc.Pipe(pipeline).Iter() + var stref StashTRef + for iter.Next(&stref) { + txnId := bson.ObjectIdHex(stref.TxnId[:24]) + if found[txnId] { + continue + } + if r.tc.FindId(txnId).One(nil) == nil { + found[txnId] = true + continue + } + logf("WARNING: purging from stash document %s/%v the missing transaction id %s", stref.Id.C, stref.Id.Id, txnId) + err := r.sc.UpdateId(stref.Id, M{"$pull": M{"txn-queue": M{"$regex": "^" + txnId.Hex() + "_*"}}}) + if err != nil { + return fmt.Errorf("error purging missing transaction %s: %v", txnId.Hex(), err) + } + } + + return nil +} + +func (r *Runner) load(id bson.ObjectId) (*transaction, error) { + var t transaction + err := r.tc.FindId(id).One(&t) + if err == mgo.ErrNotFound { + return nil, fmt.Errorf("cannot find transaction %s", id) + } else if err != nil { + return nil, err + } + return &t, nil +} + +type docKey struct { + C string + Id interface{} +} + +type docKeys []docKey + +func (ks docKeys) Len() int { return len(ks) } +func (ks docKeys) Swap(i, j int) { ks[i], ks[j] = ks[j], ks[i] } +func (ks docKeys) Less(i, j int) bool { + a, b := ks[i], ks[j] + if a.C != b.C { + return a.C < b.C + } + av, an := valueNature(a.Id) + bv, bn := valueNature(b.Id) + if an != bn { + return an < bn + } + switch an { + case natureString: + return av.(string) < bv.(string) + case natureInt: + return av.(int64) < bv.(int64) + case natureFloat: + return av.(float64) < bv.(float64) + case natureBool: + return !av.(bool) && bv.(bool) + } + panic("unreachable") +} + +type typeNature int + +const ( + // The order of these values matters. Transactions + // from applications using different ordering will + // be incompatible with each other. + _ typeNature = iota + natureString + natureInt + natureFloat + natureBool +) + +func valueNature(v interface{}) (value interface{}, nature typeNature) { + rv := reflect.ValueOf(v) + switch rv.Kind() { + case reflect.String: + return rv.String(), natureString + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return rv.Int(), natureInt + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return int64(rv.Uint()), natureInt + case reflect.Float32, reflect.Float64: + return rv.Float(), natureFloat + case reflect.Bool: + return rv.Bool(), natureBool + } + panic("document id type unsupported by txn: " + rv.Kind().String()) +} diff --git a/vendor/labix.org/v2/mgo/txn/txn_test.go b/vendor/labix.org/v2/mgo/txn/txn_test.go new file mode 100644 index 0000000..b716783 --- /dev/null +++ b/vendor/labix.org/v2/mgo/txn/txn_test.go @@ -0,0 +1,521 @@ +package txn_test + +import ( + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + "labix.org/v2/mgo/txn" + . "launchpad.net/gocheck" + "testing" +) + +func TestAll(t *testing.T) { + TestingT(t) +} + +type S struct { + MgoSuite + + db *mgo.Database + tc, sc *mgo.Collection + accounts *mgo.Collection + runner *txn.Runner +} + +var _ = Suite(&S{}) + +type M map[string]interface{} + +func (s *S) SetUpTest(c *C) { + txn.SetChaos(txn.Chaos{}) + txn.SetLogger(c) + txn.SetDebug(true) + s.MgoSuite.SetUpTest(c) + + s.db = s.session.DB("test") + s.tc = s.db.C("tc") + s.sc = s.db.C("tc.stash") + s.accounts = s.db.C("accounts") + s.runner = txn.NewRunner(s.tc) +} + +type Account struct { + Id int `bson:"_id"` + Balance int +} + +func (s *S) TestDocExists(c *C) { + err := s.accounts.Insert(M{"_id": 0, "balance": 300}) + c.Assert(err, IsNil) + + exists := []txn.Op{{ + C: "accounts", + Id: 0, + Assert: txn.DocExists, + }} + missing := []txn.Op{{ + C: "accounts", + Id: 0, + Assert: txn.DocMissing, + }} + + err = s.runner.Run(exists, "", nil) + c.Assert(err, IsNil) + err = s.runner.Run(missing, "", nil) + c.Assert(err, Equals, txn.ErrAborted) + + err = s.accounts.RemoveId(0) + c.Assert(err, IsNil) + + err = s.runner.Run(exists, "", nil) + c.Assert(err, Equals, txn.ErrAborted) + err = s.runner.Run(missing, "", nil) + c.Assert(err, IsNil) +} + +func (s *S) TestInsert(c *C) { + err := s.accounts.Insert(M{"_id": 0, "balance": 300}) + c.Assert(err, IsNil) + + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Insert: M{"balance": 200}, + }} + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) + + ops[0].Id = 1 + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + err = s.accounts.FindId(1).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 200) +} + +func (s *S) TestRemove(c *C) { + err := s.accounts.Insert(M{"_id": 0, "balance": 300}) + c.Assert(err, IsNil) + + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Remove: true, + }} + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + err = s.accounts.FindId(0).One(nil) + c.Assert(err, Equals, mgo.ErrNotFound) + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) +} + +func (s *S) TestUpdate(c *C) { + var err error + err = s.accounts.Insert(M{"_id": 0, "balance": 200}) + c.Assert(err, IsNil) + err = s.accounts.Insert(M{"_id": 1, "balance": 200}) + c.Assert(err, IsNil) + + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Update: M{"$inc": M{"balance": 100}}, + }} + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) + + ops[0].Id = 1 + + err = s.accounts.FindId(1).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 200) +} + +func (s *S) TestInsertUpdate(c *C) { + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Insert: M{"_id": 0, "balance": 200}, + }, { + C: "accounts", + Id: 0, + Update: M{"$inc": M{"balance": 100}}, + }} + + err := s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 400) +} + +func (s *S) TestUpdateInsert(c *C) { + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Update: M{"$inc": M{"balance": 100}}, + }, { + C: "accounts", + Id: 0, + Insert: M{"_id": 0, "balance": 200}, + }} + + err := s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 200) + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) +} + +func (s *S) TestInsertRemoveInsert(c *C) { + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Insert: M{"_id": 0, "balance": 200}, + }, { + C: "accounts", + Id: 0, + Remove: true, + }, { + C: "accounts", + Id: 0, + Insert: M{"_id": 0, "balance": 300}, + }} + + err := s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) +} + +func (s *S) TestQueueStashing(c *C) { + txn.SetChaos(txn.Chaos{ + KillChance: 1, + Breakpoint: "set-applying", + }) + + opses := [][]txn.Op{{{ + C: "accounts", + Id: 0, + Insert: M{"balance": 100}, + }}, {{ + C: "accounts", + Id: 0, + Remove: true, + }}, {{ + C: "accounts", + Id: 0, + Insert: M{"balance": 200}, + }}, {{ + C: "accounts", + Id: 0, + Update: M{"$inc": M{"balance": 100}}, + }}} + + var last bson.ObjectId + for _, ops := range opses { + last = bson.NewObjectId() + err := s.runner.Run(ops, last, nil) + c.Assert(err, Equals, txn.ErrChaos) + } + + txn.SetChaos(txn.Chaos{}) + err := s.runner.Resume(last) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 300) +} + +func (s *S) TestInfo(c *C) { + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Assert: txn.DocMissing, + }} + + id := bson.NewObjectId() + err := s.runner.Run(ops, id, M{"n": 42}) + c.Assert(err, IsNil) + + var t struct{ I struct{ N int } } + err = s.tc.FindId(id).One(&t) + c.Assert(err, IsNil) + c.Assert(t.I.N, Equals, 42) +} + +func (s *S) TestErrors(c *C) { + doc := bson.M{"foo": 1} + tests := []txn.Op{{ + C: "c", + Id: 0, + }, { + C: "c", + Id: 0, + Insert: doc, + Remove: true, + }, { + C: "c", + Id: 0, + Insert: doc, + Update: doc, + }, { + C: "c", + Id: 0, + Update: doc, + Remove: true, + }, { + C: "c", + Assert: doc, + }, { + Id: 0, + Assert: doc, + }} + + txn.SetChaos(txn.Chaos{KillChance: 1.0}) + for _, op := range tests { + c.Logf("op: %v", op) + err := s.runner.Run([]txn.Op{op}, "", nil) + c.Assert(err, ErrorMatches, "error in transaction op 0: .*") + } +} + +func (s *S) TestAssertNestedOr(c *C) { + // Assert uses $or internally. Ensure nesting works. + err := s.accounts.Insert(M{"_id": 0, "balance": 300}) + c.Assert(err, IsNil) + + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Assert: bson.D{{"$or", []bson.D{{{"balance", 100}}, {{"balance", 300}}}}}, + Update: bson.D{{"$inc", bson.D{{"balance", 100}}}}, + }} + + err = s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var account Account + err = s.accounts.FindId(0).One(&account) + c.Assert(err, IsNil) + c.Assert(account.Balance, Equals, 400) +} + +func (s *S) TestVerifyFieldOrdering(c *C) { + // Used to have a map in certain operations, which means + // the ordering of fields would be messed up. + fields := bson.D{{"a", 1}, {"b", 2}, {"c", 3}} + ops := []txn.Op{{ + C: "accounts", + Id: 0, + Insert: fields, + }} + + err := s.runner.Run(ops, "", nil) + c.Assert(err, IsNil) + + var d bson.D + err = s.accounts.FindId(0).One(&d) + c.Assert(err, IsNil) + + var filtered bson.D + for _, e := range d { + switch e.Name { + case "a", "b", "c": + filtered = append(filtered, e) + } + } + c.Assert(filtered, DeepEquals, fields) +} + +func (s *S) TestChangeLog(c *C) { + chglog := s.db.C("chglog") + s.runner.ChangeLog(chglog) + + ops := []txn.Op{{ + C: "debts", + Id: 0, + Assert: txn.DocMissing, + }, { + C: "accounts", + Id: 0, + Insert: M{"balance": 300}, + }, { + C: "accounts", + Id: 1, + Insert: M{"balance": 300}, + }, { + C: "people", + Id: "joe", + Insert: M{"accounts": []int64{0, 1}}, + }} + id := bson.NewObjectId() + err := s.runner.Run(ops, id, nil) + c.Assert(err, IsNil) + + type IdList []interface{} + type Log struct { + Docs IdList "d" + Revnos []int64 "r" + } + var m map[string]*Log + err = chglog.FindId(id).One(&m) + c.Assert(err, IsNil) + + c.Assert(m["accounts"], DeepEquals, &Log{IdList{0, 1}, []int64{2, 2}}) + c.Assert(m["people"], DeepEquals, &Log{IdList{"joe"}, []int64{2}}) + c.Assert(m["debts"], IsNil) + + ops = []txn.Op{{ + C: "accounts", + Id: 0, + Update: M{"$inc": M{"balance": 100}}, + }, { + C: "accounts", + Id: 1, + Update: M{"$inc": M{"balance": 100}}, + }} + id = bson.NewObjectId() + err = s.runner.Run(ops, id, nil) + c.Assert(err, IsNil) + + m = nil + err = chglog.FindId(id).One(&m) + c.Assert(err, IsNil) + + c.Assert(m["accounts"], DeepEquals, &Log{IdList{0, 1}, []int64{3, 3}}) + c.Assert(m["people"], IsNil) + + ops = []txn.Op{{ + C: "accounts", + Id: 0, + Remove: true, + }, { + C: "people", + Id: "joe", + Remove: true, + }} + id = bson.NewObjectId() + err = s.runner.Run(ops, id, nil) + c.Assert(err, IsNil) + + m = nil + err = chglog.FindId(id).One(&m) + c.Assert(err, IsNil) + + c.Assert(m["accounts"], DeepEquals, &Log{IdList{0}, []int64{-4}}) + c.Assert(m["people"], DeepEquals, &Log{IdList{"joe"}, []int64{-3}}) +} + +func (s *S) TestPurgeMissing(c *C) { + txn.SetChaos(txn.Chaos{ + KillChance: 1, + Breakpoint: "set-applying", + }) + + err := s.accounts.Insert(M{"_id": 0, "balance": 100}) + c.Assert(err, IsNil) + err = s.accounts.Insert(M{"_id": 1, "balance": 100}) + c.Assert(err, IsNil) + + ops1 := []txn.Op{{ + C: "accounts", + Id: 3, + Insert: M{"balance": 100}, + }} + + ops2 := []txn.Op{{ + C: "accounts", + Id: 0, + Remove: true, + }, { + C: "accounts", + Id: 1, + Update: M{"$inc": M{"balance": 100}}, + }, { + C: "accounts", + Id: 2, + Insert: M{"balance": 100}, + }} + + err = s.runner.Run(ops1, "", nil) + c.Assert(err, Equals, txn.ErrChaos) + + last := bson.NewObjectId() + err = s.runner.Run(ops2, last, nil) + c.Assert(err, Equals, txn.ErrChaos) + err = s.tc.RemoveId(last) + c.Assert(err, IsNil) + + txn.SetChaos(txn.Chaos{}) + err = s.runner.ResumeAll() + c.Assert(err, IsNil) + + err = s.runner.Run(ops2, "", nil) + c.Assert(err, ErrorMatches, "cannot find transaction .*") + + err = s.runner.PurgeMissing("accounts") + c.Assert(err, IsNil) + + err = s.runner.Run(ops2, "", nil) + c.Assert(err, IsNil) + + expect := []struct{ Id, Balance int }{ + {0, -1}, + {1, 200}, + {2, 100}, + {3, 100}, + } + var got Account + for _, want := range expect { + err = s.accounts.FindId(want.Id).One(&got) + if want.Balance == -1 { + if err != mgo.ErrNotFound { + c.Errorf("Account %d should not exist, find got err=%#v", err) + } + } else if err != nil { + c.Errorf("Account %d should have balance of %d, but wasn't found", want.Id, want.Balance) + } else if got.Balance != want.Balance { + c.Errorf("Account %d should have balance of %d, got %d", want.Id, want.Balance, got.Balance) + } + } +} diff --git a/vendor/launchpad.net/goyaml/.bzr/README b/vendor/launchpad.net/goyaml/.bzr/README new file mode 100644 index 0000000..f82dc1c --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/README @@ -0,0 +1,3 @@ +This is a Bazaar control directory. +Do not change any files in this directory. +See http://bazaar.canonical.com/ for more information about Bazaar. diff --git a/vendor/launchpad.net/goyaml/.bzr/branch-format b/vendor/launchpad.net/goyaml/.bzr/branch-format new file mode 100644 index 0000000..9eb09b7 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/branch-format @@ -0,0 +1 @@ +Bazaar-NG meta directory, format 1 diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf b/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf new file mode 100644 index 0000000..dae50f0 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/branch/branch.conf @@ -0,0 +1 @@ +parent_location = http://bazaar.launchpad.net/~goyaml/goyaml/trunk/ diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/format b/vendor/launchpad.net/goyaml/.bzr/branch/format new file mode 100644 index 0000000..dc392f4 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/branch/format @@ -0,0 +1 @@ +Bazaar Branch Format 7 (needs bzr 1.6) diff --git a/vendor/launchpad.net/goyaml/.bzr/branch/last-revision b/vendor/launchpad.net/goyaml/.bzr/branch/last-revision new file mode 100644 index 0000000..5128c99 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/branch/last-revision @@ -0,0 +1 @@ +51 gustavo@niemeyer.net-20140305200416-7gh64vkcckre5mob diff --git a/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts b/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts new file mode 100644 index 0000000..0dc2d3a --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/checkout/conflicts @@ -0,0 +1 @@ +BZR conflict list format 1 diff --git a/vendor/launchpad.net/goyaml/.bzr/checkout/dirstate b/vendor/launchpad.net/goyaml/.bzr/checkout/dirstate new file mode 100644 index 0000000000000000000000000000000000000000..748ed3049ced7aacbb8854d87fe218f19fc6f44b GIT binary patch literal 5692 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 a43O;PKqyl2cpljcz{UVLX1M_NVvwL)N`xu^ literal 0 HcmV?d00001 diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix b/vendor/launchpad.net/goyaml/.bzr/repository/indices/dfefc85269662e7e438e0069b6349695.rix new file mode 100644 index 0000000000000000000000000000000000000000..a1fb02affed0160b9319ee856f7e5d40f4e90b90 GIT binary patch literal 3430 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 literal 0 HcmV?d00001 diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/pack-names b/vendor/launchpad.net/goyaml/.bzr/repository/pack-names new file mode 100644 index 0000000..f17a210 --- /dev/null +++ b/vendor/launchpad.net/goyaml/.bzr/repository/pack-names @@ -0,0 +1,6 @@ +B+Tree Graph Index 2 +node_ref_lists=0 +key_elements=1 +len=1 +row_lengths=1 +xœÁ»€ Pj¦È R8ŒŸPYXظ½ï½ß“Ûûª×ÊuΡ RÓÓ0³5ÆAX0F)04̤ϮW[ÔþZ \ No newline at end of file diff --git a/vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack b/vendor/launchpad.net/goyaml/.bzr/repository/packs/dfefc85269662e7e438e0069b6349695.pack new file mode 100644 index 0000000000000000000000000000000000000000..5fec2552227164540e8971bd15374d0dc8cf07a9 GIT binary patch literal 583825 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�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%0A293v$oGO`ph=T%U2^kg9I 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