├── .gitignore ├── LICENSE ├── README.md ├── packages └── meteor-postgres │ ├── README.md │ ├── collection │ ├── collection.js │ └── collection_tests.js │ ├── minisql │ ├── alasql.js │ ├── alasql.js.map │ ├── minisql.js │ └── minisql_tests.js │ ├── package.js │ └── postgres │ ├── serversql.js │ └── sqlserver_tests.js ├── simple-todos.css ├── simple-todos.html └── simple-todos.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.*~ 2 | *.swp 3 | *.swo 4 | .build* 5 | .npm 6 | settings.json 7 | .DS_Store 8 | /.meteor 9 | *~ 10 | /dev_bundle 11 | /dev_bundle*.tar.gz 12 | /android_bundle 13 | /android_bundle*.tar.gz 14 | /node_*.tar.gz 15 | /mongo_*.tar.gz 16 | /dist 17 | \#*\# 18 | .\#* 19 | .idea 20 | *.iml 21 | *.sublime-project 22 | *.sublime-workspace 23 | TAGS 24 | *.log 25 | *.out 26 | npm-debug.log 27 | universe 28 | .floo 29 | .flooignore 30 | .gitconfig 31 | 'postgres://meteor:Meteor1234@191.238.146.165/meteor' -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 meteor-postgres 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Meteor-Postgres](http://www.meteorpostgres.com/) 2 | 3 | 4 | ![Postgres](https://s3-us-west-1.amazonaws.com/treebookicons/postgresql_logo.jpg "Postgres")![Meteor](https://s3-us-west-1.amazonaws.com/treebookicons/meteor-logo.png "Meteor") 5 | 6 | ### Installation 7 | 8 | Run the following from a command line. 9 | 10 | meteor add meteorsteam:meteor-postgres 11 | 12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package. 13 | 14 | ### Usage 15 | 16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started) 17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods) 18 | * [Demo Todo App](http://todopostgres.meteor.com/) 19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc) 20 | 21 | ### Implementation 22 | 23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client. 24 | 25 | ### Contribution Guidelines 26 | 27 | Coming soon. 28 | 29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor. 30 | 31 | ### License 32 | 33 | Released under the MIT license. See the LICENSE file for more info. 34 | -------------------------------------------------------------------------------- /packages/meteor-postgres/README.md: -------------------------------------------------------------------------------- 1 | # [Meteor-Postgres](http://www.meteorpostgres.com/) 2 | 3 | 4 | ![Postgres](https://s3-us-west-1.amazonaws.com/treebookicons/postgresql_logo.jpg "Postgres")![Meteor](https://s3-us-west-1.amazonaws.com/treebookicons/meteor-logo.png "Meteor") 5 | 6 | ### Installation 7 | 8 | Run the following from a command line. 9 | 10 | meteor add meteorsteam:meteor-postgres 11 | 12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package. 13 | 14 | ### Usage 15 | 16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started) 17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods) 18 | * [Demo Todo App](http://todopostgres.meteor.com/) 19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc) 20 | 21 | ### Implementation 22 | 23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client. 24 | 25 | ### Contribution Guidelines 26 | 27 | Coming soon. 28 | 29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor. 30 | 31 | ### License 32 | 33 | Released under the MIT license. See the LICENSE file for more info. 34 | -------------------------------------------------------------------------------- /packages/meteor-postgres/collection/collection.js: -------------------------------------------------------------------------------- 1 | 2 | var buffer = []; 3 | /** 4 | * @summary Namespace for SQL-related items 5 | * @namespace 6 | */ 7 | SQL = {}; 8 | 9 | SQL.Collection = function(connection) { 10 | var self = this; 11 | this.unvalidated = false; 12 | this.reactiveData = new Tracker.Dependency; 13 | this.tableName = connection; 14 | this.saveMethod = this.tableName + 'save'; 15 | this.fetchMethod = this.tableName + 'fetch'; 16 | 17 | if (!(self instanceof SQL.Collection)) { 18 | throw new Error('Use new to construct a SQLCollection'); 19 | } 20 | 21 | // boolean to keep track of whether the local DB has an unvalidated entry 22 | self._events = []; 23 | 24 | if (!this.tableName) { 25 | throw new Error('First argument to new SQLCollection must exist'); 26 | } 27 | 28 | if (this.tableName !== null && typeof this.tableName !== "string") { 29 | throw new Error('First argument to new SQLCollection must be a string or null'); 30 | } 31 | 32 | if (Meteor.isClient) { 33 | // Sets certain properties used for miniSQL 34 | miniSQL(this); 35 | } 36 | 37 | if (Meteor.isServer){ 38 | // Sets certain properties used for ActiveRecord 39 | ActiveRecord(this); 40 | } 41 | 42 | // initialize class 43 | this.table = connection; 44 | 45 | if (Meteor.isClient) { 46 | // Added will only be triggered on the initial population of the database client side. 47 | // Data added to any client while the page is already loaded will trigger a 'changed event' 48 | this.addEventListener('added', function(index, msg, name) { 49 | this.remove().save('client'); 50 | for (var x = msg.results.length - 1; x >= 0; x--) { 51 | this.insert(msg.results[x]).save('client'); 52 | } 53 | // Triggering Meteor's reactive data to allow for full stack reactivity 54 | }); 55 | // Changed will be triggered whenever the server database changed while the client has the page open. 56 | // This could happen from an addition, an update, or a removal, from that specific client, or another client 57 | this.addEventListener('changed', function(index, msg, name) { 58 | // Checking to see if event is a removal from the DB 59 | if (msg.removed) { 60 | var tableId = msg.tableId; 61 | // For the client that triggered the removal event, the data will have 62 | // already been removed and this is redundant, but it would be inefficient to fix. 63 | this.remove().where("id = ?", tableId).save('client'); 64 | } 65 | // Checking to see if event is a modification of the DB 66 | else if (msg.modified) { 67 | // For the client that triggered the removal event, the data will have 68 | // already been removed and this is redundant. 69 | this.update(msg.results).where("id = ?", msg.results.id).save('client'); 70 | } 71 | else { 72 | // The message is a new insertion of a message 73 | // If the message was submitted by this client then the insert message triggered 74 | // by the server should be an update rather than an insert 75 | // We use the unvalidated boolean variabe to keep track of this 76 | if (this.unvalidated) { 77 | this.update(msg.results).where("id = ?", -1).save('client'); 78 | this.unvalidated = false; 79 | } 80 | else { 81 | // The data was added by another client so just a regular insert 82 | this.insert(msg.results).save('client'); 83 | } 84 | } 85 | }); 86 | } 87 | // setting up the connection between server and client 88 | var selfConnection; 89 | var subscribeArgs; 90 | if (typeof connection === 'string') { 91 | // Using default connection 92 | subscribeArgs = Array.prototype.slice.call(arguments, 0); 93 | name = connection; 94 | if (Meteor.isClient) { 95 | connection = Meteor.connection; 96 | } else if (Meteor.isServer) { 97 | if (!selfConnection) { 98 | selfConnection = DDP.connect(Meteor.absoluteUrl()); 99 | } 100 | connection = selfConnection; 101 | } 102 | } else { 103 | // SQLCollection arguments does not use the first argument (the connection) 104 | subscribeArgs = Array.prototype.slice.call(arguments, 1); 105 | } 106 | 107 | var subsBefore = _.keys(connection._subscriptions); 108 | _.extend(self, connection.subscribe.apply(connection, subscribeArgs)); 109 | var subsNew = _.difference(_.keys(connection._subscriptions), subsBefore); 110 | if (subsNew.length !== 1) throw new Error('Subscription failed!'); 111 | self.subscriptionId = subsNew[0]; 112 | 113 | buffer.push({ 114 | connection: connection, 115 | name: name, 116 | subscriptionId: self.subscriptionId, 117 | instance: self 118 | }); 119 | 120 | // If first store for this subscription name, register it! 121 | if (_.filter(buffer, function(sub) { 122 | return sub.name === name && sub.connection === connection; 123 | }).length === 1) { 124 | registerStore(connection, name); 125 | } 126 | }; 127 | 128 | 129 | var registerStore = function(connection, name) { 130 | connection.registerStore(name, { 131 | beginUpdate: function(batchSize, reset) { 132 | }, 133 | update: function(msg) { 134 | var idSplit = msg.id.split(':'); 135 | var sub = _.filter(buffer, function(sub) { 136 | return sub.subscriptionId === idSplit[0]; 137 | })[0].instance; 138 | if (idSplit.length === 1 && msg.msg === 'added' && 139 | msg.fields && msg.fields.reset === true) { 140 | // This message indicates a reset of a result set 141 | sub.dispatchEvent('reset', msg); 142 | sub.splice(0, sub.length); 143 | } else { 144 | var index = parseInt(idSplit[1], 10); 145 | var oldRow; 146 | sub.dispatchEvent('update', index, msg); 147 | switch (msg.msg) { 148 | case 'added': 149 | sub.splice(index, 0, msg.fields); 150 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection); 151 | break; 152 | case 'changed': 153 | sub.splice(index, 0, msg.fields); 154 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection); 155 | break; 156 | } 157 | } 158 | sub.changed(); 159 | }, 160 | endUpdate: function() { 161 | }, 162 | saveOriginals: function() { 163 | }, 164 | retrieveOriginals: function() { 165 | } 166 | }); 167 | }; 168 | 169 | // Inherit from Array and Tracker.Dependency 170 | SQL.Collection.prototype = new Array; 171 | _.extend(SQL.Collection.prototype, Tracker.Dependency.prototype); 172 | if (Meteor.isClient) { 173 | // extends the proto with miniSQL Methods 174 | _.extend(SQL.Collection.prototype, miniSQL.prototype); 175 | } 176 | 177 | if (Meteor.isServer){ 178 | // extends the proto with ActiveRecord Methods 179 | _.extend(SQL.Collection.prototype, ActiveRecord.prototype); 180 | } 181 | 182 | SQL.Collection.prototype.publish = function(collname, pubFunc) { 183 | var methodObj = {}; 184 | var context = this; 185 | methodObj[this.saveMethod] = function(input, dataArray) { 186 | context.save(input, dataArray); 187 | } 188 | methodObj[this.fetchMethod] = function(input, dataArray) { 189 | context.fetch(input, dataArray); 190 | } 191 | Meteor.methods(methodObj); 192 | Meteor.publish(collname, function () { 193 | // For this implementation to work you must call getCursor and provide a callback with the select 194 | // statement that needs to be reactive. The 'caboose' on the chain of calls must be autoSelect 195 | // and it must be passed the param 'sub' which is defining in the anon function. 196 | // This is a limitation of our implementation and will be fixed in later versions 197 | return { 198 | _publishCursor: function(sub){ 199 | return pubFunc().autoSelect(sub); 200 | } 201 | } 202 | }); 203 | }; 204 | 205 | SQL.Collection.prototype._eventRoot = function(eventName) { 206 | return eventName.split('.')[0]; 207 | }; 208 | 209 | SQL.Collection.prototype._selectEvents = function(eventName, invert) { 210 | var self = this; 211 | var eventRoot, testKey, testVal; 212 | if (!(eventName instanceof RegExp)) { 213 | eventRoot = self._eventRoot(eventName); 214 | if (eventName === eventRoot) { 215 | testKey = 'root'; 216 | testVal = eventRoot; 217 | } else { 218 | testKey = 'name'; 219 | testVal = eventName; 220 | } 221 | } 222 | return _.filter(self._events, function(event) { 223 | var pass; 224 | if (eventName instanceof RegExp) { 225 | pass = event.name.match(eventName); 226 | } else { 227 | pass = event[testKey] === testVal; 228 | } 229 | return invert ? !pass : pass; 230 | }); 231 | }; 232 | 233 | SQL.Collection.prototype.addEventListener = function(eventName, listener) { 234 | var self = this; 235 | if (typeof listener !== 'function') 236 | throw new Error('invalid-listener'); 237 | self._events.push({ 238 | name: eventName, 239 | root: self._eventRoot(eventName), 240 | listener: listener 241 | }); 242 | }; 243 | 244 | SQL.Collection.prototype.initialValue = function(eventName, listener) { 245 | return Postgres.select(this.tableName); 246 | }; 247 | 248 | // @param {string} eventName - Remove events of this name, pass without suffix 249 | // to remove all events matching root. 250 | SQL.Collection.prototype.removeEventListener = function(eventName) { 251 | var self = this; 252 | self._events = self._selectEvents(eventName, true); 253 | }; 254 | 255 | SQL.Collection.prototype.dispatchEvent = function(eventName /* arguments */) { 256 | var self = this; 257 | var listenerArgs = Array.prototype.slice.call(arguments, 1); 258 | var listeners = self._selectEvents(eventName); 259 | // Newest to oldest 260 | for (var i = listeners.length - 1; i >= 0; i--) { 261 | // Return false to stop further handling 262 | if (listeners[i].listener.apply(self, listenerArgs) === false) return false; 263 | } 264 | return true; 265 | }; 266 | 267 | SQL.Collection.prototype.reactive = function() { 268 | var self = this; 269 | self.depend(); 270 | return self; 271 | }; 272 | -------------------------------------------------------------------------------- /packages/meteor-postgres/collection/collection_tests.js: -------------------------------------------------------------------------------- 1 | Tinytest.add( 2 | 'SQL.collection - SQL.Collection instantiation', 3 | function (test) { 4 | test.throws( 5 | function () { 6 | SQL.Collection(null, null); 7 | }, 8 | /Use new to construct a SQLCollection/ 9 | ); 10 | 11 | test.throws( 12 | function() { 13 | var test1 = new SQL.Collection(); 14 | }, 15 | /First argument to new SQLCollection must exist/ 16 | ); 17 | 18 | test.throws( 19 | function() { 20 | var test2 = new SQL.Collection(1234); 21 | }, 22 | /First argument to new SQLCollection must be a string or null/ 23 | ); 24 | 25 | test.throws( 26 | function() { 27 | var test3 = new SQL.Collection('test'); 28 | }, 29 | /connection Error/ 30 | ); 31 | } 32 | ); 33 | 34 | Tinytest.add('Livedata - server method - tests', function (test) { 35 | // var testCollection = new SQL.Collection('test'); 36 | //no event name error handle 37 | }); -------------------------------------------------------------------------------- /packages/meteor-postgres/minisql/alasql.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "alasql.js", 4 | "sources": [ 5 | "src/10start.js", 6 | "src/alasqlparser.js", 7 | "src/12pretty.js", 8 | "src/15utility.js", 9 | "src/16comments.js", 10 | "src/17alasql.js", 11 | "src/20database.js", 12 | "src/21transaction.js", 13 | "src/23table.js", 14 | "src/24view.js", 15 | "src/25queryclass.js", 16 | "src/28yy.js", 17 | "src/30statements.js", 18 | "src/38query.js", 19 | "src/39dojoin.js", 20 | "src/40select.js", 21 | "src/41exists.js", 22 | "src/420from.js", 23 | "src/421join.js", 24 | "src/422where.js", 25 | "src/423groupby.js", 26 | "src/424select.js", 27 | "src/425having.js", 28 | "src/426orderby.js", 29 | "src/43rollup.js", 30 | "src/44defcols.js", 31 | "src/45union.js", 32 | "src/46apply.js", 33 | "src/47over.js", 34 | "src/50expression.js", 35 | "src/52linq.js", 36 | "src/55functions.js", 37 | "src/56datetime.js", 38 | "src/57case.js", 39 | "src/58json.js", 40 | "src/59convert.js", 41 | "src/60createtable.js", 42 | "src/61date.js", 43 | "src/62droptable.js", 44 | "src/64altertable.js", 45 | "src/65createindex.js", 46 | "src/66dropindex.js", 47 | "src/67withselect.js", 48 | "src/68if.js", 49 | "src/69while.js", 50 | "src/70insert.js", 51 | "src/72delete.js", 52 | "src/74update.js", 53 | "src/75merge.js", 54 | "src/76usedatabase.js", 55 | "src/77declare.js", 56 | "src/78show.js", 57 | "src/79set.js", 58 | "src/80console.js", 59 | "src/81commit.js", 60 | "src/83into.js", 61 | "src/84from.js", 62 | "src/85help.js", 63 | "src/86print.js", 64 | "src/87source.js", 65 | "src/88require.js", 66 | "src/89assert.js", 67 | "src/90websql.js", 68 | "src/91indexeddb.js", 69 | "src/92localstorage.js", 70 | "src/93sqlite.js", 71 | "src/94filestorage.js", 72 | "src/97saveas.js", 73 | "src/FileSaver.js", 74 | "src/98finish.js", 75 | "src/99worker.js" 76 | ], 77 | "names": [], 78 | "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpSA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA" 79 | } -------------------------------------------------------------------------------- /packages/meteor-postgres/minisql/minisql.js: -------------------------------------------------------------------------------- 1 | miniSQL = function(Collection){ 2 | 3 | Collection = Collection || Object.create(miniSQL.prototype); 4 | Collection.table = Collection.tableName; 5 | 6 | // inputString used by queries, overrides other strings 7 | // includes: create table, create relationship, drop table, insert 8 | Collection.inputString = ''; 9 | Collection.inputString2 = ''; 10 | Collection.autoSelectData = ''; 11 | Collection.autoSelectInput = ''; 12 | Collection.tableElements = {}; 13 | 14 | // statement starters 15 | Collection.selectString = ''; 16 | Collection.updateString = ''; 17 | Collection.deleteString = ''; 18 | 19 | // chaining statements 20 | Collection.joinString = ''; 21 | Collection.whereString = ''; 22 | Collection.clientWhereString = ''; 23 | Collection.serverWhereString = ''; 24 | 25 | // caboose statements 26 | Collection.orderString = ''; 27 | Collection.limitString = ''; 28 | Collection.offsetString = ''; 29 | Collection.groupString = ''; 30 | Collection.havingString = ''; 31 | 32 | Collection.dataArray = []; 33 | Collection.dataArray2 = []; 34 | Collection.server = null; 35 | 36 | // error logging 37 | Collection.prevFunc = ''; 38 | return Collection; 39 | }; 40 | 41 | miniSQL.prototype.createTable = function(tableObj) { 42 | var _DataTypes = { 43 | $number: 'integer', 44 | $string: 'varchar(255)', 45 | $json: 'json', 46 | $datetime: 'date', 47 | $float: 'decimal', 48 | $seq: 'serial', 49 | $bool: 'boolean' 50 | }; 51 | 52 | var _TableConstraints = { 53 | $unique: 'unique', 54 | $check: 'check ', // value 55 | $exclude: 'exclude', 56 | $notnull: 'not null', 57 | $default: 'default ', // value 58 | $primary: 'primary key' 59 | }; 60 | 61 | alasql.fn.Date = Date; 62 | 63 | var startString = 'CREATE TABLE ' + this.table + ' ('; 64 | var item, subKey, valOperator, inputString = ''; 65 | 66 | for (var key in tableObj) { 67 | this.tableElements[key] = key; 68 | inputString += key + ' '; 69 | inputString += _DataTypes[tableObj[key][0]]; 70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) { 71 | for (var i = 1, count = tableObj[key].length; i < count; i++) { 72 | item = tableObj[key][i]; 73 | if (typeof item === 'object') { 74 | subKey = Object.keys(item); 75 | valOperator = _TableConstraints[subKey]; 76 | inputString += ' ' + valOperator + item[subKey]; 77 | } else { 78 | inputString += ' ' + _TableConstraints[item]; 79 | } 80 | } 81 | } 82 | inputString += ', '; 83 | } 84 | // check to see if id already provided 85 | if (inputString.indexOf('id') === -1) { 86 | startString += 'id serial primary key,'; 87 | } 88 | 89 | this.inputString = startString + inputString + " createdat Date); "; 90 | this.prevFunc = 'CREATE TABLE'; 91 | alasql(this.inputString); 92 | this.clearAll(); 93 | return this; 94 | }; 95 | 96 | miniSQL.prototype.dropTable = function() { 97 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE;'; 98 | this.prevFunc = 'DROP TABLE'; 99 | return this; 100 | }; 101 | 102 | miniSQL.prototype.insert = function(serverInserts, clientInserts) { 103 | // server 104 | if(serverInserts['id'] === undefined){ 105 | serverInserts['id'] = -1; 106 | } 107 | // client 108 | this.dataArray2 = []; 109 | var insertString2 = 'INSERT INTO ' + this.table + ' ('; 110 | var valueString2 = ') VALUES ('; 111 | for (var key2 in clientInserts) { 112 | insertString2 += key2 + ', '; 113 | this.dataArray2.push(clientInserts[key2]); 114 | valueString2 += '?, '; 115 | } 116 | for (var key3 in serverInserts) { 117 | insertString2 += key3 + ', '; 118 | this.dataArray2.push(serverInserts[key3]); 119 | valueString2 += '?, '; 120 | } 121 | this.server = true; 122 | this.inputString2 = insertString2.substring(0, insertString2.length - 2) + valueString2.substring(0, valueString2.length - 2) + ');'; 123 | 124 | 125 | this.dataArray = []; 126 | if (serverInserts['id'] === -1){ 127 | delete serverInserts['id']; 128 | } 129 | var insertString = 'INSERT INTO ' + this.table + ' ('; 130 | var valueString = ') VALUES (', j = 1; 131 | for (var key in serverInserts) { 132 | insertString += key + ', '; // field 133 | this.dataArray.push(serverInserts[key]); // data 134 | valueString += '$' + j++ + ', '; // $1, $2, etc 135 | } 136 | 137 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');'; 138 | 139 | 140 | 141 | this.prevFunc = 'INSERT'; 142 | return this; 143 | }; 144 | 145 | miniSQL.prototype.update = function(updates) { 146 | this.updateString = 'UPDATE ' + this.table + ' SET '; 147 | for (var key in updates) { 148 | if (typeof updates[key] === 'number' && !isNaN(updates[key]) || typeof(updates[key]) === "boolean"){ 149 | this.updateString += key + ' = ' + updates[key] + ', '; 150 | } 151 | else { 152 | this.updateString += key + ' = "' + updates[key] + '", '; 153 | } 154 | } 155 | this.updateString = this.updateString.substring(0,this.updateString.length-2); 156 | this.prevFunc = 'UPDATE'; 157 | return this; 158 | }; 159 | 160 | miniSQL.prototype.remove = function() { 161 | this.deleteString = 'DELETE FROM ' + this.table; 162 | this.prevFunc = 'DELETE'; 163 | return this; 164 | }; 165 | 166 | miniSQL.prototype.select = function(/*arguments*/) { 167 | var args = ''; 168 | if (arguments.length >= 1) { 169 | for (var i = 0; i < arguments.length; i++) { 170 | if (arguments[i] === 'distinct') { 171 | args += 'DISTINCT '; 172 | } else { 173 | args += arguments[i] + ', '; 174 | } 175 | } 176 | args = args.substring(0, args.length - 2); 177 | } else { 178 | args += '*'; 179 | } 180 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " "; 181 | this.prevFunc = 'SELECT'; 182 | return this; 183 | }; 184 | 185 | miniSQL.prototype.findOne = function(/*arguments*/) { 186 | if (arguments.length === 2) { 187 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;'; 188 | } else { 189 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1'; 190 | } 191 | this.prevFunc = 'FIND ONE'; 192 | return this; 193 | }; 194 | 195 | miniSQL.prototype.join = function(joinType, fields, joinTable) { 196 | if (Array.isArray(joinType)) { 197 | for (var x = 0, count = fields.length; x < count; x++) { 198 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1]; 199 | } 200 | } else { 201 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable; 202 | } 203 | this.prevFunc = "JOIN"; 204 | return this; 205 | }; 206 | 207 | miniSQL.prototype.where = function(/*Arguments*/) { 208 | 209 | this.dataArray = []; 210 | this.dataArray2 = []; 211 | var where = '', redux, substring1, substring2; 212 | 213 | where += arguments[0]; 214 | // replace ? with rest of array 215 | for (var i = 1, count = arguments.length; i < count; i++) { 216 | if (Array.isArray(arguments[i])) { 217 | if (arguments[i].length === 0) { 218 | throw new Error('Invalid input: array is empty'); 219 | } 220 | redux = where.indexOf('?'); 221 | substring1 = where.substring(0, redux); 222 | substring2 = where.substring(redux + 1, where.length); 223 | where = substring1 + 'ANY($' + i + ')'+ substring2; 224 | this.dataArray.push(arguments[i]); 225 | } else { 226 | redux = where.indexOf('?'); 227 | substring1 = where.substring(0, redux); 228 | substring2 = where.substring(redux + 1, where.length); 229 | where = substring1 + '$' + i + substring2; 230 | this.dataArray.push(arguments[i]); 231 | } 232 | } 233 | this.serverWhereString = ' WHERE ' + where; 234 | 235 | where = ''; 236 | where += arguments[0]; 237 | for (var i = 1, count = arguments.length; i < count; i++) { 238 | if (Array.isArray(arguments[i])) { 239 | redux = where.indexOf('?'); 240 | substring1 = where.substring(0, redux); 241 | substring2 = where.substring(redux + 1, where.length); 242 | where = substring1 + 'IN (' + arguments[i].join(',') + ')' + substring2; 243 | } else { 244 | this.dataArray2.push(arguments[i]); 245 | } 246 | } 247 | this.clientWhereString = ' WHERE ' + where; 248 | 249 | return this; 250 | }; 251 | 252 | miniSQL.prototype.order = function(/*arguments*/) { 253 | 254 | var args = ''; 255 | if (arguments.length > 1) { 256 | for (var i = 0; i < arguments.length; i++) { 257 | args += arguments[i] + ', '; 258 | } 259 | args = args.substring(0, args.length - 2); 260 | } else { 261 | args = arguments[0]; 262 | } 263 | this.orderString = ' ORDER BY ' + args; 264 | return this; 265 | }; 266 | 267 | miniSQL.prototype.limit = function(limit) { 268 | this.limitString = ' LIMIT ' + limit; 269 | return this; 270 | }; 271 | 272 | miniSQL.prototype.offset = function(offset) { 273 | this.offsetString = ' OFFSET ' + offset; 274 | return this; 275 | }; 276 | 277 | miniSQL.prototype.group = function(group) { 278 | this.groupString = 'GROUP BY ' + group; 279 | return this; 280 | }; 281 | 282 | miniSQL.prototype.first = function(limit) { 283 | limit = limit || 1; 284 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';'; 285 | this.prevFunc = 'FIRST'; 286 | return this; 287 | }; 288 | 289 | miniSQL.prototype.last = function(limit) { 290 | limit = limit || 1; 291 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';'; 292 | this.prevFunc = 'LAST'; 293 | return this; 294 | }; 295 | 296 | miniSQL.prototype.take = function(limit) { 297 | limit = limit || 1; 298 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';'; 299 | this.prevFunc = 'TAKE'; 300 | return this; 301 | }; 302 | 303 | miniSQL.prototype.clearAll = function() { 304 | this.inputString = ''; 305 | this.inputString2 = ''; 306 | this.autoSelectData = ''; 307 | this.autoSelectInput = ''; 308 | 309 | // statement starters 310 | this.selectString = ''; 311 | this.updateString = ''; 312 | this.deleteString = ''; 313 | 314 | // chaining statements 315 | this.joinString = ''; 316 | this.whereString = ''; 317 | this.clientWhereString = ''; 318 | this.serverWhereString = ''; 319 | 320 | // caboose statements 321 | this.orderString = ''; 322 | this.limitString = ''; 323 | this.offsetString = ''; 324 | this.groupString = ''; 325 | this.havingString = ''; 326 | 327 | this.dataArray = []; 328 | this.dataArray2 = []; 329 | this.server = null; 330 | 331 | // error logging 332 | this.prevFunc = ''; 333 | }; 334 | 335 | miniSQL.prototype.fetch = function(server) { 336 | 337 | this.reactiveData.depend(); 338 | 339 | var dataArray = this.dataArray; 340 | var starter = this.updateString || this.deleteString || this.selectString; 341 | 342 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.clientWhereString + this.orderString + this.limitString + 343 | this.offsetString + this.groupString + this.havingString + ';'; 344 | 345 | 346 | var result = alasql(input, dataArray); 347 | 348 | var name = this.table + 'fetch'; 349 | if (server === "server") { 350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + this.orderString + this.limitString + 351 | this.offsetString + this.groupString + this.havingString + ';'; 352 | Meteor.call(this.fetchMethod, input, dataArray); 353 | } 354 | this.clearAll(); 355 | return result; 356 | }; 357 | 358 | miniSQL.prototype.save = function(client) { 359 | 360 | var dataArray = this.dataArray; 361 | var dataArray2 = this.dataArray2; 362 | var starter = this.updateString || this.deleteString || this.selectString; 363 | var input = this.inputString2.length > 0 ? this.inputString2 : starter + this.joinString + this.clientWhereString + ';'; 364 | 365 | var result = alasql(input, dataArray2); 366 | // postgres 367 | var name = this.table + 'save'; 368 | if (client !== "client") { 369 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + ';'; 370 | this.unvalidated = true; 371 | Meteor.call(this.saveMethod, input, dataArray); 372 | } 373 | this.reactiveData.changed(); 374 | 375 | this.clearAll(); 376 | return result; 377 | }; -------------------------------------------------------------------------------- /packages/meteor-postgres/minisql/minisql_tests.js: -------------------------------------------------------------------------------- 1 | var MiniSqlStub = function(name) { 2 | var stub = miniSQL(); 3 | stub.table = name; 4 | stub.conString = 'postgres://postgres:1234@localhost/postgres'; 5 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub)); 6 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub)); 7 | return stub; 8 | }; 9 | 10 | Tinytest.add('miniSQL - test - basic', function(test) { 11 | //TODO 12 | }); -------------------------------------------------------------------------------- /packages/meteor-postgres/package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | name: 'meteorsteam:meteor-postgres', 3 | version: '0.1.0', 4 | // Brief, one-line summary of the package. 5 | summary: 'PostgreSQL support for Meteor', 6 | // URL to the Git repository containing the source code for this package. 7 | git: 'https://github.com/meteor-stream/meteor-postgres', 8 | // By default, Meteor will default to using README.md for documentation. 9 | // To avoid submitting documentation, set this field to null. 10 | documentation: 'README.md' 11 | }); 12 | 13 | Npm.depends({ 14 | 'pg': '4.3.0' 15 | }); 16 | 17 | Package.onUse(function (api) { 18 | // The order these files are imported is very important 19 | api.versionsFrom('1.1.0.1'); 20 | api.use('underscore'); 21 | api.use('tracker'); 22 | api.use('ddp'); 23 | 24 | // minisql 25 | api.addFiles(['minisql/alasql.js', 'minisql/alasql.js.map', 'minisql/minisql.js'], 'client'); 26 | api.export('miniSQL', 'client'); 27 | 28 | api.addFiles('postgres/serversql.js', 'server'); 29 | api.export('ActiveRecord', 'server'); 30 | 31 | api.addFiles('collection/collection.js'); 32 | api.export('SQL'); 33 | 34 | }); 35 | 36 | Package.onTest(function (api) { 37 | api.versionsFrom('1.1'); 38 | api.use(['spacebars', 'tinytest', 'test-helpers', 'underscore', 'tracker', 'ddp']); 39 | api.addFiles('postgres/serversql.js', 'server'); 40 | api.export('ActiveRecord', 'server'); 41 | api.addFiles('collection/collection.js', ['server', 'client']); 42 | api.export('SQL', ['server', 'client']); 43 | api.addFiles('collection/collection_tests.js'); 44 | api.addFiles('postgres/sqlserver_tests.js', 'server'); 45 | }); 46 | 47 | -------------------------------------------------------------------------------- /packages/meteor-postgres/postgres/serversql.js: -------------------------------------------------------------------------------- 1 | pg = Npm.require('pg'); // Node-Postgres 2 | var clientHolder = {}; 3 | 4 | ActiveRecord = function (Collection) { 5 | 6 | Collection = Collection || Object.create(ActiveRecord.prototype); 7 | // initialize class 8 | Collection.table = Collection.tableName; 9 | 10 | // inputString used by queries, overrides other strings 11 | // includes: create table, create relationship, drop table, insert 12 | Collection.inputString = ''; 13 | Collection.autoSelectData = ''; 14 | Collection.autoSelectInput = ''; 15 | 16 | // statement starters 17 | Collection.selectString = ''; 18 | Collection.updateString = ''; 19 | Collection.deleteString = ''; 20 | 21 | // chaining statements 22 | Collection.joinString = ''; 23 | Collection.whereString = ''; 24 | 25 | // caboose statements 26 | Collection.orderString = ''; 27 | Collection.limitString = ''; 28 | Collection.offsetString = ''; 29 | Collection.groupString = ''; 30 | Collection.havingString = ''; 31 | 32 | Collection.dataArray = []; 33 | 34 | // error logging 35 | Collection.prevFunc = ''; 36 | return Collection; 37 | }; 38 | 39 | ActiveRecord.prototype._DataTypes = { 40 | $number: 'integer', 41 | $string: 'varchar(255)', 42 | $json: 'json', 43 | $datetime: 'date', 44 | $float: 'decimal', 45 | $seq: 'serial', 46 | $bool: 'boolean' 47 | }; 48 | 49 | ActiveRecord.prototype._TableConstraints = { 50 | $unique: 'unique', 51 | $check: 'check ', // value 52 | $exclude: 'exclude', 53 | $notnull: 'not null', 54 | $default: 'default ', // value 55 | $primary: 'primary key' 56 | }; 57 | 58 | // Parameters: tableObj (req) 59 | // SQL: CREATE TABLE field data type constraint 60 | // Special: Function is required for all SQL collections 61 | // QUERY/INPUT STRING/MUST USE PRESCRIBED DATA TYPES & TABLE CONSTRAINTS 62 | ActiveRecord.prototype.createTable = function (tableObj) { 63 | 64 | var startString = 'CREATE TABLE ' + this.table + ' ('; 65 | var item, subKey, valOperator, inputString = ''; 66 | 67 | for (var key in tableObj) { 68 | inputString += key + ' '; 69 | inputString += this._DataTypes[tableObj[key][0]]; 70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) { 71 | for (var i = 1, count = tableObj[key].length; i < count; i++) { 72 | item = tableObj[key][i]; 73 | if (typeof item === 'object') { 74 | subKey = Object.keys(item); 75 | valOperator = this._TableConstraints[subKey]; 76 | inputString += ' ' + valOperator + item[subKey]; 77 | } else { 78 | inputString += ' ' + this._TableConstraints[item]; 79 | } 80 | } 81 | } 82 | inputString += ', '; 83 | } 84 | // check to see if id already provided 85 | if (inputString.indexOf('id') === -1) { 86 | startString += 'id serial primary key,'; 87 | } 88 | 89 | this.inputString = startString + inputString + " createdat TIMESTAMP default now()); " + 90 | "CREATE OR REPLACE FUNCTION notify_trigger_" + this.table + "() RETURNS trigger AS $$" + 91 | "BEGIN" + 92 | " IF (TG_OP = 'DELETE') THEN " + 93 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || OLD.id || '}, { operation: " + 94 | "\"' || TG_OP || '\"}]');" + 95 | "RETURN old;" + 96 | "ELSIF (TG_OP = 'INSERT') THEN " + 97 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " + 98 | "\"' || TG_OP || '\"}]');" + 99 | "RETURN new; " + 100 | "ELSIF (TG_OP = 'UPDATE') THEN " + 101 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " + 102 | "\"' || TG_OP || '\"}]');" + 103 | "RETURN new; " + 104 | "END IF; " + 105 | "END; " + 106 | "$$ LANGUAGE plpgsql; " + 107 | "CREATE TRIGGER watched_table_trigger AFTER INSERT OR DELETE OR UPDATE ON " + this.table + 108 | " FOR EACH ROW EXECUTE PROCEDURE notify_trigger_" + this.table + "();"; 109 | 110 | this.prevFunc = 'CREATE TABLE'; 111 | return this; 112 | }; 113 | 114 | // Parameters: none 115 | // SQL: DROP TABLE table 116 | // Special: Deletes cascade 117 | // QUERY/INPUT STRING 118 | ActiveRecord.prototype.dropTable = function () { 119 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE; DROP FUNCTION IF EXISTS notify_trigger_' + this.table + '() CASCADE;'; 120 | this.prevFunc = 'DROP TABLE'; 121 | return this; 122 | }; 123 | 124 | // Parameters: inserts object (req) 125 | // SQL: INSERT INTO table (fields) VALUES (values) 126 | // Special: 127 | // QUERY/INPUT STRING & DATA ARRAY 128 | ActiveRecord.prototype.insert = function (inserts) { 129 | var valueString = ') VALUES (', keys = Object.keys(inserts); 130 | var insertString = 'INSERT INTO ' + this.table + ' ('; 131 | this.dataArray = []; 132 | // iterate through array arguments to populate input string parts 133 | for (var i = 0, count = keys.length; i < count;) { 134 | insertString += keys[i] + ', '; 135 | this.dataArray.push(inserts[keys[i]]); 136 | valueString += '$' + (++i) + ', '; 137 | } 138 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');'; 139 | this.prevFunc = 'INSERT'; 140 | return this; 141 | }; 142 | 143 | // Parameters: updates object (req) 144 | // SQL: UPDATE table SET (fields) = (values) 145 | // Special: 146 | // STATEMENT STARTER/UPDATE STRING 147 | ActiveRecord.prototype.update = function (updates) { 148 | var updateField = '(', updateValue = '(', keys = Object.keys(updates); 149 | if (keys.length > 1) { 150 | for (var i = 0, count = keys.length - 1; i < count; i++) { 151 | updateField += keys[i] + ', '; 152 | updateValue += "'" + updates[keys[i]] + "', "; 153 | } 154 | updateField += keys[keys.length - 1]; 155 | updateValue += "'" + updates[keys[keys.length - 1]] + "'"; 156 | } else { 157 | updateField += keys[0]; 158 | updateValue += "'" + updates[keys[0]] + "'"; 159 | } 160 | this.updateString = 'UPDATE ' + this.table + ' SET ' + updateField + ') = ' + updateValue + ')'; 161 | this.prevFunc = 'UPDATE'; 162 | return this; 163 | }; 164 | 165 | // Parameters: none 166 | // SQL: DELETE FROM table 167 | // Special: May be chained with where, otherwise will remove all rows from table 168 | // STATEMENT STARTER/DELETE STRING 169 | ActiveRecord.prototype.remove = function () { 170 | this.deleteString = 'DELETE FROM ' + this.table; 171 | this.prevFunc = 'DELETE'; 172 | return this; 173 | }; 174 | 175 | // Parameters: fields (arguments, optional) 176 | // SQL: SELECT fields FROM table, SELECT * FROM table 177 | // Special: May pass table, distinct, field to obtain a single record per unique value 178 | // STATEMENT STARTER/SELECT STRING 179 | ActiveRecord.prototype.select = function (/*arguments*/) { 180 | var args = ''; 181 | if (arguments.length >= 1) { 182 | for (var i = 0; i < arguments.length; i++) { 183 | if (arguments[i] === 'distinct') { 184 | args += 'DISTINCT '; 185 | } else { 186 | args += arguments[i] + ', '; 187 | } 188 | } 189 | args = args.substring(0, args.length - 2); 190 | } else { 191 | args += '*'; 192 | } 193 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " "; 194 | this.prevFunc = 'SELECT'; 195 | return this; 196 | }; 197 | 198 | // Parameters: id (optional) 199 | // SQL: SELECT * FROM table WHERE table.id = id LIMIT 1; SELECT * FROM table LIMIT 1; 200 | // Special: If no id is passed will return random 201 | // QUERY/INPUT STRING 202 | ActiveRecord.prototype.findOne = function (/*arguments*/) { 203 | if (arguments.length === 1) { 204 | var args = arguments[0]; 205 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;'; 206 | } else { 207 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1'; 208 | } 209 | this.prevFunc = 'FIND ONE'; 210 | return this; 211 | }; 212 | 213 | // Parameters: join type, fields, join table (all strings or all arrays) 214 | // SQL: JOIN joinTable ON field = field 215 | // Special: 216 | // STATEMENT/JOIN STRING 217 | ActiveRecord.prototype.join = function (joinType, fields, joinTable) { 218 | if (Array.isArray(joinType)) { 219 | for (var x = 0, count = fields.length; x < count; x++){ 220 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1]; 221 | } 222 | } else { 223 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable; 224 | } 225 | this.prevFunc = "JOIN"; 226 | return this; 227 | }; 228 | 229 | // Parameters: string with ?'s followed by an argument for each of the ?'s 230 | // SQL: WHERE field operator comparator, WHERE field1 operator1 comparator1 AND/OR field2 operator2 comparator2 231 | // Special: 232 | // db.select('students').where('age = ? and class = ? or name = ?','18','senior','kate').fetch(); 233 | // STATEMENT/WHERE STRING & DATA ARRAY 234 | ActiveRecord.prototype.where = function (/*Arguments*/) { 235 | this.dataArray = []; 236 | var where = '', redux, substring1, substring2; 237 | where += arguments[0]; 238 | for (var i = 1, count = arguments.length; i < count; i++) { 239 | if (Array.isArray(arguments[i])) { 240 | if (arguments[i].length === 0) { 241 | throw new Error('Invalid input: array is empty'); 242 | } 243 | redux = where.indexOf('?'); 244 | substring1 = where.substring(0, redux); 245 | substring2 = where.substring(redux + 1, where.length); 246 | where = substring1 + 'ANY($' + i + ')'+ substring2; 247 | this.dataArray.push(arguments[i]); 248 | } else { 249 | redux = where.indexOf('?'); 250 | substring1 = where.substring(0, redux); 251 | substring2 = where.substring(redux + 1, where.length); 252 | where = substring1 + '$' + i + substring2; 253 | this.dataArray.push(arguments[i]); 254 | } 255 | } 256 | this.whereString = ' WHERE ' + where; 257 | return this; 258 | }; 259 | 260 | // Parameters: order fields (req) 261 | // SQL: ORDER BY fields 262 | // Special: ASC is default 263 | // CABOOSE/ORDER STRING 264 | ActiveRecord.prototype.order = function (/*arguments*/) { 265 | var args = ''; 266 | if (arguments.length > 1) { 267 | for (var i = 0; i < arguments.length; i++) { 268 | args += arguments[i] + ', '; 269 | } 270 | args = args.substring(0, args.length - 2); 271 | } else { 272 | args = arguments[0]; 273 | } 274 | this.orderString = ' ORDER BY ' + args; 275 | return this; 276 | }; 277 | 278 | // Parameters: limit integer 279 | // SQL: LIMIT number 280 | // CABOOSE / LIMIT STRING 281 | ActiveRecord.prototype.limit = function (limit) { 282 | this.limitString = ' LIMIT ' + limit; 283 | return this; 284 | }; 285 | 286 | // Parameters: offset integer 287 | // SQL: OFFSET number 288 | // CABOOSE/OFFSET STRING 289 | ActiveRecord.prototype.offset = function (offset) { 290 | this.offsetString = ' OFFSET ' + offset; 291 | return this; 292 | }; 293 | 294 | // Parameters: group field 295 | // SQL: GROUP BY field 296 | // Special: 297 | // CABOOSE/GROUP BY STRING 298 | ActiveRecord.prototype.group = function (group) { 299 | this.groupString = 'GROUP BY ' + group; 300 | return this; 301 | }; 302 | 303 | // TODO: HAVING 304 | 305 | // Parameters: limit (optional, defaults to 1) 306 | // SQL: SELECT * FROM table ORDER BY table.id ASC LIMIT 1, SELECT * FROM table ORDER BY table.id ASC LIMIT limit 307 | // Special: Retrieves first item, overrides all other chainable functions 308 | // QUERY/INPUT STRING 309 | ActiveRecord.prototype.first = function (limit) { 310 | limit = limit || 1; 311 | this.clearAll(); 312 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';'; 313 | this.prevFunc = 'FIRST'; 314 | return this; 315 | }; 316 | 317 | // Parameters: limit (optional, defaults to 1) 318 | // SQL: SELECT * FROM table ORDER BY table.id DESC LIMIT 1, SELECT * FROM table ORDER BY table.id DESC LIMIT limit 319 | // Special: Retrieves first item, overrides all other chainable functions 320 | // QUERY/INPUT STRING 321 | ActiveRecord.prototype.last = function (limit) { 322 | limit = limit || 1; 323 | this.clearAll(); 324 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';'; 325 | this.prevFunc = 'LAST'; 326 | return this; 327 | }; 328 | 329 | // Parameters: limit (optional, defaults to 1) 330 | // SQL: SELECT * FROM table LIMIT 1, SELECT * FROM table LIMIT limit 331 | // Special: Retrieves a record without ordering, overrides all other chainable functions 332 | // QUERY/INPUT STRING 333 | ActiveRecord.prototype.take = function (limit) { 334 | limit = limit || 1; 335 | this.clearAll(); 336 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';'; 337 | this.prevFunc = 'TAKE'; 338 | return this; 339 | }; 340 | 341 | // Data function that retrieves data from database 342 | ActiveRecord.prototype.fetch = function (input, data, cb) { 343 | var table = this.table; 344 | var dataArray = data || this.dataArray; 345 | var prevFunc = this.prevFunc; 346 | 347 | var starter = this.updateString || this.deleteString || this.selectString; 348 | 349 | if (!input) { 350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString + 351 | this.offsetString + this.groupString + this.havingString + ';'; 352 | } 353 | 354 | //cb = cb || function(prevFunc, table, results) {return console.log("results in " + prevFunc + ' ' + table, results.rows)}; 355 | // console.log('FETCH:', input, dataArray); 356 | pg.connect(process.env.POSTGRES, function (err, client, done) { 357 | if (err) { 358 | console.log(err, "in " + prevFunc + ' ' + table); 359 | } 360 | client.query(input, dataArray, function (error, results) { 361 | if (cb) { cb(error, results); } 362 | done(); 363 | }); 364 | }); 365 | this.clearAll(); 366 | }; 367 | 368 | // Data function that saves information to database 369 | ActiveRecord.prototype.save = function (input, data, cb) { 370 | 371 | var table = this.table; 372 | var dataArray = data || this.dataArray; 373 | var prevFunc = this.prevFunc; 374 | 375 | var starter = this.updateString || this.deleteString || this.selectString; 376 | 377 | if (!input) { 378 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + ';'; 379 | } 380 | 381 | // console.log('SAVE:', input, dataArray); 382 | pg.connect(process.env.POSTGRES, function (err, client, done) { 383 | if (err) { 384 | console.log(err, "in " + prevFunc + ' ' + table); 385 | } 386 | client.query(input, dataArray, function (error, results) { 387 | if (cb) { cb(error, results); } 388 | }); 389 | done(); 390 | }); 391 | this.clearAll(); 392 | }; 393 | 394 | // Data function that clears all strings after a fetch or save 395 | ActiveRecord.prototype.clearAll = function() { 396 | this.inputString = ''; 397 | this.autoSelectData = ''; 398 | this.autoSelectInput = ''; 399 | 400 | // statement starters 401 | this.selectString = ''; 402 | this.updateString = ''; 403 | this.deleteString = ''; 404 | 405 | // chaining statements 406 | this.joinString = ''; 407 | this.whereString = ''; 408 | 409 | // caboose statements 410 | this.orderString = ''; 411 | this.limitString = ''; 412 | this.offsetString = ''; 413 | this.groupString = ''; 414 | this.havingString = ''; 415 | 416 | this.dataArray = []; 417 | 418 | // error logging 419 | this.prevFunc = ''; 420 | }; 421 | 422 | // Parameters: table (req), relationship type (req) 423 | // SQL: 424 | // QUERY/INPUT STATEMENT 425 | ActiveRecord.prototype.createRelationship = function(relTable, relationship){ 426 | if (relationship === "$onetomany"){ 427 | this.inputString = "ALTER TABLE " + this.table + " ADD " + relTable + 428 | "id INTEGER references " + relTable + "(id) ON DELETE CASCADE;"; 429 | } 430 | else { 431 | this.inputString = "CREATE TABLE IF NOT EXISTS" + 432 | this.table + relTable + " (" + this.table + "id integer references " + this.table + "(id) ON DELETE CASCADE, " + 433 | relTable + "id integer references " + relTable + "(id) ON DELETE CASCADE, " + 434 | "PRIMARY KEY(" + this.table + "id, " + relTable + "id)); "; 435 | } 436 | return this; 437 | }; 438 | 439 | ActiveRecord.prototype.returnSql = function(){ 440 | var table = this.table; 441 | var dataArray = this.dataArray; 442 | var prevFunc = this.prevFunc; 443 | 444 | var starter = this.updateString || this.deleteString || this.selectString; 445 | 446 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString + 447 | this.offsetString + this.groupString + this.havingString + ';'; 448 | 449 | return input; 450 | }; 451 | 452 | ActiveRecord.prototype.autoSelect = function(sub) { 453 | 454 | // We need a dedicated client to watch for changes on each table. We store these clients in 455 | // our clientHolder and only create a new one if one does not already exist 456 | var conString = process.env.POSTGRES; 457 | var table = this.table; 458 | var prevFunc = this.prevFunc; 459 | var newWhere = this.whereString; 460 | var newSelect = newSelect || this.selectString; 461 | var newJoin = newJoin || this.joinString; 462 | 463 | this.autoSelectInput = this.autoSelectInput !== "" ? this.autoSelectInput : this.selectString + this.joinString + newWhere + this.orderString + this.limitString + ';'; 464 | this.autoSelectData = this.autoSelectData !== "" ? this.autoSelectData : this.dataArray; 465 | var value = this.autoSelectInput; 466 | this.clearAll(); 467 | 468 | 469 | var loadAutoSelectClient = function(name, cb){ 470 | // Function to load a new client, store it, and then send it to the function to add the watcher 471 | var context = this; 472 | var client = new pg.Client(process.env.POSTGRES); 473 | client.connect(); 474 | cb(client); 475 | }; 476 | 477 | var autoSelectHelper = function(client1){ 478 | // Selecting all from the table 479 | client1.query(value, function(error, results) { 480 | if (error) { 481 | console.log(error, "in autoSelect top") 482 | } else { 483 | sub._session.send({ 484 | msg: 'added', 485 | collection: sub._name, 486 | id: sub._subscriptionId, 487 | fields: { 488 | reset: false, 489 | results: results.rows 490 | } 491 | }); 492 | } 493 | }); 494 | // Adding notification triggers 495 | var query = client1.query("LISTEN notify_trigger_" + table); 496 | client1.on('notification', function(msg) { 497 | var returnMsg = eval("(" + msg.payload + ")"); 498 | var k = sub._name; 499 | if (returnMsg[1].operation === "DELETE") { 500 | var tableId = parseInt(returnMsg[0][k]); 501 | sub._session.send({ 502 | msg: 'changed', 503 | collection: sub._name, 504 | id: sub._subscriptionId, 505 | index: tableId, 506 | fields: { 507 | removed: true, 508 | reset: false, 509 | tableId:tableId 510 | } 511 | }); 512 | } 513 | else if (returnMsg[1].operation === "UPDATE") { 514 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table]; 515 | pg.connect(process.env.POSTGRES, function (err, client, done) { 516 | if (err) { 517 | console.log(err, "in " + prevFunc + ' ' + table); 518 | } 519 | client.query(selectString, this.autoSelectData, function(error, results) { 520 | if (error) { 521 | console.log(error, "in autoSelect update"); 522 | } else { 523 | done(); 524 | sub._session.send({ 525 | msg: 'changed', 526 | collection: sub._name, 527 | id: sub._subscriptionId, 528 | index: tableId, 529 | fields: { 530 | modified: true, 531 | removed: false, 532 | reset: false, 533 | results: results.rows[0] 534 | } 535 | }); 536 | } 537 | }); 538 | }); 539 | } 540 | else if (returnMsg[1].operation === "INSERT") { 541 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table]; 542 | pg.connect(process.env.POSTGRES, function (err, client, done) { 543 | if (err) { 544 | console.log(err, "in " + prevFunc + ' ' + table); 545 | } 546 | client.query(selectString, this.autoSelectData, function(error, results) { 547 | if (error) { 548 | console.log(selectString); 549 | console.log(error, "in autoSelect insert") 550 | } else { 551 | done(); 552 | sub._session.send({ 553 | msg: 'changed', 554 | collection: sub._name, 555 | id: sub._subscriptionId, 556 | fields: { 557 | removed: false, 558 | reset: false, 559 | results: results.rows[0] 560 | } 561 | }); 562 | } 563 | }); 564 | }); 565 | } 566 | }); 567 | }; 568 | 569 | // Checking to see if this table already has a dedicated client before adding the listener 570 | if(clientHolder[table]){ 571 | autoSelectHelper(clientHolder[table]); 572 | } else{ 573 | loadAutoSelectClient(table, autoSelectHelper); 574 | } 575 | 576 | }; 577 | -------------------------------------------------------------------------------- /packages/meteor-postgres/postgres/sqlserver_tests.js: -------------------------------------------------------------------------------- 1 | // Currently all the tests based on ActiveRecord are running synchronously 2 | // Making test Stub using decorator 3 | var ActiveRecordStub = function(name) { 4 | var stub = ActiveRecord(); 5 | stub.table = name; 6 | stub.conString = 'postgres://postgres:1234@localhost/postgres'; 7 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub)); 8 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub)); 9 | return stub; 10 | }; 11 | 12 | /** 13 | * Simple table test 14 | */ 15 | var testTasksTable = { 16 | text: ['$string', '$notnull'] 17 | }; 18 | 19 | var testUserTable = { 20 | username: ['$string', '$notnull'], 21 | age: ['$number'] 22 | }; 23 | 24 | if (Meteor.isServer) { 25 | var testTasks = ActiveRecordStub('testTasks'); 26 | testTasks.dropTable().wrapSave(null, null); 27 | testTasks.createTable(testTasksTable).wrapSave(null, null); 28 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null); 29 | testTasks.insert({ text: 'testing2' }).wrapSave(null, null); 30 | testTasks.insert({ text: 'testing3' }).wrapSave(null, null); 31 | for ( var i = 0; i < 5; i++) { 32 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null); 33 | } 34 | 35 | var testUser = ActiveRecordStub('testUser'); 36 | testUser.dropTable().wrapSave(null, null); 37 | testUser.createTable(testUserTable).wrapSave(null, null); 38 | for (var i = 0; i < 3; i++) { 39 | testUser.insert({ username: 'eddie' + i, age: 2 * i }).wrapSave(null, null); 40 | testUser.insert({ username: 'paulo', age: 27}).wrapSave(null, null); 41 | } 42 | 43 | //Should test the operation defined in the ActiveRecord and return result successfully 44 | Tinytest.addAsync('activerecord - basic - success', function(test, onComplete) { 45 | var findOneResult1 = testTasks.findOne().wrapFetch(null, null); 46 | var findOneResult2 = testTasks.findOne(1).wrapFetch(null, null); 47 | test.equal(typeof findOneResult1.rows[0], 'object'); 48 | test.equal(findOneResult1.rows.length, 1); 49 | test.equal(findOneResult1.rows[0].text, 'testing1'); 50 | test.equal(typeof findOneResult2.rows[0], 'object'); 51 | test.equal(findOneResult2.rows.length, 1); 52 | test.equal(findOneResult2.rows[0].text, 'testing1'); 53 | 54 | //select 55 | var result = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 56 | //select + limit 57 | var result2 = testTasks.select().where('text = ?', 'testing1').limit(3).wrapFetch(null, null); 58 | //select + limit + offset 59 | var result3 = testTasks.select().where('text = ?', 'testing1').limit(3).offset(2).wrapFetch(null, null); 60 | //select + offset 61 | var result4 = testTasks.select().where('text = ?', 'testing1').offset(2).wrapFetch(null, null); 62 | var result5 = testTasks.select().where('text = ?', 'testing1').offset(6).wrapFetch(null, null); 63 | var result6 = testTasks.select().where('text = ?', 'testing1').offset(8).wrapFetch(null, null); 64 | //order default and DESC/ASC 65 | var result7 = testTasks.select().order('text').wrapFetch(null, null); 66 | var result8 = testTasks.select().order('text ASC').wrapFetch(null, null); 67 | var result9 = testTasks.select().order('text DESC').wrapFetch(null, null); 68 | //chaining order 69 | var result10 = testTasks.select().where('text = ?', 'testing1').order('id DESC').offset(2).limit(3).wrapFetch(null, null); 70 | var result11 = testTasks.select().where('text = ?', 'testing1').offset(2).order('id DESC').limit(3).wrapFetch(null, null); 71 | 72 | test.equal(typeof result.rows, 'object'); 73 | test.equal(result.rows.length, 6); 74 | _.each(result.rows, function(item) { 75 | test.equal(item.text, 'testing1'); 76 | }); 77 | test.equal(result2.rows.length, 3); 78 | _.each(result2.rows, function(item) { 79 | test.equal(item.text, 'testing1'); 80 | }); 81 | test.equal(result3.rows.length, 3); 82 | _.each(result3.rows, function(item) { 83 | test.equal(item.text, 'testing1'); 84 | }); 85 | test.equal(result4.rows.length, 4); 86 | _.each(result4.rows, function(item) { 87 | test.equal(item.text, 'testing1'); 88 | }); 89 | test.equal(result5.rows.length, 0); 90 | test.equal(result6.rows.length, 0); 91 | test.equal(result7.rows, result8.rows); 92 | test.equal(result7.rows[7], result9.rows[0]); 93 | test.equal(result10.rows, result11.rows); 94 | 95 | // Non-overreiden first, last, take 96 | var result1 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).first().wrapFetch(null, null); 97 | var result2 = testTasks.select().first(2).wrapFetch(null, null); 98 | var result3 = testTasks.select().last(4).wrapFetch(null, null); 99 | var result4 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).last().wrapFetch(null, null); 100 | var result5 = testTasks.select().offset(2).order('id DESC').limit(3).take().wrapFetch(null, null); 101 | var result6 = testTasks.select().take().wrapSave(null, null); 102 | //should consider chainging order for first, last, take? 103 | test.equal(result1.rows[0], result2.rows[0]); 104 | test.equal(result3.rows[0], result4.rows[0]); 105 | test.equal(result3.rows[1].id, 7); 106 | test.equal(result5.rows, result6.rows); 107 | 108 | //update and remove 109 | // update coverage should take another args, currently just 1 arg 110 | // should better add the rule that forbid changes in id? 111 | var origin = testTasks.select().where('text = ?', 'testing1').wrapSave(null, null); 112 | testTasks.update({ text: 'testing1' }).where('text = ?', 'testing2').wrapSave(null, null); 113 | var result1 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 114 | test.equal(origin.rows.length + 1, result1.rows.length); 115 | testTasks.update( {text: 'testing3'} ).wrapSave(null, null); 116 | var result2 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 117 | var result3 = testTasks.select().where('text = ?', 'testing3').wrapFetch(null, null); 118 | test.equal(result2.rows.length, 0); 119 | test.equal(result3.rows.length, 8); 120 | 121 | testTasks.where('id = ?', '2').remove().wrapSave(null, null); 122 | var result1 = testTasks.select().wrapFetch(null, null); 123 | test.equal(result1.rows.length, 7); 124 | testTasks.remove().wrapSave(null, null); 125 | var result2 = testTasks.select().wrapFetch(null, null); 126 | test.equal(result2.rows.length, 0); 127 | 128 | // branch coverage TODO 129 | // select args not empty branch 130 | // not empty and no distinct 131 | // var result1 = testUser.select('testUser.username', 'testUser.age'). 132 | // not empty and has distinct 133 | 134 | // update args > 1 branch 135 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'notexist').wrapSave(null, null); 136 | var result1 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null); 137 | test.equal(result1.rows.length, 0); 138 | 139 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'paulo').wrapSave(null, null); 140 | var result2 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null); 141 | test.equal(result2.rows.length, 3); 142 | _.each(result2.rows, function(item) { 143 | test.equal(item.username, 'PaulOS'); 144 | test.equal(item.age, 100); 145 | }); 146 | 147 | onComplete(); 148 | }); 149 | 150 | //Should throw error for the test failed case 151 | Tinytest.addAsync('activerecord - basic - failure', function(test, onComplete) { 152 | // create already existed throw error 153 | test.throws(function() { 154 | testTasks.createTable(testTasks).wrapSave(null, null); 155 | }); 156 | // throw error is schema different 157 | test.throws(function() { 158 | testTasks.insert({ text: 'failure', username: 'eric'}).wrapSave(null, null); 159 | }); 160 | //update error 161 | test.throws(function() { 162 | testTasks.update( {username: 'kate'} ).where('text = ?', 'testing3').wrapSave(null, null); 163 | }); 164 | 165 | // How should update behavior for non-existed where? 166 | // test.throws(function() { 167 | // testTasks.update( {text: 'testing2'} ).where('text = ?', 'testing2').wrapSave(null, null); 168 | // }); 169 | // Should not throw error if drop an unexisted table 170 | 171 | try { 172 | var expectedError; 173 | testTasks.dropTable('notExistedTable').wrapSave(null, null); 174 | } catch(error) { 175 | expectedError = error; 176 | } 177 | test.isTrue(!expectedError); 178 | //findOne can only find id 179 | test.throws(function() { 180 | testTasks.findOne('testing1').wrapFetch(null, null); 181 | }); 182 | 183 | //Clear the table after use 184 | testTasks.dropTable().wrapSave(null, null); 185 | testUser.dropTable().wrapSave(null, null); 186 | onComplete(); 187 | }); 188 | 189 | //Complex table 190 | // Todo: createRelationShip 191 | // Join table test 192 | var testTree = ActiveRecordStub('testTree'); 193 | var testLocation = ActiveRecordStub('testLocation'); 194 | var testSpecies = ActiveRecordStub('testSpecies'); 195 | 196 | var testTreeTable = { 197 | id: ['$number', '$notnull'], 198 | treename: ['$string', '$notnull'], 199 | locationid: ['$number', '$notnull'], 200 | speciesid: ['$number', '$notnull'] 201 | }; 202 | 203 | var testLocationTable = { 204 | id: ['$number', '$notnull'], 205 | longitude: ['$float', '$notnull'], 206 | latitude: ['$float', '$notnull'] 207 | }; 208 | 209 | var testSpeciesTable = { 210 | id: ['$number', '$notnull'], 211 | species: ['$string', '$notnull'] 212 | }; 213 | 214 | testTree.dropTable().wrapSave(null, null); 215 | testLocation.dropTable().wrapSave(null, null); 216 | testSpecies.dropTable().wrapSave(null, null); 217 | 218 | var testTree = ActiveRecordStub('testTree'); 219 | var testLocation = ActiveRecordStub('testLocationTable'); 220 | var testSpecies = ActiveRecordStub('testSpeciesTable'); 221 | 222 | Tinytest.addAsync('activerecord - advanced - success', function(test, onComplete) { 223 | testTree.dropTable().wrapSave(null, null); 224 | testLocation.dropTable().wrapSave(null, null); 225 | testSpecies.dropTable().wrapSave(null, null); 226 | onComplete(); 227 | }); 228 | } 229 | 230 | // Connection test, should be added after the default connect string removed 231 | Meteor.isServer && Tinytest.add('activerecord - connection failure', 232 | function(test) { 233 | 234 | } 235 | ); 236 | 237 | -------------------------------------------------------------------------------- /simple-todos.css: -------------------------------------------------------------------------------- 1 | /* CSS declarations go here */ 2 | body { 3 | font-family: sans-serif; 4 | background-color: #315481; 5 | background-image: linear-gradient(to bottom, #315481, #918e82 100%); 6 | background-attachment: fixed; 7 | 8 | position: absolute; 9 | top: 0; 10 | bottom: 0; 11 | left: 0; 12 | right: 0; 13 | 14 | padding: 0; 15 | margin: 0; 16 | 17 | font-size: 14px; 18 | } 19 | 20 | .container { 21 | max-width: 600px; 22 | margin: 0 auto; 23 | min-height: 100%; 24 | background: white; 25 | } 26 | 27 | header { 28 | background: #d2edf4; 29 | background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%); 30 | padding: 20px 15px 15px 15px; 31 | position: relative; 32 | } 33 | 34 | #login-buttons { 35 | display: block; 36 | } 37 | 38 | h1 { 39 | font-size: 1.5em; 40 | margin: 0; 41 | margin-bottom: 10px; 42 | display: inline-block; 43 | margin-right: 1em; 44 | } 45 | 46 | form { 47 | margin-top: 10px; 48 | margin-bottom: -10px; 49 | position: relative; 50 | } 51 | 52 | .new-user input { 53 | box-sizing: border-box; 54 | padding: 10px 0; 55 | background: transparent; 56 | border: none; 57 | width: 100%; 58 | padding-right: 80px; 59 | font-size: 1em; 60 | } 61 | 62 | .new-user input:focus{ 63 | outline: 0; 64 | } 65 | 66 | .new-task input { 67 | box-sizing: border-box; 68 | padding: 10px 0; 69 | background: transparent; 70 | border: none; 71 | width: 100%; 72 | padding-right: 80px; 73 | font-size: 1em; 74 | } 75 | 76 | .new-task input:focus{ 77 | outline: 0; 78 | } 79 | 80 | ul { 81 | margin: 0; 82 | padding: 0; 83 | background: white; 84 | } 85 | 86 | .delete { 87 | float: right; 88 | font-weight: bold; 89 | background: none; 90 | font-size: 1em; 91 | border: none; 92 | position: relative; 93 | } 94 | 95 | li { 96 | position: relative; 97 | list-style: none; 98 | padding: 15px; 99 | border-bottom: #eee solid 1px; 100 | } 101 | 102 | li .text { 103 | margin-left: 10px; 104 | } 105 | 106 | li.checked { 107 | color: #888; 108 | } 109 | 110 | li.checked .text { 111 | text-decoration: line-through; 112 | } 113 | 114 | li.private { 115 | background: #eee; 116 | border-color: #ddd; 117 | } 118 | 119 | header .hide-completed { 120 | float: right; 121 | } 122 | 123 | .toggle-private { 124 | margin-left: 5px; 125 | } 126 | 127 | @media (max-width: 600px) { 128 | li { 129 | padding: 12px 15px; 130 | } 131 | 132 | .search { 133 | width: 150px; 134 | clear: both; 135 | } 136 | 137 | .new-task input { 138 | padding-bottom: 5px; 139 | } 140 | } -------------------------------------------------------------------------------- /simple-todos.html: -------------------------------------------------------------------------------- 1 | 2 | Todo List 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Todo List

11 |
12 | 13 | 15 |
16 |
17 | 18 | 25 |
26 |
27 | 28 | 33 |
34 | 35 | 36 | 37 | 46 | -------------------------------------------------------------------------------- /simple-todos.js: -------------------------------------------------------------------------------- 1 | // Defining 2 SQL collections. The additional paramater is the postgres connection string which will only run on the server 2 | tasks = new SQL.Collection('tasks'); 3 | username = new SQL.Collection('username'); 4 | 5 | if (Meteor.isClient) { 6 | var newUser = 'all'; 7 | var taskTable = { 8 | id: ['$number'], 9 | text: ['$string', '$notnull'], 10 | checked: ['$bool'], 11 | usernameid: ['$number'] 12 | }; 13 | 14 | tasks.createTable(taskTable); 15 | 16 | var usersTable = { 17 | id: ['$number'], 18 | name: ['$string', '$notnull'] 19 | }; 20 | username.createTable(usersTable); 21 | 22 | 23 | Template.body.helpers({ 24 | usernames: function () { 25 | return username.select() 26 | .fetch(); 27 | }, 28 | tasks: function () { 29 | if (newUser === 'all'){ 30 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name') 31 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]]) 32 | .fetch(); 33 | } 34 | else { 35 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name') 36 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]]) 37 | .where("name = ?", newUser) 38 | .fetch(); 39 | } 40 | } 41 | }); 42 | 43 | 44 | Template.body.events({ 45 | "submit .new-task": function (event) { 46 | if (event.target.category.value){ 47 | var user = username.select('id') 48 | .where("name = ?", event.target.category.value) 49 | .fetch(); 50 | user = user[0].id; 51 | var text = event.target.text.value; 52 | tasks.insert({ 53 | text:text, 54 | checked:false, 55 | usernameid: user 56 | }).save(); 57 | event.target.text.value = ""; 58 | } else{ 59 | alert("please add a user first"); 60 | } 61 | return false; 62 | }, 63 | "submit .new-user": function (event) { 64 | var text = event.target.text.value; 65 | username.insert({ 66 | name:text 67 | }).save(); 68 | event.target.text.value = ""; 69 | 70 | return false; 71 | }, 72 | "click .toggle-checked": function () { 73 | tasks.update({id: this.id, "checked": !this.checked}) 74 | .where("id = ?", this.id) 75 | .save(); 76 | }, 77 | "click .delete": function () { 78 | tasks.remove() 79 | .where("id = ?", this.id) 80 | .save(); 81 | }, 82 | "change .catselect": function(event){ 83 | newUser = event.target.value; 84 | tasks.reactiveData.changed(); 85 | } 86 | }); 87 | } 88 | 89 | if (Meteor.isServer) { 90 | //tasks.createTable({text: ['$string'], checked: ["$bool", {$default: false}]}).save(); 91 | //username.createTable({name: ['$string', '$unique']}).save(); 92 | //tasks.createRelationship('username', '$onetomany').save(); 93 | 94 | 95 | username.insert({name:'all'}).save(); 96 | // Publishing the collections 97 | tasks.publish('tasks', function(){ 98 | return tasks.select('tasks.id as id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.id as usernameid', 'username.name') 99 | .join(['INNER JOIN'], ["usernameid"], [["username", 'id']]) 100 | .order('createdat DESC') 101 | .limit(100); 102 | }); 103 | 104 | username.publish('username', function(){ 105 | return username.select('id', 'name') 106 | .order('createdat DESC') 107 | .limit(100); 108 | }); 109 | } 110 | --------------------------------------------------------------------------------