From b34fae53a59010666e0fc5d9d93a34f1278f1e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 4 May 2018 11:04:07 +0200 Subject: [PATCH 01/43] support get without a login - !! insert update remove need a token --- src/livingSDK.js | 9 ++++++--- test/node_test.js | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/livingSDK.js b/src/livingSDK.js index 2c3922e..8d4411c 100644 --- a/src/livingSDK.js +++ b/src/livingSDK.js @@ -47,7 +47,7 @@ */ login() { if (!this._options.loginRequired) { - return undefined; + return Promise.resolve(undefined); } return new Promise((resolve, reject) => { @@ -111,11 +111,14 @@ "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), "port": 443, "path": `/gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : '' }`, - "headers": { + "headers": auth_token !== undefined ? { 'Accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + 'X-La-Auth-Token': auth_token + } : { + 'Accept': 'application/la-ul4on' } }; + let req = http.request(options, (res) => { let chunks = []; res.on('data', function (chunk) { diff --git a/test/node_test.js b/test/node_test.js index 85d9733..f4160cc 100644 --- a/test/node_test.js +++ b/test/node_test.js @@ -2,6 +2,9 @@ let livingSDK; let config; let defaultSettings = { } +let defaultNoLogin = { + loginRequired: false +} if (typeof module === 'object' && module.exports){ livingSDK = require('../src/livingSDK'); config = require('./config'); @@ -59,4 +62,13 @@ describe ('login', () => { return last.delete(); }) }) +}); +describe ('without login', () => { + it ('get function', () => { + let lsdk = new livingSDK(defaultNoLogin); + lsdk.session = (function() {return new Promise ((resolve, reject) => {resolve(123)})})(); + return lsdk.get(config.appId).then((LAAPI) => { + return LAAPI + }); + }); }); \ No newline at end of file From 1d3df6f05562f9d9dcbe2fa317aa38cb4f110f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 4 May 2018 11:32:12 +0200 Subject: [PATCH 02/43] ts setup, removed docs --- .gitignore | 2 +- .vscode/settings.json | 3 + dist/app/app.component.js | 23 + dist/app/app.module.js | 40 + .../src/app/main.ts => dist/app/main.js | 2 - dist/livingSDK.js | 356 + dist/pages/home/home.js | 43 + dist/providers/la/la.js | 28 + docs/JavascriptSDK.rst | 176 - docs/demos/App_erstellen_Ionic/README.md | 364 - .../src/assets/Screenshot_20171208_154847.png | Bin 114191 -> 0 bytes .../src/assets/Screenshot_20171208_155022.png | Bin 115122 -> 0 bytes .../src/assets/Screenshot_20171208_155049.png | Bin 109768 -> 0 bytes .../src/assets/Screenshot_20171208_155142.png | Bin 109124 -> 0 bytes .../src/assets/Screenshot_20171208_155205.png | Bin 76119 -> 0 bytes .../src/assets/Screenshot_20171208_155227.png | Bin 86859 -> 0 bytes .../src/assets/Screenshot_20171208_155323.png | Bin 120467 -> 0 bytes .../src/assets/Screenshot_20171208_155356.png | Bin 152338 -> 0 bytes .../src/assets/Screenshot_20171208_155521.png | Bin 152338 -> 0 bytes .../src/assets/Screenshot_20171215_120146.png | Bin 6479 -> 0 bytes .../src/assets/mobile_screenshot.png | Bin 78553 -> 0 bytes .../src/kaffeeapp_ionic/.editorconfig | 17 - .../src/kaffeeapp_ionic/.gitignore | 4 - .../src/kaffeeapp_ionic/config.xml | 84 - .../src/kaffeeapp_ionic/ionic.config.json | 8 - .../src/kaffeeapp_ionic/package.json | 38 - .../kaffeeapp_ionic/src/app/app.component.ts | 22 - .../src/kaffeeapp_ionic/src/app/app.html | 1 - .../src/kaffeeapp_ionic/src/app/app.module.ts | 32 - .../src/kaffeeapp_ionic/src/app/app.scss | 16 - .../src/assets/icon/favicon.ico | Bin 1981 -> 0 bytes .../kaffeeapp_ionic/src/assets/imgs/logo.png | Bin 39757 -> 0 bytes .../src/assets/scripts/src/livingSDK.js | 475 - .../assets/scripts/src/modules/livingapi.js | 916 -- .../src/assets/scripts/src/modules/ul4.js | 9049 ----------------- .../src/kaffeeapp_ionic/src/index.html | 59 - .../src/kaffeeapp_ionic/src/manifest.json | 13 - .../kaffeeapp_ionic/src/pages/home/home.html | 34 - .../kaffeeapp_ionic/src/pages/home/home.scss | 3 - .../kaffeeapp_ionic/src/pages/home/home.ts | 42 - .../kaffeeapp_ionic/src/providers/la/la.ts | 23 - .../src/kaffeeapp_ionic/src/service-worker.js | 31 - .../kaffeeapp_ionic/src/theme/variables.scss | 88 - .../src/kaffeeapp_ionic/tsconfig.json | 31 - .../src/kaffeeapp_ionic/tslint.json | 11 - docs/demos/Gruesse_nodejs/README.md | 78 - docs/demos/Gruesse_nodejs/src/index.js | 13 - package-lock.json | 790 ++ package.json | 16 +- shellscripts/build.sh | 2 + src/{livingSDK.js => livingSDK.ts} | 44 +- tsconfig.json | 57 + 52 files changed, 1370 insertions(+), 11664 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 dist/app/app.component.js create mode 100644 dist/app/app.module.js rename docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/main.ts => dist/app/main.js (98%) create mode 100644 dist/livingSDK.js create mode 100644 dist/pages/home/home.js create mode 100644 dist/providers/la/la.js delete mode 100644 docs/JavascriptSDK.rst delete mode 100644 docs/demos/App_erstellen_Ionic/README.md delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_154847.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155022.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155049.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155142.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155205.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155227.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155323.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155356.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155521.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171215_120146.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/assets/mobile_screenshot.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.editorconfig delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.gitignore delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/config.xml delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/ionic.config.json delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/package.json delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.component.ts delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.html delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.module.ts delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.scss delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/icon/favicon.ico delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/imgs/logo.png delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/livingSDK.js delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/livingapi.js delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/ul4.js delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/index.html delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/manifest.json delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.html delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.scss delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.ts delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/providers/la/la.ts delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/service-worker.js delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/theme/variables.scss delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tsconfig.json delete mode 100644 docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tslint.json delete mode 100644 docs/demos/Gruesse_nodejs/README.md delete mode 100644 docs/demos/Gruesse_nodejs/src/index.js create mode 100644 package-lock.json create mode 100644 shellscripts/build.sh rename src/{livingSDK.js => livingSDK.ts} (92%) create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index eb4ef50..802f3ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ node_modules test/config.js -package-lock.json Archiv.zip node.js +**/old_* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..af6434b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/dist/app/app.component.js b/dist/app/app.component.js new file mode 100644 index 0000000..2d9ac15 --- /dev/null +++ b/dist/app/app.component.js @@ -0,0 +1,23 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Component } from '@angular/core'; +import { HomePage } from '../pages/home/home'; +let MyApp = class MyApp { + constructor(platform, statusBar, splashScreen) { + this.rootPage = HomePage; + platform.ready().then(() => { + statusBar.styleDefault(); + splashScreen.hide(); + }); + } +}; +MyApp = __decorate([ + Component({ + templateUrl: 'app.html' + }) +], MyApp); +export { MyApp }; diff --git a/dist/app/app.module.js b/dist/app/app.module.js new file mode 100644 index 0000000..5b39cd9 --- /dev/null +++ b/dist/app/app.module.js @@ -0,0 +1,40 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { BrowserModule } from '@angular/platform-browser'; +import { ErrorHandler, NgModule } from '@angular/core'; +import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; +import { SplashScreen } from '@ionic-native/splash-screen'; +import { StatusBar } from '@ionic-native/status-bar'; +import { MyApp } from './app.component'; +import { HomePage } from '../pages/home/home'; +import { LaProvider } from '../providers/la/la'; +let AppModule = class AppModule { +}; +AppModule = __decorate([ + NgModule({ + declarations: [ + MyApp, + HomePage + ], + imports: [ + BrowserModule, + IonicModule.forRoot(MyApp) + ], + bootstrap: [IonicApp], + entryComponents: [ + MyApp, + HomePage + ], + providers: [ + StatusBar, + SplashScreen, + { provide: ErrorHandler, useClass: IonicErrorHandler }, + LaProvider + ] + }) +], AppModule); +export { AppModule }; diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/main.ts b/dist/app/main.js similarity index 98% rename from docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/main.ts rename to dist/app/main.js index 6af7a5b..5b2f55c 100644 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/main.ts +++ b/dist/app/main.js @@ -1,5 +1,3 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - import { AppModule } from './app.module'; - platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/dist/livingSDK.js b/dist/livingSDK.js new file mode 100644 index 0000000..e4d0806 --- /dev/null +++ b/dist/livingSDK.js @@ -0,0 +1,356 @@ +export default class livingSDK { + constructor(options = {}, username, password) { + this._password = password; + this._userName = username; + this._options = { + url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[livingSDK] You want to login without a username'); + } + this.session = this.login(); + } + login() { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); + } + return new Promise((resolve, reject) => { + if (commonjs) { + let options = { + "ecdhCurve": 'auto', + "method": "POST", + "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), + "port": 443, + "path": "/gateway/login", + "headers": { + "Content-Type": "application/json" + } + }; + let req = http.request(options, (res) => { + let chunks = []; + ; + if (res.statusCode !== 200) { + reject(new Error('Http Statuscode ' + res.statusCode)); + } + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + let body = Buffer.concat(chunks); + resolve(JSON.parse(body.toString()).auth_token); + }); + }); + req.write(JSON.stringify({ + username: this._userName, + password: this._password + })); + req.end(); + } + else { + $.ajax(`${this._options.url}gateway/login`, { + dataType: 'json', + data: JSON.stringify({ + 'username': this._userName, + 'password': this._password + }), + method: 'POST', + error: function (error) { + reject(error); + }, + success: function (body) { + resolve(body.auth_token); + } + }); + } + }); + } + get(appID, templateName) { + return new Promise((resolve, reject) => { + this.session.then((auth_token) => { + if (commonjs) { + let options = { + "ecdhCurve": 'auto', + "method": "GET", + "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), + "port": 443, + "path": `/gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : ''}`, + "headers": { + 'Accept': 'application/la-ul4on', + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + } + }; + let req = http.request(options, (res) => { + let chunks = []; + res.on('data', function (chunk) { + chunks.push(chunk); + }); + res.on('end', () => { + if (res.statusCode === 200) { + let body = Buffer.concat(chunks).toString(); + let dump; + try { + dump = ul4on.loads(body.toString()); + } + catch (err) { + reject(err); + return; + } + dump.get('globals').Login = this; + resolve(dump); + } + else if (res.statusCode === 403) { + this.session = this.login(); + console.log('token is not valid'); + resolve(this.get(appID, templateName)); + } + else { + reject(new Error('Http Statuscode ' + res.statusCode)); + } + }); + }); + req.end(); + } + else { + $.ajax(`${this._options.url}gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : ''}`, { + headers: { + 'Accept': 'application/la-ul4on', + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + }, + method: 'GET', + error: (error) => { + if (error.status === 403) { + this.session = this.login(); + console.log('token is not valid'); + resolve(this.get(appID, templateName)); + } + reject(error); + }, + success: (body) => { + let dump = ul4on.loads(body); + dump.get('globals').Login = this; + resolve(dump); + } + }); + } + }); + }); + } + _insert(app, values) { + return new Promise((resolve, reject) => { + this.session.then((auth_token) => { + let fields = {}; + for (let ident in values) { + if (!app.controls.has(ident)) { + reject(`insert() got an unexpected keyword argument ${ident}`); + } + fields[ident] = app.controls.get(ident).asjson(values[ident]); + } + let data = {}; + { + } + data.id = app.id; + data.data = [{ 'fields': fields }]; + if (commonjs) { + let options = { + "ecdhCurve": 'auto', + "method": "POST", + "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), + "port": 443, + "path": `/gateway/v1/appdd/${app.id}.json`, + "headers": { + "Content-Type": "application/json", + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + } + }; + let req = http.request(options, (res) => { + if (res.statusCode !== 200) { + reject(new Error('Http Statuscode ' + res.statusCode)); + } + let chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + if (res.statusCode !== 200) { + reject(res.statusCode); + return; + } + let body = Buffer.concat(chunks).toString(); + let returnObj = { + HTTPstatusCode: res.statusCode, + recordid: JSON.parse(body).id, + Record: livingApi.Record.create({ + id: JSON.parse(body).id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + resolve(returnObj); + }); + }); + req.write(JSON.stringify({ 'appdd': data })); + req.end(); + } + else { + $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { + method: 'post', + data: { 'appdd': JSON.stringify(data) }, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + }, + success: (body) => { + let returnObj = { + recordid: body.id, + Record: livingApi.Record.create({ + id: body.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + resolve(returnObj); + }, + error: (error) => { + reject(error); + } + }); + } + }); + }); + } + _update(record, values) { + return new Promise((resolve, reject) => { + this.session.then((auth_token) => { + let fields = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + reject(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; + } + let data = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + if (commonjs) { + let options = { + "ecdhCurve": 'auto', + "method": "POST", + "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), + "port": 443, + "path": `/gateway/v1/appdd/${app.id}.json`, + "headers": { + "Content-Type": "application/json", + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + } + }; + let req = http.request(options, (res) => { + if (res.statusCode !== 200) { + reject(new Error('Http Statuscode ' + res.statusCode)); + } + let chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + let body = Buffer.concat(chunks).toString(); + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.statusCode, + recordid: JSON.parse(body).id, + Record: record + }; + resolve(returnObj); + }); + }); + req.write(JSON.stringify({ 'appdd': data })); + req.end(); + } + else { + $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { + data: { 'appdd': JSON.stringify(data) }, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + }, + method: 'post', + success: (body) => { + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: 200, + recordid: body.id, + Record: record + }; + resolve(returnObj); + }, + error: (error) => { + reject(error); + } + }); + } + }); + }); + } + _delete(record) { + return new Promise((resolve, reject) => { + this.session.then((auth_token) => { + let app = record.app; + let recordId = record.id; + if (commonjs) { + let options = { + 'ecdhCurve': 'auto', + 'method': 'DELETE', + 'hostname': this.hostName, + 'port': 443, + 'path': `/gateway/v1/appdd/${app.id}/${recordId}.json`, + 'headers': { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + } + }; + let req = http.request(options, (res) => { + if (res.statusCode !== 200) { + reject(new Error('Http Statuscode ' + res.statusCode)); + } + let chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + if (res.statusCode === 200) + resolve(200); + }); + }); + req.end(); + } + else { + $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}/${recordId}.json`, { + method: 'delete', + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' + }, + success: () => { + resolve(200); + }, + error: () => { + reject(error); + } + }); + } + }); + }); + } +} +if (commonjs) { + module.exports = livingSDK; +} +else { + root.livingSDK = livingSDK; +} +(this); diff --git a/dist/pages/home/home.js b/dist/pages/home/home.js new file mode 100644 index 0000000..7c7feee --- /dev/null +++ b/dist/pages/home/home.js @@ -0,0 +1,43 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Component } from '@angular/core'; +let HomePage = class HomePage { + constructor(navCtrl, laProv) { + this.navCtrl = navCtrl; + this.laProv = laProv; + this.coffee = "Mocha"; + this.number = 1; + this.consumer = "Der Herr des Kaffees"; + } + changeNumber(diffrence) { + if ((this.number <= 1 && diffrence < 0) || (this.number >= 5 && diffrence > 0)) { + return; + } + this.number += diffrence; + } + add() { + console.log("add entry" + JSON.stringify({ + kaffeesorte: this.coffee, + runde: this.number, + mitarbeiter: this.consumer + })); + this.laProv.addCoffee({ + kaffeesorte: this.coffee, + runde: this.number.toString(), + mitarbeiter: this.consumer + }).then((res) => { + alert("erfolgreich einen Datensatz hinzugefügt"); + }); + } +}; +HomePage = __decorate([ + Component({ + selector: 'page-home', + templateUrl: 'home.html' + }) +], HomePage); +export { HomePage }; diff --git a/dist/providers/la/la.js b/dist/providers/la/la.js new file mode 100644 index 0000000..eb935c2 --- /dev/null +++ b/dist/providers/la/la.js @@ -0,0 +1,28 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { Injectable } from '@angular/core'; +let LaProvider = class LaProvider { + constructor() { + this.window = window; + } + addCoffee(input) { + return new Promise((resolve, reject) => { + let lsdk = new this.window.livingSDK({}, this.window.username, this.window.password); + lsdk.get("appid of your Livingapp").then((LAAPI) => { + let app = LAAPI.get('datasources').get('coffee').app; + app.insert(input).then((res) => { + console.log(res); + resolve(res); + }); + }); + }); + } +}; +LaProvider = __decorate([ + Injectable() +], LaProvider); +export { LaProvider }; diff --git a/docs/JavascriptSDK.rst b/docs/JavascriptSDK.rst deleted file mode 100644 index 62fed3c..0000000 --- a/docs/JavascriptSDK.rst +++ /dev/null @@ -1,176 +0,0 @@ -Javascript-SDK -============== - -Mit dem Javascript-SDK können sie mithilfe der Programmiersprache Javascript mit -LivingApps interagieren. - -Das SDK erlaubt Ihnen, die Daten die Sie in den Datenquellen für eines Ihrer -Anzeige-Templates konfiguriert haben, abzurufen, neue Datensätze anzulegen, -sowie existierende zu ändern und zu löschen. - -Die folgenden Beispiele wurde mit ``node.js`` Version 8.4 auf Ubuntu 16.04 -getestet. - - -Installation ------------- - -Das Javascript-SDK steht auf Github zur Verfügung und kann folgendermaßen -geklont werden: - -.. sourcecode:: bash - - $ git clone https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI - -Danach können die benötigten Packete installiert werden: - -.. sourcecode:: bash - - $ cd LivingApps.Javascript.LivingAPI - $ npm install - -Sollten Sie bereits ein Projekt mit Node.js haben, können Sie das Javascript-SDK -verwenden indem sie die benötigten Packete separat installieren: - -.. sourcecode:: bash - - $ npm install blueimp-md5 - $ npm install request - -und dann die Dateien aus dem `src`-Verzeichnis in Ihr Projekt-Verzeichnis -kopieren. -Sollten Sie allerdings das SDK im Client einsetzen müssen Sie jQuery -in ihr HTML einbinden. - -.. sourcecode:: HTML - - - - - - - -Einloggen ---------- - -Als erstes müssen die benötigten Module eingebunden werden (Clientseitig haben Sie das bereits schon im Codeblock darüber getan): - -.. sourcecode:: javascript - - let livingSDK = require('src/livapp'); - let ul4 = require('src/modules/ul4.js'); - -Nun können Sie ein ``livingSDK``-Objekt anlegen, und sich damit in LivingApps -einloggen: - -.. sourcecode:: javascript - - let loginOptions = [ - {}, // setzt URL automatisch - 'me@example.org', // Ihr Benutzername - 'password' // Ihr Passwort - ]; - let lsdk = livingSDK(...loginOptions); - - -Beispiele ---------- - -Das ``Globals``-Objekt und die Datenquellen auslesen: - -.. sourcecode:: javascript - - let loginOptions = [ - {}, // setzt URL automatisch - 'me@example.org', // Ihr Benutzername - 'password' // Ihr Passwort - ]; - let lsdk = livingSDK(...loginOptions); - let data = lsdk.get('59b02548af9e99d525d316b4'); // appid - return data.then((LAAPI) => { - let globals = LAAPI.get('globals'); - let datasources = LAAPI.get('datasources'); - // Das App-Objekt aus der Datenquelle holen - let app = datasources.get('persons').app; - console.log(ul4._repr(app)); - // out: - }) - -Einen Datensatz anlegen: - -.. sourcecode:: javascript - - let loginOptions = [ - {}, // setzt URL automatisch - 'me@example.org', // Ihr Benutzername - 'password' // Ihr Passwortf - ]; - let lsdk = livingSDK(...loginOptions); - let data = lsdk.get('59b02548af9e99d525d316b4'); // appid - return data.then((LAAPI) => { - let globals = LAAPI.get('globals'); - let datasources = LAAPI.get('datasources'); - // get app - let app = datasources.get('persons').app; - // set content of new Record - let newInsert = { - "text": "das ist ein Text", - date: new Date(Date.now()) - } - return app.insert(newInsert); - }) - -Einen Datensatz ändern: - -.. sourcecode:: javascript - - let loginOptions = [ - {}, // setzt URL automatisch - 'me@example.org', // Ihr Benutzername - 'password' // Ihr Passwort - ]; - let lsdk = livingSDK(...loginOptions); - let data = lsdk.get("59b02548af9e99d525d316b4"); - return data.then((LAAPI) => { - let globals = LAAPI.get('globals'); - let datasources = LAAPI.get('datasources'); - let app = datasources.get('test').app; - let r = app.records.values(); - let last; - let counter = 0; - // Letzten Datensatz holen - for (let d of r) { - last = d; - } - return last.update({ - text: "Neuer Text", - date: new Date(Date.now()) - }); - }) - -Einen Datensatz löschen: - -.. sourcecode:: javascript - - let loginOptions = [ - {}, // setzt URL automatisch - 'me@example.org', // Ihr Benutzername - 'password' // Ihr Passwort - ]; - let lsdk = livingSDK(...loginOptions); - let data = lsdk.get("59b02548af9e99d525d316b4"); - return data.then((LAAPI) => { - let globals = LAAPI.get('globals'); - let datasources = LAAPI.get('datasources'); - let app = datasources.get('test').app; - let r = app.records.values(); - let last; - // Letzten Datensatz holen - for (let d of r) { - last = d; - } - return last.delete(); - }) diff --git a/docs/demos/App_erstellen_Ionic/README.md b/docs/demos/App_erstellen_Ionic/README.md deleted file mode 100644 index 3abd33b..0000000 --- a/docs/demos/App_erstellen_Ionic/README.md +++ /dev/null @@ -1,364 +0,0 @@ -# Apps erstellen mit Ionic und Living-Apps - -Hmm, lecker dieser Mocha. - -Kaffee ist eine wichtige Resource in einem Softwareunternehmen, -deshalb verfolgen wir mithilfe einer Living-App wieviel Kaffee -konsumiert wird. Allerdings gibt es keine zentrale Station an der -der Kaffeekonsum eingetragen wird, es wird stattdessen jeweils Arbeitsplatz- -Rechner nachgetragen. Nun wollen wir in diesem Beitrag -eine App erstellen, die auf einem in der Küche aufgestellten Tablet -installiert werden könnte und eine zentrale Anlaufstelle zum Eintragen des -Kaffees ist. -Für diesen Beitrag benötigen Sie etwas Kenntnisse über HTML, SCSS, Javascript -und Ionic. - -## Todo-Liste -- eine Living-App -- ein Formular zur Eingabe des Kaffeekonsums - -## eine Living-App erstellen -Zuerst benötigen Sie ein Living-Apps Konto mit erweiterten Rechten, -um später Datenquellen freizuschalten. Folgen Sie einfach der Anleitung -und falls bei ihnen etwas anders aufscheint schreiben Sie uns. - -![alt](./src/assets/Screenshot_20171208_154847.png) - -Erstellen Sie eine App in Living-Apps, ihr Fenster sollte nun wie -oben Aussehen. Nun ziehen Sie mehrere Textfelder und benennen -diese bitte wie im Bild darunter zu sehen. Bitte vergessen Sie -nicht auch einen Absenden-Button zu erstellen. - -![alt](./src/assets/Screenshot_20171208_155022.png) -![alt](./src/assets/Screenshot_20171208_155049.png) - -Damit Sie später die App besser erkennen können benennen Sie die Living-App. -Öffnen Sie nun bei Ihrer App den Reiter Erweitert und Konfiguration. - -![alt](./src/assets/Screenshot_20171208_155142.png) - -Falls ihr Bildschirm nicht so aussieht wie auf dem Bild oben -(Sie benötigen die Anzeigetemplates) fragen Sie bitte nach -einem erweiterten Account. - -Falls Sie bei ihnen alles bisher funktioniert erstellen Sie ein Anzeigetemplate und füllen den Identifizierer ein und für setzen -ein Häkchen bei Standard? und setzen Sie die Berechtigung auf "User mit Rechten auf der Applikation", dami nur Sie und eingeladene Personen später direkten Zugriff darauf haben und keine Dritten. - -![alt](./src/assets/Screenshot_20171208_155205.png) -![alt](./src/assets/Screenshot_20171208_155227.png) - -Anschließend müssen Sie Datenquellen hinzufügen, denn auf diese greifen -Sie später über das SDK zu. Gehen Sie dazu so vor wie in den nächsten zwei Bildern abgebildet. - -![alt](./src/assets/Screenshot_20171208_155323.png) -![alt](./src/assets/Screenshot_20171208_155356.png) - -Wenn Sie diese Schritte abgeschlossen haben, können Sie mithilfe -des SDKs auf die Datenquellen zugreifen, wie Sie in einem -späteren Kapitel sehen können. - -## Formular zur Eingabe -In der Living-App habe Sie bereits ein Formular erstellt, das Sie online -aufrufen können, allerdings benötigen wir ein Formular in Ihrer App. -Um das möglichst schnell Realisieren können Sie Ionic vordefinierte -Elemente benutzen. -Erstellen Sie aber zuerst einmal Ihr Ionic (falls Sie Ionic noch nicht installiert haben können Sie das mit npm i -g Ionic) Projekt mit - -```bash -ionic start -``` - -Während der Initialisierung des Projekts werden Sie nach einem Template -gefragt, Sie können ein beliebigen nutzen, im Blog verwenden wir aber -das Blank Template, falls Sie aber die App erweitern wollen können Sie -auch sofort mit einem anderen Template mit einem Menü beginnen. - -![alt](./src/assets/mobile_screenshot.png) - -Die Gestaltung soll nahe einer Vorgängerversion (darüber zu sehen) -nahe kommen mit einer Auwahlbox für die -Kaffeesorte, eine Möglichkeit die Rundenzahl (von 1-5) zu erniedrigen und -erhöhen und schließlich ein Textfeld wo Sie Ihren Namen eintragen -können. Darunter soll noch eine Liste aller bereits eingegeben -Namen erscheinen, um eine Schnellauswahl zu ermöglichen. - -### Schritt 1. -Führen Sie folgenden Befehl aus: -```bash -ionic serve -``` -Dieser Befehl started einen Webserver, der alle gespeicherten Veränderungen -live nachlädt. - -### Schritt 2. -öffnen Sie den Editor ihrer Wahl, in dem Beitrag wird Visual Studio Code verwendet. -```bash -code . -``` -Sie sehen nun eine Menge von Ordner und Dateien, für den Beitrag wichtig -ist nur der "src"-Ordner. In diesem Bearbeiten Sie die Seiten, die später -der App angezeigt werden sollen, während der "www"-Ordner nur den fertig -kompilierten Code beinhaltet. Verändern Sie deshalb nie den Inhalt des -"www"-Ordners, weil Ihre Änderungen nach dem nächstem "build"-Vorgang -überschrieben werden. -Im "src"-Ordner sind folgenden Ordner und -Dateien wichtig: -- app Ordner -- pages Ordner -- assets Ordner -- providers Ordner (dieser Ordner sollte noch -nicht existieren, falls er schon existiert, -desto besser) -- index.html - -### Schritt 3. -klonen Sie sich das aktuelle offizielle Javascript Livingapi Repository in den "assets"-Ordner -```bash -git clone https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git -``` -Kopieren Sie die Dateien aus dem "src" Folder -des soeben geklonten Repositories und fügen -Sie in dem assets Ordner ein. Löschen Sie anschließend den Ordner des geklonten -Repositories, da Sie sonst in ihrem Projekt -Dateien wie den Unittest und diese Dokumentation -in ihrem Projekt dabei haben. - -Schritt 4. -Binden Sie nun die einzelnen Dateien im index.html ein. -```html - - - - - - ``` - Sie haben, wenn Sie den Code kopiert haben neben dem Einbinden der Dateien - eine Abfrage des Usernames und des Passwortes - eingerichtet, Sie können natürlich auf Ihren - Benutzernamen und ihr Passwort direkt in - den Variablen hinterlegen, dann müssen Sie - es nicht immer neu eingeben. Falls Sie die App - aber veröffentlichen möchten sollten Sie keinesfalls ihre Nutzerdaten im Code stehen haben. - - ### Schritt 5. - Erzeugen Sie nun einen Provider. Es handelt sich dabei um ein Skript, das später mit LivingApps kommuniziert, damit Sie nicht später bei jeder Seite es neu implementieren müssen. - ```bash - ionic g provider la - ``` - Der erzeugte Provider heißt la und nun sollte bei ihnen der Ordner provider im src-Ordner erstellt worden sein. - -### Schritt 6. -Betrachten Sie den soeben erzeugten Provider, die Datei liegt unter "src/providers/la/la.ts". -Löschen Sie aus dem Konstruktor den automatisch erzeugten Parameter und die erste Zeile, -die HttpClient einbindet, da dieser nicht benötigt wird. -Erzeugen Sie die Instanzvariable window folgendermaßen: -```Javascript -private window: any; -constructor() { - this.window = window; -} -``` -Nun können Sie mit this.window.livingSDK auf das SDK zugreifen. Würden Sie versuchen über window.livingSDK auf das SDK zuzugreifen wird der Typescriptcompiler "meckern", da livingSDK -keine Eigenschaft von Window (dem Interface) ist. - -## Kurzes Revue: -Die Schritte 1-6 sind Schritte die Sie absolvieren müssen, bevor Sie mit der eigentlichen Oberfläche -und Logik (in Verbindung mit LivingApps) beginnen. -- Sie haben eine App angelegt -- Sie haben eine LivingApp angelegt -- Sie haben das livingSDK in index.html eingebunden -- Sie haben einen Provider angelegt -- Sie beobachen alle Veränderungen an ihrem Script im Browser dank ihres gestartet Webservers (Schritt 1) - -### Schritt 7. -Lassen Sie uns nun mit der Verbindung zwischen LivingApps und ihrer App beginnen. Betrachten -Sie hierzu zuerst diesen Codeschnipsel und fügen ihn in ihrer Klasse LaProvider ein. -```Javascript -addCoffee (input) { - return new Promise((resolve, reject) => { - let lsdk = new this.window.livingSDK({},this.window.username, this.window.password); - lsdk.get("appid of your Livingapp").then((LAAPI) => { - let app = LAAPI.get('datasources').get('coffee').app; - app.insert(input).then((res) => { - console.log(res); - resolve(res); - }) - }) - }); - } -``` -Diese Funktion soll die Variable input an Livingapps schicken und dort abspeichern. -Vielleicht ist ihnen schon aufgefallen, das die Funktion asynchon ist, Sie liefert also ein Promise zurück. Es wird eine Instanz (lsdk) des SDKs erzeugt, welches Sie automatisch mit den übergebenen Daten -einloggt. Falls Sie die falschen Daten angegeben haben müssen Sie das Programm abbrechen. -Sie können nun die Daten einer App vom LivingApps-Server abfragen indem Sie lsdk.get("ihre App Id") -aufrufen. Da diese Funktion ebenfalls Asynchron ist, erhalten Sie ein Promise, welches, falls die -Anfrage erfolgreich war, das die Map LAAPI enthält. Von dieser können Sie die "datasources", die sie -vor Schritt 1 angelegt haben abrufen. Diese "datasources" enthalten die Eigenschaft "app", welches wiederum die Funktion "insert" hat, welcher Sie die ihre Daten, die Sie in ihrer LivingApp speichern -wollen, übergeben. "insert" liefert einen Eintrag zurück. -Sie können diesen im nachhinein auf seine Korrektheit überprüfen. - -Hier ist noch ein Codebeispiel, falls Sie Daten abfragen möchten, anstatt Sie wie oben hinzuzufügen. - -```Javascript - - listWorkers () { - return new Promise ((resolve, reject) => { - let workers = []; - let lsdk = new this.window.livingSDK({}, this.window.username, this.window.password); - lsdk.get('ihr App Id').then((LAAPI) => { - let datasources = LAAPI.get('datasources'); - let app = datasources.get('default').app; - let records = app.records; - for (let record of Array.from(records)) { - let workerMetaData = { - name: record[1].fields.get('mitarbeiter').value, - interests: record[1].fields.get('interessensgebiete').value, - picture: record[1].fields.get('picture').value - }; - workers.push(workerMetaData); - } - resolve(workers); - }) - }); - } - ``` - -Und schon haben Sie ihre gewünschte Verbindung zwischen LivingApps und ihrer App hergestellt, -ab jetzt folgt nur noch UI. - -### Schritt 8. -Öffnen Sie nun home.html und löschen den Inhalt des Tags "ion-content". Ändern Sie den Inhalt -des Tags "ion-title" zu "mein Kaffee" oder einem anderen Titel. -Sie haben dadurch einen leeren Contenbereich, dem Sie nun folgendes Element hinzufügen können. -```html - - ... - -``` -Sie haben eine Liste erstellt, in der der erste Eintrag (Tag: "ion-item") die Auswahlbox für die Kaffeesorte sein soll. -```html -Kaffeesorte: - - Mocha - -``` -Das zweite Element der Liste ist ein Zähler, wieviele Kaffees heute getrunken wurden. -Fügen Sie folgenden Code in ein zweites ion-item. -```html - - - - - - - -``` -Als drittes Element fügen Sie ein Eingabefeld zur Eingabe des Konsumenten hinzu. -```html -Konsument - - -``` - -Zuguter letzt benötigen Sie noch einen Absendebutton. -```html - -``` - -![Bild kann nicht geladen werden](./src/assets/Screenshot_20171215_120146.png) - -Ihre App solte nun so aussehen wie auf dem Bild. -Allerdings fehlt noch ein Zähler und wenn Sie bestimmte -Elemente anklicken erscheint eine Fehlermeldung. -Das liegt daran, dass diese Oberfläche mit ein paar Logiken -verbunden ist, die Sie noch nicht erstellt haben, was Sie -aber im nächsten Schritt nachholen. - -### Schritt 9. -Die Auswahl des Kaffees beinhaltet folgenden Code, der bei einer -Veränderung des Wertes der Selectbox aufgerufen wird. -```Javascript -(input)="coffee = $event.target.value" -``` -Der Code weist den Wert, den Ihre Option besitzt der Instanzvariablen -coffee zu. Aber moment mal, Sie haben doch noch keine Instanzvariable -coffee erzeugt. Genau das holen Sie jetzt nach, öffnen Sie dazu die -Datei home.ts und fügen Sie der Klasse HomePage die Variable coffee hinzu. -```Javascript -private coffee: any = "Mocha"; // schonmal vorinitialisiert; -``` -Damit ist jetzt der erste Teil vollständig nutzbar. -Für den zweiten Teil benötigen Sie ebenfalls eine solche Variable: -```Javascript -private number: number = 1; -``` -und schon erscheint die 1 im zweiten Button der Reihe. -Mit den Plus- und Minusbutton können Sie die Zahl noch nicht verändern. -Legen Sie dazu eine Funktion, die number verändert und begrenzt. Bspw so: -```Javascript -changeNumber (diffrence: number) { - if ((this.number <= 1 && diffrence < 0) || (this.number >= 5 && diffrence > 0)) { - return; - } - this.number += diffrence; - } -``` -Sie können nun die die Anzahl getrunkener Kaffee am Tag auch verändern. -Jetzt müssen Sie noch den Namen des Konsumenten abfragen, fügen Sie dazu -wieder eine Variable ein: -```Javascript - private consumer: any = "Der Herr des Kaffees"; -``` -Es folgt hier wieder dem Schema der Eingabe des Kaffees, die Wertzuweisung -an die Instanzvariable erfolgt im HTML -```Javascript -(input)="consumer = $event.target.value" -``` -Nun können Sie mit der App Daten vom User abfragen, aber noch nicht -abschicken, da wenn Sie den Abschickenbutton klicken, dann rufen -Sie die nicht existente Funktion add() auf. -Für add() benötigen Sie aber noch zugriff auf ihren vorhin erstellten -Provider, den Sie mit -```Javascript -import { LaProvider }from '../../providers/la/la'; -``` -in home.ts einbinden und durch Anpassen ihres Konstruktors, instanziieren. -```Javascript -constructor(public navCtrl: NavController, private laProv: LaProvider) { -``` -(Achtung !!! Besonderheit von TypeScript, in Javascript verwenden Sie weiterhin -new -- Ionic nutzt TS) - -Anschließen können Sie mit der Funktion add() beginnen. -Die Funktion gibt im Codebeispiel zur Kontrolle auf der Konsole -die zu übermittelnden Daten aus und ruft dann den Provider auf. -```Javascript - add(){ - console.log("add entry" + JSON.stringify({ - kaffeesorte: this.coffee, - runde: this.number, - mitarbeiter: this.consumer - })); - this.laProv.addCoffee({ - kaffeesorte: this.coffee, - runde: this.number.toString(), - mitarbeiter: this.consumer - }).then((res)=>{ - alert("erfolgreich einen Datensatz hinzugefügt"); - }); - } -``` - -### FIN - -Damit haben Sie nun ihre App erstellt und können Sie für die Produktion -noch etwas anpassen und dann ausliefern. - -Wir hoffen Sie hatten Spaß. -Für Fragen und Verbesserungen stehen Wir gerne für Sie zur Verfügung. diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_154847.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_154847.png deleted file mode 100644 index dddc332d2e2d41310e8c96a73c7d64209856c7a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114191 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

Nnf*(UoM4W>Md9r*at*-3<(5U{@P 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 diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155022.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155022.png deleted file mode 100644 index e7d9e9bcac23cd8c7c0adb5bb7a1f3024cb81931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115122 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 diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155049.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155049.png deleted file mode 100644 index b9f985e76d91efb859017d86e22f7a00d0330c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109768 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 diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155142.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155142.png deleted file mode 100644 index 2a4271e43288e560ac32ab706914ba7d3f552c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109124 zcmYg&2RxVS`@gh4iF`;XE0MkT2>C?F-kS)CWbaj3A)91pME2e*gzUX{viIKnFW>Ju z-{1dvopb85p69vm`?{~|J+9~Y%E^dfVLZSUtr?c=We?`0Jh z%jG!!dpIz&M1M~7k)OZT*@R3A#v}jmG4yHL|GvCwo@|MS<{kX_!}XP!IJMu`#JSSZ z`t`}t;SX1C0rs6VT{n6f289!*I%^v<o!yeR;^AbKn zdg~DmIv}oiAyHC(R&_0paOpo%U#|3jj`#D6goMcHjf1}<>=WEGBV%S-wce&LzX?3> zZ^Xb_!zDaJW(qae2@qEWjN2k^3wal5j$ZDrjv?5vz zo(U57QPHLu8Yn5N_UUd3RCrMdiKk~~_PJWWqM#r%&poX4tuX(yvB1CFFf$n+ua)yb zPAwujzGkjj_pg;>VPVdF0oo8IR&DKAil(5QgPl2x-PSgGnFIm*Z5s|0UN7%uBuob^ zkA80pZQQ9wQGG&Dr7tbx ze%#kan|M~~Go zj|FVWI-9l(%y2i~lHF?(v$C@x%nxohJU=hmtMre|jTNx}aOc9ZZJvnRym3l8WlEU_ z@8n=r(C&|ogPJ*4jA-cJk|{eQ13?sGL`~Cu>*)3R`n!mT2zL^mC(iRlTR34$B2N1V z*X_Sc*<<#Cgd7jIbZ|+^jO(5x=CwACwDk9fKisT7xzlam$mw;kG{CO^hlhfKB1+0` z^)Njwt!q*3sn?(4RI7`c89~9x>({;RHU-q!o&ZuK)@chD{(Vh70r{`~4 zJW)rdGV?>bj>Rn;LT~AKyq+{w?2mP2cO&yof&>)Oi`=I+KU_U_Ew^cGvNdIB?{FV2 zh@!l=Q>#UX4ENbv;h%-ZfFNE7@j*%kP=0!Z7?BL!XHy zb?R1$xPMz(ids8!t+e0RZ;-9ks*_=@NI zsea&mMprdjGMhw1w1WmbzUvV3Vg#MId-L)P`Rdgnl(1)KC* z(Loxr{#KG=^UviB6MK7ZjKrTm-`~V0qZ7AU{VIQcUcraZJ%d=3Tlsn?z-N1?^{g zBfiGu=fn5cPG8A}i7p}upN1N=?-7|y#j&`(b#|{Uzl|^bmE-YaPP2(<`?T6eYP;=l^Gk<0#3M)8VZ{B}rC>Co#Pd>6J^ z_N!OVuy0^}L-s0E|97QMGb2+@Xl>}LO~nZYEGo`wEqA{By-8b<(wF~inp>B7s?1SR zt6qCxv&^#+0_tdfWsZdZn#ss`eSMX18rsC|JeZE+6)vuK7ZjchI@-fD1jO>;%cvTS z!=^0B8hi}QWE}x#F?l>ub5EowKf;y3ZtUVgZauclG_t%)2V-@ivx zIzCohSX}ZPZ=h6m0~S(QS-I7IiC}?QCnHiEDLUaE{Acm!Gdx36v$dJ^l7rlVw{c(+L_mhS7 z>~(%8i-d$+?4%!VGp=_?d~sDU=Gcy=nq~6Tv-aI;qU(!Yq?n!2I3f-P^iA|XBkAZF z6(g1L2oi$h;yh^R7#XW8Dn>g8z3<3Mck#H+zcn+IGjVx@w0b4AIaOR7l9tr`P6b*-mHB@N@;%h0QQW=b$dOE{hZ#BPzOv$& zw^v-JyF)hfCTrJ+MboP!Yky?n^)mm(xGs#uL!}y}J_-@vHF;6RCS1tyZ5zg6L|KzuA<|iaD5FHf9GRi=qR;E((9ZT)%l;EW-Ob?%68?Dli#x6 z_@0{96~%it-Bau8T2*>_c-t%ZyVu-8LPxxSH6QBJLxdNqrwkSDRh(CZSR4JWSsGc2 z5J}>@tEi}F%ZZ|?{gx-}#eHaWu)lrkxMIJnLecbD)qAMFUrpmHJw?}r6>Z>5rQ1nV zi-8;h&}w)@WNkaPC}bW+Mn(=V$>kMJSE*KpbjA&#C>&oT$_RhnCh>vNTSrkZwgM@p zwuBTkg1~I)H9qDsLBJ^6_x1#@)iHrCAx9qv! z9=nZ%iV|_T1|c;n40^n!rS6e zBA*KKSXAfh2AilJKfWg)o@$}@-J&^X>R@$D=+$VmBmtvZnL`xYMq7=>_x#VTwOANA zxL;j_zE>xhi${LDr|TZ3D`%{y*ORPiEb&HNLgE%m{2}u6u&w0p39X4@>hB?w=W5veaLAmmPXy5!LEen_Nd34=meS-nzvo zIit+{6dgswL1{4Z2bR`t%E08!(o%*tTIe;jhmVbamq8t2$PLVlm~N=lNDf2_(oJ3BLcKRw3HSL@A*qxVAA=j}u?xw9C*FD)ggXSor!G`BQT z)=T3_M^7IYM`HQ$saoIE#@xMoVo8CFIy~;(Kd<0_!Dqm4>zoX%d#Gcyu^sX0)~r-V zJL1MGfDZ~$yLuYlsTR^?VJ3G5zNp$BoprgA-67+nwMxp)X7ukUDJ?B6EHu-4UVIZX zF8|!MVPawe$NTz?8#Y+CYOL10zjP?8aw;?b7e8HmpOZn=w+^hRuN_29I1#o&L|&;H<(9+3D;(U|$1P@6P{DCgX=mv46)!PTVCp)$4Tb2~t6P_p<+cl- z?RJ_XbzklUpT**KL?(j#xQ0GmPOIF>>~y#XaE+sFB@ykE>se!)gIsS{^9A< zv=N@z4t?n}n%ZA(Q(Ra{)`6Zm{?em;Y$!1{p9f8ISuj%J=& zBNS>{LsxBQ4ExyN;B%_5#^x#4-NUWS_S3>X$;elzN^fEztIg2>A|dm!Ndw;f)iGTy zttW36gLw;6UlFP(YM$`WR~Dt<$@kYi6H~)%>NFF=xfT)^R`|A&E=tJ{*^8I6|4N}F z@pwC<%$0h5#e7hPSjcXCG31&s;@TX)-G#iGT7Q|o?!>S=AR(qwETYLdjW$r?c z83h`qx(LXB8L_J79`pTB6dOQHRM=_nbiCm5m&i>`O`EDs=$($fwu0B2EL>rma~x64 zK+7dCM27lAO8ki?JYsnWL ze}YctyWwji_D`EFy60_IO$=(ok!0vcL8`~C#`^Pe*Ce?z+->oAJm-N0ZAG!Q@{~`~$>NJ}KD14DW|nVf z{#8}2FB0?fd%nt(r9P1|J;fSEq>=}wT6AkL9{=~c-&6kH?3kbws-4b^Fs;$94s9D4 zye$W-vzJkPbaXvnN}uCSJzn@sgGs8K#(jM%ZvBUt@^}(2=E%lgRAbHA_&oja{&>mr zj~!nqZFJ1*%i)r2?rrHD&!JysQf0uWrWQK1-l(yUqxg2iMe1^>c91x&=R0&k4ssU~ zlEx`H-L!T~KDpq?dS<~bEzwr~nUBCV|F&3D(p&M7rKhYiw5@b4MCtu|c%iyiW-tB~ z{oa>iHRQ>VpgZrc_DoK7_4cBZE2&V4OH0<;(sLaN`+Z@x8LdDwro7s+cfX0DH7fZ> znErQ^f);k|#m&nZx;#$XemEk(UC|0u8?a(U1tC$NP>9is|9*ys_OllIJcs??S7`4` zuT=csivx6QUR`}_YHCV|`0rWK91?s*l0rj6?Y~}ux36BkIuLAR ze+6+3-7l%Cs%n%;by}#gt&N_ZUh*MQO7-VzW*!XEqIz^l4w{Qg+*aB^~P7;I=U zm0G^s@itLaQWF2JK!}c3w6nb(`rw@xE(e$KlDdXARup zM4MADjg5cLZb4a&iW;fxy#3G3olcEZ+MDa>#EU$tWBJ^uKQcV*>ElybUcOZ3sI5H# z6D|4T1>z$DbRP|^UG7a?ib1bqX(PR`9DA3@A zQjSpZ*R!<$`t_^5eKqch_SJu`#u%KC;J(no4tpS_hK zYbz_5`M*}Yk!^EZ4v#{9WMsUc!TZD0X~349l~rN8LKW8XZnCPyfUWf1M08Bd%AY@% zYxv4Te5f4lm%gQ~ZE;#!+PbI$jR7K2>ciU;559>~g?qTTp~1o31@=>97o~gCOH1n7 z+Kl-A%2#RqU|y`stFrg?-@eVt&DGV>nN(@`SBRg^zJ-bDvN`>srbaNVMM^?qX3Jq^ zDEH$0WaD*bth$_>oR(IV+u5F<5ouj6vCRn$MNY95~F&f+UYXt-8@z`E4pp@rKD6omRR!gVcOp#?K z19ax*=F&^1?xhm20vHH{LyR>$CJ|S=cw?8)#W+<9-3mD^EiF5Hq54?K%exc2JUoO% zL_0?=15f>uzDgN+{8T9@DZ%#@0aXjD?;j`Ped%=zV>#MtN16(Qe1GhTmWmIu{-a=$lT;6DfUw7n;zR8< zSa_K@zPagXi?z|>&CN~FQ?+1D6L_tu&Y~ZF;*wBQ#}>Lc-O1ByaB*?5nJQ6_$c`2YfOy!aNZU2l(e+S=;#;n5Rk2% zo$F(z=CFuSQBg{Cd%L?z0bkOwe2^paEC{*1z3mqeur`=IHd*Z)@uAxJ0RAl9);@0RjN=EW)t{|dx;{}kRcRj- z7!?!4Z?hTeHplw#yuj+kXX|_kXOvJK0~mdIJ--`}wp7cKj2^ zq{l$VBIs3}oSpf3d9Po;K2dHh7KuB<)9K*#F3ZW$@i7&Zw~vpehKAc_-Obj-D~f3{ z%0`E9Nf{X#N(tDk&!0c9C@;T$?HY}>%uqvtVOwW{(8XM&?(xx4oPaYvc?xZTm3@Ny zxub`4k+r>jt=-yajqAzcfa}S=cBNg%#DsPmRZdQhlao`%!6_>yI}6Lp!V!p*ivF*G zAQ@z4WW0R%&u*XAHJGe&EPUO?#m4ps@$n%7vw>8|?TP#O>0`++utBDOhfolD_jC{o z2?>Q#E~yxJ7&ix!Kqlz543f6LLW76#;VJCd^w~4zyjyHaP zmhn;*QHRL|z3B7jq`X$1ZgFsggs?j8F5a+AN=}xI<*{7ojFSkXVpPjR10dV~w?}dR+3t9EN!RU2l=B=$$_ukCpZpvmUb6VZgS&U{l90rG{W_c`n*cwhCA(`(?6xwP z4LNHZWLC()K6gmAcXmvLdyL^dt!gJ*6_vrCAFi5DRCpmF_jA7+XW`(0q#=x$D6>qK zO%UV>l#SzyXr47RG>qf1)bEJqEH$4}p(@a8xB>FOM$HM6fPm}oU~&YxbVx+y$x>Rv zgSSZ&!}+f&?baTUk=2?{!3yj*HaFX^jVjy9J$*&!?dar$aSh!t4KHx^nlOa&&e18C zi_=thcW{eAZ{M2|<>-IbVDtG5PoUoLOoI0rCNE)swzRZ3Iyxc}DZ~OX@3Z~t?=KRLrBzIY-RLQoAm|F`MxtOMq$MRa z^YyQXwGL$H;wS(%uaSXyqqzj7553(E(KsKoukZB8>JB!mI~HaUm=`nXsSDeX;k zjyv`i7LWmWET*4=DpgronV+A}WT;+YlWxU?HfQYBC3uqMe6SAX2<~`mYs;$qbiN~I zeSQ7xc*7K4l%CGimvP}`J=WH|nXBIXEz4?;c-OTFLQ zicN>4q@{0Sf^_@$3!~;2X5AXop&T-|!@7}?DAET%XDkRYZ}>DMiYXVWF$@^*@9$S^ zl=?EE`6WU18y_FHaed2wOojTSztm&8UE$=}J#FVy@%jg=we`;V*@>8_s5~AZt$R2) zJv@OC5%pK&$6WP!oKMZ*skmdKglULj+c@gRTx`sJAfrJnA8uEM?gC1?F4^V9)62@k(y3oxMFaHnwWO z{_c_@Q)K3>Ta58=WMm{g9>zf0BBwl!fh}caDZA~zy#Q~15(BR9Gf^-8v*R673<>MP2896%ISpckYiEBzrBVT;Syg|Xs8`WXN9Tf;! zF7-E7Q}ANEtY@&*sSt`rP>_^7rR^yiGjncp5E%?tQ%$X#oF@<#TnP>p6#z`!^w`la z35^U5A0rVEqGKi*qW^-jyQxx9NiG6be}B)v`?In#R&d6}it(+iY`C$}>z$~nW%h38 zc6)A(Yn1{6Ls;JL0LK;hyVY123I6lP4dVl)szhOJbD^pa+FuXXy1RdPy4fcyB>k1; zO0#WreRoGkM?=GGBdV+4LX=*~L8yFZ^3Z)OFoXh=DtxkfEkALr;p|P=eP!$3j z`(mq^Y-x(Y!V)B`Tk16~j?&Uts71)sP#-hKG}P66EgzhSeQm5y$AQBn%GI<4LI zeGdtRio3tB&)U*bKJEg$*^(;k4S>N_%{O-;Kmj4yg#1H&rd?C_19MB}i{xm+UwoH7 z*B>wL<>#i$El|I~b=Wpm&Q(^P;5bcO8l|T)Vbe9Gs_SaF*9zNTX-c1kaJDG`1|2(^ zhSpzid74{$?&t4sZEL#*s~totu(%0@oU25*9 z5A4c8pj(UGb(52B<7JjuR09xOTT6Xu+FDvNu{=En2E{SPkzrwX@$plu)`Xx2=H=zZ z#u95|Kz*Qyc;SU2ulCa;6h?wJlJOziXSVG7cSDG3B0=4M;s%Y;L+`7|BUTrJGOZjn zhIiw)-@_8VX6v#6z$lt9|PS<0!Y|NoTx3B>?EM zG9E@tplfayX9s{$RtWDz&q1a}C3cUE#pryec|jF+437li$SN{#H^_l9R*4!BNyAf)&N=bNou-mXTp#_Bkeb zirjBRQn4ahQEx{Kx2uZ_10&;g^g8C+(O8tX_z3j@}SFf~p zbXZ$kuPiSw91{w<=b{ z%Uvwys-E5a=3sFBnVogsTQ)Q|pMrb^pekD}|Bv>K1k)V8gB~E!`(1 z?5@@A_U6yX%=FNKrltQJ#!t^Y&~SYzDJYUPOWy?s2AT`WPS?^gGj9N{tf{GKy+t)= z1##cuPrwZHb#yuHN{Ye~EX0#1PrkO>PhtPtdUGMvFNFBHuv4zZRCFOcW@TgJa=1yJ z&}DCDm-@_tcxY&do0HRZe>EzQ{Wh2HLxid6%KZ5x`9HUDx{$tv9^5tuM;yPs+e!JA z3r8It9SI4EC!|4jFCThZ5Wi+292^{+pP#3cC~1*8$GqWD_wp&hKfg!g_?CJbcyQs! zTW;>s(gdQ-goXKeK&4F!JC09CNl?gZ!pIG-%eI-zV^h$WhvXY75x6J-Z;QM4s&4%Y zeY{Xx|0fx2L=IJ;iHEkgwKZ6dPfVO?8zN2@$}1~pd35CDHgo<*1U3ksTUiw>^9dv2 z?v3)*Ht3#B3k5amgO)m3X)pT_S@nM^f%CP@oE*0y$N%05{P!o(kOkBKUZI^*1Lyts z*wlIde;-X(|8y9-e<-xKyVOU(tkXXAO2~nbR1(J+bg!MlW0}a%h?teo94Xuh`n&8T$ zsSh?;Jd0j^W#@lCakwe+2nY51=g)6@5__?~T=zngXfPXSaA!F2>REn?BGSY$8d&^L zgwMq)ifc>Mmw;Cd4W1X?3Y?YkngMi?j0fQ%c;k!`UE2BGAkt zJweFRI4Fqa?A$vc;x=c;doVxq3kwvU#Kgo9Wq^gG5+?T7C-@Cp!&Mgk8w~H=OaJ~g z@RaL{7Z_ua#?T{tPDk_Ecc_cY-b59!EFDjbQ`px-ber3>YhQZC6A=*s_oyka zl&fc1{nO|Vlz!f-9CV+xp5$gApTK!x*nNF{j0_BXP(8*uyedl+_4Aon(<}I9a;8R8 zZlg6@R+tfjDi#`AKf9Hcl@$+&5Q-eAZ*mYA*S&^mxufip?{nq+=EvjZp+IM)^Os*H z8Sy2;2$Ct7e1-JzRXWbFp+q9=HYUxCjGFZG#X}8P2yNzXef-Jt`5}V1nHBRDTa;C~ z3*bz%-i<;1UqDlBf}~3?09poo{ye&GAP>1d;>BZJ-wz*zt@*zz0XZ@sD`BLdcy{#4 z2e1MR9L5Q}v%+c51cj;(CVy5$4F&Zs=wysIo}r`4s_qH)>&?0w@xL?amKN~)|6p>{ z8Z_JRrZ2wT*rURgm6bg>IB-8XaVVTWgvw+^ zF)nAfI$%VgdsG-U&Tc{3m7=n?u_*$BsJM8}svIy2f}FVd?DRBx?As54k_5NJjj0~1 zV}fug6V9{S3QC#q(ynFnc$_$MN%vFeUA%~UHXIE-VbKwSF&#_{3`#V34EUK+D zko_F3ax0K6P7XG>+1QrH%dHE0@zzhJ4}OPhz1wctHJU%(!=u4y$a~!t-}vj-6W3!7 zUf%o7mi+vcKoNin-0|rvU_z^2k$2*~b?8(0tJ;Z@g+BR3w;_2{9f#gcpRuFsYy}%Q zwD}mNcRs!3D81aaqGDoTg)c5G<&V7eLJ3Err(?<_Uba!Hs#1lGRGns8@2`%4^zz6P z>S1)T9{ckvG-DS}NX^erk2>03Dnf4?=&C6SZ=jO-H>3Y*Zr&Ix#U{tY#lT+YBN}W)tf2_KvYB$l*6-;Nqlv>i~ z;q5;D27y}iaJ@}|epBSyu6brv^>z0&-7ba>?R)$AqXUBg+p1iSwyPX>7Om|)21)?y zZ~+i&38OCMsdrai$vlINlop-RIk*e*YGS$~$PVccBO<3StKU92ZwS zpRI{M^VWBTr6~5-q~J;K4e4^fY6j14XxEhr&far}`H5nf0rX+#{xNRPU1+#GH3r!%KUid$rJu7A5{i=d*KbJsB`xaB zV0fW7fGzbfQSNJSF!I5JRs%Kwf|!_?1%-v66hU4v-R^obmA}2)v;5V%zE8}N$W0U> z5OYi}K>U7fS^k0{&9EgJ)TEISpo=}t3P1^!=sH?j>MUW8(cxjRv$J!>Fh;yEd;1og z6O9sriaD3HQBG(E0Uy9GN$}|JUC(Yn?W$R7`6dGy(lK1{kJ-`o9J^7wvG6jYxhL}m zqwB4d>9LWGEIlm!>yiVF^gDGp$ziXj*gCC`Z`Fawr~UQ-rrjN(`?+jTv*IG zAC(YC#}Y(GYE+j&8`#O)4n&wKl)jMICjAG-(41SB$o%=E>pKE7(iG zG>)GtbDb|yKUl2I5J1ni++S5cHV?BeBkC@`{Z06!w!?>MnrE_A2Msv#!IV3NCzWjc zc(JLfVVQ?VLpZHsYg?POmBu02*zkw&wk>vhzNq1co_2w1Pb@aj*R;{_lAaT*J$Sj| z_Vy1SdPARNe3X@r+Zfi)`i%M7sLFk3ex^A}9zso14YTU-@bLHV(dN=q>P*HS@LCx> zefre&(Wz>2&1hR|E9_@8GqW)kRX(TWW+~0JB&?O2&0Da7U={g_;F6HIt_(6t6U+$; z3UYCAX@r9E`_3gmQ%j2&P|L>eu1}0LH9db65(`wWJ&OGFWA!8dM%f*lYL05X9u^h+-F`rf5pG&N<6u8bUvyoE6S4EMZ2(#Kew8iR_?`H~o}I z438T!wXpa~o6$~NeqYHs!K^i$7TNQMSq8IVkqK?UIRnG%V}}v-E-3c%f|<8 zGc9x5Dmqt@H?%yF&9xL0+e7A4`CRAts84tUMO5nC+}wf*%#m$?F2HUwWE%k-jzm#P zKuVF6lmsPfwrsx#UmCm_Y|*Y$0JC4O0(MEPr|HT6wTITaOrVdPt`vERRqfmC-$W8B5qeMcgi z{6#tM&mAfw{8o@g?LR+T7LRGedxSxms%0q?U=hBw__#gJ-{5p1CBWL+UKn}JrvWFdBvHmsUh=EFtZ>6^O+Io@C9$E6YIjod{>dgR za;4m0S69QK{M{Ahy+`)eK7AoX+2uwE^28LQ)sWm=0cox|LbvfZzYBDjn@J?@70gB2 zlS)_mk!K}ncFzkZL|K1EqR9DEb2o%$9hw4u6q(+x4ALDfbeshPcHMroB|uCe_mO9f zzW~QDd;h2G+zKa~)97H5zO%FyJ?!NBBFLpbll>zf} z^N~;P8b20!k@bQM;J@=T-9QhduZV2?6L}r1A2~N}+~|zvTmelL7LSFKQ@hY8ATe>Z)Y(Na4>-E^=E($*Gu)$|!ec)|w{I%BvuU^@s43tP{(zo}|Y zNlD4AIi{nfl}MD^T^l>NJUR0nfN}sk&fo<#B_)_<%<2UO>*M9SR2q|`uv8#D0K$Zh zIf_S*xZaHqzqAL%sxM7e$o>3DWE;e4j){Qy_g+zde3B;)$cDTRS8ty0_Q?X-#maC6 z*$>FVZdzDGgze#`-kd-zy=o3*DUs*TL9EiQb}Ihy<5Ln1nAv&_-j_`(WftVTyy{Gm z?mHdaK;Z+r`YTcZYB6b7gn#+sjkL11h5{H2B%r!njbXCZ{Q|f>53vjsV(W0m=- zdL|7yA^m(F&~T}#eH!&`mwH9_jN-JIf_!}?BqhVdDedg+uHL)@_)yi=qNTYx4K!1J z{*#T`i+D~`d{?5G&6x&5?*KBPc(?hmcYBYisi(@V(=swzfByVAHB}1{o zuMG_WKSJXD@bsm*ITX36f#knGX)BANT?3|IO~L4+hgb>B{*BRsX9>cI5EKxR-MG4v4xmc`Hv(yDfJZU_TQyxNIzC>| zc3G){m(O8y8X(mE%1}@eP4SErm7=8b7D(Cug%d%sS^b@Gj}i27K1c?vd*L zsCXtiFk#;4nWO}#a?Pka_kdnID3DN8b`RqAJsbfAga6P4kV{f>1*AOiRymYWvteIT zqvf5gO!N9+sSOMa@bK{R)Uv=F-CLg^BJV%E+p|TCGOe0w`rfxqmN7?^!KqW_Alwyp z07YncSnXJ46EvSouPZhdiGoSm^~Y~ODyKbk!Ax-9oThF(d(cuXc4d!SV5C7;j_Ix6 z+pRM_za%^iFDo~m?R)7;%WG?9;4r^_9T^fLuc|6$k6*N^!}{*0C?X1z>@}MUao?y) ztQ{G-!NCBPx&$lg$KZR-NT-B#0^=(;JZ3^YHSIud zfx(JJ#0A6vNnT_&RswG5Na1UGJU>vpX&yfO24*Cn+0Q{i;PZCH#ISkm;Ylbc(29nZ z#go>vykL0#ss1a&=emb0BA;H;WO%9+3gvdWYFIO-Hi~}3xh5)?!~ z(6sjUT0!>$>>bAYVTVtymd?-d7HK+h(u-~5i@kbj zXrKz7{8gibRFErmL!N=v$W!s@h}>(7Hr_ThtzF{ zCv)!`Ze&9D#ifUnCKKm&IOFrCFZKG(n^R?$4ddfa*x0Oq8o{Ileg1q3`7(lW2Vl)- zLRM5{ekxcaAcd&dT@eu#1(PUeOLQ|**Ub?;RiF-#cs;$nfo>IoO@m0hejEP@D2z=3 zL{J{U3KOth4&Uxny9xz7!R>en>{nWRf3eSmTX2zF?MfB(3h?IuU}=|I84l;^fl98b zW0dX+#)~N=YS_EL3!JzAN`RL-JK?(3NO1rDeJ}&Py}d!okdcr`+(7Sn17aRC7nh2z zt~=ZZWQR-Hn@FiLGt(5HKgrj)I5Pu-aEM~=YS1oZN}r6pwS!4`{+WVj>_1tSFV3U6tGE|IGm z9dT5e=a1jtb=j{YDS7!Le1F^7CM>~(Tw*^f$UbmZsDlq4JfNbc24;4#(2i9=>S~q^i8+-kY?MB)CFt9aAI4D5upU8aA8BgxK95YhDU;cYr=zLqyffbc zGYx_gNGyQ*(&N)<{OFjNWTd2&I){JFZaF;Bv9aOsX@Cxu`#cukMiolcZu@1WBccU$ zl|h(k)l825lZmBDgU8Fu3t3~V#7q;M!hnDdzyeF}5XC;GZ{EN-U_84S9v&WAOw6>j ziL=~y7PcHT&aVgv2;9ZRT_oa%Jloo0!(j&L7@+Nc(=p=$Q~%=On|E9s5lWJCrb5&p zu|e?3@#-hFcpO1j4)iU+s1wPMa++$z)U47WL$DuID}-nt8=<;dmyvXuP&DLY{Mn#!_bpnAvg*(T}!z_07+v8?-e9Yk!# zNrDf_Ch2Y%Lci)>kS}r2*Ywgnp{=B%%wTl3_ulB8cm*Y+-AEa;9o1P`{TVYg@6;c4um^c1Y(kBj5w zJAiYHI->89lIBz$_LGQ)BAUx5oWSMbD(pZzO|?NkX2-o8*a8ds{=bY%ZyKxtB04_PdEHb!Fu_Xz-bzADoVSX!9ZBFL}`W z!bWBLL$;d~cfvA=4Xtm9_1_ICq(}>XCh?U=UUpy*;}sT(56i0{@#qAzj}I4bDu0!t z@^6HvPz(!4fUmUn(0}!tr=I!}y^apai44F$5(RnTHUU#VUPoP>@WB*>^F#sfUbe|fnS2CXSj?}Da3_vMJuS;{=VP2rD;TqdHx?KSBj8-)3gW0^fXHn!lzbG^Uq zJ6_V~ksI^G6xJv1O~1GtaA|=qL4#hjN^<~_n5+&PXvfek#-x__zQ!GFec?2A%Rj#$ zZKS290`Adaz}GFam^s{iIBLs zRvVMmg09D(M3R8Iu7HrVTYR3QUHL!=E&VUFazM`c^$Evjqo%-SH+vo$3WA7vt-yJ0 zWkM@9m!QP;OZp5Ov7;k`dsBH}aF7%fU^oYmR1t*PRL$8h-@Ch-xW0dfblt0=Gi4%B zqtea{+Df1!YH0>qDD5pR%boTzl;{BS!R}5>Oa#`O`X3XIfS~UzFvIy^dpjvNJEq^D z)vEjnE2||i%H7A}YHGu9lgleBOI+TirQC5l@87?NHincGO2ZSagZ5f4?V@jPAkIN^ z3e3b(;S{L3P-#SJMPFZv9X2w+qz~Xm|Ni|8Z-bwYngL|);_ABOe-1L$8T17}Pl%6~D*+4yPd%7uV>VjqAU?0AC({g48?k6do{zX@vCLOL31=o5Cbrr`YyU z#0xS(7aq4$hl&v)Xxch1HzZjpzfv64uk)e8vyzY_g_|B zZS6}sVL98>lX;mfbAS8*?=w9;9eVaa*ee6)^s=F+J?fe6Dwm)Z(9PkuCEG?1!D=fU zc@*-=&A8CA>`TT|1Qwa#rT8Fpx_Q<6vX-War5cZj^iA5PKTbJHfQOD47jl}KWp5WG zmZU_}B~VJNEnKVM79P3zA)4qiX)$Yh>)KAin{Q@Ql$ad-r|LU6X}u{b3zcx0edZf{%B(`Q0|Unr$I z!xt^4+|0~mva|&Y9=52g>%Q#SX4$Fk!b1D9gciK#B#<#$gr^cSW zPYane&h03(Q5y|G4h<4u+XPd-F*5@}T1`Wvmn0HYNk$p`>Iaz#VPT5e+R$5&dK_LO zPI=k(cG(^FrZ>e%`bMsZpU92GiCFv74~6QEk^~ZL>{{o;KIGxGR-)S50t<1@7U<1{ znB{Vx5J{W~>=RW&ma7}*?yq5t-T)Udt|48LyRyQd^lQ?#Z3!rG~Z#_o&F&@{BG_NCn1fmlf&2{+?|P z;^yL#5f?{-C>)j5F?Io@_B+`%2Sw{E9O>Cj?5C<;Jcp^SH5a?d!*RZ8Ls}<0xvccg zytQ0c`*vQ`NRe+C|tm_g9V!t zsJ;OYf6N`Qp1J0}4FzKm#QBGwZ{NO!Mj^mgy)d(o^PoFS8e5cmdU0_WY7$Vr9MA;L z&lT64ZXXf* z5)(s@@Bbe&&wG(M9t_*Vlaox9N{DlTBfk$HJ}A+xLDdA){?NtE%#1OnBlScVsu7@3 zMHQ9j^5JR>gZX1QE#cSEKWH(fi4`QOz9vkRGd42|Ko)>>L1hRXYj5ef=y%NZ2pE5m zCCZ71rm#JT=}?(ufX-%cTr#lD$3{oLe5r9k($djo0RAN>C*P$5V-xZ(>~n!9Paa(4 z1qTF3i;MpTbsrx8d4@v8#>EjW`~`XiX`wGw+BEi=7b?+-GgrmX@O$dAvL>|#MvkPw zN~pxzy&o0Xsj_=95cQDa!*|mr-*C^ssZ3Os1Qo=gB*>jL^84m zXHczsvCDy*19D6M@k5*{EL}irERPO}0_g&v;yT0Ort}I14oc*g{6B9*hGlyRl?3Y^OV) z2EY06vJCT4F#@KjztMC6gBm6d{-NhoDGEOkak29U`<`xH%{bkd{;H4eOuvu)H5G)5}E z#~i5UOwv$D$0ynGAEZ>=A1d_U@V47nTIMU^q*Ao0jBp%vbB+>)3Lr`uOqV>FH_H)houk z*&1N?d=X&lal(uxoEvivH{SsBOIoO$*7RI&z1LJU?Vog1nN#Ns)OSuENKr}y|zjgLbPmf&Sa2fP227J@G)(CLLTeBB4=`}p8JyT0T>pL8IodAl3 z+2(W|2#6y^Zxm-gr>7>z(!{^pfyOEMz5mDDdk00CMc<-`qKF9)B#0nMl7JvN3zC|g zlY)|yAekmAf`TN;qU4+rNs^VEk(@z+wgt&K_uW0?{O-L~uj*C3zaBL;!!*#}*XKKD zpS{;!Yn|kX({PPK*UQ*~5b&69rreX|Ho$9yK0A;_)s2kSmX|}G>bkh>Ky-sRClgMs zMA!^r1DKJ++KjV#|C54mzJ_Ova^mOvwWY(utzd< zb#>ho@sZ>w1#aw6SR8QVjh;V$ZfraUs}B~;VwA=*zCz&uUlS7( z-QBj(F@x@uKo}DfQ{Q{8rje0d;3!T2+c{P04LtORbP*E$obfVuE6&~{l$69dd+we(uHQfnb6Ozt zZ4tk>FGx;uMV7W+ygdvgd60q6EJwsLkb$^JC?uz1`4Z>MfLvY86w1!c$MrhzbzMDf7WISM=wx3=G%KRAe>+zjhtJJ1y-MfrhrQ?RGzUg?`;g@s zFI8f0daIj{(IEs4pbuBzct9ZY;F~9m?ySUp_voI7Kh|CCSYae69A@(GV(=%_ z4!ip9xN;w$5ui_7mrs~->lJE0AcVA^W9|0aG!aFa)w$RTFNLM)GMf6rli|HX`XkY5 zu_)iwzB`4+GrYHkf^C~b=Xs-01tqtK>FRfv0*B%?Iz5Q@u!MLquQBWLPNSxU(YmKi zn;b3d$vcn$hRT?v{%)wLIRbzk&>b2|O4dFF&SyUpl;eC?Z3o(a*2d|~)a!Oc`##&Z z@q1%oIOW5|$+_6$yD=lC*HCzoidVZfPVE=rE?S-rjp9%sS&lzsq2gv8Oef15uQczSgfNFSTdd{N>VI+ReU@ zy$$rXc7)J!oM5UZD~hl+N=0lOmJp!r&{`fTHkvi%F1H=ugd2wRIV!H~uGG(#yk_SY zLW#;@xKp4EnzU~y%wd)&A=tqv3`_L)_rq|)+;!zy_64dvv<+DLC_j>-azB}Gg%?`* ztJRpPEqPqnqH>iYgVpKhlvv3>jOr-;)vFQ!NaxYu63yM^D2i#&e@kj?lUtzg&M zboFqH9?s`DLk}z1h5#`GSZd8})*F3zy{V}QnI!JHTQJ2Nsqv!y8q(8qayBKZ6ekRJ zbWq#wQ~k_%f_LF0qh0l%*}O2!QcYsw@M#)X#LyeGhk1rPmVZl8ItZ**xlIp zi4=qUdQ4GalTPOI(2!wRwv5Y00m0=svek~Z2=lBN*>E~K((OoiAN)kit#oh8!Hk4 zife;Agr{nhJ?KDXVH9dCXl*F_O#OGWv|3rB084IS@Fozw_2rqaSoU=&5R#MYGUwyw z26CbRPl_H${D0 zGTT--pt<>>?5LNI&*?y>LQ`Yo@?e8-H8s_dUPKJrK}#E|IPBIjLq# zz8p65uvfgs)^=3ID*xwi#Xm#28n*LfN3KzNg(HB{Ij>HQ@5YFVizf@zy?<lcpn^{HeJb{O5GM@+lNqzTsqDVxwQMaNq7q5yP?>bY;y8@C-rXAqX>|Uo2-J{`c7C}nr`u`~ z`(e{jZ8D9ee4S0Tt6Ar6-J7lM^J<5STo|sPJ?)Ie*()2h_fbubK=Pvuy#rn{fN?oK zQI5<2R6nla1XT*P#*+}zE6mTS_@8{m5qz%q+K>k&a7X^|m4l;@MCYZ$lagq{Jk?D^ zX7dL1*$W4XhY5spGJ$JD6lVFD*jawmbDt_PHBZir@|~_CraR7dleD#V{#4C(Rni{z zH}F+C3Vm|P?&!eOz0;Xgx~JAy>tDN#Yh+I=+oRX5XjZ~{?Da9~k8DAG!2RjiK=r(S z%V>ldV8Kfxg-5{o2lfggSChc+`N5`Hogro+N(C!~Vql1N>PL9SyubQRQ;Q@;1MxS{W1--}P9QKkPG8 zD<|0b^sA0(^?kNBvyJDu1o^6oOv6j|(M!l;ZLbc<&U9y-j9$rVEDE!~~Z{I|# zU!NSd%2Ug^IxB)M-ikcJK!Fqz82Ec2Gq{#J@0q1#s?lSh%I-q__S(8w!qY<>MX zGBpbbly(pcVC&xd!*Sg@lF1p=IUg#LWbCLnT3 z5uOv=7=svVYjptN@6u>7XZTs*vd=-~A@4A%SWeTpvs+R}q{#~D-w^c1j&}Y)Bm{w| z?Oq}YfporhA!Pok+WAmO0rNc~DvDlZTTWhHugVdX^5E5i{Ypp)v@sx6TqtRy9<(k8 zaavGFNEwYz3}6G1k;H%qs4|22l*KIypVpC#10;6p`j+?ZXAX6BDfAM8#%&9>)=Pe% zRYO9UfbJq`Xps;$uBEBxe&Bm{*hb^~rKTodGY=Y!6WJjSGriI*ByWw`7IV(52qG`C zTGL4w8qPp|cazr|aJq=tSa>=Wun3`b2K|(>vN9o;CCl;&VBx_qKuZ$o?rvGG5AX;) zewVeG#Q85UYU%ws+WEzgss=urDLfzqvXBeZr~vgkP*wV3d?v|^B?F`0bUJm0DSzw# zW5YvBGeQ z6TP^j-5<%WsWSPd+WK-13=YPz8{BbQf=TKO{g=uakFJ)YX?SpuY~KJiA$&$jIheW- zkg87xVWZ~MQSnl@M~)ZMlVM89=DdCPNBw0!*F)J{BOA&HknWU*)@#@no^ zVK`rB4fbM3`*&z0nMI&L{(+GN`)uIn?VDL3?!8v#HnoF3 zQ4@bc!~D{d<)d#67RR;A1DW>LqU;d;F z&cDZs3{MWzm^VbkJ?7%FdySm8w|^^bPv3p<;;IzLx(D{rX&jEf9vI&j#%+Ceiy z?MLO^g8*^vB<<(wuhnM73Y2fs*jI4%4rDF(-;%cC`2Yf6tMUl|nrG`gb-+~vI5i#~ znb2p{-D+T_ov-Y!w&>m%MP9L7y4Uxtg>rTmH9F!m zR@_aionH9|@kX{j=u!jE@*e?eS@h^%wv zSdpWLPdER&UnqFiok2T?I&8_wv(WQg(TFBJ zB5ZTmbhtl z;Q+Cs)|`OM2^|obbTuEgjt(-2&6Xv)boBHvw>{^YFOuEtL3a2P3UciLkHe0K62+Tr z+vg2=XBf38Hl-=lp3K+b6g-f$Vl%>f^SsV`S(Y6tF;4)AKu)fntNCoAtmN8)+n*8W z;=>&7Ds_ExnS#!jq>Hn<&>!+m3sci}rx&p9ry;NbhBBrSl@$#F+lR`mL?k4pAK9lM zh2ymu=>`oCP+4~KgGmQqPyqxg&?^NtH{fT&1jD40waOD2I>m-SSH#NQ7Gj2%Epnsx z)vI+ojBl<(H*V9m+P>k$6}r68Oj9=WBY^xL#J}3bhR?X;K@_B4W=YFbqLDug;5{(n zfX)jQ8ORwNsWb@v0oPvvWE&W*AtiuWz~=G>@WD!z3s%txtL zl&L@KOlY_|6NDMgLO_MSAbde8JwZSr;{K^NTB83X@e$LeOF6K`)kr|?YooySTMpnV zEK?h@*!!&jKbdwl|AIi4_1(H0)^?;lA5^K5lCNRxX1}-&c(hQr?5LcVO;&5Mb8|k4 zuAo%z9a6)le@bE+r7NQ(6$y`}b9soIe`?nhM0+QTy z{0{C|)HV`)n9!~(=B_DzMiE&U$O%LD_VLRlIpwRld($u%!sa29zrA-Ji$jdWA7GeO zBN?JPGDiQ@)z%WUY~Vcr0|&ZH&C^N!ST&qzVkASG5yjd9-Rd;~0)h%NCDzz2*^9J` zd)$4G<;|50$DQ|OCMBd8YBo)4T-8Eva<{rC(fbQ5LXmtbq9fU$zj=|va#*9z?C1MY zCJTym{)C2ioG5!0Z%JcK)ANRrNk!K;pH7lv61RF1-VU=RJj{J4lvo523l>bn@uq^d zb}TR}cXwBZ^FanV3e9p9k_|SxNa0JnuUxy*yBBeC6Z*QPA?1%H`?_{r7<@r}OP;XM168wRX; zdU`)rECj`tFJR}a%SE%>g z`EBCHUt<(Ze`jF6H?{^(h*b7r(mh5KO`-MDd}Nl{jbJm_Rbe1pmWE0gw_z6+6+MAS zzEEt(o~cRF0;J%$iZ~ayA173dd4cCsF&{sc+5`)weJcz~zlM&tnCeB&=p5CC_nw~m zuID9YvNq^K$T0~a?fL!aJOE}uTToC^3JnUPxcB5M|ExeQtq~vp1Zl%m`Q7Co4wH?^ zVRsE{$2!uH9w*ntiz^PrlWd46x8e+VYz985(I52_JUgoWReLPefLUICD$fv^F;gb- zw1=KEWU^!Gv^L6-k5SrK-J53i_m7k?A8MbP8$oV%=sn8bDeq3cX8~Ll(Dj0$0U8PH z{u0!L6eeP2zUQWm{<{$h8%m9E&_X%V! zK+yn@%ZBFzFDSlh3sp7f#?JAZ~O+{^Ta6E{M|e3 z*Ybz;x7WTy;}MKv9<%SfB+#MY1hD})$2c;U3US=Sd7;il84B6=I~~2)gQKH{qtzN9 z&wc89rJU$l*tgJ0%BA@E@;7hE?|tTM`~6T*=SPw^f9mi>kQNCdf2xZaucr&Qw2G$}a|f;>1XrYk)eTK2NCTI$k6%=NH%f zL!zH8ckXitcM`qi-|;pOTK{PL)3>H_>AUDcN%S2ThQ?uT^T>=7)A?_>*BboLGF+hs zdarYj%M)l#3LyG|NB{z1B!e0P(rOrBNZ{`p#ge)kLc#TkFj0B0gDE+BSC7%rftE`L z@HXyjnHO&!%gD4s1}k>5J$OxQKgC#Q`nesf1n3mQf{7jgnppefWX;&J4R6$Kd^3ZW zH>hur?hr%gb!>1@Bk4`8=bl};{tANm3K=<$M6ST$TVom$=2r>r*B1-<7n|ne^;HCd z82lbce3 zzf*$9urD&28Dm@T+EO7Z$^J0s(%yTLpQyxYPBye3_ik$l#dQ!*UBA8sKrv~JoJG7a zhP#-5w%1S~x$1i!!0OOnmL_9xRnAox-7&Q>U}XD(QCZ-L30beLYEp>JshBER$xHY2 zBk1<0_t#lC8Z8kUPWI=I4Oi-PwnTEs0HaMrRFs!8RD>NI=EyZzV_>V3N$;;Hk<_#k zl5p45+Q0k48lHEuzrVll$sZ%^-l;_mEfS}J4EfD8GYBVRfQG&Lw0rJrlXRi>8t6cT zg+HPXV0(npB93VfZ2vSf2a~0VH|rH@`0ixL=63N@h8Bgda6ZE%6VB~5ATzx?&zf!j z?vD|&8uI?iwtDu_l7K0A{G@sza=qU*BE_qW);K!c)Weg-j3!LlG50Wp8}UD{az;2h z_X~!V2DsRkupV3pko?&>)|&T{5J&S9J-u&EZ#s>jI(wV<38+eZPj)t=p958lTjbn2 zGjcA7i7Imd>rwNraJIUpI)D9n{`U>izq-ox6iNIPa@H77U1+(n|MOy=5e&67yUBUp z2jKRQ>v%?zR0@6vI%ZJY=dJ4h^Glkg0Mc)v`@lUw%S{?5#rQUv1Q%pbKrpLtn3pLX ze>Cm#kF-0758k}5uNcyp;m54_qYM9W0f^jF07NyccJAm%N8QB)-MONY*zkLy-!axG z{X0;-mWuxKP|_4q#NIykD~E{iKg*f_>s$XXCl14p|8wKYagOHFo(2bkf4*LPX4VSx z{eOLn|K~UUpI6;8Y$wWc$5!zF3f6H%gceSHOVn`u|6T@%nrK%PllFhUfG2%)98jU! zs!KX@A+K?%x%SM?RDR8kfB!&r5$MN{XDQNgsCo0RZ;6SBw;VAI)i!_c;~F!(Li8K+?_j-fl629*VZ}N8Ydyw04!pd? zHNsoBl z)<3VlP#1Pw-hcV!6{MQ?7oa9eAQJqP3MOnw>due&#=R~ zYV~L1_-2ow^Nj#6A?ynw}PB+ik-}vy)_a>Nb5dIkvp62GW>T?gcP`F+7Qr*bS)}|Q@ZD%7bPOOjK08LC} zSgdMVih7;E^^<>f!8!5V_an8tX(D5g3dY^~Pqa24=9+5bp;xo+_`OD#Qx#_=_>rB< zl>Fv^n;Fe@Cn&NxL%4G7cz=F?i2f7>h~qR`jR3BDuE4jbg8Fgi_9CesbFt=5a!UYT zaXa_lPex3UOXjO5z%cv1V=JMBH8=WUrfFpJxtDsE3L?uTG95H>hH52g@%TN>`&$3!lc?J# z>(y)<9UKTE7*PUqKb0A-@P2&Hk_^W2mE2L?+8v|(U+hfp2gtC1XV3#$e37=T5JCh# z2z?_9wDX6J^*(Q-pGv&}<&O5AVAVO=7Z>7CU##QVz;EN1!RZ%yTm9qga~PL?QQU$2tZ_N z=4-OX0Nk0YiO5vXR0kXhVjZu|C|7IV(E{Q%;n!E~wH~p~2icv!G5JP%|1GK^T^-H> zPc>DQ09TfUk(d<8*5(k>VReQ< zvc3M~0*(F1!%TIpJw2gU@bO!YyGGSFg(OA%Z`9?gkfTW@r_bivKbAdm61I!d)JP2# z>q*w(rPS}>{VQ{CPY~tmv+Y&S#cS2A@27hkiTIXjCWq!Q;54etGL^$Km#1TxM36@n zgdofZcc6re2WYbre1i-sY;#rdqa8yW650oktj@$YlhZfba*WZqeKCj&8}^Rv)ilO` z@-xzGG|Fzm=frWdjZqAh-eEL`Iovq9UcYZ{p2{wiI3j;hHY{=t!adm&LLg zlWSuY&WrobabYXPjMKVhrpOY;kefT^PhR-;uY@T>*O^+-$I)%sN3#83{~VLcrS(1d z$Nu_Yn!=mimZShHRNRQT8$!OEXU!+W^5%R7Gdis{rXpDfJYmI7(~e8iHR%19!=~+L z5xp*pWAzGc*%xV*Ka}JIu79%d-20>@VORM_p1+83`nG>YW_EU_#h9zzz!xIg3@gp_ z-djnonpgu&@VFd!631yvC>=x;#C3-`2hn6yXC_K&Uzga)YrE-O=)rTk%#zQn-f3ZB zj))8(M6mSq_EtaNRVma5aEU$I&rc0O&Z&-wmxMGD!Un?~dE%gOm7FTt7jSjkL=`g9 zCCNX|6F9yNqDQBzAMB<+uMD5z6k>VWKY-d5?Qlq+nYvXoTR(Ou^d_<7<@4$3tA}xe z=Di;d&H7hblES_{q2ltW{buQ`&iJuxI|TmO+PK(IaJmxQK_lz`W?WqV(^Khh)h3Z* zF9;j)&VNyV64d)xPPg2(Ze`SHI?`bkDF{0r7;}xqoS604&&$+}XPS7Dh2xUWb;htkkBQ*wRp1PiNT%kj zE{S{qh?*Zj7=UcS{tH;}EVonct{v{pcmlt~JK1Zq0}uzJpS)h@9#uPA0dEP65&=8P zU#*V5WM~PaP7vX`r)cL|t<8=fEhiFZ^W#*+zRK~H)1KX!y+j+FCJ{tj{nu z4L;wQaBDXQF7493=rM5H_Rfk+e~D9LvWMAHc5LFFlBiE|c0w(=^q#%KcPZ|!Qwhet z?+K6H#OLXHemg?r+00v z>Z#jlAXvFQ8~@w_*)kyXy$W*5%22uu{Mi9SkMt()7#IwIdI_HvL=MX!l*WsF^tjVi zMkd{%(f{K3_&8{dH1mf~PkC)}x`4ze6GlZrL{tJ`5mLd{b{TUri-8Vqv2IBtlBe0a zoWrnI;O^Z5=*DQNkLQ{2P-4Zq!1V#gADi-t>?Dt+!pa$#5*#Y=;m@65CyjnE*CH+; zNs8OmLvO+Hq1P~aH7l}rI%#EK>mV?&O(2Osehcc+!v5;T&{okJS97xrE*U||WACYS zO8(0P1=51bbbfwl<|u(i4Hvuk7WPA*e#2FW?5-QC4y|;uL++x|i zx4E6u$mjk;=N$g!^|h&=R+Gi&(;en-yy16Rpf2uVrXNbh6JgM_<8TxPGbY81MXk1D7p6?SjX^mCaG5)8ae6b2%6l{Qku<@8m@aYA}kNo9jBWd-q1Lx6Z6B zUt4Qy_5KuSp?Z?VeOulFOP%x>S?0E8_<&F#Y!W2VE&o0lfCS;OJbn5UvV6?$q&-V! zj84-9BS%N9dR{Q>2&!HL)fK3qN}m60gyxKn(sZ682q~at1lFAIqN6qQwb_%YL<@Lahpvt#5z`=zmo}#mH`?V%)UF8yoP#pIC@#8m>zPkrsSdgCV;s&GUVw%}TBOM*L@;(z$Z>!;Ce0hn}GLy?8bS}k8lb-C_MoUIG z8HZl1bCX>jhX1~W(#gOD!bA7Ts%B^#`snoh6{+A`gAtpgae=(J9^`5Y`Nk@B#gaacATj2S2bg~=PF7P^zDf%Xq)N%W4OLmfZu2cLWJwwQ(-uN8->DTBq4xI2yp$=hy#Yi7MG^QJ zSj)-bo7jTqA_TYHwQ=s+@8Q<}EQQdj+b7E{e)Q-98G4IyRhf)-nJd7l8&1_7_ZI#_<7kWO|QDZclxPMkt{(~@hs5@e_}~;+7Q(+;#P-{d4VJ}_CbVY zQ^{Hx7R{Wd*a;QN6!!AR6BjY?S*xm0U%I`A>G_2lD)YD{G4ajqbGNUZ`y_qlvdsMI z*oidLn>Z)@ulxP>p_m_Q{s9noU`TKB=k3RDRd_G^t_+myGx+ksEY@STmcS>v9#w#z zQ_#}#?C`KjW#=4rV)8F|RHsaBWk0KGfBEJns?45@{jnh}EzYZNs;?~;%Y66HSI(OR z#np(o;&i4Uw|;@M2N)zq+2^m0l{7&!ZhBgjjjgLf<-vn*Y0|+Jw&RiU@ep>nfK(0s zQ4w_ab99Ox34#I^oE8DpE_htSCoC)sTra=_%B`nqe!u}8LO_23lda&E0l@NMhvB?i z@O~W@!JBS#C+G&izrh>@gaFCNUla$l$h<9pLHTXRo*(Z!WU7Orat}1M`NP%*c&%Z# zJb~&D{YIz_DuIs!{VM#67is<9D`o-8inU+^Z!TDnpf~ketwIYFvAz}%6ikQ8IuZO~ z0OSF)Tpn6e;NZfJX9XUbVB>cRtre{Ffp8O;S?~cJL8smH`pOaPe`Fkwz;PjE6m!Ba z<%3lr0J_@+<)YFZjfW4Lzc|c8ci^efl{!O^#b>~MvXZ=ome%-0D4`?3gTSmz5_VHg z?{{7rvI0h{P-57Z^$*(dpyV>F_o@ONvDBN>x-fa@x`H7awm%C*qAq}*q~2VGA8O?f z!!{h`B_)idv`7(=k)bWo#@B!HPq=_aV@C;8umBO4i&n#@#3CDj)ti@&S8MPnbPQ(brErRF3`Gsn>GeiC)iOsv-R?R<+bjC z541%2{iVU$vLU5!n-5#bBghrxtByLF_s#`KW~$dzA#->r^IIH$PL0#QxwdZnGCQ_( z!JPcF%Z*@Oww;P&vM4U-dq%5DLLjOMMEruY zB}#rpg+ARXkH?EDzwI{(UuUUhe*E+<_S9`(DhaXPpRK|7Y?_1r>gz+DFED!dTVcbN z$LAuy4ABSXT8zC|7lZr<5QIa^EvMfST91)1sh>9bL)T51^*KZo=P*ZNLkO0sH5Su6;FKHLg4NU=aJH8{BA#hMbT%=x3@M6 zjHE)iBtTQU;b2d91ar>&a2tpKBA^V03AeDLg9UZLK-kmMQ~YSTG>sY5>CL)_mv5PA z%u$f$!>;8RHvp3eHh#d$YaCIX@3~AsAqYJw0pn);P?@GJFSuR5SFbcQG+?!3osB`d z0x?lsOzad|2O!!m<$Mln1%CJpq!Z(|h5!qeSq(0%0AIordWfK@oQCdOU|=Bpo$ujd z_O6QaHcV`6lW6Koe^ZkQ#O2+}FAd;T4a+h(jU0S5lam{OlK?)mVT1!&N;j)=fktZN zv6x9_$^42xl7oz*GSXSC}Pr6edaXcb~Av#HL3BGHMob4Z#?#nGpqMYl5=VE)H#=?KeYq1Pdg=^r)d}J12zen9}P?+=u%!H zAOL^j61!=kgFE+VO(CRWCj!8rF#DPCC4uG(&FEUw4r1ApukYTy!#c+f4sL-HDpRY68V0^Yx-z^(EJUCL*m1@OrV-GyQLf;?a0H62 zLhU~Zf=&=crSRjyA|56^nEitb5sFF3Ly0ZD>McS=1v85|mBj}K0Z>M~6VCrkL@xvT zS2pDO{)7je;CeX^UI*Z;O4B+9``Dl1{5@zy3(Z#jCIap&P#tCXD3vc)Z-MtL3nTa{%HpG#i`A{(Qcw8Y zh12$`VTM1wc;+1)#Tg&Ht&i;Ip07$urkY_8!sovJn%|qfCFYUP@9w+s`kUqP+{bt$ z<~e@&uB3+JUyFLh!ZupKCe-TVw)}Fs zB;Y#L4V$SP{uO$B8l}_57>j^6!;43XoK=*;=w2bm<>vB?o9ELvs$bFK0*BA%sD)~4vp+{4=mwwa2GI1!HIPWk}2pTVkPfV zuP-l7l;>Agx>eomV=PLD2nM#LBEF#4{--GmVUKNQ+UAk15D-y!bU;dB0jUzi*^9KG zYOL_}=!#`W#Ug>w3Udc!yja(!IzwMD!h>ZCeV9&8CHNj3yTO%%(E$Hzzm5K`3`;2F z%#v~t)UQ&D2*CCNPJ?4<*L-|@z{CJj9sy|GLSVm0dnbwoOUor2-AP2*>8_HjDKizTN2&{1Z`a-Eg!7 zNa5p;hdm*bg{NOF_2Qf!>0klM-5B*Pe!B$yLU`{TNMgkR*MUC!H7bGcF{RAe14$9r zVam_|#|Uh2V6T_O@3-WEs2yRy^fpbvX5=n%qZWi}F$nNm)&9%{-Q^tWt}3BabOPme9vE@bcSFw3ncT*IK#+F&<8(-Js*;YVy%2_ATXVK z@JYWAV2zetoyW6!^>FCvmKMbhhr{|fiBDHs-`Hr zzzY5^HD4MYu}ubRK{8r|O-8@Il9>NxgSb&>o~G)wYMAlBn^r*9ee`GXKg5Aw#{lJk=7dAto(>RCUN_qKv( zOpK~Lrr}J=l}fqXfYP(Eoj-?;(n*()17?p;L}L;Pc|%%{( zma5v>)@a%K662xcCR65wQISC^$+ecHfs&K{>%J3cBAn5HH*Y|rY6*O{8^M{-KnkFa zv1fv%IVM(_Fx7OI6aqVNE+Mh(+KVy^h;@x(umXtA{~g!^19~^P3#C>5FsqyPN>G~n z-sT|#J>&}3a+4_PbJX0u*fO3)+4rv+|r z#hJSSb}_=URfIG&$-rd?HWUydx(pUJh&I2zfsGJiuotA8Ab*5*>t=f(LiorxFeoS< zs7MfUBcr08xj3oiehAha{3o8A`T3I+a`mt0!c=<`x^e|0(<~xr30!1eO46MXBi8bC z=uR0>Z7c}cSf!?v(Q{|EFTa=g8p?UycOO1}>5q(CpgxRFxwt?=fWU|JEhRb>gV9S?;m9cJ+=Aw-PanGLMzvmfc71tp;J$g!V^!wRN66PWV*qrtS6$ku z5Z(nSYh()VHQk?G((3E=OuG`LIjsN~zO9S!5fl6QJ18oE50Psnz2`iQT82>kqV-dm zg6<0$CH#0^x0lD?vkDoDalPR;rvm(~t7=v~@V~wg(LxQvZUvbI6n*zZL~2zVav)8B zC@uus31rCZd&iL1b>3USD*AvuhE4r}kFmfm-6aSjj|3mD>FNdzwcW)*a7#mhv`9tl zAfp!58hT`p23inmVc|v^VDAE|)#2WnFYIo> z*JHYKN82?ntNDIp({+Hsu-cQJp7Pnk9I%I4+BpR4CWtd+9&$$hDsXcN}%?)`k`)&&V}159wRu#=IM-4ekbvH)2m z*q9tx3%V|oWA}6{xjNr(uyPdY8E`g%>=CoqfQ3#^$p{I*l21am24Yt%i3=SOsLo54 zoAplsI!nh>do$QTPMSmfO{rr7_i0L0Uts+3A|0>hr6(<^wH7fhhROBAHu>TtJASoW|&CE|b>gmKLn3IJiVXbnk}aD#F8!z;)~- z+7a39l^O{S5$h0= zy8Y^=DA#Al_XD>I$k+7YitvbGH^hRj5QwTlV4PZxV+xggcxb4LlT*|M{19qUeY;A? z-|IG7Z?4tt8A6iv%FnOJsG*nK0Gc7g-S(U@kOBfD$Q@P#XZ^mhuI~Hd;x!l=u1uQARt!qr3Niz?CtZe}Bg*?=kCVU+k7ssHAkigP0LgW)G|!3^_ynuuY*> zZu8P+8KQhZ>G`N72|_tvYs=5?Gp;-_UVyUdqCkJ+`}T_jQKuY(*#=iChfjOlm2hZr zX^B(QwDV!}X0Bo#MnC<4FM)4GIo$4ZTY}c?X0u@dwDF*;LP}X_qzNrV6lxFgr^>>E zNRn9P7PHXY*7MGe!E7hRG?vMP{7M1E8_x&7e|`LPYN{q_3d2txl0R}RgO4;BBh;C@ z4Y=@1*mQDil3Io01r$R=;Jny=jzZh6P-4Y*cY;^nn6Ir0I3D{`d6gKQoI!v&p9SQl zVboa54XoA+i@{8kgQ7Jbs$A(c$+&hn&j|!uvoHsMlLVOvH8C-_X*(gZs6Mn--|%P` z<9-WubqheT(~~vdE(1eA)%N%Iv886Nh6TWb0e3)MJkSDf10EehiFV-s1qCjXKNxmG zMpOwgPz>_+zAbR4!xE${EiJA3(#jAb>F}1=91U0(5l7z$t@; z5gAv>;O~w^f@_A(EF5+MRm#c92~4PjqD^&Y{#{&GKg{PwlrUBT>2WBsCd?&0?N!}3H{vtOQS6{@puH1nh6;x53~9H zSRb+BDQEsdzGObvsPU4>kS;o#3Kc_a;?LFip5a$8QfKQj3v01Vt?c8*8Y0Ohf6?E* zx>l)|pOXGg@6bpneyh`-HQbea^WK;5v1v7lHSeB?6Mk)-?Q`3h(vz+v`|wg6dW1R` zYISo6ktY4uIQS-YG%|Ma*-!UpI7p3Vqq;&<2Cd1wF)OX?liG!k*K%$p z#7R)qsw+QIs8*Xx3;MkNNvOEqU-}G?{PkZm^H6{GASFju0|rVAf%=zr11t z(tXfffs(P|*(9H@FNn(kr-#Q6qs|M?VUybgIkpg===!#>Hjq&ozjqEH;$TnDfyW+T zEDFQDzRrz8d+#M%+|7EFss5B3wMEr27_4LWv3QE-qY|DSu8p?Qp8KFglD;PH+OMpv z=0YQcL9eUD&FKhpt-(Az06N8m~g+^%X3A2}Ht(B(9g(H5BLz@>3$tNXL zqI>guOh6A<%itDD+zovymGozN3mSL^+J4ZNU$*!(dga=nRe8nPj>_MAGh$yDt@iMl zq=n5sjXeHd5>tq6?^%_fJ=$Z_(itC#%w1e`yd+?KL6(3w{SRGZQ+>j52NpPZwJ{a2 zKeyzHF>|b!JR@S9Aj`lg@3{F}O39Gg9&jJ1q|}&60EL{Wc=k~_o6Yt71;NYSz*M2rp;TKU< zbTkiOuMq4kEG%G|Ubt|RK-ZS?Z zun+VISCJJh@aD`D4K~LyX%-G6x(oU(8KWLB0JDtCyj*{H0w*X)JHLbOZ8Tv&s~*8! z?O+n}nSxmZCxLp(UlVcGBsh{dF(^ful3V+-K=vaD2yFs)nYAtW7%epCGY9F#UvIvI7J!GSgzCKiY z`(9_z2yVXVQ##rA0UDNt=JZU=48iSz4EoZo44q(KN02l4sq2OOs$sA83!jwR=TyI) zDvDSBoY;LHu9}$QqO&9ty^4#vwX&Q(p(yt=2#2U&Mf#zPN1n*>(99Xi2IJ(vR7KR! z#akl#i7mn-K8f!MEzGn7Qt14uU)&3p%hh5ikRTkob3apa;hZw@aJ03Od7WhDeFQFj zr0Gw3O4sH4>$84yPbsrP2_^7sR%gqqd^O12M)Kzi7VJ_(3vsE*{L)yfvBw3&*ZMWq z^40MN$*0Jr{WSyr_uX`DTWO}K96xz~u827Ipdc!uDqL21;`!tNQ9s;p}QW> z%=|@$DD{>;zZNS^=ghX0-lFX5okw0jmGleO1z!JqQ#hKp$`Ru=Cc!he42~&$=hr(F z$cXLD&CKBxE0n24buQA4zx<8zbv@29smb>hg&%d?%)0P^-4~?&N9>uSi_X7%zLeM2 zGXe$3`A&3M@EMFxURQPp$K`FRZ1eo&V#xO2m9idog@I@n0e)P7Z<`Ft>lc zROxU3M;8A7$G7+pU-MRl{@$L1p1X%fb$#hQ{ZN|@;OD* zQ#~O0`$yJUZ?B!XC$oV6Lcj3T?B_87XM?66E^gA=^wzcxP#{uDB!Cy@*)@;R&j9g?j13W0y-9$g1B@R=-Po-*e2;)AT?ZXSa{r93n z4`YaMpT8zD=Kgp^#>C9Ig$3oTU#OqkSp9cS;sj_S@g*WJ%a{QE+2%l{6ER2#Pyj=a zdY&dT@_$(4r@47jU>hV!E}N^J-f!hXs++?#o5N4e`bpy7E4`4FFZaj6M+tx|BWn=# z5xBipL)H&y-z)y|^TUnN&s1k-PvZs4gLwh|!rqo|xFPpm_3MuF{w2e^%W0|LOT^mq znVHU9m(CBb43|mo=jf z9hWqWTznEDuSn+)9A@(C(nR_Df5%ocaES^pMLXBK)|)|o$f}$mV4!JGBU9UE$oeIj z$h4??5?W9>S5@2O%HKbrrWn4C`y?d32k%ZmJP=3HZvY@(LfjZl5Wpb68SMj1U!o88 z-EJj{rQ_Y?uP^@{ZIWUSNt{RqiqP{>Hlne&=Tu2T=htxf z+Nc(VU? zUBh^a-;=K%J8n+(pX#exLsMXK-)YsLx*bRP0>RLVv0~|Pb z*kc1R7dBl|v)3lCzA^t<{AdqTZb$Ukay~J7$Tt*OJYaJfqp7rq!-8^GPF2->5^+s) zJy&G+mWbo=5TFWL*{*VJt}3oR)hjA&I+$vo(qI*u{YFfw+o*$@*)yuI$-?(9b2$?b z)7>Z{P9u+g`4*4uj&6-BdgASLUA3#537hK~*P2#VI=X4W`}gjz(dby91BlcfJVEb0 zK7B8^H|5m#=(+fo$e#aNq31OOFJ20q2w0r`@qP4hCP7xKOzt8n9NU9(eAOC0Fgkck z)J!|58S~H-j(P0UnRMH3M*T^(l@EWAZpxjj`-qRf`MX4eg$|}Y#}Y|!n~7NENfk$bG*0!)?aXEme> zW4u3pFg4x#;fUUu47{Xc|EaigO_ax?lg8WAIXL9-`O#_mTtZQHzQ%_-dS2dgy{J}w z18r&=9)3Qt)aQ7?2=ibIC2tI^$FDR}l=!84)~d5YyXEE_`n#u6&hq8C-*lMhQrBlQ zIUdrf$@8Ax+KxGqk9Lit6cFxxfA6rpqjYkYT2nvOKHTnf#oL_S5V=PyQ-GbanmA`Y zE_7ZPW7Ep_z+N>pkc^_V$57=17f-Y3FO&Cp`kvX34nwOKWg)VA`L1mo?Hv zS!F*vIsRfds+%uHiB|7-Y2aw(>$=&ZHTp`zl8WpQh^3PIw6ZFR^l4&e9^(oh5JeQL zC>SNjKIHM5+xDHQr>8?#H*7C288sDI7pb}*oi?%8>;Yr>Q{gj%(!1Nc)AUSzR~IMq zUq+>?GF0DiwHfU7CJuUN73bxxUo9}gn8sL|P1=k5X`>-1A~h)D=>?j#bf&)8kwTV> ziQbbHcB|!Pd#AXIq)JyplOCVcec*xf+=7EuM0`;bKd)P4sIz!FcfUKW;2SZ??pc~H zbm}svUh+CEZ7?d-Z4l&TPYjf~wmO;@&qUPo{@&}r*rM_0KbJzE*~FTenumQ5iF)=x zN=o$WY+qMlM0^m}o2@kuDyh@=#6%RNj_!Nq-wn2O3L@gxW{-6i-u#v?z46JuvQW>J z{#dykWn=PsyZCYG;fEe!jz@Ld+xZ9C7JFCHaaF-64sj76sJVl-#9sB;guT?y|#|W5aqMuZr z@EUx~h#orojY*2bNW;Tq_~6)~>3m*puFKvYV_Ku$i+WLLbdJ3YY`t=G%;GnBgzlrM zSqkiIh{ijj9DW;y(JQynwx3%f_BfiUteE}QHaVJ|iDWE=lPF;7E(>}op6(cENTuuW zW3uc*U0lkN{|i#X^RGt66q4@?nV)i z?rs4=x;yr})ZhP{i*s@I82jQ}oHe`yf|EZomex)%Cf#-so+XNBu4`Ic<@t)TqM{VbjV-eL z2SV=0I-V-=-5c~gxYZpA*0uD)D^ER2}0>;D(4^@J6 z6yV^J(lVDa&+1DZyZk!ZpRSR$aLZ0g+@BRKH9OV9+)}4)l2N*qF4LJz$a3CgLm?t)Mn}DL}9%A zW5au~YP73MnZ>X_+}tW-@ddfVMGoH}wuz@jOG7y1ygtk^v%S~zwndKaWA@IG z^rB3*xsk)q)g!+H#V(Bc-IdW=wLSCVsGNvlHV!sDc8e?oxuEN|jw(?$te({Cd$E;f ze3;%kbsrh9kIE1D+<$hglw-0)=FYJ?uKHD#T3C%cu##`rhKt6N#(N1m%x(v7^0V1( zHLcb>p(=jDk&dWw^V%HAr0Ld2Tg6&hTkwR{?huuyrKPewlGiz4M{PullO|6)9LQKGB2`%h0f$;EXxe$o*mkT*P|_?sXa@frA?Uk*iR4QA`s zVLELdX40#D)IA;Zo%Xn&__W;+|Jl!s)DVQ!2-U~Wt?Q1j#P4WFf1wf|bo*U{e} z7Au=SYF96&x#%r7EmvJB|Bx6DjJu`~ zbV1Xp*YN(&k^Ra(@324EvE-UmJAqFSI{Jc58vAo8b3#nM!Lu~oY}~*L9p~RWkF{?3 zOH$m}7qtH=qa-Ee?4{3ux?_O##p4iP8ZrFX#;$T=`bu@tbV>EuSY1}|p3hqK!dK~~ zH8+PZr;0OuQF-3hQ>7su9y>#mvJ7~8zo(8uk}46{u8ZppY*=6`4MOT%cbr;tGMQ>7 zMrS)FJ+1WN^bO|UC*^bT$t?hT^NqvY&3R@1r-t)(+>=$_3Hv-t?rRZ7_+q-j`3yZn zI7`^)z4O_{bSO-Y=xI1FN=imuhA*tZ?M8ggO#WII3BDoe@W>BVKB`jiSXko6zn9j1 z{P-(*?m}qk9G?h}C~;;pu(oD?@`Uzi`?aB+p2`bOqE@e4vDYeIu2EwaYNFt^RN>H` zFK$=BV28$sJHY;SVv1ESEmRX2>uVRJX4b1CzJj?X=*}pt-}i0h;$Gqn>}HJ9oqdu< zR_S3ZnCohX%Te#Z?(VlJ&(Ev{7e>xCA2HK^Aw>}KXT{7GD^KHzftU9{}T%RMYP1 z+6#s5WI2ZeYEx#tqc0&JKE=f)UU*%Qn-Awqm6kTbkWX{G@US>J?#$iTQb5EL98Nj4s{W5(cv^a_z;hZ;@S|YxD9{^$6;4 z-CBaY-47aZJkF!^N80}L{V!ZC+S`1Nk01Ct<7MQhWwtJ6M-vjkKbJ}_dRvvGwCMP7 z-PVEm^|vkFroZr*m>(1-80mTl>h4<1=omJ%@K2vUrCKtfVEBSx zU}SEo)aJoxG-#DAk*37WZ(?j#U}$}}ah4cOh|lY2`Q7Jvs^TwNs%5lQ-p_ZUDAP}; z-=Go@2v=Q7FvNYulzDec7!x#TT-w#e5n`CVbrdZp`%6OuwQMK#^gbhLRH&X;qh-|I zWXoBPmR@u}DOT@@P3~F@Y;pm|%=7u^sp0LV`Qdc8#de-=xH+dQO)EV6Tv<%fTzjz( zbLOL(anCl>)jBTU{d*n;&`~j2O%)A3niIzx!7O;yNYhp0f|t4bL52RTkJOYd^SSaO z6SD$-;)m~^eDz>M-kUd{gsoeb%DqC?=7OQjh}oCH(l_0fI`26jnc^Kdh9w@^|0+R zQXP185+sDe=}E3Nu^kBVG~k*b49%m}tt6&-Ay;|C)L)JaS(4_Vg2{ zj-c!M@xd>pKN{jDr9jw4dCz|Vi|l=Zz<6`@=&Pwqv(99GKv}C1_bJZM$RtxkUs}1p zV*u$*Q4PNCeS1Q}Pg3MD{YaOD#OZnjc_FWS>dPy)HL4zt)m9xRR=;pe`&Q%ex4~>jf}3HcR?Mlcm-4P@PsrY2S1|cU}{P{P8I=6R7ZL(&O;u_s>a9 z95lsmH&H zD=YR4m;dThk&OmeE_VHkxSj(n_X3rb`m@vu=?nv_f;w`d1J#zyEb{fa>z&Kxh@4l? zhPqDOO~`~D2rxn#7wjTWZH0ti&$9>h-4?)zYK%A&rxgS*n$F1Afj3St5zmvOrynZ- zA(<%31=dPA+=~bCqpS6!R9dso_3f|%{sRZ^Z+erbIKG)tGgqv*Q40(we+AsT!21xD zSZ~)tY9!hSKA(v+v;Li2OTA3*Z(-?|;!g)&)<_RqfBb>NNBpHqckoli;i|vr` zSeSCw*w_y*aZf8Pf~6Il-lV+u7*XwK_(U`;nVPv-hS&DJzKDrkzt(-ay1l1B4#87+ z&F9y}M!Cy_dA^h9eOKdbnx0*{`-eP0#Vk~j?A|@$PEwEKgZ3Np32^rF&Tp4Su9RQJ zAl@Q@4WwJ;6mIazQ?Qx=x2+yczm8O^X)Mb``A(WR7%ao*22%xf#it)ct=#AlTPrV= z51Q2?ndZlDgX~0eGtG~=i)E*>02;kYf@kKI1IeZ3HQyEV_1QjYRXeIfkD|(M%baP~ z#aNl+Yt`nq^dfywoyA=Ycqf%A4uXa~J(MZL$qG4^i>y8d14r&m=$+qu>GRB0vpEl5 z^v~>Ad3hxI<>Ow@|M=dyJ=H9Aa!hufI)vdub?b_k&^Ul*)!r^rDt(?qtB zrwUztu|2ml$j)9YLEYYp)7;!re^K*IYAL=N{L$`M?%COJ)6y*U;=(NAt-1_MV(|81 zA%jQfkNCM7M;y|OK6>r`{1gK5Y;pd@mIcr*vGnu_xc@9sIrh4kSQm7)U++^*#FgFK zd(pTdRFGl(YkG=?`GH;g`We-Bs3t^B5l<~(`=D&@sOD=mbq$HpN0JISE#F8lYMb;r zjW}aAH#c;rIDHSq>4!~IBR_1v1-T$f4t^9K%VEstdU;3waZ?sOO%?W?z2}vlC+i>DhevK# zCLZ98J8qhBgixnmKS1Vz_`KM)_AM@f0!xPsm8g)PgtVx#v@WDO;^HjR`swk>qeV8! zq%Uzg*z|SOO6qxfN|}$Xo!ogVpQt?HyteDz{)M`kDb|%UYvc5EVdXdKM{c{^={yq$ z7jIbVL8KG;7A+W%61~;h+RIjmmp>UKFM+mnY7xRr;-aHB?|TPaVN(We?MEiL(`6Qu zeMfJ-HgHOwW-8DU@_5K~=aC2!@vQb#ndm(JHY9ihgG5;O%|%$ZPK`j4^Nh_UUF>0H zm(6+2p3^j!qa%3smE|S46P@B1-NVTfqc2^ge4EZBCb5P^pOt!_>m=L4@dCyl<2={Y-LNl`$iUk)G)JTSsI&S9MsBU|okJ!L28Q{z zz4((m3?zYniX&OAecx)pafbWXufxQ}!qb1lln)<)vusVT*LgNPk@Io&0S&qW2bx~lo5E+zq92&+@l@E zr3!PG^sJ*4z8LuG(e_?SsZY7Tp95`oFBlEYUn1)T0SfTdyK996g|-?inTQS(5U?e- zy#D+por;Qvh>&o3WtmR*ev-#93Uf%y!dAsZk-Yn>wk*v_>(RL1snp#cOr5T3Y1LL8 zL6VHaZs<)wQRLrhOazv1Ssqo2ct}Kk8SNsdSS=V}qxjYdu$=8+`WRF^QA5d~jp2SC z5zC-LJPMu|7ExkD9c{JepA=++m;PuvN?oK1HCABL>eZJ%4@l)@<1ZpRTQ9YRq_gNb zS#EGxP5j`%W2Q;_y!_jYCu4DbI$0LNI}Q53WiTn#Ch1E*KKBtDSX;|sV6qX5B~gjo zMxp-z2a74A*15&_P`KEg!M*_*IoXrDB*kWfV??vgZB>8vKFTJU`j!$3ns4twkHVb2 zzaPGstZZ(M+tp1g@W@_5&``Agw}_Sz7Z7!MhLu>>5nXBc&{Y*_IpB4eW2uCql*vg$ zlWtrtjeXmp{pfno-#?+4ETyNT;2Ywo=#YoqLB=7CS60e;ZG3MUGVDt#&nK1L&}jJ2Hg@bvMGL?NQs z4+`7rbO|Hx-p%xzR-X?E^Uy$?;qw;l-)&`N^o?N7^wXkXgeuTZ6d5i4S{pZE2VeAd z)UlNCyzZ=h1+f!0%Ev4JN*;qM$j5jYqwY#<@-8HgZtFySAYEj$n&((r(vU<5!oAE68d}fSN2KRPXEfGrNKG$7hXNH*uN?fO2*aC|2~AG za#`uW|I%Oj-}r(L|2>$(Es6jCvi~0&gqcXk8z`Qn(d;IZf2UMIF^E0Q^~q-x5!D~Y z?9U(kn=%ni*el8sna?i4bVfEbUqD@fJam51-z4m`X#H=sJmVoj=sStW-)&t4xP+qG zsZx|WFT+Bkf0S_f2UehDOnz=|=i-jETM+u6btKYj%pR@5*abcL;h0-TX@VpubSMh9 zwy{wt!p&BeHjn=2!YFKLsUS1PDg%_42y%nP%Mnux1r)G0U2cm|hd(&~V;NrAdv`Ck z8?*Z(l*Uj$K7j9??bmvBPg2wQ@4gV>ql5KJ^-~!>!?XgH3i+a?iHtlhGm*ITO6r4$ z+7QX#^{KE<^N#8Nz*-dv-IyB8vR)jo)BW!*P?E5>+N!S1uWB6VA`r9NkRAvQ3i5h< zBSl!OrKxG*wzpDdMB^j5e|z~nwoT}7I<$UoO+86LS$Snq2RO;+b}K(fJ&T;*x>(aL z*DANPTm9Y&)C?C-=Sa>T&i|TEsJ7kmt^QM!1ZPvUj^kR-{EY8Gv`bTFtH~#(sb@^N zfdPwpE!-PJw02_enN@p#AG6K3|aG3euSwfkq_E@Yqs8{|z>QeOc)YvaA zl%PopH-ZdA3Kk0JUft^jNG}mlET9ad9L1%E0Tl@9Pztn+|Ash%VmkWrrzOL?8p`Rs z!h#mdoVhtilV@1By^kNhakRJya6jnE7j?rDJ@ejKT$?Nw*B38vTaPtyQ)yBfZVOABaYC^76{mik`TvZlr zZ?Q8zHJ`!{@Q_2fwq@~^#ikwy9ypg85cF?Mv=+bFG`zjNfi|2=4T7p5czle5;OUG2-W zXVBBk!NYT5w2B`~uPPQq`~(49GHK3%Go}wg;tm=U_3PXv5yTiRU0uv3kK6rr8 z;uvTZ08w|bO=*c|Ulr*z6Em|l(3}Fxaanme%Szp!O&gJ7Ur78E=r!m4v9P77WuvnI zO6gVYGIw3SUVqqXtLsCzpShd1y1KeI#Kp;P z^Eq3O4>6q`-_fXYzt+f#;N&nn&WdF4K_^oj?8*}{J>FkQ1gzt)j^DtexxIh_4r|+8H+eJJ<*D18Run$_^33C8 zkEJm7nh8DNn1PcUm{M7}xv5hCgapXoMvx?eR&Qv#HdvvgrUu5>?%qy&t0oE9vvSX_Y|9*YC{@dv&0B#~3@%{{v zrw=Twf=#`)9)?>@M+BZ!v$8Q2OG7Z^L%C;%3QjgTG8`;VQ=<=+|!xvV>c8m3F^YDMmU;&a0wy1?q)45fgj|D&?F>9oep zX``#FD}n3JUqYSRKbD%0LN}aP;aCq~oVSEe4*(JK(#;K|r9kB|7`j~m;tJSn0Ouuw z?xMgs4LM-!VU++4&eZrg|APm~e%C=J7W4~d*VZP1pdUyMU@0?@0tjOr_TAjv97wZS z!G%msd4M0GrbeE@B2K`iX!FAfG?W&L18xn;3yzA43Kk9I@j#EJEtW|@(i6}Ru!A{4 zn#$4~5Fe|(0LTD>k3Lv+&CSn%ehRkkwDSR!eE>D6qoad{h6WtCNWl0Jb}XpJ-M;z; z5U&7&g{lFFF>{#@(1JvYAL#rk)q8qya1?`z1E^LA2PA$2MiU_+Pq^gAj~}6-0;pd= z5}iKf3gB7y4-U$Uir86M%_b_gpj~~`9wf@4{6@Y!TAVI&pB3t7=Dz-Bz=H)Mz90+) zKq!#ivcHx0;Ew~R;9AFj?L*ap>N7h}r~0;lfEvM(R9To`* zNz*-fxajRWs8lIHctA)%P+eK6URqr3vU45tNv+q#)||MrvwYch{CGJDF>%^GNmnhx zlhkJA{@z}flYJ{T;f;9h@(##;fjZU;c{|gf-$h^C` zIkR&FOzinurOUu8QVOi@`yT=W+xNSH3_c?*O%>=X0J4CIoT}QI8ohc?B=i8V#E^D? zHt3e`-)Ywx0dNWv22jFcxFsa@DoAd_*nvRwDg5A%6nF**A#5%HLnjEhY{Oy$+(DYs zZ|8{y5LT0o<1GZlI}wjHOgONHFTf(hVaS2i2HKuG`}?E-+kg=SP=OF2_W`ow2y7O> zd;t_Na5E}77l1+otg5l8DcIX$uZwd)AZ%}KNy^Ajng9a^Kriyr(r~bmuZRyHdP*(S z%eH~G3-F5~2%u5s1%&ST*-8D_EPx}CtV5%tE&v7sa6P~0X@x-YpB=4`;IW8!rFH%E zj%L#&c8{3&+DV?$RhVEOgKv%B9v(a2Mz8J7uru;8Amn*&ztijp6Mu(--1*KO@-PWX zSgfb6h}%GgV|oTMcFjA4?{^0sf9=KsW(m8#10o0E!a8Q9$8A zufqX3Yd_cxfPCr!oIq02{iB@2%Ya2U1`3De&}|`!(5-p_ zFeObusI)~&;np9*Zh~nChBFBSfIjZ|BS{xP7ZhMlz)T1*k>8`mi^$H5Hs~+6wX?g0 zfdM9>pJ%cbpa@8T7r^KMveVMPv~&+}C17Xix(@(BwGL8burm?H#>T*9UIKLJlVCJ@ zdOipVhkJpx4$!8I9K#U~PX^naDvyvIy%t6Ukq?E zxH?it{o%tHKVo9y`E~;A$=MGd?s@Ecjw{r_ zH?_6Jgy0;eu-r9^YVds>@D$7+JTg%3JewZMQeA<)361#-I?8pQ<3O+K z>C+jQ#E35_2=ZQlc>+|fVb<0!1CDxlR(=3_0Z+#QV0SVbn=ha;nyCrwVcZ(30M1JV z(DmNN^mJq6TfeD#FEU)*GV?)tZm{1%i5m+Gjv)G;mM9HyevHE2p&{xNKwLUF>;Tvt zSXYo}H_sB_)__L<39qGr%y0$Th&w^1_+o4hiX(uz?Cj`3itbPW|6E6Vd$r@rM}gRx zm6dk53zd95L2?j4B7&nQw78f9)8q6|k+d005ztBV`ByGqMhd&YoYJkKM72jI0@^<_ zFHa8fBP|Zc2NAl?2)WI7W#d(# zt{*k;RZAM-2FEgx;4A@1{p@(p->l))CD_QyTFP~3Q*ce>iN3OuT`~r~68K->%8!;V z!E!ltKL$F+j`?+~Yv~-VM^pOa=#Z`0ywhimBKZS{fR(Rt~_( z1kh7K&(oK{Fa-dfYG6`C zS#&DE=N^Z%7P)yr_Cll-(43$Q66*)l*kE_eEiIA6Gim5W92Wpm$^))1}}CNz;%X;6pY$sK_s6V9=h&kfIsk) z4h|gzC!nOk%PFL?9Lh0^q*p~!A0h>E&jzsqSpZxt9ZLdCmzl6wF)%P-I5&59IXOA8 zZ(hBIYe$>phXJa>;N`q0;CKd)0mKCw5J14$FzSu}=M-ow-UyOTpOj+uG~pL4z2vwX zkfHEWS%mz!R=*x3HgN4e##Zx3wNDlrRa-RrY&T2+cn~D)3=2m(Cw2AuH-_H}y6sIB zdW_drJIA_}D=cOUyY6oGHj3X#6ks|n2=&t{v20!3!RtuGJKHicH*b4$Es$P4uf}j8 zvC$XZE>}PQZGK{A^k^)IMLQf1gwD(b3x%MmXIWM6uMFp|EiGz;A0*9??Rj^3EtjKVE(}}cCmH&wH*Y}GhII?GjDbT4;Ke?0^P09ckx=mzU?~8h)}Ng0 z&g(kT((SNNn_F6l2ne>0+>erBa0+x)$FSX!4YL$eo8h2^Ge=fNCctZm$3HMIFeJog zq#(I36-kXzRCN2+Eyb9i@C_Vt^*9V9@lS8c6L4-U#!7wzloI^ZbBeP+Nr%H*bq?Yv z3~N7sVelew^|N(eDmNg5T37vn3PWM-jfX}byXt;Ea zIeO*lcB?Pij1?F(9y_|Y9IfzJD-nW;i;f=66Ffl+4&t_%*qoU<8>!GBzr8xTvs-!h zhIk9aa5)-fy9;|-6I$vROMk-O7 zeg`4Qk?Jv_p_tWSi8^qiLlET*LSq%8dYBf6psQ34Bx4Wp zb&SFbUl?a*T(7Yeq=3!nXr&*)-~8o5i}U--FUR`7e0JU3-0CNPZ*FGx+2onm@1-<` z;oA{c_g4uHFZg|1_m&2;#q;%=Y7iD=i9B#G-vA*cS%191w9* z05%-Yi!)~kIKagv=670!(@n~k8~ZCTvH@)x`~rmW&cXF{5tss?wlJI#0N1rKPe%c- z9qcyj1|9IQz|H;3bYOgk03ZKuFHGBLCN3xsfs9wNDIo^i^nbko-C#bQUcLl6hZdZ4 zG$1?t{rh*WPNkBrt{?@45u8d-UTDx_gCDCXE^Z1(o|>8(C<;Av*+xocd(FT7W4um@ zKP6#oTET2KLo8)G(*SA>aKc=_af61E@@^>jbE&CwFfr;k!T9k-H}xfur?Xy9pFRb75(q=C zqv1C!*ds;U!dn41+da1h$W9{Ax>A0io{^eb3XqmqFM6WBJ9o$?Lyf71W2ZqxJeX)=axA1&wn zO#C6SdPn@ z%z)h#6s!e`1yFRY0~hac@+NE)h}WELZIOPE<^jf^`Io|n1Z-A&TiY@yVu8mEC#<28 zQW*HEU=zX8T*n|r`XEEKf66$o?)j9Wh)_NKtA&9=+gxd$^0%a-@Saxkl3&x$VU}|>^~Kmv_!NF`Zi_SGnwpr@dTu$RpNt(| z`HQCdpd5DDFCSw2rAmn- zZEP|bW$)W~qM8CVAan*@e557&H!$qb2$TyzgEN zM5O$yc}9Gs@h2xQ>Q!{${Iz0X+g`=LAQz*s%`15-#IYfnk`b^zoG3Bp`O(j&c1@V< zU&-rL0F5f;19BRy@7Zm?Eo|du4tI~lJaE=c{SSx6&v&2}@aKgipAg|EAy2Zkj919x zTdSz=eWIyU_Zw~oa{cbWk0ky-Q-AgURv`O-o;j-6%YP@~^x%izdebfav|p|GS;_fB z4Ki;VBODXyc@63qIo0qZqtly=mZLM&c^cNY7fAk<&^D*>PPr|9t<4`09BtpTAerj$ z5j!6&X)jR6QLl^mC@iD9!^$3{|DC~nMcxGYW1>BJ>G zG_~UB-{38e`w`w&74Kh5950O^CU>~R!XY2?;Nw&PUYXFoo%4#+)R30G)%{ja=u8l@Z5W-#Z)@49iPhV#vUNx# z$zy1bHzjSyt!QJl6Zt{)6U&Y;iBWobS#~Lb@24vl#u(N2ylMj@&ATW+dC_>>DCHfQ3uwXS5KcH9@z>lzNx^3IB)x%1UyB}HFO_nI=|ws^ux zuWNZ(P)vR8z2e!sq9&S-s8-|tH*K#jimn|f`DN5aANTJ6TAq;aea3XrgI z&x(@nVu_7OH$`ve12X-5vJ=Ex$fZQkn!C3=Ey{wHaSM!`EDrQq%_yqCb#Y`-KT?F=M}4u=*N9k@AP|) z?oGL_RClEtk@xM4+!pL=Laz-IK~UsTqt(T2GE>NVosGjK0)$LDQ%f>uTO-R69aWJz z_2*V#P?Fkj9j{F1c}5&lBxVcHg5VE(^eWJmfhz%$%^zApyXhG?PY_n2Ddz-%Yait6 zdjk_H2kYI!7mS&DIQyqZJD?u|LcLKcZ^3U^886T869xA{x8Ug`N!<*@{K5jT;ts(J z*uDSRScT;jcA+LmIch@hkcS?670mP;-CF4xGZ}f9^>1@$%6IH0&6m*Zdh#t)a#T^S z>%aGkW7L`)C<$QR=n=jUYZ9L_#(Yj@W@JYr@CBb?^=92mY_Ev6@M*qXJ=F6cg^0|d z^IA=8;WsDMtCdGZH~dp7WrO_8*5*nYZP=a5vQ#vE%hz078%8U7^3($6P}N?>Xsu+d zxkS2TXX6lk#$)}aG9*W9nvUc{nV^@ZPNZuxZGgLUFq82 zOgI1$lbxM`zOcu!3M20L__)RM=a`BRM@uc!Q&B;Q3FZ7XMiab^dfvtKb&%iITW99)}}& z%rA3V;dxcf@Zhx-!X0&CIj=ZMbL%t$!dN#Nx!sf~^u+eNy&Ym=Od*~T=_u4gJexT= zPY|!UN=>JvJmX`Alaxk3qj0*QVVeAEy=oqJO*V*1Ddt|nKv_V;q)xwD$N{A!0^!cA z+;N!balbo&OhNU0tXr-+buzt^Fhf%tgU^(<2K0=I@;eD z?(yEMW_U8oPkhUH?upN`4)-~W2pfSxPHXF3NxvnzI9gfC%sL7sPYK3I6Th@7cMQxe zp*#6Qs&n@g#S((r{K5+#Vm^5`FDQAhv}A}p#ruHIG5AnOwZzYCe+`@5o_W9Sl{&ws zeWa}XMbpgmw1l#BZmU779bXt89XX9rUA6ZwIF=CDgcL7|duG^o1vDcfY1V9irk-LK zs^CU3JqTyfD_>F`;i9+*_cUXA1xcjiY6@;wxXt9BK`!h@n6aXW53~g-mUr%#K#gY9kLMM|xiXl=~|c0CAUfd4WBq~EHmPas}}dLK~Fudl97K;95&ds~eY&kcZ1 zX{4)b{by4ku)9N%BQG#eT0!B10KDjTH^4TYnnLnGLI(7M)CGV0Q>5edie6!nJwE$6 zR`01BUHRPk#>r0Y%h{UhOvFH1Oqob-MJT3k@_yNy@H$+{$}nj%d;cZr5T7*m=)RdU z*3rdd+{;rZb!FR$hnG}G5A|E=irA$uRjBo4BzM!KJc_#a(}5B(kXz+sMd3(3w##_- z!k8O#FEdxWV<>B7$HM*mNQuNvw5}4Dhmrcg^+lezN$&M$grU(cTYOutfsArLU%7FYpeGVja zpv&7hIOqsf4tTFrEbzRgAjqFjR1{`sGlaBMzxaKRKSabDXrmz{2M)r5f`ST|Ca55c z+N-Op3;%hMk&%_X(^a_7$jHdbisa3PhzmGYk0I>`>n3Bj52Af7SUthPoe+jXkxB*u zN%YmgpFB$MV6uY9goWtnT3cGgb#*-;PX)BU5oFL)vU_kaJU9r{>WU!S0^bP!#tEz& zkTU<0o(_3TwFDUhbV5!ET5PC`nOj(FK;8#5Ri#*vn%7WYlc2l@$pX;-1J*@QdHLiw zF*zB_3FRG#RUxNw`{vF2DIm`XkscYpQ;@9EJ8y3Yfut$#VZu!WLNdeB*ccKFG?^+$ z$pBb6Hh<$f6cY>kE212-)=mjIjsBn5hOt7#jpO}(9M6dIGHs}L<#6AOHW`A$;(IrO3$m2;qNhFKqi#DVDC6z$!k6QjEqS(LLH|G=rAqHZf zkFNN31g??PPW*=kv$ZM~x}}S)DX$y~=WM7kF?}=qUY?(DmJZZlvD9G3t~^gp?lRHo zJ{*Az(ILa45J3IGBfpDLPiwl|P zfno!+wPwBmc5*|zul4HC(>J%JmZQ;|CLIO)+6MAGw#utU7r;RYS$+P84wHU2&A}bE@k&Oif7k^%j$>+wB&A z4w0%}B$xk>uNofH*&TAdd;-kHGjjA7JE<4AYBB4-V(RsSw3n?dnP*7cV%MH_*eE~Q zOq1p;@3XYdJR0||Fd=Q`LOZ;Jg)q#N5hAP8*~-Z&E%YAU%)TZ0xb>SGU4ZY1_Sn{o zj;(!Mxu#DTo6Nc$XEl~6AqF{)k-izSOr=8tawngt45A!&iv}hR8AZd}4aCWow)wD@ ziMpy|v)UKAO9z6w+Uju_h!=Ehr+nkb*>%5;aj|5}1%cdZHo#V!-6&-yjzS zY7tPgP3SJ2U0r|<*mK@b=Tuec)^Ef{pU0r{(?|zt2@oMYp;%28G zYEJkQ+b_uKQh2^p&(=f_j*}g@W*&4s%8vC{x4GGFjyevWvLiunhK2uj{AonY`1hCA zMsstRnj~_~yY-)v8W%}7o_<}&=53SA&nt9osI0if6K2ZIo|9UT(?FUim4FNDMaImD z@>nt~V}DqUcx13jiGk?RMc}Pq40nwaO5N&_ek{*A@P#*=%1M`#^kwyB7(P#FmBo`hlWP)?!uBYQzkWk#U>vXM{E#^0T&eWSN3HI#CUpADVupP;O|z+B zJXe*Wi0*Irb2-A*g}q@nGMP_OnkOaZ>8c%aEw4_Rn;oF}U+k$^7AYvjDQoOZ2I+qZ z(7l6Lqumbq{P^%(5#`aNM-*Z~w)XZQ783mSttb@YQNOPt1|UuC^z8`BEXYhVv=Cz`tVa%yA&eDiLwI7b6f7};gA0STL@8_UJ?ig zy+KvR9^riLq5bsnJ91fo)=}Ml36$QzAbftbNXEdx0CaGqApoptVZNb&f8r0U__y)o zVmKw0m62*@a1_RHn05gb!^HQMiT4Q|nR+$ejt{9F zDZ4U@)(;Pz>5gJMW64ex?qB42c=ioHKG%|uFP`W(u3WtEIGUbQmfTuvdjByXUZ>}~ z*`x3`-BVKsXFNZ9X4sy;4diF7RM9lw`NhK)qn}aU!vE^*%=9@~9>k1xCBRb|6TpD|I}^x(T@2t@hi)h6+^HK2hI0UlI-D@C&;VoUpPc*vGdd;)N-Xk))FfP7%*iqirz(0fBjn3r%ir?k2w4oA>}J@lEZc1>08bS>Has&i<^ zfnIwx)yuE%Lzxt4fH7}gT@I$E26+qaSV5?&LcTms$io$mILNwNKxYS(akB^nkh@=` zF}d+eb}`CU3OiYB@;33_i0O6rj?2c_v~5zCL~1jJ$eKZ419%A_ezApW7iciaUx3H3=(<0`{_NP1FxYA5m#mSIkvWJ>czON&?hmo^Q*gvvn401d5rJwc=!6g4NO3*H6AgaE%EOah1p+Z)MK4x{ zf;*o<%hJgBcx-Ge)??romZ3H(%;M$oaqamE#UdoPZfR-er3;l!mF}D7Nst?V1T>tt z9)M?0J9eJlteg?0a{nFBbRGbwKm0Pu)c{+tGb4jmTU#5F@X&(-1qo81O$PV;Z?dq# zRLoaaSU5@ZMb+oGx63PXz(_(EF}JY+(p8i^JUqz?hsS#sky4H@h+!0{AgJRBm4AJGeb5;q z4E~at`P|BCZEcO|?oE1qNloxto^>bGLX!!IN5XMn%Nqx5+TbBWWwAbt3maKRfhffM z`EyWc_q)q(+C^;6ixR1S2vR7pkp@6RPgJzAq@)BK(BDf-6E!a3gf~S7XP{?k!5;Xc zLEfunaR+oO_CQa@*V}t-s`dn)0ggOa3t+M8UT%@c%aQR|6Tkgx>)Pdjw8AQ8je73#RJ$- z!TADE38+`xxpj*!`%M03GHxx1wW#+7L*tV{@hCFvhV~=A7FjvD_kn>F@4mORB%Zgx zWo|uyWeQH#dS6;QY)}}2?x(CERi?e%7Ck_84h090upxy~A8c9J=zBXm%9$#W`JaiQ zaD4)$Kr1UN@cN;c_-kfH#IY+s2HZku#Ds!PTU(nsoDt9*^|=fPhtr_41*tU%KhUlt zt86eFY;0^0*@m23tf)JHZ~U!Q~+Nww2Q->!5y6(AAdjX#lE$^QXU0yT9JT8~7jTtIvT@-^MB9dha@(y3;07_) z<8uYnNIG|bmJd8QbjUyjmW_)GC$I@9!lC61IzG^|&ho#g(68|SseHY<{^+fou~Zm^ z;!*+8!Navu8u66-?^Ns!9_e()Y)eMfu5+|26fEmwB_3kG9@aLAj9Lz-5(G|ULInWk? zya9O4A;<4i41wA>f8%Zp^VG+YV+>@qD(M!cd}+1}o2lr2r1Q`6%A)d0jn;gDE}zI{ zrS~hE#q=(tE2Kq#`38FqHJ)4S7S0pw;4_MusIQtUX`schh4i+BnWp6`MsHUnaQ#$f zahtSQu0=tiS7{aCM6U7yHq<(wYxS?WO9&}+y1$^n-~PU0{x5{k|JHxsDJh{?a%B2to<@KI$^ zsltHdfA`v}X81S|W#VAt5~9kk@c%6ozPkQS(;g6h=I2k^@3e08_w`YQeX9z&mGp4L z^1X50({O(u~TCotiBFsY-mXN{`XFW;h#^6X3BrwF>EsJKc{&o zfs=K|@X4mOU5$j=bYTR>e=~p_faGfk5v8+z@N`0O?^&Jhn6K^8y|ex2@T_4zk;bn zAIxc)oQzk03^AiQxu6@sAILcPLm`HUO0XO#%?OKJ8rtfln}O;GTjE7&NIk2a}c0exOwmo{$kf6e#}| zwqx_Kbxk5Wc{`vC8h7EM10#roJ1z7e$%mUgw9{T6e-$q5Pt*u>K zU4@QYM0!8CEWDrt2_~T5tfa^Z*xG%MhoO@Ka)eFazpDs`&Ck#G^e7Z+=vbbBM*$j9 z5XsX-wF5`J_?0Vf4f)=5zeOYyy3id-J-+k+k)!b5CR2GDlM7i}9H;@0QXZf#;LbzG zI<(6}_p|5b%wgaiqkhEXi~+-z(Q-hrfLCgjXcwND`>Igkhqli6hSO;b~zaHc`PF;?xI@0u!= z1`Q)4kQyT)A-VMcEToYA{Ex+`%P`TYEa?hsUXOpgHYNXz(&qab1%=B7J}N-E0g8vf zpO0*jfs0;1`>3Iby}dnnJ}_92;jTh@;I)FRtUb`@3tcaeZDnI;Cxk@>EDjGq%BEVQ zr4ll2cOOF+Eo8a8A14O~%R&amdc9>`{&BK`M-Q|~Ly8aXX|E1?AV8lMG$5ce1{yV> zw|K0^rC2I0>y!^El?^UCgy+z91Iy#dTj3W=3Xn4aXpDFeerRMQ7oZPdJpE!a_UnfT5jHn)ESs_}WAzviJS+>m+Eg15gOXJK~2gU^~9P3przGKLLb@ z{*XU3pv%N?wtoBe?fZ9QaKS)Zf>x_ihZ#~q$*`Cqvv*t+;b@K&qd(f{B325S*moOAIh<&CeU}$wO-P2)e_qEG^yL-7|QBdE5|6fM#aA zmLmm_m^3T}Cl2#*fKan7FY&S{ACL2LQ#Uxdu-VA)@LJ}!(9qG_N7LFsL5-cAeSn2k ztK2#sJhtd)%}(=`-Z`}2nZqtm%E4Oazg2!S?Xh}(e}?sPHIaJmHlC)^^v;HN_0QG) zrtbPkMcRwQ9-Jr&q8H4gmItvc7~k_NW2uz6kA2yoPlY~7fffKfY6_cd#h|YF71|V+ zp~J?$wX9Z#y4vfaE;~EBtc?4?XIOXdK7iV#VH2}XMZ??{29H;dqCX{wpt(wEhKmD z-+v0j2RHyQP#o;+x6#p|wFwmI)}UMg3m)2qilB!bRBwm{T}#4-=fTScXo5zGSuYeO zeu3$OO$C?Dcw6sr;so7;a3|2h3|43w06O3XLRT5Q;5g3G0C9jsuX7i`NW6P@6#!r0 z^5NB9j@aGZ1;3O@vxt(OzHNHi3*^SZoWgODIyMCkCIAi=;(h><0!%!zQ|reM36O;| ztUW-g&q9g-OdJ>&*ep&PQ}Kl68q1lo;8KIT49O(;NGzYjvm-nj78V;=yx^%yNJtcv zlz`>tE)`^F?`vsU%+9Z?f~*HrLSUPJnKFTN6C|_*Uo7>2VS~IV4`_2#>d2izm%2GL z^Ff-Q47M6XeCnp!V8IBHx`)rr&AXr*`}jDsn{pw7WrbM>32%Est_YUf(vtD**Uf_i z^@|ta^ujbvRXGM`*}^bD^onfDvb8PHU?gRIiozwL)Cm}mnTFS?V!_AI&PFB(tSjmE z*6R@v;h%vuf*cu)$3U@(ceQ&Kc-W8qp!ISu@>s;mGRT@5ZNs^FC8AGNd zG7AYInL;EYV?w43sgRHqnWxN_A(^M7l4MFUWzIZ>5F*2SuKND=yN~1j?fo9_KKAv^90zOU&#uk#}Jfnm7=x0X19ywpVCU?`?6kZ#{96m2kX*bPsC&^GklH3$4x zJ_(bLp~RPvFo3=8;NXA);Of%!g~k)INzG`g!3#zwF)S5-BHa`WVO;hSB_NIdZ=lapPjSs`RTMgJI0K7Q4MSklZBov)0%)HqCXb)?pQ zZVReGi;YWe5~ma%gGNglOY_;(|nQzuYzEug$=BBX>3Uu&bOZ#iz#cG2%+WGC9ZD|im+c+F0Wo2QGmg0;-^&YDs%)BPYN=o~x6vIrvW|2YvpM1#Z)jYRT#QU!n@{QU2@nt#Mt7!2P)$o) z8*qH9~3A@JjX?Kf*DQ>PV8YCmuJB!Zb;V%!VVmK`Uv&M(*`kJW2> zKQ){&&3;n%oJ;e%jAbgK)Xr6oXjK+5*Mo&$&6Wknb~*{KE!>%DQ6^(ztxz*ct^G2_ zuXiY~^41CSUt}c2eVGJy1{@7g3TAKmLx-?FFjw)bwM|WY?Ch!L^+l|qN?O*M5jxzI zWMmV)<-$yIV173?W{>OKOI(;n&W~Uyy%K3DaTqd238HQ2uZ@MBx^Mw=9iTmpZZb~H zBxJtSd>z3acD^&}=a9Vc-D_oT{;jifpA39#j(#cgS`8pm!WIks1u7YM5e=2D8O^?Z zxz?Qmi*FFLXpf!o-;u+3J}oIpmb4a4vAT!6-T~<0DlERDuKpFS^be9|%q1ph>P>Q! zn8toWT?)P+CN>rm`3wYhw7{Oi?V^*jcEsND#r8!r&Cdj_xK(BpmjJCzUIm|Baovv& zs}~X;J~lBykTl2gC@CrBW~6uduMZ%966ECyoh+YybBO<%bhDeWZt;BHbHg{S<+i$@ z$dWOkyQ=jv3s}2DLA{@5drGeZrpq(EFqw(v&&;%{O$b2RkMtcr9@U1s3!{M`#yL4T ztq3oxYZ--;=XP3$Dy7UQNgI$mj;1uPd_H%%*J*v_YJ0dRoBrd?;&snd2E<$nt-kM{ zu5&Xe8*LCZmTpi_< zOJq#2JG|j^(76f%A(tJ=u!Am$^dG6^JN~ zTYCe+d24oJOynk%$%$jq5g3Nw?#XlFc64hN^zFi$<5)?SNZOw6tBqU_ZUVzY>0C1U4ym`{m+yu5cjy@B8{seD)S8>0V|tLiE0 zihn0xhK6dfWn$gTlVNg}5tth1lY}{*;Hy6#%D36BJ6TV*_@sK~w;)4yR@b=0>b))7 zP^W9bjC*vrsb$h@&X20DB#+%!N{o||a{n#OlPFiw#<8T<_2_r!LMWHOgk?rBm5hS* zQq8%j#cz*W)>UFNnvsU4YbK8$6$+F$7nE5yTIL@*7gTU&PW09VhtKWjMZ$MRP1JG7TX|X?Z!FLDNHc0Zebfd1$?MA3bj} z3W(1AwOtUtqgK>Y;U@eSU>d~iTa=fvBqP3d7!d{2gHT(`LzXzz99#+b4H36Xvb{Fw zuSej577z3oT&kEwMsR_b@jBSm#(!VeuBmCqV!Kv9l+vt$2}M(=ipov3R`_)ox;*!l zdE;f745n;Vi*QF~Zz@cRLU$Uz53{Q5;XTfIf{c9yJ#oZSU~G(flNErCn>h^xyHb7j z5JH?v+BZ2b)7-+slpD6mFcFhpNl7feRfKm_KqkNNV<-o);S9BTj-sqvBE|FS9+oTi zz`tRfal6mg2w*@Uv{qaG)lge|2VL(7)cwQm0KdT5ZZm|OWvuF$?U~Tmr7$t+@n)7o zciw^(|Mso4#PLA{BiuYZ2+pj2QaM_uZ}W7!n3Tw)BOx^O>)vG1CK=Ps$7h@+X_Pka z)Ow1QN~f~kq>xgb`DE5yr84wkTo+=x z7wq>?Tx@S?A$A7l8r=9C!x>Tw5TXDr9K;#i-@dtkG%#t1_E_N9=pEtN92gyKhhI;; zzC{VeLgGL$ybFCo$er*)0nV5BszH4U=`NADfS57t@TDAe0zzv5-r)$cqoOk6K90gJ zVH^-jjqa#sA$lyn*}a7PO6h6{@)m;<+ku*+o{s|ph||TeS%4#-D9z~tpI`=g|A7OG zIF^9XDH#MGQN6#BkMY@r=dXdFVhu#}pq8Nr`iEa#@Cz8ybA<#AK!z*&c8B)WpO}87UM=BF(5X z{)nEwdDSt_=#x|x1+kwS9cMds(>^{VtXe^Ce~H-D+?Lsapa;7jS)&9_7%_0Ts9c9D z2C)Wd6WxIW=w~QIkzY?w4`Facu&}e6+aJtlMUqT(KMQxHS*cUN)fyW+5vnwK_F0!C zk|BJwxaYAGRMX7$LY*3FUH=PfagtmJLOuUgY0 zgDdw}Z|V5@uxlZfLPyuf--s?Ghn;3vfo8dde8EI%_uZt~^FcJwE~TgVh>LDDSoiSo zXwz6H^Lek{p*@Y6>$8=cadB~PQ18Sw0<@!1DS7zt;po^H3dOX&rkG~eI({$j{WsKQ zl(4NrPw;Hmfomr73BVW90AVEcI8D}luOsVJXxb8Fcj36ADuUz?FyVb^{%dbZpu9mv zN{r^wgaaS|3xjP)7k#SoFu+KFRhXElgM0@%6li-spiTng9V1|>RC#wD0V&8XvW*O1 zvabm5*%OG-kkm5R)D{@GGcyD876Cq2`mQ~b=yO3pj50XLS*8f>u$zoOJi?L#v?ih? zNNK8X%oB$+!g?VOMmh@S-5v@G*n^D`CzE2Bh&_LS&o#Mvi*Fek8z&-B)YymF%!Gzhe%aYK zVN}>J#wn8$KA)ms`q0quSUzdx_ixO^H9~wzoGq%$hHd-}6dcfuFrJi$C;R*NYl~5y z&%qkPcaFlRlA{->0VyRzweFB~Y#zFn)|xKBHx|xnG7cRk7=^Yud)_ zTC}?XC5wyNsb`vfRjQ`uRwZi;g$Ep4h7d zK@%J#SkJWhW}@N)fl9vA;x-^j+me9&_AfQSAQ>v5mq zUt4`#FDN`Hi9UGQOZCspY{4nJJE!ewWIk01)|UNA5q>}Q)^^thVMAt8N@Y*iW$mcR z9GS+4ZFa?X`Dg?=P(Zyd5Q)ML@L~8hNSNGrP3&S1kWV@y>cDa447h}!!RP>JguWk? z!s12Sh@!?M(nIRo_H>jSj$DphF0=k9RnI|P8mxbTCg=D3b-H_-KJMRIqA6Z+O3Iaz z3$Xe7?+%quV18^V)qTanO2@*}y{##^S^0EiZ=*|Fc7c=Tip;yQn%35WZ(qe0Um{LF zEf8?a5oIv+9(CLzO1P=jq#}1loemhn3rQ{E9WQJ)fsCoF+i<_k((*}0 z^CUKnjP|~Ia#!9uZp||KSC`8Vl`!PiN>zo&(v-K7Zo;KG>T|U1)6Vef*$*1m8Ag5SLYP()ogO)eSvm$AKdffr*j|s?{Sf zzlP)@R$_<3MC+tkwPqgGitLM~3uigiZ1QAX#_eIIjV_%()qF>0&*E~v;n*kcg2>z5 zqz^Yv%^RC3e_pB)@w;Px;>||~y54;}zg_nKEA{_eA+$^1OPu!HHdDFZ*!T4Tv59=| zC<+E6)^3AdI#>AEx z3gOCAJ+IRa22lxYC{4bkZ(dtkO>E9CE;DMwIci6|omF~g z%Kb+5YJVoW-~%apbi0-{9abItSdYhgt$VL?-?_ki>T^Xc-;~Vs#QBP0gx3<6fa%0ktUXa1=%X-OD zRlnb0i`|`?N`Yz9&urcfH1>(=)Ju}}>z_x4wpu$dbT-#VsAiVTlV@@n`jiKme>VJf z7SF2Z{${t=4;c}WNw(G(Eu>6UKUUo0{rua7(z5SGE%ZOF@A=l2-ckEu_uNWfdsH>0 zXtl2J+jHTfrE#M@nPfYT8!xP0u?l;wCPH2P^;5${wj+UFG|IN`k;$Q>CXPZQlFA|D z_VhznCcco`oiqu$wPKO4{SQIYyuUN{({tAIiC>H^zkXxSB2z(T^XkNqmc&as-8`Dy zp0=kcoBd0k>TzopsRhN=o?V%OGOoHmhq>%elnz!`1-fjip177#d(7LNDttp|>kYZH@W6%}K}GQ3>fy4FQqRZ=BbW(! z(i^k&&Q8yy!iqjx)5b296evVE$gr@A7}|*o-5QB)aE}z=G`wo*BHTweTKk;k%3As8 zgXpLGLzvjSUGyycP3scqf^WU%dpqU%cM;PMZ58sOn&(&H3I-4x#t>qV?h?Vywi#ov zO>^-o$$FMcw;O{>SyY|zm%G!J={DxRulG;o9h_DIZAYXErJrfPc-6BYUy-7gFv&Vh+gb5i`(|_9iL4Cw_yV`wtnG_h3F`aQSLxj; zL&Eg*s98BLN-ntS4g1RMy?ynNY|)l*UQWliBuoShj#bFnuQoansblz;u`gsyyChT^ zPHzS(R;)#aY&ikLWqE%s?NP(C@Q|F9D6xaDERQ+-d*r4dBoIo}V)KiNUcP!9S|oq; z!c~VT)(eTx!{&JNn~hGIZxyO2Wa@rkxIg=yo?7pLEo(nkyz926e|l*1P{3z$Hu-_0 z!G=fM#lp?=f@7Q7`=>os_5gto=F;Te8Avr~QQf^SWP$f$duKsj&Q!g6V}>O^P)q&A z*_6aovT@U^YmKkv63XJaRyup{S#D;M?o-^DmeTkk<49{?sQc?@^82G*2lnQuy&UAX z@TOwny$vf~#b=+SzWdp~gK)3w#=8#lS1Kb-T8iDgH|zWBw3=7x(7v)Uk5nAE1)?rpyqa8lW0Jsub!@+be&b zWxRBJx5S>v;G)G#?JdfLMJcOYwB>3}WmzdUtNp%de#v!r!}L@9*J5?P+te+-`W{&F zyy3=I_M)#Rzw-xu^rv?iyzy1KJnQe$NS_S7(@*(AdmCWuM>({kshObVY{I^QW4|A?C9)Z-H6qhdTx zT4`spZfKpRuQfRyo9tdan{d=cdDX1J?M^VdYtCN@IO=s=~SDAiwi?Z{bi}ZdPXb_0!`J^&f zFI}yO>eYi)@*|7?1ylc~XwJL6V1;4C8j8IQE(={`majgur>MOY=sZxI7qZdX9;)}4 zic66hu|73H^S$wxJrt5RRh9legL_?JadEup(&H9NnHT%|+#WFv5fC079F(!lpu5)< zxusEa_*CSl1V&D+l81laL!wq?d1lAkD@--hnj$W1l(Gi)`)Ujk_ z8y`M?4C{FVqzZYLR>FJmN{_R%tH)z>VMrc-b%d^ z+}sT{HEHBE*-%kIhT~G&g5`UUL z4Q#*)av8ZO8O*-1>foKc4X{oA01@*|WSi|RKYw$1Y00K7 zbaz)L(oolEA8DrJ(PMq4P{#=>E-(Y_Zli{%(^JqP!Mym(?(X7D=s7wLcn>8L zy#}Z0NlDb2(m&eXq_H^zMCI_2Bj^esWdiJtWKHvOF7Rl;@WEWjlgv#`wI*kfE$3ka zN2}p}(1ou9rUvSHfUr<$Nw>k=O- zYw2U8 z#6YQy-$_MPRHWOXL~$UDFwKAF@Mjci>~G&LEGQsllGtkxL>tjnWADZ)i_#<)gdC2=Y;Yca78V#U&k*M zZ`Mjp{}lbaRSil#fSPfb+&w&|et)s7et9Q!a~x(taxW5(QfP)?xd}PM-csP)1hz`t z1Fk7Ug9Jd-($AmiNgPvk08}I-B(Mv>K@70jOHQr?NxY7i5N`Q1dF(N2x()GCQmm}W zt>GqzDb0WpI{sWELP9t`5FBcF`}Q8y`)mB(GE6}=*K>6WJ;pQ6l9RmHKt&oFEKssq z#u@;@NTHOw)$uYGtc2bg+Jgs60czfterqBCan{`2lZ6tePdmPQumeyIdk6%|Iy66T zbl<8p0P2s!3%nns6QGuav@~bvt%0loMhOc`5~^#s@UEsNC|6#`y_TcI0+t67We_8O zHwyRTSc8p;8r2kfQd%#)uc`vThpNIMdioNZUQwAxG6_16fkf*1@S!}hm#Q)PJZUG| zUoGF1*r%>OBgdC+n5x_2DLI*w~5>G7W?b=g&_UzFr-sIGz{f-hnk&MA(I68 zqyX!qmVtuNUDSCqq@johH9EA=DAfJ7k|wQfY(#hQeN8TWQ5zTxPELKf*L_8I!5_RR zf;j+X7aSc8LzK3vs;Y=`M|Oj9d-n#R{Rip@v;l?KQh0UNs~KYDh>}^TOluf|AewsjF+mH)sxRLxC^dByb_*y*Y-A+oGlesUpMarK zQGwZYHvvEas(OQxvEH64Y>suXY*1W3wM=kG2x0pgv2Mx30~0Mrdgtf&EsjyZ*U)|2lW(?{$z*P@8k`9S zXXn54pZ93ViP9Uy$pC~ppSGfctMSPvy0DTe)_89~zP^+^qMT_T2nqC^8#E)cbLn8|2!h@A21@ z6gdG|GBFtjnFV|{#e-=rP_SIweo7|cDHTFb8)QLG;$1IXB+V@#=$}a+6J!rr>2>ZuB4SUB@U$c<>*^XC*MAPkig^75S@Jxo1**ikMq5wYz@CFF zQH36})*}i5AT>gUD!q-~-wz^F*n%K#xjy`~la!O>-cBN40M0IsSUta#q@=Qi7-`NV zx#CRXLNC}<0zSd#fTynP(O6#(Pm?H_X-IjBp2A1w(ugcr`voRmYiMU_mCBmr5fv3} z-368y`E`wOiwI)tY8<64itJMBzgjLzt!qwBj89Hd9u&ZHa7IP?&6_vM>A zzRP0uBPsE2W` z&Xp_WCimCY+%t9?-Ry=_K*5)Y!y*~e%`oizF1*aAQTFJPU>LO5q ziNN1{$JORFy5HS4VVCwtVHLhE|N-w=xFLDIUN=`p?(9M9i0>xng zPsMVVaegP5cdh*XbtTyUmkmA6k%CXe73%Lgz!y@>)zkd$-2h7G2pn5FI{2i5U=F1B zIP-CHzs8@VH%^IGji3pq;TXB~m^UbS%>4YX1Z0nRxVyv30IRyB;k&fF4D|mMqFdb~ zbMOVN0laNnoSmH~6<>UFf`Y7Qbdnudba34#(tIwawVV)XO zTv>$DC|WqQ=U?E94nZW305yxls<^SXZ5`lV_*1^j)U)2x;Y-9c1RpuUwfBf<0haRZ+qXcj+voNlLb5Io?h+c?2j*NRZ)kyp14b&L3Ep98VIgzq z>CU~3Fq6tWn^z^#c}VHog2NppS^#)WM&>;%381YPed$*fxp;Vhu*l*FWD=^hK&VU{ zZea+i#dUyX>bSoOs|U8=YfulMW)FQlEEZNA;;q;`L`8RKNrNb;SzM>*I8t{2y*SSl zT6JhI$%9?t3UdR5uito~FSHKeJFKoFRj?k;ES!DC>(|~g2}MOqPz!98B9b-X7!kGe zhVS-y4_<`Eg)gCX-Q9lx@Jj;Yg~V~aA%n1#6fvwoz75SG(!vy-?s=eiAdse1R!ZSa zg8R1qOQTlHOp>$c;dM|b-6aj-d7$TO)2k=ZkTX1?qo)Vm3GkewtBozp&DAP)0bYIs zVN^s>{E^BKrenJhra51Nl0n1g&(OzygltKU8Dm7q+umQkp5KWL1ETeQKe=<4X=6kk zCy7DV&2AxJki;PYXQE!feZr@=b#$aPn*$ccs!c<;In96tMG_@f1f)oj6P*RoEr5y+ z>Hui(aGdG6gXVX~!|EWHbM>FpSf5EwM-UFGO=e}0dGlae{M`%_AM`6BngTmR?G_>t zM1nX+&lOlfug%Wq98XG2L`uoP$QbwZ=}*LQ$VqXajBzwj;~+*FI6**-O{v-1hM}7Q zcge?>18D^G*G-L&gG!vM6B8P`2!NXC$rw&g;_?b5sIDPS0uTql8wNgcG~4>Sd1vX$ z;*o9A*&!%g`N{poC|z|=?0De^0>qXrTcAYvB2JZh|9(hwqUCF3K22jQ$vt)(umBN$ zYggXH1_h5*XZ@jO5F_B_)n68lswTKX$Th&|97(gdF%hY$7gQJ2TIw;-aNOm~U z<0=p|a8)WxOOu>FeSKONp$yYy{9^9o0W`_DXxGFDaIY^m?i4sdw$9H;NGMmzg z$EHBMN}Npa_%V2(XmV_IVh{NbvJM`s<>I(rAx;Xse8U2 zgRe)Ud8_(I{7Xs~pl1V0n_J(J+ao$YgObfEW%3pyfk;H0L=2J%5BG+d8TfIOzARLv zlP()sA9sZBBq6bk#leB}4VdZ}JTu`?2EO$1Y&mH1snnq?giwVTRl&BmJ9F=Ok17GA zI5z9~DqEe8?V&>_kbpqOEC<7`22}O7j{c{d{4mRAbnDy1d$=;7J7lB#BkA-S)<7SwcAp80!^8{a-ypyXrp&aCf<%_XB;ZPzS~bt$Jk zIv&C&L=4{$qL~&8OTX{eHqY9&w}o|T#*Ar)8j&ZJISXZkVM;ukHC*~;@v2M}?n_{(UrOX0NJzd*QBzY-e&=XY+Va6fp+RZEqEM$&7G z9Sf#)a|uV|%oHvc6-8KdT_J)>uSKn!tSCaD>r?%k??a zh=7F$_npd;LuzN+Khe8IsuwO@)&6q((v5_#)%Pm8df&D^%6_@_{}~tV8aIC~o~V$4 z9dw&nh>!RDjl|l+e|(lGE*t!>pmpl1>DnTf^ZNRa4iSOfH%EJf9wbn@XT-&x6zM)X z#yVP?{hOi1z~Ows_scIA5T6lWg05|P`>qk9@1j$3z7Y)@5~ zYqe~u=6^qBv*&cV;49q>os+{dd5H!2{r@dOjJ&_|@^7j0H)&&?%t}^b2Sz0tUA&*- z#zS7FE)}piQZQsFVv zIrI#HF5TuE2ckQAABUgN+F7~3>DH~HLFM^=faCc23h!21Kcl6! ziYB>pR?#im(u?Q$hXsV4PER@t%*nXFDK5N`>!oVfzQ?vXrSBWK)>luUg(NmREmXTH(EW*#knGOoK0btoi6nrYh<5}`e_ol(SPzB>Rg-~R_N zpQ(7RPZpwT?#()O;z`YD_Un*HJ`MJf`U`tzKmK_y9%*l~`;BYB{|mx=51PRhB$C=^ zk7xGo(VNIOyL!?8AEVk(Z7>(j*v% zmRn12w#?p2qfv|BR(@zDeBT|*`^?$WMx|qct``zy+7xwGO}wj9m6G3ZX>!RZ1$kE` zr}$rp?Bn}yAZV7PXL>In3?TX}xsUlWfz|#1(}(J(9@RBJ#@r$$$NH{VT4mXu8aHc` z9y{~zxZh*A4Ct`#6RrCpgTOhaqi=o>@i57~O^sg^npR8H+Eip0o%r45sqdf`y%>LY zy92{q;n*&TrizU>*9_>YjKy9)t`nc@J^=T)jtpRrkIkG zGOZpKWg32w=2tped9ry!@ywZnKntUiX+L@Te>!|eWF;!6H010Y<$pv+f9huB!Y?F; zkR7)yIj0jGLG`ueagC|AbKV^fO4)dgQPKxEBfK@#WzloqQPuT5s=PnAhlw453Pp0d zkyVikCmc_UXS;|Q+xLysibl7;74WuitGw(N#r^_^TzG-nXYy{wu$l8Vbbm9;X%0UY zJUy=Nqm=RcTTMd#)6B+1-{S{1zPxmC@v%SPtH|O_Zx?x}jDhj)vqPbJkN$I!()%xk z5Ic)6dM$-&%@KZZ4JoGnsuQzoc74O0WK|IrvSsSTiAEzzJvPr(nHP4Vyqm34;@4G1 z3Ey5P<=!#Xdf)M)X6)1ch2a}|p%pa$PjK{laO9)9-y>IVywq&&i?}VNmA7%Woy1Bd zV`_V};`L?=bP?+lf}0Y%$IZ7((0L@JF=>1)lB{!$;w;=So0h&T8|MG?z@+{Sk?hDdhmI@|4%uoMe?N~S7We%&5~)jvA(PD_Gu9xOMHgJ_rsV5TY2={je>TG-^|XN8qImCtAO5fpLC7tHH2P@ERP?yjr|hp`2t|uID`4vtGQBIWK{N%HLNMxt^2F-L|E}u1q2&pWOb`ja$`<4RU664MP)MPs^|GVqnSqcHhx{1S%ZA{Na!@_TcfX{+P9qEHU+EujI8{7_X}Q4i5)M_rnP-?clq}l z615|(7dFVX97+E*`NNxYoqo+sqRHs1SRZF{rT@~uzmwLu|6hIS|7Wr5R_(uL${&F3#S>XKA>)Cm@8^oY zn4{i_-lbCgmq-wy6YKRZJ?AF_OR4_G{K$n;easR=PiT4|dS{TA?AWmbty(Sz))YS& z+g-gHht60e^o2h4=ydK`4V+xCg=`6E!}6{1TS+Dvi5bk#m8bP1NdDBhLLnw|`YT#2 zFc1n!iHrgYbx8_a)WA7zjYsc{K5w{E3JL^x2{JUI)XPEhb)rz<#4B}zGEoApxw*A9 zD{yt{DoSx@&u(F2#k98AtuMNAy`Ms#QC)*1zTYvOv(*u`qMTW2$&2U=0SbR_=N?X6 z#&6|x%?x}dLDSO6=#tk>N1zi>R#7J~G)G@$2)toop=)1`;lQ6iqm@=wQL*;ZCtwZf z1UbdrBml_}D``rdKtD~Vb&*WMm$o*oTf_FH&EUp;%M#(I$nC0p$9{Hqn z)^7d3xBz2h_Z9vCCLW0pAZ4Azt`0*o4lS|5rHUQ~95_G^WD7owD zbphnY036HL+ltf)S)JrlM?z|?iI91qgJ=cRHAjB@{mMjj0x1)Hp!x;mq4(z7l=ey^ z9Tg1&3K1Hbf^rQG*H9?&>R+tq$fvdNU@lu=;D|l3bufKNXOB7u&FL#fEIv~tjzRKC zL`CqCzeAB3D)2}lwNL2_pi-khSC9cc#9-I&*fg7cGZe$IP;*}@B=VO^_b=-rVI7?) z&3D_9Ssumg_|Zf7w!SKRZjL)G&OXgdWJGR++c`aEhlMZ4gB?$~&bfB??w)>` zk&(!e@#+;-6m2mXBOhQ}M;loZj#cBQdp&f5cr0X3pg@>;?XPr2h0ZamGj2=VG8~|J zFBYu|MK>Dfx>WSpo_U;Br@=wfEIVFv22GCq^oIpZ6neDud5iJEn;p|m(aP+_-A5>W z6@zhNxI(#_ZS9UIYt@i#-%8M&bP%0(Dwj!kRIb8LU(jhy>033naE_XG`NDwTA(qW- z$iWZ@etqBb>Ujg))<#Ef_*UIdGx$E|0(>c{8Je;s6S>{frlzJq-m0$uXcoMQ`5!`8 zj!|9H4XYW#IgC}U8L{8*VHIXN*FbtTCp^_6m=)NxKJR6MrlO33ph`EszjtQQRW^a@ zES0;Yl!SyqQu7Dptf#J$Sn|&4B{{PX$?6uvGyWg>A7i(6THmdVPqp9;kH)|~bpl!u z=eMy_Q|we>52+d;-Rb4`fNuL)ibFzKBlbYfg`#6s%{XWVZO;JRLUBScDq`)|iaYou zL2E=v=w2X{8YoWdL{Ksl_LRHfi0MPFAI-Ao`la*+(ih5x4{zrP;v}^Uo z^bZr$3kn2dRp}x-nfyLA9;Dc*8wO*6$C0g#QXNe|C+DcLT$=dBW3ZzNlrqGnc0Cc5 zN^C`Iallc;rsFE#zIBVZ<*{>@&{J7If|1tY^&<|VD(o7lwFD<#4>mdGP5%%N{$zAx z$y4P^n#ZVs2mJmnA|gU3qQ$9n@uIV6tZG`mDe2qU<&KVyZfha$r_#q1E?i(y6rdp= z;4{tdgp_3B?nBJaI9OP=F%2)e-W0+%uv$zM6cU2AKt4B~-oxEOcPsl%1WpSJo0*uH z7k0^s4T?LL>K{08AVCd!p-L(04~@{=T5FQ0!(ClnZRaZj^adl77F{c7&Y@G!Kk@y* ztC}GK@GG?Nefk93d$QcSY5+J4b_(XR>w{^5lANFlR=BK8G`|zIc??> zy-$_bY5ndR|4hRjO5dc63@%(dGn;P}*-kI)3CltVm_j?OppfcYPtW5a8k9p5)LwB< z&AI6F(#epX7yWsIXKy{fvX)k8o8^e@8F*m!kbz7!L&IAFk;MC#rN$qQJ+2zCC4QPH zbm?ZX2Gvw)xP1>m)gG`xaFf!vFT~fqAtfveYwb0Db0H9yqP4iR zf}{6aX?!kFzEd85{0qF;7cNp_o-`h+6UKAm#P01|MPqrZ$v%2W_G8l8!H4JweL^s( zIrjqC4=h(fq41U}{sgsg>?*XPg2e-3$UOPX!pi4339DQk?C!*}a$Y4Zf7^-Hp}7y- zSOZkD&yrdc>J{o8F;L&*TQxE=;#7VlJd&l}M}~>l@d`JsxZw5rK?gzoPILgF;+_~3 zw2c|=aQj(S(XCbd==g7IYs21#E6o$D&jWP=Dt!19Ha0e%dKnzpt2vj`S|%1($GhCp zT68rut`~P-|4dKm8+1gBmeLnnS~V>ou8+^2w}&g?$jZ~(^C^lDh~#KYlegiu>d7P6iP|j_^7bZ2+Q#>5M zLUW#|Kubi}6+FbwT`IXDd6=@i*Cs{1)3JqZaDE8`Tl8)`Z@iJ2o}QkOp@f)&<^drq zt3ZcapH~=q60SmO?n8hOKvZBgyJhwHL-K2urv3kH>-B#NlaZ0ZT=<+|eX->iin<3M za$>-2XW7+k?Xl6(onG$%jTfb|(vZiBI{H@)z`1aQ){S4bO;CFjEld=B9o9^F)HD{t zI^fXSp!{`ZN(~w)o}U zUd-QsI!a!CJ`wtKK2G}HTo9ODW&f;$==CLg(OAYH;x54Iq%OYE zf6fVg*gPx|xlf|0{J^Vy^?BGocFX8-!ZU}~2qyfMtp!oxv-Gl^AZ}7ye#DX0OmtrS zEb%lv-TLn|c>EL-eJP9Xr3Iba)6GXxV; zee)$BZNNF^eKP}|CpAJv^&|W^8}@I95=v*<~xiC}EH=IOpYd+Q=hvgEv}e5({MUR-vq z@MBQ>@K(hl*d$e-_xv2M!}aTEclDbg`%2Bb&DqAC^&GVyt76wr`ll|WwGmpsM_VTx z2z&V$lDtG(X2!^NX5((M9}p|H_xe5z&1q_CK4tYwBl%Dmj`_Z@Y_(UN%41DC!%Q>i z{X{<=@0b)5=6zL|RXFukGlh~)s7uuA$jf6YxiJT;EDI4|vsSC31C|Gkh1t`}k^);5 zgIN`ediGr&bzWtCM02hXck_O6&926+s_~E5@77W74Hs~jYl+4Y~Kod!W(`( z<9H2+KZJ1&oTu2EC%+wZmyE|16j!uavXLgXDXS(A5wBg*WVtArj>MMp-_>7bp{E$+ zBmrLh(~bY!CD)2L)6U_F5xe4_+VwH;8GB#$-BFYucRyHedfII{m22y9?!_{@sMLz9 zd@m(ztiF>l4KM$}Udildh&{^o#=|fM55K_{i}_69r-H8w<@+bsblYc_hh9=mfATE> z_pWB>Bt3=Q)Jm-C@%W}&jz0s0Mh>03L{Y`+=l9+EG3S?5m#M)I4!zmk`|LbJ?^a43 zrX=o<9lu$5Wj?dI#>q*e%JB4X19lb3i;lNd&Lg9v@=bZE&F1**Hp@24LO<8mU0b&x ze9N=Wob3T=p~bEDxGT$SpXRymd2;i58u3lwI>MXR4EfpEHb0qk&|gwb89jXTwTGej zr8qhon(u_JCyWvq;6_?HCYE*%zONYUwJEL{Qf#Fz?|ty@nt?&A8pmU?fx}h&1GdOz zilT1)evle*3vyt9TzY5ZR=zuxH?QoZ+4q}y@XoxR#16`nzY6RvdVYPkiW)x|>>u#- zRBf^E6YL&s;_)Dnz6BnXvFqod`j?vX_!Ay1;ie>=?53sVATiP_Fg3OfiJ{rwa-uHfj7_jPO@pR`+vi{Y z?mI~w`2Lx~)5G>6jQ1oS$|T^6Y>K;Y|%R*K2EPZufczMp?;@de+och0qI;Vph8j%}g z(pxPexl;YU`8^Sd9Pv%QHA1r@t}+?6;TvHGr)EaZWCJ)K8UgJKx!Ch%UxHeCYU;zLu|pIO<+{JSvydjX zEbxFXIks?GNT{sWCQzP*+D|8J(M23l2Ae&Nug7{r8;KULc#8?6eDN0?>HF&A#Hl~xG5fhmew;?T}{o_i6c}$ z&7I%|Ztv~h_g51qG(24FFj2E>yzVC=2FQ}e$M>gf37DL;j7o*^2&U=#DY(nv*)10; zw_KeDeq{tcCZ%w@NJ_hPSnT(eC%)(oWYf`i?0=TPTrOy)p3pJnb~$=C$=m8(f0IBD z?`HFY?rB(Tr4)fw!(vUY!tQBA_UC;_$|SU|=5!3r6~x3hjo2gVE7a>fu#F1S;r$bB zr@Z2}1?{s16*ZumnrzE=CX(%2&xVI>BFgWzxt!USP0Ns?PH4Qbu;R`sG=K5$_FBgE zt8sYmev2eaQN!slovmo>beuS!-%_J`C#UU4CleE2-o{AH0t=T5ByUs5-V?poDk)(#t6y^V?pPl`!r9`b8Ug}MI4itr%kvOO-{r6~XsGu~?T{Kgc%RnN?|I!4g4>OlU_CWt8nf7q5$ z$jxM8VgdyrM3AhrGvjM9lXNP@$^J$WP+UOPguE6rBki||Zx|-(xrUj-fQ2Z#JuKhL zYB33YH;SFI{Pf%?6sfABUIXALq!@F$;^35uOw%?AB<#2FQXORmWE7+4E+gM34s zee?9u7}d0DV*~&}6OW$Bsj5)qyMMRJdE z$KPysl_pfl=g{CsnhFm8x+bF6LAHT6@bp*q+AJeMLR&xIRXsk}4Cv=!a5T6KJhZ!m zYEJO-KDn}ff`%MT9!M$?@^D^2gbyY|bmJ)W!Q~Egh%;V1M&%;TnAyglORvG(Hnj-$ zDMD8y@;p;+7Ew0V*5dFS$DiCCTUgQO?LZ=d5LhoPzSqY2+_@cRsZL&>hf@$&xT-AD zKeiAHwpU`JOj-*Y*Aw=pT@Q_rHQ<^X8kEi~_CXHCV4UZ}l;NSF=ZX_ZeXDT$NO>-0 zw#g^uW)oEQF&=nOHPDK`G-62VDARulB}>@#>EJD|osq_F z_nU>~aDJZSvzH17 z>ho~)o^1+HKnTj~-7(%v`?n{wOauoVjtdWWh6zTsv`~+Yn(W*qymQ*gR|Yb?rh*J} zB#VAd2)N(-+|2K67+a7{K;5&hzCM7L=e)lnbYBMNT#R!gpnOF!wESnz#hS<0@dxQM z1;J}??{#(Q;V~EL!D=x^JT;=v>6lt{<@D#`;CM8#a*LlH&Z=bsEA>c|Yh=zvQ00%i zr1-F#qM{#)7}PHmgZJVIyt@X~rlPJEpb`J-RGE}sd2C> z2B%u!!WLF=E@LIT>dXaQ#TnCDh&nFrf1uqG-&B)lt*srVmp$|8wMRB}Ks9nDWYAce z8~M7-&%RHgYPIeDJq6au{z|F%ri=Ey<-BIW0VWs1NB5GvDE9grD8G?s4^d>L4zD*A zB32T9aov~xl4B_4TLls59vfj^OLZDH+5og{mDvm~50^1(H7~y1epZd<+$9>D+q|Jl zS9tUmTwVtUQ~%{y+8*D5#4)_S&C)UXX$bkq;nmRU(|C6UgN{$?;8|2x^Nt8F|!x5#FidwqLSdU?xNwlyQ|<(zps`826B za?QOK6Q}=*l#=e;CLY|9${vo>C4Kav*m;z|N;IfnaR*#U0y(_2*QUpKWbimO2?_5$ zY`e2j19QK1CdH_g4|Q!6R34Cy6?>ikt|nQur$OYLeVvyzNVE$3R6 zNh-8IZ~iS~a#OYAV$;NXHugmiwG}Uhe>7<0c~7zW zXUkOfdh$VwFFjy}l8{v1_Z30r?3c>QO8NkYZ^S-Q*=g;!9b$N#xJRhSleiL=!YRzM zGV_01a9OaVhv}caG4{IQuD_~HSBKNKyB$X0NkV zSzi8KAGunqdowd7yi!AZirm?P^w^>zW!A5O?l9nnp{ zO(AL8L4RtiF|&(zX+$pZ#(s$&$v%8{{e{Q%6t{Z)>&=xX(o6%c(q}hpI;V`xtlf!b zc)oQ$Iz7Jnf>!NltZjSQ`*Y+ox0AF&1o+mf zSDVPjqARSt<^tqx1Rp)T82#7s#O z@^*+QZ8>QC?ebE$q~t`wY9tfa#@F182%Fu6--C~*3b!o@oaeZp#KV|cGT`pYogvjsrnHj*7!$d<1puP=n2j1i!u&xiZ|UZTP~g6(H>Ub%QR|V z@jcXTQd~EtvYaA7Qfg?m$!^T(f||lUjr?F%N;YaO`d8cM&%aZnwAPUGW}{L9g&s&>A44&7l!!JXzh%vd$|tsPjK)I}4yH+wNauqXGgVC|wHD z-Jx`YG)Ra@NcW~U3aEg9fOLa^AR#TSBHbm@-QCSTYx{ohiJ9|1b7sz*J>U3=FR=G> zKliihUh8)~oj-D_v>CG!_ow07h=1e%G@kt4g9&HxOw~u@Tl#7rYT3U16c^<-lWk7q zy;~O>VYJ;lh#Y&=MB+B3;y5{^AJsB69h&u$2s;w#{QK;u0i&3C58II_ojI-;g~IRk z#N?wtc5dOb+-^%p@x<3Y?eKK8XbWgM|G{^0E`3c+slJjP z^J@Af*!tc60>d{bC5lUvRP^1p&`cg~|UhslN6y?)OjCSM;^k4ZI>Rl(XK=AX>G|J=*kJnWEYzxV?ng z-L+OI!liwl6}E(#`b6NdKj&`a;}O34iVtqJ@2ec*Lc}Tkx<^k-?lh4~+qUpzKEX_V z`=+@7RXO#EnM=l*ML5(T^Skl+7yo{ex;_P6wG-zIGZ&jxg}QpKQ=0M@GaGzA=mm^# zdBIu^7BZB6XqBPC6N`OGa2_HXjuJV-w-@HYRcJoF?i!o_zOgx-S>Wb_sgR0b#dm(%{WJ5O4kH7)vMrs}LLBe;_+ zyXvf7&o@pVBCjZl5L0n2eW`2?XKTCqbBj)C_SA*r3Mp~Q?ebb86~7jeEG;n~)8sMh zqr*>@pQ1!{S=*yjPU2KP1l+zT6E1W;w0Q2|Ucq`fs&1_#bd?P?fqR6)4iiT!TVX7Y zV7_h!@gR#*C{(YxpbG%26zGtI70&unRUS=IK%N;M@&+S{tO%*Lb~Z8ahALT;_vEL2 zx!ZbcmcQ^CyQyW z)_rkaQzW%E-%?e!4;cHuNt|Zs&r39^-;gQ&FzVT1dt7n70+XubR4#bKb4f3rk0X`9 z4p%I>v)e=}qdK_nL8IATPbZ~soz;7y107Mpne%z#`bYOEsCIu-jYOM`LEFT%pV?nv5~Cn@d?EYU^T9T4$^Zc0}2$Z#TAK7Zbg{Mv-Jk?f1Z>G1kjY%NLno;M0b} zr1DUwxyIh`7}KrOFq*a{UFX+Vrf6}@htuajw)gHNjbVHL&0^uQ-k-W}|Jw_I@yM|E z92etNck0gBY`MBez|NJh z(s}>-?(yT3pRbB6v=#?0xo|K9ix0d;k`{Tnw`SmfFy4I~Al2i1Wr)JNf;C0TYKHE;$TYiokMK-=g~Sq9sWVW`$#$UaBrl&*Sd5YH z*^O$KZWrf#*H215xYKHvL&Z-ma4KKF_iI`zn9OH9$Ypl4Z0H{@UhnFvq>-jq-IO3G zT-6ek#q|sa7&fikxG2t09p9R+klqveh4W!jA@dufd^oyiXb%IgN6D~W-<|!#i4JsU z5RS^ZDvcyL^9@X-X1Mu@CWj-eWefY-=2x**wndUM0 zGuk3m$18eId)qWFhHE?bo}E8g_{g+{sN=;s{&u6FHC)A3vHNt7Xr)oEOD1o#Ms|2H z1Os+h;@7Jb6Gloi_{m*dA9Gwc6nkqO|I|*$6uX2<(tMgH{IoT~XFW|J_bK*ef6z(p z28AQ$!_G*lsp@`R+!80-?A%WAx~fuH3Hx<2TBQ360RtsUC#~$&v-A*>8}}iUQ4W=} z-S0aRIQ`tcxf-9UqmYuT2uD;SfzR!J9`X09L~p0U5{N z*CcPd>5e4dO((P~`RB!Q{eSt4|Ic5jBj_NqPZ_>*T+09KCfnnN?XRegWgr2GEyY>uFT?c z-%9LqM8B1fNap|gR_k$?QDQf# z{#jZ0b21#`zy5;rzweF3fU@6*>u0qOac$QhiO4E+5!P^NMmG8fuJQOl&aeM-HGKl) zr*0OC_n*d}$W{vS|9yuP-ooQWiWN_)2TDD>#L2Yz?F6!JUS(L-1ueYV9Y_aP_x9~j zCBD$7z9TDVyjE6+rwqap7gW)O;>urdZgj=JUB#pdeDv=vx8|@EKeM-Fi)1cf!{pVo zUR>UFqPdbxnlshJbXpd->t8{k*wd+NcK))JOJU1lGV>BjKzu6Ul-L&}4R7?bVZh`OA!4J@x$ z34+JPapey_r{DgYqhhdx%=}JyNBxcTA{9Z3j%bIR8~lxs%IpK4>gA2o98H=lNw_;; zwu#L2gUJP?f7T$su9lsv`hDR2#WH5AqczX&wuFCwBlX9&<#r$WdA3_!OWoOV`{I}* zd`Na3PCC{+#yWeC7oVP>s)pGtz0OVxNCx$-DFY7Ut#da=PpxUh-aV4JPy6=sQ7Deu z``+tmT2C(b24%~}rolzM_>{=_fc0po`t%*mu?mtnEM%hH1AR!-ZK=?V>vGIKnBa_3 zSsCMMqMyOj!$~Fh0NJ={<`Zg`h2Q7BV*CYtUFf4K3=Gx6H38#S32$+S`xcW?ipCAE zNvnkx>RY=^7wxXQD5s+u6@z7Q@Kc5?&j+7v^(hC-uzuX}=Dv1bG$^3S+8*slWX-!~ zd*j?XSB@^NY~YA|%!WMmPJ1&R(&^{WVumyIwjRf_CuS<6heGKG&gOUYIAY-7Tgj;W zx}VXE~pRXlku6%*gZ@GF`PT!-R4=i_L{8 z-N!zrD94{u*NfqkB1y8S(}p>WJj2Z^88@=^qsD@3nH_^&r>rMu#OuCi`ZhHT0Sq%Fk`|GT*viE z^uFw*JS}TI`Dq{@OQTM^aPC&(koLq6SJ(T`xmu#FLD+1;iIsEGCOsLlA#&J>YN(bK z4a>o>yH32PqqvK_vtalTPmFVLKw2bgC!*$gp3qcvjl}CVRE!Tbt{B0!>-3%DQYc95 zd)lrLuv3Zej@gP~jC)*b5jZvxxaEtf982~=k1#^3vc*mC+jJGBdcH|?Fjg^&4 zL(`0${%S=MCN~{$#nve~O%%t3Wl3;GMP@ek@X}O`mSFNk5H_Xi4 zU5c*m6X_JbZd#yS+)XBaBN^G*J$HQQW%V}44NEM`I<*auBe?t6Xt&Xa`S9o9@FG&o zhVfSJ1ghZGyJ6aK($5R+or+KSRNmkc=MhaN>1&zZaHCD7mG$d3+}Fi^*)Q%J;g2Dq zCnjSrBSC+KR;-y!&b8=F@!a#?L8}6l*kaUqxHN(*;&S*VU)Oq>5RbaIM*dwYF2QJB zFR9%+hc3waFsVvE=bH;X4Mx&#H{n#8clN4BF?&#)|oMmss`qigKI~pQZ1;&MO^% zC1()z>DnEVTXCmGZ^%-ECW7!2#oLtxWUh-X25&7-J;7@tsa4{u zy?JMVOSY9R;nhtf20YUu{7c8@!&o^Hajg1A1k7g*W$EL*@Wh;!1hrA!nAP*^9)Ey( zWeP%-Bb%m1QNg>BFxXzKO5Su&!Oh~I*vF@P*g^SCj09$4(G@SQoryjcAwnPCcB`E2 zkAmW^8sRiDhqPj!AKKF$!On$SbBp_0(wKFPxA9q{B}e1pWdV zd#WR|@1K9+?+$s-iP?0Ig^NDW55rF1E3k-GUG~@?7lU`sR4EL*Y!+hPM0bbs)aV{TMzR4C!;puihSEy!#(XrkG@k@7rW3xR<)5$wZxJd6FVQyC%7YAy(*smQYyY^%{`qY#2%9=#lM6W3BWkP*g&{=V9$M~b0>N*@B#EwM~HPX*{b}~=!u+WDYJpItP zfV;vVB;EdFu%LUgCUCY|i2qiQlU0GCGQskQKNUisKqPpVp{o$p0*3XhI>#VX`qddnipbN+x;S z1kW*m?k%HZMm5yE*VmC0S?-ff^GhqsjmuY(JG!HDbAPo-n_nTm;I{Y19r5llCLX3D z*A3CQ9Fjbu+`8e-cAK^lX;OD~Zf1FclzSJhM4&F9*TJb-|B}g0ZGI^E%i|)HrnJaJ z#ekpaCf_fbdIH%Hnkjpp4tA!qhW)HW)8f#UNQY$d$dGuu{MZcS&WE#kTVfr*tC>5$ z+k2yPSV~-z!)V-BJ{TXzkhA0Z(0ub2TE5hWzIP$NXPN(wm!?y zk0=?RiX9`A_Bm>D85|KTe>8+PHY`$trQ z9U+6O@vz{PD;PEE88p8rXED1uMDAf0PiT1beM?APPU>ZcwgdFXlGVlAJ2)!~j$EIO zhZ)5+FRrh>O9E7v?FOSV7q>-S`thrc<@>aXRTH_lTJVWzHdjz{5QmcFi?6#pKlEMQn;#Kll=wbY@Z!=K z8O#2Am5?=y@X#5SulV79hrN*Qd@;kPnnCM5ZY7JT^_B}KdC=%>n=XY(2CA1b>B~Y! ze%+l{C${TDl2^{C-jHSDRc{Gulc|;a#XvB~DZF6RD(PmQc`(#lFgTVoj0kqrdUS=%+G$OzMn|QmU2Xnc#&8WAR>5I0#Ih*iD8;ZYkt|Vykp3e~WCEo9) z$mfPb$g!Q8r4r`P_~9GMJ%{y+nYP3bN>w|=;n=z@5ccg0OgI{U^ygS_RqL!EA@Qzx z=ve*a+sd1E_T<4)QEhJzdj!xP&H zqDAqUAH3~Z;M~*0d4(INMGq$?w{7>;@(}tJ9(x*Z{su+#HO~x*%{|>*UL@(E~Mp?TDt<)d+xS!s%&dO+`FpWO7YMev0Ilr#iDQdjum%ZV= zaqGc=hlvh_x`Kh)0yd|m>C(+RLVmcRwC03sHk+)XR)&V_k1+=-Sl?e^@1%VH5%qLT zo347(#QC}E!^z2QQ8AfhDSqGgtnJi(wb|Rt60|HR8b3@wDT^cNj=~wxnOpUCN2H@N zsby)G*>qW*uEtsnR@@tuB)Bk#5_$B44o~cDoNp&(ADn>Cta=}-IO6_S)sw{EH@>fC z)ff>{N#HL|^p#i`jnuLw;rS?2853)@R;g&BCcil@iF|pi5W*X1SN?jjhmya}`o#y& z8FO~QX;d#$5U$a7Plt%WiEm)Du4qR{Pt$cXt`l>@RM9mK(W(*rn$cC`8xZhHe8=$d z`bo)+lrJrZV^0B!(F^+4xC*>zYvNP;xvNe)^N?_GVdui$B+;zO3W9W_96#Ou3n#{0C}sS^C3-A8@2|dEN=_!5&fc zYZ)?)91{*|!3TNs_k*bOi^JpfGntWSw)sk;3fB0*q#CA--Y1Z`^lf=CYuVQ*3(0*A zqW{SnPU&j%Bl{0Nv_h$l!5Y2(v-FA2Eb|UhQyo5UY>X7qj*_2{{1g1uU{-6x?AKUE zpBRRM`f6sP{|4c4){d3;aj^J4_<$rSRFyPYVyQj;?clVP8@)DTqq~1pj@W{~FK6*; zx+M{({_@4ada@-dIzyas8%~s81e|;OySHkU!kNiwYMsJ^Nm7oZdaRR4T*(t9Y`C<) zFQ-H$5*(FBc&=>TEZ4U964f4h>!;3+Ki=lOHC%93ITgeG4NiB|r!SSioS7Yu|KtVL z^#=BZRczzFZ5KUTS~v=}?At(T)fN7Hn!A{) zFY@m@>P=%-wZT5bNNIy%FaXA4U3I0E&QNtmIQ-{Z(6vv;52mg{B2mX7mm{9tJ#}?o ze&PS`FThw-|F;kZ|MY*ViYD?rq{OIccy;Mo<^R6q3Yw2D|5M48iLmYeZ^`w){@j0y zu_A5c&u;Nt?bN-tFC+a=p$N9K5k_Z zwDw7Eim$xTwEfn;Y=~&(&eFd4pGja0)ywy9Lk00iX3CRB3L}M;b-!K3C29u!k5ZIQ zU)kB%pLUP6{EgEvQV>4Sp0S8;#(aM2L?7ppSMBse$1>&Ls`sOU3+O1)uR~h=1eG7f zl4d1x*X*C4^ifBb6@D{=*djCt!|~S#1_0uLYG_p3V6G0Qd3TB(Up459O;106TW`PB z_eMiYYr=gc55`dh64xtN^3mk_t!>MKn*BELNjX#AI(NgyFv?}z{bt9Mi7gt+C8+b-jZ^0 z;SpO55nPWE_Hb#sg_act0Y8^hzC@Tufi7um5*|vwGTVtH(C`9vs(iu3F&hvCnn0q2 z&kKG$I|Svqs&yy*JQ!$6Ntp!UE$H?9_U#ZfsN`zBcGu$MYz${l-PS7>Kz%4!v~GXc z56jDrklrv$55>Xsif=w4h+OHbR6t)*X-4Ka-~AKb3j^ zAX2XC{{0jUbXrQ3{?fhm8{TaxY?z=MON`Q{s6Ht(X!Terjjj@;BEkY#HfRA8NZuhJ z04~uZ>M$pHj#Fi#vry$AwlbGUe}}p#(i$)A{bJg-s!7it6DOk%8-DT6{85R*;pOSy+2lW~%E4{bV=% zF{#32{6u$+VEl;Fw4IGO7|wJIfHudh{q?&!7oZ#AFDWp%wCCmFY6Czc5W-rrc7G1I zqSF_lW0A866SfbQG3E-Lt8iqjq&i?WX|=6!;;yxqsG1()x-bLicjml zzhv&u^}Lswfx#w^RmBmH8r1nom}oR8lC7=J`W&XDa$pdR5PcExUR)Oik2+FlJDKu> zjGv&MO%pw<)aMjGQcod#y7JMU<~iXx^r5R|8V-cfX4u#nY0568Xc(StOef$_scUP0 z1F1g04+aH>psOq?X!{=2)6kzAl$N0j5;GNGp@(PQuPJfGZV7EZLS*Dr#dOT`SOYe# z-=b751IDT>N-KTMplM<4o&*znQD;_Au zaRE)7XDz?S{BMiv>DY!hqT!B~5J)Q~1I0Id4MrVDV!MBT3V->~z&tKfHe8_=Tk=Vs z=BIKRQR7q4LUgG*V?`dd&4h}c186SGJNiMGTx&XX$ub+(Rx4(iuV5z#)mN=Abg$E7 zIlL{AOYbS!=rV~<(n|5AOut|r5BjnCh%slF+^=0NYAexQgEe9zl#dVj>b#T56>yoV zWN)NEFy<~xbk$CGfUvYudAgV~L!?p?kK=Yp?8R3YRDPmg28MASJd}h^)lsWTOuEXW z`FPOagtl`$F_0Hb;4}-7%V-4{A7}!fd5eylg6LgA?eVfaYYp6{n6R*|W}47R0XM%7 z@MMD>S+Cydgt00Rc~%xVqIH-Bxp;lBG0@IfQnH&@KK`?cRK!#J%K$lurvl^W_-`<-L~->#Y`u#CID`OiAu}-icA2H&htGjv$_Wmd(~|CC5O?5 z-T_1ciJc(k%L=5|^d8Xvu7i`xqBFW=PY$a;Y!!OsFH?b&$K%({JK@P`(N7;K#|>~a z&=i~wju>5_Q%d+Y6CzktRJ7}UrpP-6lAFWP!O&R@YVc`k)187F&|Pvk(6Qt+jzpbZ z^`&BE-AH{)ZlNPufbPX*mV5$#ruWcR?LTy#4U@L1n2Q=69W7grnOz2Pemi(}L24I> zn$Y4(;ko(a`>RXPm6}H4NsRU84x^@?V+S`hFM|p6y(MDq7N|mB0%GOD`(HTz?F9hE zd_ajsM@3D`C%9)GdDeQYSI`LxJ}npoVfe4v+1C@hg#A7!Wz|!p=`cls{j3BzXLw6^ zW01!C(WZu6Y^aHbaXs6bz26}B*Bs32b-XLlA|;D-vac9hhlPV4RuH?k0|N>}TCAZj zaY+usOWhS`OpWoU>|8;2+Py|ZU{02Ut*1+Q{C#}ca0PbtQZJUdb zF!ghXs>alq}LFga!k^#W0=*@zK7<#6|lc|3OHbNNOW6Y_7g9qL58jT;=F2vDX zv~mJp&kGJo6t}{zl@JJi%4O)*xbH!Cv$Mb$Xnq3(AcB65zBGOT{^@xk-*&z1?mK!` z)?{|$tFMeU?HJ(r`x6+Zj}h?bSLaS zSj0pC6}r10gL^wz8+l9g;CN(=<45A2$NMtSUj@U8&}6|8$-A2ntCS3ZsxR=5x6ckH zK-}*TbTq-Fn=YU9a-H=ZJbj=XpQ>tEW^;a(wR-3Gk)+gs2kNvb<#l_n=gc6i1W`kW^ignw)JK{l(S7(XO_c}SMH@;3Mc*ia*i$#l|+P_!7Z)TbBD(UVza^TQOO#M7Q@8z6}g zHe0jvd*zbD?xh`$-^jhW>9-qQeJur*4tmAe*QvNDrA4hz7q9FTFn6kV#dD@-7gEhX zMeZFT3z9f$*~Ix>7JW8&k+(4~2XcJGsz3c^;uu~~w%^tzeQQ1XOW63~iO!sf*|2LQ zuGk_(JffhP4Z`9N17RRoOW!$Cg8FFcEd~1Vg{VXbq?p5)LEteiDam{KR{$vdZbL*A zyq@Taf>m^AV}_>WgK>|I`dgy!1uwu90Zck8$FNPojsTVVslYpo)ORFo%01w@0C#Bv zmcqqlpC(iYKOzV2CHSXNh`;;>Ju(Ve^jqT)GFtx)rd6 zh?um|62&05I?d>hdt6U({uN~5f#qpEUOhCk1(WU95cp`7O0W)xt&9cW;6Pr*l8g8> zAFbM61uB_aX#`o{Bf*O7< z>`b^VkOehtgUO-xTmLqLQ$A7yAsQG&m?JCC4fNcoIRK2sJKSSfHToQJ?4jTJ`e^Dl zTu0e}*5=)og7XM4?4S=1lF7phJNj;Ok>DmqL3k718Kh3h_5U0$h@y_NM9;Eecpw>d zx&R9VPB<#2Seq%z7LX=$u;aW!Xj3tu*kMm?x>h$UbK9Id z&Ds-NgOn*4BQ)C)Y!3RKNEqLvbz8iTc1CZEloAE}@lO@TfsArGz(jZxCy|z4{)-lm z6pZ@-JHpUotrTuQ8J`{H@gN9IMZA~+?Q_wS)nZWGd|=y*>r44=CBMoB1gXRBgBEWc z>;PSx*u{ON-I1oZaeVe^av8+nb`%VKB)X)MyAIG740aD@RnQ*_V)gACF+5{J0S;YD zPD*iH0bL6axw`=-0>p|#SHoxV=~_1j4WY_)u=j>StySxJvDv57fWZ{6HTblcPO`yiLMG>H7Z%?nFjfPA<-h*lUU}K+rAjkQO2*lKjgj z{BSFmmn)Lb7wYFwuH50(NM=JGm($BZ6-Vn=c*z7$EtgWLu6Ylg{P0*H?jaL#r6jna z4 zd2q^3dSmRk$={iqTZn~qPodEp;xa7*x4Ggj5w&b}%+&I6_n`WzY6#3Bg#!?XJ1FdH zAAP5TVdGqlJ`8uq~karo(XofKzbKHe6_`#^tQ3KQ*Bnm0`KF;!8d$A9IQCTcVX!r4AE) z==Fl$v()>$_Hf-O$TY*$OSwtxcdiAd!DO>+IM|LqV0*xlgPaKr${M;(`OB=l!Swy% z6J$hY6}7SDN{&3;iZ*bUWr;3#o|x4_!Uly53&w!>W_KZGhbeMA8Yy@PzzCm(b&z}Q z_Q2P;m)U_|0Hb)QlL=G^e~?nv34AZCxQ>d-COB`H6osca?IUN06%R;ZrT2i4Lk&DT zySq+)xXE3EFhWU{tsWRH5fA$RVD$iXfwtk&0yYjVAT&`HPNXpkRCwb-CdAHCmeek;<-@a{XgJKK%lx3 z-gxn2Q^)sN(H+{lOw9xCyI8EXhiTeOz)B5cjX5o|YU-nT@}L@W0g+@|kd%ULK*3}6 zCy2H7?)Ai99mzN%N;C$rbbz&~gRKEvif>@Sp*DajM@$$!Aw^Mq7ahEX6XGi#he=N# zb@$30$tQSU8*J29Bk%V0n?Gj?;C2ZEk`1VGZ7j|394e^bf zGpFC)!g{ryZhCs7Kmo}gIzobP8y_EsCvW%Q0LDAp2Q=CyY&tFuo_mr4ATddq<9of%2H3LFm*XCg;eh|EEb!P`eMxPxvHn;hOX;d!t({G`ilJ#w z=7dX?htu_2HRsbu#Sr4;8;I!Fcs>Z;zn^wRUMo(9*2BfByrgKn+R@O+yY^|@1G96H zq4AmsfrZU(fpyuf z#5*i3?2eVlHR&2elS`!B9`dQT?QH+y`IumquaZ(SceGB4{YWQHqCm2s$`L?Zq@%fB(-?@`9LjkmWq&?5$tn_m=xq~G3%``+@|=}s4* zI6!_r27U(IVgTsnLn{4xh=w{`h89r5@Uft_PysSd5HSFB=r=s`qNr0)!+?B*UC;rf z;~`4q{L(zpOo|{v5tU^06Rkk-# zK?WwE7tejuaOh>)%wH?fZ*+y41B4%}F1{o;XC5#I$v^MOP!`=%iviF*hs6ThDFCnt zNY(&*&zhWDv?A`mAc99G>OI=p8hEqsdQKz-<6Jd$_IO zuXTXO%@Khp*lf$4!`0HBI@p-#0zBU47T2({8S|icrtQ!7_c&YqX8R}Dfu#j1R;Jpo zqUy%tuH>H`eY2mDg1ORpXWy&X@8|*C1I~8&GU(F-LBN@+&a4wicHtr=c+^!l$-)wt;(adJivA;GW&`i|;EM zst0Sw!AmBSeb7|*_EIZBsLtH&0w7AalQY*`Xq#Y392BRSETNcRpd? z`l%Qh1;a*Rpb7M!dM@mDe2He^;2`9@T>~BU+e}II@&e!CrZr6bEhte9{p)> zM)gFf?pU;+L55q@C33O~l5uEu3cmv_9_WX3@LddoI<9sknILo1N1aa~j|fo#Aj?-& zV_F@6q5$P!gtIf+B?C2qdn2C>84vC>e@Kd92I>Q#eZL6t1C;P)=jKY`@!cj--7p3i zo3M}&+*1Jdtt~FP!d&RQcP5kxAUKU-H+Gr`0~=k}wIZTCG{A*hlC9%6KF~n zBuDa!ijaxs{l2a`gm^hz@)9fvti-~WD;y7)2%KuIXj>jpvm*?@w5PU;YwBEl`gCMj zGo9tWmZ8+=oWAO!+?>*U77M$*&+nmpYA;nNP@RB}7uwV}*Oqc3sm#p55#F`HiA_bO z96_w7>#VMGEKtY7{sxE49qLSIgiO&BjJa%i?Wqc738<)nW}Y!iox(JlmvHxDcklR@ z$7(9_8d{njy0z*9XVmOoMhxwFjnS_`jI;w{B1mT-#W0EMn}g~Ghp4yH>4^TxP9bEk zfJZk8k371dIaJ9#LfwyX^&&>KplrbPgAJ+MJxLSgiNbeeB%)aozE~No!z_Bmgfd(+ zqxX?0HPnB9?^!F-hWj=tlbxN6_SAKGoz&}f>_%jIGV`z>9T(ek*2aydBPNoPcP*cp zDNERp32-cho_pm>Z-~?!?@kn=Hbc(dW_9H}`)Otx$xTwuwuBt<_^K-i70;ybkM!IH zX6EM2CHpXduKN6E@0Fe5Z_eNL=<|!sc<044jYV%i{%kdP6??13P1I#ut8ZOGa((Pc zO)@v!e7(Zw4d6_GI@C1!8O`D`H~)OR6aaN2Wf1Ks_3p5AaCWY7T2hUbc^d-9KdD1u zUH$za-WI)-JXG!Gn5qKIuZ9_XD{E^=>rNnJBLlXBh{!l-*l=@ejO9YL7Kn<3#i5{m zsGKAOAk_fiLt~*Uy20J#Zjs zf}za=pjX|*!cq@SP*7IBg@g0k+l-HaVHrL+)!!Fnl_t9G`T6-U7QbEEn)x8VqlZ;F zTOIhG8eUxzYfwaA8Lij}zc1g4qVF&41)L2yJSf9~XGJp;HFUyJCv~V3$on2BB{U0N zORZ!$VPV$$W(PSbXt{y}D#ZB^k`4#yGlPr|tj==$t4LvzjMo2n1B5`*ymPIM|KH6U z6x0TuFg@v_O0?o&%k{a%#k=I>`QA^5qEjo0YF@v74NeSdogZRd%8U9yB+^1@P<1S? z-(bujx*v)LgzzFFLhLPTkcneh+(|ltrKu%t1q9#_4f+8GDWGgt7H`ZhC zEj{6-VNj^viq^32dd{3@?P4>*aZvRVu`x={>8+~dvfq0D=EYEor!`iE0kej6q8CHR zTRU2|mdC$rd{=&2RaQaf+}D|E6m2s;l{$zVDOxI^xrVTrpynZa)VkR2CBwsqOLI%(6Iovr9+2=jVBzU#>*DuNR3T`{VltMdL9dg z1R63$7{qPbeis6K(~yL0wXD_`MUYWI1#|;l4}tPBuv%kVf-Rpx?0m!jdH?4puq^-+ z2<4jJ9EFDW+WC6HdP_-2prdK{uOJ@`9y0FbujgA3g+Mx31UJyn&ktfW4&MYI=|WnC z00RqU4dnSz6V#rdDh^6npp^w>df3#k@9**2Bve!!K@jjxCPUTa#f#BuH%_qL@Mw|U z0HWYaVA(?H3Iv~wpFbyL)>S{58G}WF z3|w-4#Z6qMTrM6`WGE!5sj7m@+dn;W)X!7`4FtGaunfSLGR_S95)LvU%F1S@>A9;_ zpH#DfJ~}fq13%HvyKZ5Zo1UHywSZoOiT=!po{up3U=>NT6A38F>r1GEp)Iv0KOiwnfFK4MSY*3>;}X#$hDqR zR}a*b{5I&wm!B&LHo@l;5GVuPHVEMXrf3ekp)^o^ssag43LGGosBVb}#Q zAQruEZ1nW>0s_Z?hJvFmb=I7rrS{X_`|!D$1;2pG?9@X_GLp!0kHDh`W!;aXgx!tg=7jm7+)Zpk}u-PEbS(+iPhuH-o(enK~XQZYrz9v?(SEwUDM*%_%@7Y9I+an!*1VOAM=1B)$_tbNS0Yd z`_WZ%Al~U$ILyHf5Q2b+qbUu736P5te}iRjXUB);W?s66g^e9x4mBFsQ=|e;pF=}K z;d-I`8*7>e2ebbE4N(31*aiREj%s%22%Ug(n6$!8;z~Zt)SRRG!t@wBr%<;fdEVA`?1sj{a_W)uzzZ82@2zRc z3cdBUHQ{I9F+i{lYdTK>Tj}%R;UN^L0cWMTQxC)-y`?EnM__=Z4YzT1fFU z%5P$5IILg0d>N?2GR30R<>lq*G6u~f|3RrYaO@7Gzy_hT4RreX=S^=wXC zdbqlx8%Q8gUe>U%dk2(bIG*J;`soJ|CmoI9MbnAw!h+Mr#?dMdc3Ra`6{d6h{W3+8vJL)j#AMdS zvp#0h+@Qdq=Mm0p94c?i{4&~?wHrvs9!bEBZ)<5WBFD^9&4w!9^!z;Fkn@3^SG|$8 zL<722(CNV0Wq)WZFDJMBr*H-im|~`|00{u}uj|;@d7H808pD9N1!TZ{aqcA9AzJ}C zY>sB&0g^!+{^4Cj zY)*z@86UM07r7O#VQx}{MI`QQOOA%*)#+;M8dSJ;wkr(RrZ)+WR2GFliQatWdVUI8 zkD#s_B|{4i6&4qC2=lkpF;zU=IkKL>g9vCuSo0Xu@9+@PP*cZT(^emZ$OR_O_w;Rt;Qm0dYt|U^k33lB8#%ec58 z;jD++3Iy2`h>A(ke5n3F-~hy3O*y$h$irZRfN~l7bcXoF9+cL=wLZI=jo7$U?fxk% z3pVC6rmeTRI9+D~0L5FJpKqLV(8|^Rq44rTiY*&1#_rE53QW5t$pBT!H7iEfD5m~M zlC2{qRp;UYU$>>dEnwpX(X-~?|Lp}paN=V0UAS0%hb8LtFd-biIo5xGkLs~>tp7HA z!Rjcdmz!g6|97^h+tImOUPtnyCT)S)cas4TRv*-j03Yt}Lwp<+v!gSsxzFE66c}fU zg`}&qeIL@M{_g*Gj`xvPDfWfav+8G!ktH9g{neX~GJ=kLq!#zFHUlNTZx<1{r^XBX z?UwVrYr%~>*(L2}tVEYZ@G#;2Y5Vhr!{Uc0&$n|7{%wLBuZVk#k$<1S%Z*(_vZPkN z=Ia!;i%a?J*Ts0oZ0EaI4%c2|WdgOJu<=2PM;mI-L0#!masIYNwLj9z59}IJ-(+GRD`s}j^7>MOv4a+&g9%@9-1TBBE6RnK($F_ZD@@}E_;y*vq zuLH?@$DikKU3pP# z{-ykWsNyy9IfUS`s_=8v6PK2*se2w2vnB+Lu2yklzpXOAyiEM4kxE^Ve!X}&rqh~E zm`rPPZJ(X5@mpD_ z*x!u=P>f`?FK;h8XqRNi&yBj6HeL(~TvVe=zp|E*A*YLE6inCd`K|ihs4&XUtn-|% zCO@#Mx8Bo=v#|6XXKKZt$L&>7D%uYoJET58jhzkXP;BJlen4FjzHZulRWNY)>Gi51 zVw;1qO^atLTK*Sm=4NI%Auc-54-7myIpKxBo~|6ovqZy@3#3fHMZQ2=h4WIcBtv8f z32(kG<9LOmG%Y^p=nvFlndnuy9Q!76e_YYjpXcN%B ziCQ+M!LuuyXyeC=H`E$&uaS%r+bdYO(s`@JH9>v;%AogS_ zqaNV75MVjm**zQ2%o^0GqeHKoPo;(#6^2y4!ea?Tq}8@-!r5TneTn`?)lGRbM`{5w zt+GDv#HvUGhqSsqI-In7gT4KnS8nj-+UmxS6Ths>dOMK4;6I^vPGKYc;{@O%zY7c} zfEN$sWytUV2a`k8@avaC92aQ%!>Nipw10tGL;C_$tpMy91N~+Ynn8MO))9BVmkq)S z>g~-z{&Oyegb-ArOyXm5GHNc`5cm_`yFJnnB?^%jc!ohR zH3;z2n>T}?X{jSw)R2rZJJ%ErDIsgCfKx+#T6|C*4mf8P5)u*>HKfId=qN-7oe5Bf zEy4-na_;(g&C1M-v8gG@{1M{erJh&+Y=wg%^aC|R97LMf**oF z1r8Ia!^{C0BJnXk{sj6@;Xs1RqTd`^>>!L4(EQ6bdX)HO2KSNZH5%&U)8`frQ}H87 zTKIwQWGqygMi^|ph;~9hy*44sP%e_^op2k#XAJ-H?ww?R+YdWE&YAAn=Xq`z>d(e1 zozcPf*JqDGh6z>&O&&EMz{Qlo;KQMN0O1D!RRJen za2f`OQ4m~}TCGD82#2;1mkvU`7ERWTRhVB{@tAMFhdzYs1i+5HeFbEO(0#HGO_JkK zF@P?Ebm>rUsDMWa0SEw=bzy1A4W2VtMY!W<5TmrGL4FFvY;;c*fQX?e0GRh&%{eB+ z+R^rQrUwt^p(zWXwl%I>)H_GuyMaA~&gI}FodSwJJ@4b$)ENe9y-wcTqVR?d=e+V8 z%#jwq&Ug4XAz@+ZVB$MOL<=)Bw-4f?qoX18jE{dBnQ;ahBn$1aj!>wF&aC~l5nfKt zh<7FGrmn7skd&i4au&O(n4OzH!{4N&-aMlG1GsxBsYW;f7ngvedXRR7DqF4Hl-Tp< z|E;_$kEXJH*Yrh$CJG73HqRkch>Wof88d7$&oa+K2^&e~Dan|59x^LKhP^5CP}`7@ zAyYDQZt;D;v(7qat@B&!{CD0z+56e=`@GL^-Pd(J_dNmpMQl@9?w?J^=Sn76hNSuV zUfkorxrtQlw>8yoX?R<4#@g{&yU67S`s{8>lW?%%IwBLjmopN4d}HV6vwn*{G*!VT z9tw6-(MGC&!CaX%qDo?-abnyQd=MBAqA#1g)7rDcxyDU>O;u4z=`+}-fKL>Jf;R{Y zpqusd-neH~NlHrqQr-rQrq2e77xWV2!`T9oK&T)w4ZzH}{Sp+)=FkRy5Yod!O{ZvjZ9Km928HW!M!Hd&-aZcqP;xzDk=g$ML!0oUB6jOJe zwt%;{H=~_(Hub^s`G##dxE?`By_@4b9V@^|fNH!Mjy_w>|VVGE`fC8gprV!sWIMJw5Pt z!X&Q?4OR3*0_&`&rza}f06affN^b=0R+xQGk(+=BXfbhdn=kK*JU8v9@}QbgNl8yQ(AYCD|Dcq2Yz2rwz(>!fqkiV}^fWd7Q8ClN zrD?{Mb|qldBw8LSI7dW?OMnOo!Mxn|!(bprVCE));R)VSTU#5@h95(+!Fh7v$y*Kdud^z-tfMv8nrqzR3U@3%fj+_#83|h;_oS^e|6!V;|&O{k#yb1 zhPc^;xaG~2XyrXJu3)lmS?_`2z{(*NDmGMUp|2|S$)zG*_6T-cpO7u5xO764`Y$t& zskPXQ7R+DA@Gbl)n(`mzMR9}c0~`#TzzYH24n3n?<7#KT2`g2BW(ni9YYm@1z1&PI z&ib+8xd(F`&dPg%eFP>0XqzkGtYM3gN>@H$GBB~+w}1L6XYGKE3G7YzNP{)ky(@bC zkaIh#FILOhxg3Id_z74CzD-Q<=zlm~iRxtUe%xIL;XM@E784e@TV}G&#?EfkJ*N@Z zmo2`=3bGKG^FJ~CJ%B{XZ7e3f@uZ!X4@_M2eaI(SgnsIo;s*2ic#B0vgY;oKXLAO%hlB&&E4?>*ozW}N87zTN{q z<1o-zYz}kmD>S6@$5+-<2mjj{0=ZW zfZ5)*V-5qHClxm(X#ylkXy48{;?eLIX+Q$wR$xL22?!*mr4QUYm}ff}1ZRu~IE$N_ znqXe$>Qt8(%fXGXs|ji0lyUKK1p5^6!0#4FbUF!L$G<06uoZ<)Y5jv39Wfx9>9FR=_xDWLHwr~dEXN^c87x^?Gn1iht zG*U0GJwR#bRtyG!lQ9fG7%vBPU8<`+fI|m<51tY{e4lD+gfjX7@jbX23O<<{o&w0z z%>_&L^yDAk8Zy>G9^LIm~E&UnGXg zDE7;{e@F$NbuiL(7!`v+tL*o*iyUt5{)t%lY~#3{n`E(aWy(t()n8u@BjJSQr*FG1Y@UaAa9o_wVoJW8Zi;HCChNstxLF? z_>%ci=&sDaFhk8d1>Hd19i9wy4^j)OsFH-v2(9tu{gX%yZ_KyZYxMBn5HGp>AHR{q zSBm#R2soC~5- zMJbDcO-w`SpDBv*p9G?hSP(qVLJQJk_c&DPCp+Q>{`J>ZjUhLJGR^&+;15cs;Yi&s zf=|lrBDjGTj8Ce^IWGI}G>f5zx|FMfFGz4cQc@8jB*Cs~0Zfy!S{LJPWn{gpBd#Fy zJE8L?{O~63Xt1ZF)|<)_i5fn3E``2UKXxwIP5WCNUdc#&BBjQ@3k~u-rEi}AuLl9W z5&45e8IwTI=8)W`9gF$vs^qMY+ZC>{`s8!3Pu^!z^6@u#B*>Vk}1D$r;LMtB+9wYRrOk0vh<>6%|2+m@v_}f#C4+z(-S0DnYN+i~!D9ojromrhYE_>cw_%BYC>AJV!KVLX+u+Z{14)yT#_D@(!;CQdrj0v#(B;h@A`eze&NdVAg4@VjOjt=mL-CsmtvP zq9H$s8cged5M7^Hlu(m*nA11a$WCj$K|%agmQC|Q__!h0@Ia5ffAHjB#16xFoWzYr zwc@s(r)cL54gd2tOOLfr5nIdGsPv`%NFJ01dWl=K%B;t2^A*3yxcu;!`e)O`I@26jc>IFU zr;%zATxnXt@8IkFj(O`siu}K=icQAZMuMVAiI8f(dkXEWO2>bf+z~AFQc>}eW*b-M z3YH?#RR}CzUw&3iQJkk6?E#LIR<1-_PPJMNzaV$Qru9PJGwWrP^G2mN5G5m@V}=;o zOMI=oe^}KqF}e)wq8N>%HeIRZ%}iO&Q1p*U3zX!!IGhvi%*j0((qrCAItokCs5i`g zX3E-E>^1qYL2+)J>Gu^R^2y*t|8LK8!Du1tvoxkLS3Sb(QzG1i|9bS8?i?}S^$Gs4 zr9kGl5=G4H4i;=}LIS)93mXQ{Xzi*ytR0P0eP6fz4SpsoTE!+zsA$E@RmN`d6!hxu z%-*R)&k9)1o*D0T+OdM8~ zhnX&1K}MN=J3Sy}B5B&H9DIpKl0f*((~H5Y$f(r#I*R+B-fOuEh-Y|N>bEKhG+0Ye zA!J!Rd*D!8$IKQy6Yk+p7B*dqFf54ZTNahA&ZEG)ZW#qn56d9oJR0F7RiFs z>c)5Y{ZSzURM_~#Wejjs)enNg^}D!U?~48P^TvhJ4t$8TCYR{P#tfKX7+M4`rfj;ZVmOi zLyWZ1F#4vB_1Q#uHwjhcwy|Iy?JTQi&b70^xl1O;Q3_#UwCB*3RE? z)X}T|7I(XAN7>k&Ar#51ZG~{kOsm>tR^=1%{IhD}E#YVTUTAn7`^Ef0_iW*=qQu=U zqGwdmIestE(NacNJzsgdzrji?;}cugL^(~$G+WB}Ss{i;N3x%w-|oFs8{il!vGe22 z&#+!C)?>W#T$V%AjW;Kn?Q~_XzWnpwcUmny#?pNnXN_&%z4MLKq~{weEg|7_*dL(x zB+)Ocw&_(nN?Wibl3h;g^Od`@XRd0O=9Pxym=bQo#K7=Q0$MCQNI2I|ZaWEGjKm40 zDl{2iRC==0$8@!y(BRItme}%qIbj)#k29@|BnTN>cmEpV(GkR0YI2v|t7Av-Vk(}f zR4)InT{!FVaWZg&J*#l`Bb%AhH_vv}Vl9Qh3CY(f>6`XF&#wd@_RN_0 z!Oo~^A)`~apEMQePfu=2%92liX(6c1T1T;PY0Y}cB%|hA5dps9Du?73AEwQK*ONH| z76$DClf^qWrVbkH_yONd7*M@;w|2`)QE|mFwNI2KA4~+_9=g0SNYQU1&|zlM(#5Kt zTOYNc&v6FHiE|ftJL{CK6^3L_4>~7=SuG;B3*4ZJ4j~S3GZ;Pdpr_t|Xp2hm)i}cL z!m5D-vN1e(z&Zb8z6syJ&7_qmjOU$Y&vw5UN%9jTRaz$z;lb4>=zo<82n~)@VNzzJ zj#A&^;Kj)E2UR9iNlcAuDt4KNT?mS)K(%R~AFAJM!_1ukF z`|M|36r-q`>T1dT2pJ6GBL2u|kAa=*RH2GY((Nminx~j9dmM^6JWZ3F91b)}+B; z=e5F1%Y!k5BYRY@Z*kGnRZEN;eE_v5S5?VL9FMQ_ttSI-l0ewfVp<2rj|wciW3fcH zLLR#4e?lF>T$+>W&boK4`@14oq+coUPZT+?7iJspdp~w&%wO6bEA8;L#-7o|`fN<6 z*1&jwu~xKfu|#%)@9>2;?B9qk4j=l#raU4z+2ZM}=bfNsa!fjDvVw>F`hqut#8!g_ zNg&bm@v-CK7c%K$FYNh_nK0a3PqAI}t%($qbPq$!XueM)V$m%pOtkv+H!z%)vOaN4 zRA-1Jv1IY?&yp|7_z4Tl;~|dxSHD|fJ`Ns2NxV!{8R4;iAp25%wiYeknZFVI{|ws? zZ|2_viT{ge;Qv*#U#=8nA%eOhVp!FNBZ|5>Nr_A z&fJU%7#v1h)Ey>b#>2}@k3WC>CUHW2dC4Z4Q7R9!`SwI_D3yLi{oANGAKt;wGc8Mm zVRZ9eW`@Iq&%8@R<%`6ego`rI5#@ai`{-6)FS5O@`Q*0|kvQ+{{?+YAK~1hmg4Inn z+`6jrLeOu<9HqArIb}gF1dqnkq7HTu!xlIn;ufJ5`znxahx2CM+r;r9azE)Ujil$; zB=Ye0w9)Bk2e*5Vi9@l*MVHjhkY7Vsl!q5A*UCTEZxQc1 z_^LZqai!kIP|Mdzv1!VtCUNzeN{eAhRjjVEd^4d#Leq7w^B&dRjYyJYhmEF~&5 zTFZySQ8e#S%XGrYn?2gdUK@`=N_ByNdV^KLp_5+#}E|% zy^@n>q@!Q2B!*$t8RfA2^-P>aG=xk(j@-A_qR^Nq6I48brB@vLe1_$5;aD9ft5-}64xb`r_S zFEHjgZE?FiE>_c>FWFW}!$dAa4xtxnX0Vf&lSLf*cu#Wt<(o95ueA>Qak=99B+}gK zC?^3O#;KBz{1?4PTT~nLiNkyvgSuk8X%+7T^?7b!0OzV>kZ=XCV zYki7t^6V`5%HGcYy~L@igepplB!+FjN!N&Js-N7h<2eCZmg}|S9VbbqtcYjzD^gRx z*vxfiDQ}|PSp0&<--ZX=q}c7Q#I4qJKR&-=Z`{6uT>;vMoCEUjELc>xXwH6XWvFD{yT}(>v0Nb88jFzlB?gu9_ev`u$PVP)0&L;qor* zDr@$$x#cG1Qp4F53a49)oLK6vXWie+3x3v|BJX1F=^NhYNqOVOIB9e?CcVa(0?bP2w<$Xq3I3?c)Qemfu8vH54l{{Lw#dG`Y6yI%4yC zXRHwRGY#O`qZtgaYUD!0@?cGp7;oUrxJCf&U1J(~Q^v6-1=~-w5j*1{A>U;YDY$bf z3+whbJ|2TqmZkfFtx`=4DUkq_%kr5Dd8ZU^$M96={a`wWpsjd%^~8G_Nw;*_`p~BD zOg4C03*dRw2p?W`2iDR0&*nF%P*@S+KH`P#L+@JM0N=UG^1%ie1;=a9)M=*fx9(uu-J5`=7POisd#FLg*q#lE5l7s`ouZr~9a zCL<7{gybk%Y2kXh;8v`%?fM$y;X5Al7PA(|dsxB0J7K7Tm?&m>Tx=MZ&Q9Hee?1jX z9f#3!<3;Z38+Q@t4d7mIG(O2Wu8JqoRc$3DgwkHl{n-chbc=?Oh8MEa%h8XfEu<}5#)Z|oJk-SnjjLEmGY?ByMMMQxT7*Zt-v(NR`M8>ME4;eqgq z#P=%--QN?_L@MLd;x=5Zytq8Vg8f8yZC*w&-xmKpx%POzomo{iTa`ErKW0shO-383 zZ>DS)cO%j2%yZXyopp!4q#0KMohHMMORRBX>5sML={?s(t|q8yWN&fP)9Ix4c-cQm zd82Cn=sy4L`ws{_)PzE!Qk9W#t2k$WiA&+CMy!(u0J1$=ZMUgz%4FxP4u@9X#pl+H zaJ0ZZUrt7%mikNt5h>RSa-j*eCbBm3oHh8U|7o69@R)8(E5Dake!|HTr-WBKFBwnc zY@^qzuXdYE)VeWmzA<#gq>Rs+ef+CJgk*a3^QG&Y5mKy^7;8)5y?mPu&RWp7Gb=r+ zi>PgH{L+{aq%hC9w!xZ`M8^Yjd=UMP={2c(B?rPimSKc4!edDZ2dgO~iLO@IM1@Bs z3BIW^Q3MamT(%zO`6=)S)K$G29?^|dW`1Z#*P)A9v!rEAF)`W6HE7<_9=h89p>T2n zxR6p)1&OoGLMB@cNy7;QO=Rq6yHG#$aoB!abj0V_5|+{Gdnk@)am_*X-%fj3F>#D8 zCx1A?6%7Gz)M@dk7uQ%HhK_S_jhWXGhc4)^7Tj885L56#>Wiuw;xl^FcgC=gJu^uI zFV|%UZ+l+qftsg7Yjsu(++?==qiuKgZj65M5eBX?(U?HxSIoG%<;}b(qy5I3uj>xv z)kvo=(ZPP#dIugg=H=2Uu0))kjP|DjlCg3DGyC9|W5aEh%RMc7$$1pPW>bBoo|WBi zpO|S%XT^3g{tppN_Lt-0(C3z>TjI7`Cr!WguN@z$;i&l1hV$YQxWnG~!AG#Q?cRN* z^Wmred9}w5q7`iaJjKfk(WvrokNu8QsV`j^X~{4_8+h2Vc%)|nkc5f8Qg{dLfXT12@mi8L?k$B?BAlK z|NCg;=Qiixch>s^y!=u7ws6jMc3|f3sA=ipo1x)?rHlV)AA58+Ms~i_9s5VX*m1ee zvA+US%fNV=v}SeXs6F8IS-w{>NgetB{>>-fKmVO4_T`mWYr}))WF&#I6VrS8AC^O# A#{d8T diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155205.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155205.png deleted file mode 100644 index ba369491de0d107da1d266cabab346df83b2054e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76119 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 diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155227.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155227.png deleted file mode 100644 index ba2749970102a0de2a218350ba273512bc8ebfc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86859 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 FCIE{2*L?s0 diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155323.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155323.png deleted file mode 100644 index cde866c3eb99c143481943bf270223140a9c3ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120467 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

WPk7;wS^m5^Z@ z`BTEH1DyC`MQMcAhEF8AW%Qv|t_tS5e$5p#*uQBUt*K%_z@vWO#Ihh#z}idA}7u+~ZuchkZ6igT;wTH*wMSJp%X|G}+EL-!=XMR)ephfND!P`+8R`pr_o~LB&X__cz7SO@ z6d+=VjL_lXkqY&3H}I{1!_$61aox6QxbpMWjzf>;-~9R9-2CqS*20i;w;;izM7hel9&-k#$gsLA%S zs`>Cbj&lC(ZOw<|WhG@UzYd4==dEQc z#m(Kr0n`6j&19#2@@t6E$xqFtf)F*htOHrgzyxTyOx64=<8}Xudo>>v&8RaN8W~JQcNzFW{ z4gBy%ujU2Os&uDE;i0tSq?vm5;E9Gj-LlIfs#MS>bpWELkYccdm`T7~C7osLYMj2dQI2 zKNcb<8!G@wq6tTKjZv_>hy1r@_Cn2eJA#J@HZG~f+jI0vA+Y# u|0Opj(6%P1T$kcj?tAR(7W@B3E}J_3ul8RG{lJg^QjDDq97eYGz5Nd?_A#*l diff --git a/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155356.png b/docs/demos/App_erstellen_Ionic/src/assets/Screenshot_20171208_155356.png deleted file mode 100644 index a7d0790ac2365b9b3366b2951cee2c293b223ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152338 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

CzHS#+-;%e~Z4>Y;&=fiLdI0mk+)oa3T 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

CzHS#+-;%e~Z4>Y;&=fiLdI0mk+)oa3T zQFPEI1%qd$vk1HdxFF)X7VSZ~LN88K!uq7$>@woYj%aVE=i@tu^9QH{4|2)A=7D_5 z`_RxVe&vcYku)<;N+;&`u?Z@-@(K&HFbO%;qDd`2*ViY}Noi?mnHPZkM5e>+vc-IK z=kL_CjEuR{ttK_W+w~0%{7!444GMzAWaQ*P1#HaB#@6adc=Kacb8fVdef}^Y=a0o$ zQp+qNo@n~?0RjnA7>oA#k6xRv8Iq`KYC^|-5aweaJjh8(O7ipb8<{fZTI2cV+0wD! z$&=gOw6fPf^a;R|no@qb+I0ofSrox{UQxW$XH%)xQ@M!;pBj|YeS+Z9QZTo;_U~up z<&>#n@M?BR~J}A(DM*hoU9!&ttUfNG2@05`<lb$->C`aMV_`@8h#W z^SZA0!prL%<`*s?%VD`R0l*)fcNV0~qg5EMZazOZm)rg|fy?5F%ci!LmUJj#R>4$T z+amOeIpW`Un=CIaIj@gwKvkiW`mwkJryu7@B#198+L>Z zE1`rk5bUTrs@`zQ={K*)Vha{uWS?_8XKrhk2X z{m{@5kZzg)QJQ`*uE8A5rSF3RcQrQzv`tz>4PELqEx-1Bp?Tx1*gBYBA>|Qu07w+acOMKD+zaBzJMR zHt{BS62R01D2mIYpDCD*s@m-+#JoZ0z`Ce;v3wKsKNqf;wH{ z`%AW!FoAamx2I=jQq4)gI|Qe!6s8k~YVb)&uI#!e_$-%rXqkM9|IPxusy&;qEMlu2 zGP1JT0Ff{xL`BL~$X=@cbJlicA_r({>#Rc4JfgghjKUZZ_2-$99daeT@@7N6KL;%_&Eh00+OK`#F8qV949A<+>3XWDMM^q%Q&lIT2`9QN;zJ&ZS>P8GP22#@&s`gc#&K&l~$y`3F+W$_m%2!#CaCyJf25ivX>Ic zzedWc<(+(Z2YqV@L?~KUR<8!dM8i4d?b{-Pi0#@XRM)K0zxS?P-q*+RzMHx!eEv{h z;>YT+UDMXRb7Pz3CRwKadQB=d#wTNDM+>K#PX>$K$j)oU!T+ntRmqPCeNsUtLIRG< zjR1vbvNcUHSjdMhmC6%cpV{?vcoWA5ioHH3^_o7Q4nRG!E^igzKX&Rt3Ga*75kIgW z*?!&dlq&c0=S&-!yh56Q6=zhZMOmKCz5RWdO~ylxjEq1=ON5c#z{ak(okfl7vfAv_ z<$`#C_BJo{_91}twuD1J@w`aw;b3FSEiC*`k4A`4`-q&9l> z>LEce9ulx^y25M_r0a+0#xQd-d@7gjO%gP>yqx1Mn`fu2pwI`?BmjgM(8~o-I@x@< z0i$j=1O0mZI_CSmjDROZOVWu1VW(f*Qq&Uw#Q>T%f7sg4P(-%T0AyWsCx96lG4TUD z1gJeeXh>Zusi-)@m=rkFQFKso!={{zWi%cVG7{c2r@QBVOes!B0Guu$Vr|=AC{>=v zRa4~(s}z&VJAV9l7Z!|X@8IwW<}B4LI*V#VD^!X%g9{Wl*bGY5hgc9W&J2z|%(20k z1B`4ah7xUb<`X@og;}K&?`(6^fOgbZnF)a)Q$s?e#lku=Y@vKx*dm@Rs&p*0H{M7$ULTN5$7KFA0ViJ{<1#NQifuAZYO(Y z0E!ew%}nDtP+$16SALcL7n_-sh=@MGH<;n5Vkb8L_&8dsI(F*dd^h*+V4`RPZV2C7 zI{ctzZDV}CLa{=e|vX>+~31PcFj4`QC zyqy!c9({csdXI#0eS(wrHI$h6cnt`%xUQ^5vOJ%D5c;HBD=T4Zs1F$!BA;i0^v;)+ z^`mnB^Gi`#8RP}!T9_l#gJF@(lMrHMfkxMi^w2`Bd^ewCb5C^r9kiN_U&))+liwK{ zrV1qql;N<6YmW{!^ znDrQbuk054a8aoOY+-1?b?#kvzD4HrSUMM!8Sn=KDDz(_uHUCoC% zyWu^RruC<UW`4zRKUZN3()_##&z&JveB_XFF=wcJyttTHp=PBy zOuhgiC*v~zu(?YjAuetWGvbRsV!+u5dH;ThM4}Ld@MLhBa~w`TFUK~o5GH?yeiuM@ zzI^P@qoy;ZeVz=JM>NA15}Z|LFgaXq(hc44^$2PalirjDyZQEPbYYOCBYVlZl#@F zX?wo%?vD?7Eue$*dZuJAFBQ+tFD<+ih=>|DG!#@!DY8v`veaJ43vY~>$%uOFuccHc zEC~^US%!P-maLQ%AE?MzuU=hVoL4?L{ec??nK*uZ;>qSO?Vo9BX-7v#&|p=JRx6l7 zd*$9TILh-ptE`3@;Rood;$bgAM=;B)3*TU{%hexzrxX&Al*CMUbG3#~623#Vod%+4 z@FOXg+D3OWt}Jd+QI(qa&4ezU(Ab-nwZ-jKX+TF-w{~Pw1T;?RLW)J5hWm9;pd`WN zDKzu*rzOl`!C)M380bZ?PP^f&Cs#vxkY13B&<+DLAYt0dqW{Lsq~JrK2@juKTv3B@ zi>QQe-=?QiQuHP2vbjuNzU=$;D_4av?@%sXffN1@E_b(4FG68{hLtG9X0jUp&KRlh^4m8-N(#32V(Qq&|3}$dhDG_kQKKV@fhZ{;DJY#HoeCo$ zDM+_;3DV7=NJ)uw4uW(^H-pkGEje@#-3-jx{Ph1`=X`pvGoMD8nJ4!B?7i-FuXXQV zJ@<(odEcFw-(bJ*1$JdkK8Opx`)cxT)@Rt)pAE+x5~A zak+A~NFj9*Aj7?N8u+O%ZYEFTYc@-(Qs$mhNr8M3`u#6P(P7u5kjY0!e}B!C z)6KPx2>^1P{3C#|azJ|BYE+_4$`{ct{C>9S2sKGXNtv@UsFMghmXA7RV3)9?E#acv z{IKgMj&?2*zx2CEpvkvEr=!u@Lg1fxR}rpQS1~kdi@aaa{BER{bW7A8@4fHGj+w_M z$m59or~dfY{L;{kheLQZ$IDYua)ev%eS-Z7+^=RARp0OUzIsC`zNYo9t7Nu=*7(Iw zRA>L)WIcz`;zO@PXJd7X6Q@Q=YG=VI%s3nk%wep{Uc|iz;LSTSl0!^7hnr9 zoLDs84y6qoX!Q( zY(BvLkq13TNRToCp6qXB+VtMJL7fW>VF_;o$qkm6es5auUI@-vb{7I&KWCFYMhplMj9qHIhG;4fnCC`JPZ?gf9H1p06NNeVjix))y8L!8x$U>^%}#2XNf`qq9~`7)K9Z$Carpqq!(uSC;~e8aS@{Sb)VVbk1lu@`S^#~q z!0GUk)h_N0zOs~5z$su;7fVU@O1y>g{i88^6CCwuz$^gi#zR8FQh-N+*+wnrPuH}H zYR)Hs7=TeE>-+bqYWs|XN9JNfN$y*6tG#1Xi|#|EIQPHq5+6PJ1%lQo7LrIvtmuWW_;<; zFAFB}CAErB*@bVrzg#{hMbxTLBC!B>W>rxOL^7E9k&VM;`uT?eb8m`)g|zEJv= zsLmE6dr+{re*HQIl?iPq~nwU~5Z@$b5QCEO?+Fi54+6Wt3xr zuVm_1798O004vnm%WD9)^)X@>#L`0I2Ir5aLT#5Of4|I9(n!>BsD)S1&MS155*&&0w)#?n_~fk?nO{16lSoNDjb* zKh;JA^t~YHo&lT6&dv@_Z>tJR%#}QDCB+rccWNvnK)QeTZejN4d$(`Tj_F&C6-@)C z0*K7mvMGS@-x4^hfNE$4+&M7#c$5N$o@0P6<byQY7$?fb^&Wr$D38OU z3?0s$JHekn8^U1EmAgN>I(V_7lPi;3xwp$`X^O znzy>TT3;{X6E1IMwGJ}A_ArX}h>vpuwxFyUM!^rRvr(4=14va#NlEs=?=jBb*jNpW z^!Nkb0$%jQeu0310N`675de83(CvV7DJxYx$3~Ub==lq}NFK{U6AhLSQ97sw50==4c!-|TEOzB(LH$D?6ySbf!3hJ$UP8f7Zdf z$BQHpj;@;ViLerxF?D7&RUgylTY#dA`}*}))lF=ypOP!1qV>zi2E0fDHKUi*em}WD zE?1)qoNZeulwL3s1ZWVuxzR|r@W*r?bl+Z%AEL&Q?0PP!34T*iQ68QHR28yPx$&pr zp9WVu+KsP8HjNv@g$&{Dm$mVIdJ|)J@AHu>V11aaa775X3RV_mOY_{(*~u)Vyp`2t z*7ipEYxz%VpJI|HlwSmeeuOf;S*c{R{Ik^)PB$8z%dxq*J=WHmFzEzEW^uEA>oO?? zv>PCU#4k@C)6>6vLdYB=3+zcBo_~pqvGeke=3)< zQuLmDd~q(g8f7F^r`%t3Uf!uhbd%2lbG(BmEAk{g0VQ47SiMrwi>&QZ+do%)w>|bL zNHgGcspZU4r}1%mmj2It>Ha0TXLzG5CBM%y3hF>2eU&0K0Bp0&|MjOKQ$NxVWH({t zyz6z_ER;29AX5Z+)Ks1ttG~q4cN0904C{n|m^}j3oW`ABcR|_&Op{l|8c?J9DM1K) zyGK9=bj8d8-xu8HtdqMxc0`Y@dvAq49n6;ZDEOj%O2jV?h5&^(Sz+B?tS;cR`r0u8 z?tS#InX9<*%*xCxD=_dDg3@WNyYKjRO>OPoy$3O}OPiYo>iMS;gmAC7;1Ty|5aZ!- z0{K6%Z!XnaRLU{XiH)3sF&eSrMVuv`)&K|x3Tul2_b3(}+<`Ulbn)(k!g@W$7f>o8 zCt$b!m8Fox7E#{SwpKu*@~zvtVuw|uXlK90=VUH$CDpS}#IuGc;4P^1{LD_++1uk* zx>KpVLO4-nhXCOTt}7SFG0;ZFfYB}~Ilj~mfu;v$g|h2OSSlp(>6IA01iVf!0=xSf z94wQQfI0$|MPT4a;(Nz-{@eo?&xvuy3bdM)8d8DU3ZoHRfAV6PJPv7*H>F!vqn8>&F*>jG*%^m4KB(l-)1O-h0HH7m4oK=)INF!FDQECSz7Omt20oU6ds)->$gw(M zYbK%<5;_B`a71WmGKh4_g4r(7Lv-b1nqASgM$tNA3zn!EX_- znR+@puDssUcB9<5#ysQ(o~Vk?m8B|D$nG@SJ2<-+>v8p>liy#^y3Tl`+&&!D)wxUR zE=lSV$6jD&@?F((yz&7A>9E&b3+;=+CnW{)nuhZ7a!~dUqZHgrvg_LXQk?whXf&>F z`IJUf)N=62B>mOw$ah3SOv0gC+crDHX25B~R82izZtwSlt9t+kbyLK;4sEOxH!<;! z`)lWuX>?u3>*t{P>O5s1L$K=K#aGlW}{0e;)v`FsTfA1|a`|SMR;vFu^QJVi!yL$B|E84jp{lz@bTMT|rEdR`9QfHmLp}LunQ{*U#itG@~R*XyGx=Hd-BBh1W^O$m1YsA}EOuun`TAkb)EC!?-v|YB;s(h@B#feIshsT}H z@!tvMy{TEd+0fNV$?{Bo>Cz#9vK`p}54NUtIO3Az8GtgCMGastu->0mWl|YvJjlAv z_Tt-XFQDLh;5{lC<49Yw_nL_~MllScR13_~0D22LF4qGE%8{OPb0x@IXU4{^T!C-n zk7qplfq2vkr)1(46S2B2wl+i#==FZX$N|jXF$eUQEQZe3%z!DP_=LZuh`}9ne_Yq>yc$A zNfgtpa`x6fwY?g#956VGzMp-buU-h!B5UWvaasOLcf}}!PQ3#Pjqv>S+1V>FG?>3W z!4NAWRQ~Q=(f5=|OiOm|qRgY;E+Ck7mw^{)vch*H!8R&^6Ivw*-r@p*;yH?LS?wvY&MetwNd_&`g2 z<-t-OWVjAd{dHRN4Qdy&@jC$8z^dD*UC4p?bNRUv6WoEyH())BCSR%;)6XA#mC+Sx z9R0X^2s7><>&O!7ftTBE5{w`u;|| zu^JkWE;2{t`T=#s=OwHhdMl;BRz2T94+{=R&JvsBHIRz|CML553Yn~dP_HXHUh~DS z3org_c7pgO;?P1^pAZI1W#n#Y|M#D&2sGNulim1c#S5T6@priP%Qyhv_W{sFiGt#k z^Vompvb4mdr6s*aukqgA!dg}=$k7KUU-eG`0d4K=b`#~V@<-HN_5S;{yf7%8y`!V` z@3a@r8aJ%Ufx;6kGvj~GgO>R1re>#>G$}l3O3>QaYmk55JS%MZ|M~rL9^n74rOyB7 z?I-E`RJmJ1|E}SAjIqZ(8jWe^|6Nm;=J^Wek~kUB|J;67*q{FW4f6lzZ7K^;nU~j6 z(f;p;vu`0UtH`nO)yH26g1n+{UYza{7ICK;pTKcjoNjr>`0odOv!hMBVF0BA@Ln>d z^O6>_b&aUqe#$SXX~D6$w;wR0+_=q;uG-&Uy_8A@MKSd05H$j<>ajh3dxl&nx7DBD zeC%}fA|iRSP`tRrR3EytP4NwWi*oJQx54z#e-}2JtD4@A;5iS32!x;9_Elxkt61f) zi!-3rr>2%XJA61;+#es8Wx+!pYrGxtzs^iKdUi68s7DeUan_e=zm(b;BEtW7Sl@}xOK?q>Ob|R*{yI{9OX@9K zG!vxd@8v+!T=KpuL(saA^EkA{RxehL{o%h+bfe5OB8H6g6djT4JpKD=-}W?F66{6u z>zc@RdrIIw&Bf`HgW`6V+Gst*Y%gI!@&Em*RYua|nZq|UeEp#Q2|1+W(k11LR z9o@WUKxDTGPR*}y|Gbb9|CcXa*!~@N)>4I?7Gk8S&JrWUMBGXq)@kzfRi;Gb>x_YQ zC!t_fI)dOsDM`>ep}X|H!%M+ici*=>$Q@DB16vndy?hx}4?jWNTD29-Tw(_--rKuG zcA5yf*8nUGDpE#+VS|407)6jki43?yC(IW>p+TResi)h= zU7^k1{=JJOiv~z^ria5dF5JiXIGHZ=#Of>GZ$jiy z+7+4y&Gqc87;W^z*nOPSc^bs&;Up)NcbT0fQpQUAYKsTRY$q@j>FOn?q)=jGy>K2| z`tZf$gYrgf1le!|>`&pF^Bm`HolpD~=fNjmllU!7j=$z>AM!vn1MI)BCR0+OG|lv1 zH0l>u8Gnc{kZEYb-WOYfjjkOC*3`rq7u!vgY)phz?~x87G>$=I`yq2qRRt=zo1-~m zyg>QS>~2(#PW1iz;@-T0rsKJGFwNJRC#%`-?Hv+D7b=Di4zNQoBtHs*7m_JsfEw+= z?G8h?gFRNzJ|c`-XlJ%0D)^P_DLd9Rod&h5==Nod4otE}q)tzi2kjgmzSRl{I=Csh z8CIRsaO;R#$cS5uCQj7#D5>yqvz(2*qJpQ-I)$3P@kz1O`gIdB^`_5II$;v6jE_nY z^Roj)+5LK7Wa)jxoa@T%CJT-05b8yz=FPDVV%`ToUNENjt6ScF{)A9aFprzNtV^h= zxtEu5yECW*lnf$f61Ns}5_e}P>#lfG{VxbjHtheEsJMTlp)^Ro|Iu zakP<-&xgY#s|J0{hCw%b)sEoo?9*nhS@IPRUG&!Vz*9IzzvgJ@c*g7PRL*3ut7594 zL29;eUbLE)Fkvv%aVBMH<;`(ngqYkbIZp5ARGj_AEA{aAjB8Qu$T2ii(?Ohp1?A{0 z_!q;}t5S^wm6A_EJc+k*Im)#Q8*qwmFk0IM=M|}RFZYW1c(x&QT+kH`VI$Y|$@s1Q z_=-6;Ud|l|hH72~ryExN!KUUu#514#(~W-j<1j6no{GebUJIUglND86R<3yF@5rzm z+O+a6@tY)JG`P)w!~))u)s5!dWLC)+$84?8W6o`-o;CN-`ldk;-!9IfJl2~zDyHTu zHdE9UJ{yX3i2}<|IbRx|t`p8ZNKh5>S^Uw5(iRpJ%*ry|oPfQb zUPduQ1tW#`V@N^YXftoFm2u_A9xf;*f)GxFhNBC+5J!joAd9x>R}Hl;bmp*IZt1QN4YiGAXlY`x{mhJ45)GA zb@`c&cr)}YXtl0i%xXAIjKF(mc?0@=zykQX>GPn_>*oh#zw_>yz#$aXA$qnKDuFRW_59 zv)u++R_ruKIk5WH@9cPeYcr=dCH~+zuVP?@Gx506l3)O#QT5~OC+L^A+c*7EP9wF> zskL5%jwFJbFGudYa%-zdu*O{{^jk-(Unj`5%WvHr<05LI1 zt$^?adL(;nVSdbRJa=fr!)5Da&v7B@>l>vMQN(%EH=R4d+x>|y0AIwWcm}Q70=mL^ zl+Y?@ls!?2T-*%#EyJ46wqlBdAY=u0 z_TmcyvrJVtPeho+|BlBJy?T@Orz7I@r&nlp-6X%`3_rQTM%5krKgD!#P-+TO|H_SSao?uDJp0!syQz7y-##FNQ8a|#p@6i-dgx4Z)*;IfJe ztmaD_Zti{Oiw!3_cfjEr-000f42cT4{_&pO>1(*U`naeKdR! z+F_<(*6*fJJVqnz91!$`u#?|W{Py1QWX*9?uTGWU_3JY!msV?g$iyQDDYK(9cHtJI zf!~+j%Y8lzDS`(2wd8V8s>yN>yV3FtMkP#xL!mqa1-Pfl<971#+@hQaU(k_YV9asG z8lSL!d#8jqsq*H@naDG@rd?1UBC>JEZLWWIq2{l9)W>KrymKV3=6TyU2q<`aVgXu-aV>!$>0)ZJRYf<;g8TpI?i@< zy%ay*9zhL{?{_j=0(T`eIyJ%czO^9J;*h?F&+!LIia;)UtMyUjZvc1<}N0=Zc2rJqG13O3f^Sak7q#?F99~PIe zy;0TGH5yx;1DnrWKbi5o3MejCVOKD(>Is)m!WPM3p-~xD-F?&DW45z2d8%D}?1>>z zx(0n3$BV3_knSJXyo*}&7ZCBXJB1t5EOcIL;uzbBl8_*dR^9#GBOJTI)og!Q4C0b% zvQoRz?4p!+<1~GTAF-_HS*XqrrtH}!-=r#AgF1qhxpi6SZWSS$UrKBuzvXbT zd6nKdAYT#w=vda0F)&{H{<|4IXcXT5TQTSQ?EcG75huwFZcFW);%mc|6(jf%0=9Qa{Kf6# zb7XgKSX>5UhPd~3FJbnK=g#W9Y5oa3B3YneHPD?%I>K!~qd#bMHFqe=9CR16jj-9t7U zi#D!M=o58jN>v=wH5hlvC%kJN^eXwcn3nFN>o>A>0PZH}{H}8Ot>%K07-vdXue8*0 z-NQ5Ha0=Ifrk?sGb%}IA?=;11C3)F-ojudJ42b7_YFaum z9Q^TuPNLyU(%aYoA8LJ9hlh%dA>- zJuP`WaCz$r&`8kF)SU151qCtj_IfC)jJc&9*8i>QX?Y0MMBwcKaYA%$Z06ya5 zVBe$ogs&XIL8SzRFHBNb*->qfvVxb2sZ5b`WbjtL2N-#wjC(UCC?Zzuiw1_n`>t9cQZ27UhZL9BUhXC92s z_ovBlTnSqOpruN%0^XM2^wzo_{}OBN4WhC};@hJTz$>z##>#ZsD+@pRVGXYv1#1?J zMsIfU?eFJGLPKEatQHrFyZ7=!cnLctu~_Nbu)KEXgwaQd$V*1L$k#beuY1l6ZEf{0 z;o|+U!`5IsA2&O8sS?e_t!3@><3^c6#qN%s{ahXO53S_)2t*IkcL}4mq~Hhvr|0nf zxZ)|Ok>%I$H3Z*gBDV@$cwD?|faJl_raZ6kXV1@fZ3(r@`o==TkJZHxlw zC&#vn?t)}+~+q+G@l=j-q-HjVJDl+n0W$ayFQ>_@4wYg>e zR_6jU+7H(NFpN;FsTF`>#-(w)i^hK}g>3sM_V=8b^_@3@g`Z>2kF&9}>r&~LKN>Bq z2kGa=X|i*to4`OpA$SFOK?xI%3{t0eGnb9xaW{?TzR;*wZn)fDyb)aL5OFKVl5X5o?hK z6{f`hyRY1)E6YBYsD7FT-i(&dzVro?^%u*9lj^R(H&Z$)(B0SRjoB{-X_Q?5qFo;d zZ@p3vz2Ju2wTBYle1k$6HuPHgI!w9u`w0{%V0(Q%)suH%#oCT@dm|rzrGu36l*00I zGr8j7hFKJ2ctebvbp8{ppNr+(3CFeGO}5`x<-AS5W16Fr*v2s8vc$=_aEvn&ZhW9hdMqxL$`O5_Rj8gnvc_Fndg1NO77^ENl1jY=Al09ItY=yB z6V>eN+iKRTvh?EDyS^%B$Hm$`zowMw6wl@G2Y?lyAMsUookwFN1oZUTpKjg)!>Q92 z{1FTNnKx11+OF&~xAe83+b9^AF?<<^0UFF|I3E~;_blI8(_02uoi2+XqYH7~4f<0p>Vec-E_qv_wOUT&s)nf0>GSJnjYhh&O=@X;85fyc6(*SJ8LKeUZzNine5xw0EGi=mOHDTO`J?Kj zuU0dJko?g2oEvX0TE<*e>t_6<$pR91e9D)k_Ir0g5)QH; zPnR_dXS;*b5U`l*R9V>0jFi76i!pK+p3aoiLDo9=bmIsK=Bf-1_M$L=4~bQpf-S}e zCT%p$i1z5{0v#>I8w9$Bjgg=8>DpEnsxIJQLyxXovsd+^22w7hSE6oQamYjx@<8Pw zK`t+ON<~aFSwLh^t3z(VK@p?I``6DwGL~snf+$u3Z>Wer8(eC7%=wTWWagLX36-Y+ z_9G)Z9eCw#9nJuQF_@CR2jM>b7^D)+P6u%!3>I@R`>SO|~vhrYGTVNUg!$Alx$76!cg> zc;+5~}iYl>rRrRuGq#V1)>45VDxdk_Qm;!}=O-*h6#qJ8Ud=DAM z{wt|*cVe;a?YB7NB4*+}07P_yYuc3VX_mN1PR0_@H13{(OlvFayHo&wA?d2Y8S$G` zIQ~GvtDXvq8U0kh^CS8G9__RKh6L=mqBa+sA&>c0f-0gYa{rO--?jAc-oz>|RDe3c zTycZI)9?DTOYzpu^&)_LIGsdxXB<&2;xRQM8vg*yS?6NI@7;Cx*-X-#W>2YnaZ+FP ze0HWE+>3reiz*4abf#odg&d_qg&%3>i9ctv-S}N0Syx0gv34(DGkGe?yzkwg${~m8 zig$I#?$vdNn}a0^AnD3=)KP67fP?*O(sipqv+i4mwynSRMinCVLI@MW+^=-9+I>nMb_C`WDscyk?8?Gh zz?+$vdb#o$HflRz)~>X7Bzmsz;j-yyoLbV8?Qk@|6ww%8%ug0uJe{V(GFfgxO|H9r zvi9s55`KQRxDqo;(z*y%hzP{l(a5X*#*@wXsd{vZC!W{tMSoH(#!@UzGvgFJ31?KI z6ke*?wS1Uxjz_~P8nSq9K#Ht)_B7n4eq-QKlm_f4m~WZ+V_H-p|8eFOQA$+XmkqVW znsslHbH<&ymM(0k;5+TQ2*EVh2Det*ycf-xy>=nOeekNec`{E(YmpS_5dip5v8Jn3?AJD0{85 z4LlX-eW!1BS2R;oYU!c@;bf=iT>~J_qzkHIp|wOfYi!5Y(x62a1pFWrox325zzvMq} z%Y-ArS+3@GCt?vSRabh$dd)>iWFNUE1s&a&D<7|Fw{{ZGIv)n|kT zD~E}wea%V82TP>+%WI~uK{TZTg3o*HnHgMGeZ^?%ch8Qd&$-JSDP!)lKmHYXZ_*(NOI@*QDV~k5opVgP>G`Fw;`#I+7(ky-DX@tjl{>bE#D!5jg|3O zQDv{51}5l*R(006_xJD)O8U2b-#$!GWg)yB6hsC*Q);eZ5SC?=gPN#;mApEV|33D5 zL&TjH68qMakonbjJaOXx{u2V(%1_1j?KDxzA34(FP|jd3n!C&OuMPr)wbWRKL2os~ z7ly%=7mkKwJ5mPzuhQ{ci`wzeE5mLF*)oejpXuyuFVxVD*f9JD*4_g~ohW=r!f0;!3Vulm1AS<}MdV&QFwA;nqP zU+%uZC_ha;K2#j;sP*NaR0vxKvt0!tLfTC>!1K*O=JjwSE|DN*4OBA*!!- zo~+b0F1BVaAcJ;WbmX-CQ~8))bo$bq84kKU+?#X>_1bDRat6FIZpi<-mkz7Q7tbwh z>d=8gkvXX4BzKx{C(1KCZch*hUl2G?U6~`>_r0OsgrgZ?3Q9g?vAG{|asCx4SZq;n zL^Q_moD-*m3j_kLwNWs=5!o^r-ymvpGGF*vzw1RAZgVM{xWKjEE93-TIWe0wpd@!< z7QCbx{#GDhK_GTjA2$t0(Y%cO*bic+N&Iiftg=CE>dVXhq{ji(o|pkJLih+Qh$Ac# zOX8g7?{8TZvfy0%?Z?1RxbyFnh9PP{=>Gl@0vQ(hKjoBRod4@vdD|DtOQ{Jl2{o(7 z2BzGnA)JVU*8-YbXLFOMZ|_kYZB6#q`!7_(#)<@8k9y+m7by5Gt=!)$x*Uxect3SG zh+ig%gdTK%gv&Dw<-aj7*NP45OAXdP?_aN)NkGj5I-<^HOTcS&Hrv3fRs484Yy-xo zeS-cTw;mXq zb0B}Prn9?CF9FE}TF%B`MJP}TKviGAZVH6R289KKUdLYfN#Y@J1WeYU^wc*?p;@ln zrke%*?dABdVJvksq*51DMnL zATKbd9^Jrlv*`4rum3Lw(`tcaK`fw5RqO`-=#ROM0prmEeR^V?TXYEH#g?sA3tKzoq<7K zW(T7xUR@N?4+0Qb<~c@l7v^dY+G@iLHJbzY^qK!Y86w|UXs{lo?<^BQ%gqj1!WRN? zDf;+Li(6YheH!LJE+-lQd!eZp>k<%*8~q6~-<<3$c+CVjNPTypFO!PYJU9s{HCB*) zP5Qu+hdfh7%VX@bsa()1%GIoU(Sh!BNL?rYVWE0N5QE5ZeOc7LU*R!~bjEpIKK?}a z#S5R|a8!3Jn)ltA{I-xYb;I)Cb9$X2VkOiBPU*39grN8OV%s6c0rbcwo1eE0;Il9k zYidNnN}%8#^>|N%F#+BA78jQV>Z;>0f&!YB?Bc_ZNle=l@gsvhxz^_vJBgsgD&plW zPjC9suJxsW$Hwa%z967b(pF#9;*W!q#~35KurSY-zp}Y05A|qB6_?6Yz4wssV-V25 zvuM2gdrmo>)Rx2$&U*J7&0HH}g{a>pZ}jzx6tl~4uWgQ3u$I2;{?;u0CliBgZx0M| z*`Cls_~ghgk%0qix$Q5>#R0GIbo-c6p}IkXM~%jIBap$T(~BD^yA<3ZKuwnE=C(S0-2JulE9fYMcw7sThiFyPWx?iE62BY*Z*;4 zcCyS!+J&8~yU-XiV)Mzup5CaDrSokTk5KrJbK5 z_ffEO%0zuiG>>QlkIE@G`PH>D0GTT~~ya412+W!fVUb8;>zr8h7eh$fbX}hwK zF~s986qT*}XH;kXb4%sbc&jaV6mc-<#AQ4^6}bI)ik^de%5~&6Sl*k4Y|abQ*{g71 z>+|;Xa>th?1sTk(%X(M=H*X2{ST3yRxA4<~AMl+{mL2hO64`(zw$;C6F-*NE%O#(U%$wo! z+;EyLj-?qJ!Zbp)y&Jqrx~aA!hrfK1zIxi#cUNH^(6zO{U^097SbAdtrw*Ou#Gs&) znqE1@;&8^kRrY2)mZBXc@9hk$9a*@*)K_p<&JGwz+(GE~ysM@Axz&0VtAAPt70Ucg1O5aTFmI`CxBc zncu7&=;#_Xen3`Ss4EXWxT7C3PpaQnhROH%oVI;8ja=qNPaEx}H&zVv326x;xxdtY z=WbXEVtZZG*kG^5Ng*d>asR%4$@s(}{~oLTjH6}iO=?9>bT4`@8}F$E3ysC>#;6AUF>h8C4jfhv9zQTz zs2>ungy%nVP`>kW8(KTnG19s$^2FofxgbYS?qJ;2q>~olek_yq;W1s}*w1$k#?mFe zuh_T*WN*ML?J35dzk>4bIU&R)I2#bM2acq8Fl$Nmp^>)x&L)krZ|RrG7dPZ3E3pc3x{WUu2XL+&wXmmi&Wh z*B^%U%irEw+kSrBJ;l?484pnGEdKP4hFS(%GemxP=e_1=Kfk$l^LOTZ46$~lk`D;( zP7wc1aSW|#S4 z8d1k9g&>9xN#31NhV8bBS~`=o2eLOb^cbo5V&GLrjJeXbO7;e1u0jgU1Q%``RRg6r z5aM=We_|=&+59v$s}A}tdC&;|U8=E}r;ObAB|VXg^Y^W{hc6!coK!Au8Z9&=Ml1JK zr{p5x-4`rE*>k0nm#}G%a~XzT_rXXSx|$DF#FcIxMx(uXF}k&t?PuS!SP4(+(tNJr z_>2w4%O062=l;ZqJeCG$W*s{9UDQ$$(W*So|5DvDZ0g6m&RbuHkty95tDj<+ngSWQ z5yEkvk6wv->3kktrdlAnMho%H8|;*}cd}{V^+PXL9xsBSHM_vaT#}$L)YkL;nbut# zenA#9xuH@;gL3^N@TuXK9B8GgQuz*fn?;fL7w@XDHOBP&r!V9m!RPgvjaBi!iT>k-49jbGjm5-4lk6X`FB$R3k;-r*8_AU*dj6Ys)xCCF!;>q;-Qz{#1{bF` zqnx7aLa*{r`DRA(Rx7i$!U0p~{G#=X&SaF|AEk?=tOfKYSb}9tcsK?}Yki(|lG4DU z#(KI}f^I_Wd*4Tnt^6WVALp|d(Q|?OHG1BQx1>(wE$0u;J{(-Uvf3}Qyv5!2iG|4E zw$&W-#gfEUZ4$Per+W%Higb;Zs_bzLJb(8*vpzz}MB&}Clg;=3yJ3_ePREyvPe>m& ze(pQ1^_$$A(KmnQbeCg!Z?c;uFsM;13Poqi8GiR9JK{LK+x>i7MCQMA*N`->jCxT+ zDDE4oR%}f-z(w9W@WlrQy4nQCVyaY4!;YbeGGV=@-2;ICB2-ddOYCc=~(zHgwtId_vjuY;m zwalgs5m&n8Rp@6Shw-pC%r)AYe2)iv9k#7Kw-`ttIx%dOEv#9I^5=aZBIvc5 zbKxs=1CbC-*PJ^%zn$@{orh`s;G)txW%>?w+5PXjorAUrwH-aDEcdZ^_TUY>MffY$ z%TpV(mJ4ObzK}c2MZ|ld7wuGGe-Vbx(ZQCKR7G=S#-~(YDCSKVQh(!G(VS>(p(7eV z#yKw1Wqk-KCnWvNVIq+gR#jd&)&NW0`+B{(X9H__qdRnsTyVl(XS${+IjHu$gVS`) zc11jh9`CMt2s31{8wrrwOZ2g{0jUM6xyVt;t6Q=5N# z+~=mv;C*i(wSq3rH~*g9BF7OwJxH%(U7wuEKA5ze+U3DGxa1#@XUMp_e^0Fey&bmq z9=`;0bZooAzOnuo*isQ+a_Q+RW;_JZZ*JZclDFMtGRY0A;%Rx+BYwrmG=-PS@or}G z*rO|wvNNDR*0q0Xm{U7NEn0-}bqPjh*D(Hzj~3ZwC4WTq=(*bIy2;tzr4O4V^gvlSV&HA~VG2FE z$R@1hTzq%s8THKNN~@W5yB%Wx=w~$EgooGIhz^HIqd;)zkeJsR%6qnXFyD_s zBzk?G8y$W#3;`XJ+G65mS+?`YTK9MwDSBdc^c@mbj56UJ0x5=NNb;|7meI-m4_@j8BPc{rT?D z#cbk<6Gfy$eo&CdlmT4Ie6ey$JxLN0don^oX3eQtxKd!dl0hFRbrLOOZ1b1RGan_F!g@q&#Gw@I}dVW7|lQ2A|Gl_Bfau zF{Il21Y!nk(t!-NmY=GU<^#?k9v&Dm(%7eh=>^X(Z5-QNGmL${AH@jEybY9Iwu zwf9Of&b%;pn`;CLmYWtRcPNx{U{uFHib9y0dafIDUQoEPrm7$t854dW=^7%L(vqjL zG4&oQ{WV0#Lo)%NV3{r!CmvN5B5N0SJKme*`YjvQd`d8=zU|FQ%$uY+Kc=|LYKHi! zrfbhT+4(1`w@X80k;J>o5Sl=YQ`EVDi0B1IT5_S(JxgW z7Fvv*?)A(d)5@9JIASiA7Y#fN813+_DmnLVqkW|Hp`lX~hGQ8e``Vy)v`-{H@^u<~ zV5+O>T1>omoqzXAwxfCr$rL+Jviu0zjUx^z_IPS7WJr+J`0l*JVSdqr9&u~y+frIf zSC5DYAJXal@sD`jgx6^i{X^!~)K1B`II5wybDwiY-!r;Kpsb?YX@iMyc%w>((^Q4I z&cdCTw%mLbFjaI6V}|otQq>C6j#Ux>%F40~^BXuUG`pmRc%0|7e5}?*g?e{}aEe;s zP%Ei(ZlQ=a*~X(@?+mupd5JYr7MAqxC5b!bI|7s;(Xb|?GLZV|7a{$&9NT);)~H5G z1JY_KRW%KBrW$~>;J89ec$@l`kuA7 zUE6d&_kCUGb)Lt0oX0`(MnY=do5MdlGje!l@^s$(!alCyGwahT?~aar3tjw86?XJT ztLvxC`#B$cQ(6nkm6=BR*n5!FtC&bLIVWX}NhS|<#f5XKd=88fLACWV@Kt^1Y{h(j zLL+bNkAJMZ##Y(VJO+PQPW@swDi(^I|JwHi#ly?hrA^MF#xIvo-Y9{wYZ;yTx z?yD5tS8 zcIrFdHkK**((3K1%N`}_+mx|O?Dxy^u=&R$ZJBdF6j=H16dP3Ox~26xr$2p6^N);T zNSi;?WKaXIQl}ie4kW`OAcM%s-ie{>?+MJqM0|B#^1j( zmAIi{o1k42<@ft7eOjeD+q1Usf2jRLAp@*NJx}hq^L)`x8@92RQp}&J3>R|_{4|kd zbz1B_7b#H*+r!7|kDu)(oQ7&KJIENys-NV1A z`Ts!2)jVatdzeN)37Lr&rzh0)pB0B|8)+Ht9alT%;S?lVp?R8Kz^tp!((xK^rL&X*8}=0TUSrnrfS2f z)6|b+KG@%gAvfMOutE@UI_?+eL9?tk==mwm>$r4q+zFW=Cbq-Rn6@vnlH?}(p8i@^ zcB+1vdA024%XJk?Ws@ts%4(9A)yOYXT~vx7meu^&uphQ?g&vmKwIX_bJD*Iht&HDx zz+e~tb+~s!;}Mm4nn`I>;=ev=26A^A7vv2#&$Hg#MO2dGo7o(Y+3Z%IL`2MJTK-z= zoIykOAI!Y>{Wbyp3`)n~|BS1^T>O?D5Lj{=xNJ^UvBI7^0WXU>L9Hh4aNM zlGizLCTqD{zavM+hK}V48l0ox$n^Ccm5xabi`ks{>{YtwK;}{UP)-kBH*Oiz?5FAb z1Ky^IYAM(^ZyGMLMe*4#()VP!k5O-(dY||H5H+gQ-9H+5;?0Gbs~7D!=Byk z-J`dCyWqWkJ@~%w=irGp%k>P-sC1U(+}wl!GO`nA&di=ZS^jY6_KU%$G&D4+Yrh(| zd4)&na_G)#T73!m&Aa~*kHsSWL`G5@v4Y0$z+0A_Oy6sD^ymcpI#TuVmyn=P*GH!lHqKOwLtA}bHb?dKcU&r+y1oCf zI7{%M!<{w7ZlCh=edXT@<_k*KJpN1}#Njpp>GWpyQ8+O>Ug-W76xwJeshh3k_)9J< zBQYhdFe;LrVsF$d{TnsmYcm&}q@112%pQfjuSpfMg}C-?iS2N)`quK@D|fS$STnQU z2RseGWonuFK}s~ngMIDB6=h`?7dll%>j|wb-(VI-Z}-*W>4?b4gA#Nt9#6=1$n%IT z!j#pto;fX;>vpK(Vk=eOKAl}1zbG)Qac{AP?o~SHrAu*pDZL6^U3o1<{@(Fkb%8fr z+r6dbtt~BEKUtVbyL^Hw(d49y!=&YHbCST9=`3vU@mh|I*xXKY{*$sqZ05&giZxv| zEkWmZk7Ss??BM0+)srpk9hsod6BLEV*Ykh=c_&95bG>@^o%KMId?6vm#xJ31TDL6C zZDxLMxWOT2saEVMqj!tzjFH{M_viip6n=95@hR%ON8gu2?3#JGya}()vookSBn6|% z!jP_;XS480k8`Q+^A43HwYvdM`T6lD%Ll#&8otVGs;pdTDBrgvH_hmMxSVTt{s2sR zEW|cVCo5vG^bbl1GhS073(v0ckCvpU-$Qw4tN~n5y;aj zvblcA%_}1DYK;5^H|~RLX@c!BOacx||NJB2lDi|O)?@kg1=IF-@8rT}@@*8 z{O0{kq$756v=MJTapdJ^%Qp{_tNa>VAVH8;lKZp$>(JeB^?z4raCkd z->N%KvGb^MgfesJKeZ2|85oRmIIk(1dqwrF@#Mh~JE@89ZJ!)A)eP?SG}jdN$a=BJ z(}>+=TKpP4*{h_jtgNCpF*bDj+RencxJyugSE$K+=60cb&_9WiWw*(#%-pQek(9*3ruB!TjLDcb@j$@f* ze#^p7o(%n>m$WpzqD(fzL4xA8URZzGTj>{HKRdl6{ip4dpIJQ~{=QM_xWclgrtg+J zS9_@2A@6*gys4#$S3rPIK;Uk^UY6DqbrRBguQ{9DUiW`Gzy_4vVtnW=%LSrKw>d8D z4rZkAo9Ux?>Fn$(YRF8X%<5rvLi;xJuF#M}zLMtVmTIZnOYU8RCa0CcLU4;ltWrsz z-Dw2_E2{wU<1>r1AKrT_e@)Gf6_X?%xWwsFG`_ei(ML9zo?4!4er`F2rzOgcKSGAR2R+s(z z2n%lb#F7vVOpaTa8oREy)?4WoOA*5pfy=`spT)RhuWEk;T;hQ>fDPs-(K zeq@ZMzW$-3=W}`s~w<@Gj2?q_p+O2qi!;6~$to{pTOFTZaFj@!R~fA3yg<}gfe;mXaD0!v#O zL2`*7oSX;{=RXNgPDtINFc3-7+j`iMXM0eh^_lw|bha+JxvANaF0OM0S1vSEuV>kLgpFfVq=*#e&eN)}AK{}}R_cBZ9j0IDO$R*U+pbKn8 zzAyJ3ubAshZ}IF+Wh-^ww2E+Dtq&hQ2F#B2KqK4K++4#s1gC-9K$o2DT4X5?@D zyQ*eLj<_Box-U*H_rgJ1Q z`%OrHAC$=AF-y=dvRe-nD>DvC3UB*o`Q!E;wKMkbF}zhC6rc#*Xz|) z=U7SEcyl9O!)M12o$&Va^K05O|NFP(rCYl)S=}q+r0tnvWspI#mAALw!2FT-u`-P6G z;_QF_{67=eZOQ-rjHkf%|1M@CBI})r|2A+5pYJACA{06QzW%>u%Ks0)$a9zzHqvko z0QchbY2VsmkCnkNh{rKNbISkfzwz2Jhme)`HaE7kNU;P%0(5gl9YXvjP%mEYfdG`J zrzezK6162+sW!(Aw`?HR3=Nu%^>t{&K?|pNZR!(O(X#PlUr=LaS2|z=^)pQu4mX92 zU;ixw3`_`b({TZEKQ7MBF!$pZ5GXD&g*S@Z>SzL_S)p2{Ntp^=@SGgm&kuHiG6Ug# zZ1VdF2?>w@&B~h1WHy1MJv6L)Jhnult{TF0?Z%CvOv!)wfCgf}sH1Qf9dE$pG@8e3 ze@v|yloHQR7tBjE96#(&@MOP{)8oEowZI6Ypo0?d=4v$@(g>XW%LRb#Q>>EDxs#;3 zOJRo4)MN*7QB!UwC~Dome_xHwo<{TE1z~WY4&}^@U*8=;i1kE4vk!Vu!Ox%1jEb$# zl;Y3DD?@aUrcOzrJABwD@1PQoMIFHg2-gMC(-4{Ul;e|QW2?}##Qzb!-T47>$yHUd z-b%{K^)AzekI3Pnx)HY$_W{1XN1&Ss72HpsK0&{9?X>D! zm>NPNxjzdQbLo)Kfv^>b6dO~Yrgv`tOzuGYXGJ<@5lXiiKOv7zg5F79o`Z}G!N$F# zqhnSZ5s-d=0z^czvVtU;YF-Jc25WoWS)6Et?(Evi3YJ12CBmW*{SQq;H~Zfs%J67| zMk13phWd-w=j6QWpm+^eBD`qG39n}_Uyh8A<7cn^I6sZM^6I?9?ds4o5P~akUE!7( z+1yxzk{RS2o1uXp#;K2$69bdno6pbU*X;IE*4IxHeGWQSe}6yWt;2Z_Zb6Vnhiw6j zDfdxxuGe~OHgv98e^!c>O~GkdYb#<%TV=fv&=0n-hw6_TnP--)%iaB z=LXOUx-Q>wb-l2-hMR~h;NlhX+Gc|FZ*cO$v1vFuZ7q3hJtF_7aTI$4%h({>)Yn+% zkBhImdI%(NhjMu9TUz)b&RYxBb_m-OwD*>JJOXQBv-jyvp9IG99+h4swzsoGotx;J z{Nckg%oCxJ)@lf|T~u@mTxZU76?=&B>vJ52Qtkj^#MwrYDtzj`E%<*}3 zdF|S>r`WG{i#QqoBO?@Q%8LsNP|=)fR1~{Rj5_ilu{Zo`CSo-qR34Tr)AYSzr+@kC z@<8B02?p1hi>|Kg5L0z^btRYZ_4UQuB)F7or0ccS*PnwaUx7(68+SMdv?P1BHuL&_ zW6QudGOp)0g6>6*!zaAInGVJ~K(t0h;5il}WDB*Brn78jX2TtM*7GZ_<)es*nxq*S87NrsO2waezd%&+Wq5eN z5gsW8W?C42K%(@ZuViZvR%Vvgg%9^A|3rn}liPsQcxw76vBC*MLQn5iP0#inJK)(j zJG~u7>z3UG`7mg* z1z~)tRGmNFd!!&ZjJh6M~d5ld*x zIRDKYxDH5YDo*=f-9fa)dS4ugk+;OQ5J^}!atRAvYsE2i00GbhUN<~7|9(U7btLRu zFJNkW=E=}LiZ{lD<0feJ8YHiYbqM?Vl=;HY0^X*S^HB*(Cl;l)@<=^kl*bNhV>ZqM3U;m%@pd*>?wx;Ih z&1{#S*@vuAh8WoCMDGidc{e&w)^{)nMQ7p2JEEBzPC_X*{~phEb-gJ>A3uH^Gq-@B zHqV*s#>VEA#+8br3vT2&^WJEqLO)8s_C1NGCo!$huUSX0$A-Gnd!~(_1xM9P4-~%> z*}psQ{@=%7Ab08LzT@-l&Dm@5)2U7#8`%b1uFJT|7ew&u5rL~KS-hjx7%D&P>!NCBg5{Ha?sjK9mnBJJ%*DSUs8 zh5SCh;sg`hUozFBJpZiO>()ss8(kb~PO-95BqJp|r5Ns)$K6^ue+m_p31#pT_E9aB z;qOrpbXNHhlj5=dt*-8-lx1pE7wc~a>#h9xo@9^p4{ttbu~N0Rwo6rf=jG9Kat)|N6{{;tj4rx6F^;^RYXrYwQo5yy&ra+f0BwexA@LCO>sr)Kq#FwVER zx$jU!xj3!uRE+*7K7Jv!<8Nuv8_(CoMs%R|T%1(f3GZ${UCD&T_c!0gS8E>kmPmL= zc}4OJtyN|Ap%Z7MMOoRyWMizFJl${W6;BPEzgO8Xh%7D$6DMGcGu2snetCRTvBl$UT3noyu7)Vq05yQ1MlckB$o2jJ(Esec7sg^ys9+^e-Gb|E+sGe^x4` z5HTCy)zm!osBy4=tfi|v7FdquWIu)5lytKlJaPePk{dI_OcfnLOd16ypKg zn1+I4(~FV;d%C9wW;qSzqt2ca1WN!gmYD zL!NLX?Cf{ke&3UvcCs(XmVK?!!|lF(Q_R_O%QK&MDC+2*k$PITT`_|D5Z!#tRkN}m zuL@m;6$h^`>34Omr8PY-|H8f>@4!kiCX|Z$^5u%UQBn~%5$|V3McZ-%%%3m)zLFxt zOhQ9#YGiZ{y0(NC!Ja>9C^mEndw<*Rc~!uXTWbBjc%(aBH{(9G&ksL8D1liuYpYvM z>xui@&E8HSAZ{K|_u!@E|+*$M@7kMF1;>z1OsHqelywVav3?d9bN+!PjMT7gx3fh`A@_uNij}LBl@aHdQ9vb&Dvz2(AQF1QVFnw zbFZmphE?Va|A-WEh)$+qHRYB_>^YGl!y!Se%*qxl9sBIlN8y7KfWjq+UAofL6ciTn zdCYchFY=0Ol#!F8@MR8_dEqmGI>aV_tNZsZ(aRi%J6hWry%(puRCRT|6khR}Mdt+u zCex5h0QB`%gawjp%-8xYjXS*_@hVBlWU)%DdYqbfKmOkVj|G!nER~QrMx5oEA8Y2h zk`P?WtUwygYh-+}-PW z`ADJx1vRJM$mAq)?J57O-)1O%B~ijpBBktTZ^vfw5fC7G_yyY61QY=#fyl*CvO^lS zlxE8x&IG5C0)6`?^QPZYC8MBV9hM;w{BE%H^5r&Uu;Te~fs$E?hF79L9wv_Sy^ z*g{iB#~EG*s6VNrga?0R9IYL2j&%>XbYUdo)!f|WoubO4ZM+4Vlnb}$%0}0-m31;x zgkNV=Ewa^|@mgH%O1zK~tFa9;9ZyZO$R&9GF?lF)zu{~s2YZqlE#C>LQN1%~&aktO ze|hj};FLVPdx#msPFlCY7l9ba6B75kuJj_UhFiTg^ob@gm+Uw61?Z(KT8-FP;ytu5f6`kQ>s z&8n9q`1WQ*t1b3irO2}$X7X;`|J3g@k|RL1MyP*ci;6^D4~HZ_B>xiVAMxu-yh^yd z6jKl@m2922Z+!gHvF7HBNXRx&i$AR$HVJ%y!V(n(WY?FF)ssu0LO`K|WFBbA_WMMP zybx>W;mH|}h(`LInwknfZ=?ngR0Tq@{r=hORd8~M{CpYK9D?>^YL=eQW9j(JsWg%; z{(%Q%?`JO_vmbEWJ1Y3w!VFsK2q=tY04+N^Q82Hn(^RIUr76hC>E_!E*8P-=RWdd) zL9K=&62j#^BJQsO0|Wc-HVDRa_HH$YZs=yj6BW@qi$}^ zLakw0VzL0&dwL3re)z#N1;H2tj=Y#|fxT{0(x|OM4sGp#&s4P^>t<$l6i;+*%qteTyE9WHy-7@b`<9lW z`+%ypa**S?qNYF|lG@+ZVaTwuHn%X-SK%;$^OKpo^2d*&{QT2P8vI2se3MS!7ysZs zse|tNj~`FJr)UoTynUQxuztRw{I25fY2`(bXP$TdWHoNqw4$jGIvdNb)Yfuk26vy0tC|6A0H#5QQ6~z_~gTf4}q^>-&a@5mC{h1UsFm_TTs*!443D>X2=Kw z4_9l_M9ekAtUEDr-e!WN=F4OQ0Aar{_u40j(HV5>YydAA=T7?yvOI-PVW9Gx7qrM`OsL^*b zVt1V9s25Ec4l=v5d}|N}q6P*}HMhM832E!-IIz4Pc&59f1Lnkj>hDmPb9C^8%hycL z`gGZL-Kq@<2~pS7qzeLbLGa2hY|{WPQEdwsmWl8NHs3$m$^ln z(K4&T(ONHF{#5+)|~zq+L4TFWb^Bcox}Q(-#V9p7CnF8b+7d(Kj_GpyXW2A-eO z#W1G_Ox)1bH90WA1Lq$1bGG@N5b6H-Q5fYIKsw;k-gQut26{s4?zHetTqa_jJEIwL`#78p)YQ~mf7eUnyzaHh zw-Y|fXovHYDX0~;4_#enf-B*okeZg3#p~$eqN%BAo3AG#QV2`VDu?GP&ctxl1Mr(; zKW-T2Qxhq`rT?+1swz1(m4lB@os|mw3V51S_v}GM0tDpk+qd8*d0$N!2s{D{J$TGd zPE6p`h~%>f#ddvE+E(b|U}|dW?ELZ3qY5+=U=7a0&5d)<%j=Sz9q&U4xF^7{jS>r2j-VeOA5Y z^5L-eGE`DJ&QJ``J!B18zh+m~0Rnq^5|#5+S(oGIr5hB&=5NpX0BX-U}@o*wUUvT;-BSQ?3A)Hfj_7U8n#g7y6BqTBD+4#9^;{7ADL94*Z z(o&Kb*4ibVoqC(gv`3EMBmvn5&mg(#l-7+Y>Kx;US<4KzHGaKX5Eaa({?a50yr z{i?<1tblSmdo6)%Et#!z(OEVuv1aY%RdM2Q%tOs^GFJz+Hc8E$M|b% zDmo+t?y{MMIvN^2QPRo$hq+QEnGS|ki@@X2-@h6MBRUcvjLS(TzHKgcSfl$4^cUvQ z@D#zr6A=-Sh$UxyXIl9j&bw7rRoAOS8NG2_zz5~wNpAw9F;C)gxp5(y zP|NA(@Aj9Wmz1QIj8i{7eaiFHT+T5)zMuQbv$4kYkT~FZ!2_+UOXR`@y?KXNm<}i^ zW+Ww5c6S#gCs#ospNk6~jTF9RU%yHrX<>G#Vh?>L>rd?D_w((x3>Mi8g=ATYmHx!| z_(8k}oFl*lfyuV|CcX4@4_~j3lTJ=Q>UZ*xgv_nb@vxI$0~s=SDTRfF7unSTNFgd9 z$27xc=99tI#HXdDX>q`uZ{94%tp$?&8P_TrSb}8WtfjA}_9i1E&`d|(#bphC*yIve zvgi2u4c?oF^xsvMKbu>KwXMhb^Xpd@VPT!3Lw)gbVS@BO@UzGzV4XFB!z0TW{LTqL~;!^$WYAl-*n=v0?Wj z70LD0CnErBW>0Uec=Yra7rMFrlAhMhnk#nF(UmqsAKF!I=XS=MU&>zZrR0-eM3v!3 zc{J+Pi=ssjvzoOz53f@S`=fb}Y@IjuUP0sZ+n&1S=BUHR?$_!1DPO)C==bW_!;QC% zNBk*6t7=06&E7p4z8SccU#}K%0S)_GeFwFANPtDc{T<=DrltlZ1J)+bjqm78K9Xb_ zotVJ1uauM&g)eN&;l2vvq+wX46*w=L+x<4YtZHP`hyEF?OwfshJ$x%XPI~L%xCBSF z_O`Y&dLL#ggHP?*PrnTOHPh?|+D4cC4=X1%b$xQ6rlQ)pdvj_06oQCmx}Fd+H}qRv zEk6Km2gwFjOByV}lQ3n3^}w9sQQ}ynsQ)&4u)OjNf0-XHwi&E~W1BS-NbW~IxB*3fwoTzAYrD^Dk7jOXkjdnzN zv@2FmD5t(G3kBY>&H6**iFBYG`0lg~~8v;~AirTJCoUH~PwzD?iiq_mPp6 z=K`e{;NVC_*@Ufb-hK;BEIbBmMkIu&385l&>=?{Y9VXk=H8h3>2cZ{$#!uE_Y4Y=? z#zvf8v*_aeUR=E0kxN!>gLa+Gy?Y3E+@hOTt*x!$Z2iw=f5Ndb-GeH!oy*<34tt}% zM=`gks3^JRaZ+mP1vrVozzAE!-_MUK@9IYXMr%ihD(eeWo}WH^08W8I6yxOBK0N5o zAv7WS02hLsgO)Ury2~b>1>7~kUMNDF0t*G5ivC%?pmE1U8TIeAwA|Pks5+42H`mu+ zQBWvnNftT}yM|)ZN{S@4k3jjSpkA*G!&yl;lbG1Dw$9EAC~pv{ade`!QIEFmCch3s zBuqpJPQPeew^lc!-;%=Sgs$t_bwYbjUH2{;;qbgqH7q_BV|@E|dP0Jxw)SX$|Cix; z1~GR+3x$u4-B8P_E&C+A*%VGCq1wIR{QD-}ka5;BdK_P)8FX}Y)gNkp*CdX`>izNZ zTxoOj0%~OJhq)b(e+>`s+xY-bUH&-v1*f?(&|8BkSHkzFM~pu-)`mN;fvW0!x65>p z%p3Ft;4?ND9`P(wD-{tgmE;unbdmX65^SCV5KnMRdr^*q%f% zv(mzT%rC0&DXf?!5{MqXmp@Or;EGXKj@o_n^{vGDF#9$ThuIhJz1UiaEHDMX66(c` zruV-d0aKB$VSLxn-2DFCJ0t?PtgXWWbC5;=G-GD=7C(+AnYOO(&*o;M9LR6LMFAa& z?CdcCOE$01%jmwq`vzqsGNO6(-`ua%R91$Ix(NqJfnR|>quWgH#bP3y!#8f+uoI4| zxv}K0SJRLF@Wxb@pT9qz0gw5+CCxr^lPLkNk$qD%m72VQBmS7mpTw4->c_7YWY#2m$R#xI3Yg{NwC1OT8I=W+l z2}KI0;m*08hK_D+dHI`Zc1w!}c9PUX#nNP13W=MztAGrzCg6)rv|&h?fxI5g>DE>n zx>-~TIB27*2j?6wKuBWD=}Gk#&}vpmYQpa;&zMYXpGR0VNcH?f9~t+LnuRcj=@!~ zrmb&$97!9hb2R6{egFx~R}vXI5-RnW-q^BRH*Y>J%;V+eHqL27-Z6L1!p5CUYwnxb zDL!2!{sK5R+$p;{J2RP$7JLx;%=tC4GF9TTvg%PPqoBUYD<@YC`__f7@Y8xS(6o&hn1$e@85$h4a%a4i&pf|aCvV!wcmApwDh&KXuLkx)z@QjI2#xo zi-E77A)_}?6IwdD>)hJ<`cYT{QBnG!3V_rYQ>#h8Q@Y5TKJ(AU^b+j!JIM%cPfuAH zGb`(3d6qzWAqs{)nj7T@lZx&gCzEAcky*XIH$GhHR+6!`^`F*1+M*=;_oHNyAZ~7I zy2h2RerN)%P&{0a>uPEgM(-shyzG7Tir&M+1EdP>aDW^Qz(sIQT_||}o-eQh#|X&D zzUceM$6wdiKYH(UUQUjxJu6@3nPie9Vyxd)|a(|af~#kenA zGEeFe50X(cFxUjP1XC*SXX3|4CMMMAy}?2BuNXLe^@R*Ga4YM%nvxR9d+WK+zJ3>^*gwn4 zej&XF9C7mG$&KiF>S~MyKz``8N)mz(lKO1auvN z#JSIaD5s`8>^oT~d{H@RQPa4d(YmxZR_Sqb2#_J*CX|$v_?n6CE2FV$F}l2`O{uEi zF?J^wxc?bciM|gYMMoz>{CG*xM*;Ju#7F^aChzUrx06dCYJ!5Q)mVjG5wt^v{<7P# z-M~W4XjgVKoPLBY2!khN9f0G}IRf4kAQdU*QPd#1eTVbga@aLTv=rQYO$Oc&FmRBJ zN;Z!n0eJJqw7+a?^jZ19EN+$Ya4WI~T;EEEM*JgBc@~o%kHK!;#+rK7!$E zHSX?#0~L9Rd3n?p*{#->EUl~tI}S5>3({XLK5NPU$uPsu?8~4HfjZY6NzG-zd-iOJ zv+%Wn!q}~&4OfDh`@WgZy@7q+)mJY=LkYH_gwq#?6^wLSMKlZyqK(&yV}YAkwOE%+SA-Q0KYmY3ISTT7Dt1YIxhIDB*?J2=@b-48uQkZf<> zOiWBH@eyVy`&uQo)oX$L8RV!7b|d5xtlZoba$@1~UyEhL zhI{dW1A*wVfH`OhI@_I7bG`f1jkTrY>f1Xy7JmOGmjLR4qp8v~IfEy}?A9&RTL`iN z%|0Eit?S5^TVD!}Q6s!6Sv%HJBTsK=P$AnFKvEEz7<#YUpH&HSSJs;QEZE=U7UTq}GlVGd(FBS(BcUGCn>Y zi4-_Q7WUNM1nQUC#nIS_u;GxQ(9d1nq_a|k3-ji7I~`Fy&B}!qj;O8M{>wR)CvJJS zo0e!MFzemBGM$4a)H=vQameA|nJ5B9a?hvh6B85PYil(b4jIT<;cU5i^X2pBK!@I_ zB>7m?LJ$fE-Uj@ekzK=vd~xv}0>}!HySqEUfYPrG7B_F!t#?mpQ#;t(BjHAq;*fti zu#M7>#8s-r_p$J`<~5%n+;tD)JU?tf?lRRWblCr);WU1Z(**-FGc%-E#c#jJ9=MN8 zBS;3f=n(PF;o6vrsnNC7Rn!_jZaO#&tCkA0Gc#W|La+?R#)(+bsi~xqQ=_AJ5-53@ zLu6N6i;Qzzy`O=Z2A)%<=stV`+aY=Bt_R*uY;505Un$4oeI2KO5wr??hsV2`vhw|1 zCTD2?aKO`uSVp`1X0! z#JdMfO-&&=zhAv0cW0(Th%Y-Qhnhnx)4VwuvDr9H z^A6e(wSC}R zmPJGjuu}OYCEY@5qOnUnUIis43b9pvA1X2}$wYyIVgE;uq>+1~q>*I0b^G?$YOVMg zc>vV#;)_jwqY^PlmE+wYpZHD<*4jXxfcKQpG2bvVi;RdcKGZL}@1FWhza02=;>Yon zj4KM?zh8je=$vlC%WEDUTkwtb@!1V>N^~@~PDh5*zQ`IZYeMz`#0ezXu$&!h9 zg?c*3Xw|ZX#edQTaY)Wi-e9Y3-Vhb_1w0x4Mj+2;^oxLObx<7tEMg~`l zxcH&N{>>d7E@1hBD2bjQ4i)Q;TsYHZwON7^Mmu8540I9jDM)4eT9#~3;%%6hp*fJD zm!IvjbUR1}efxvRgyjv3>Rs>RNJsZmzrYbtBl-%}SBy%Ox8HwlzGKC8v-HscxUtWa zfJlp`lvb^&aFja?-LZu&wQgJ>4VTCHDiByvDn%M<7}jt}Jgy#$Q0!Gi0PNc=&9GL7 zFUUqO9w*1%%Bqh&hYAL?Ih5>%ZVMrJyXdiIe&XEimF2oJ_u|D1=opTTjO^UGlhu9T zD|m_A+`#;T0f`b0#U5*gd&|HC4@$_h*rK{neJlUjKvEt+;qvSNHUqFnbdFjBo?^@U zm$#!qio*fOsmQhGXVJNllN*OqBsQC&p$Cvk;#fp&0OCN+fPuPx=U-WdOgFGT=ijXS z)fE+Hc%SAiXykTvcf0qNY~z^q+c>kQ^AY$!DB%FdHDO?agVbf86)>B=zATf9{Vc&k zsI?2aq_17;1zxf_7-mQ)dn+oWOGSF7m;1?bLxw2TD_+#xh!MPNj2ae66dc`9Um*C6 z1-b*yR#9m{W`in)>1CVlU3A*-YNCGVE=~~KM=+YP zuhdlS;4rUx?mVDPbL{1w0w+q3Y2n8KWCso?%F83j9v~$x+aqU|(}wOe>*>=Mi4n`% zT3gZIsX*NX(_EydXZiWz?7fJ8n-Y+;j>3&rni#nUDy1aVg#H6I@+>?jPsSG(>Z3&j zqh##79ns%V4wf4u!$Q0z8+49+mkKBbZme54oZ?kZFJ8vf*gEa3*KKq2Ra6({2Oz7g zJvcl(5L5gCymYL=sxC(|4_klLrY6E_w_0SpChDSr5W6s>gt|_ zhXZqa;`UAa)`P5fN5$Of*O6!Gj~4{a;!a5N%QEeEOxsRWz=~A4p}zj}l=Uwo1`m}2_Z?>i zLG=gu!hL2@Km$q7y?cu=05`CcFz|%+qM)#_am*NDL7`QEGOD{)n-a$s_7!;DU!4Vh z4Gnb{x#`w;&Jg|P`7JM4@D#Ptp+gJuTn9?(P>k(6slukdFK*?*&LkSfH)EIR1UbA4 zX^#>pga!B2?2FuX6d&9X&G7B&Tz6~X?C(+40=n&s>i5*i%+)Yy{9J}vi@8CTo8f60g0E5t53Huq4?D{{!1bJW2;y=UR7rZvsmOM6BhQWs~2Qaz; zh$}ZQFJ&(VrT8sd&+4UMIANoDQQ8+q*8ZfrBD3>0A@R2jm+lDE)qEbs4a0w_F7!aVglEumkw;0S}EZ z{nm5m^5*kT4$}tW;^KGj&iY>^mLTq{XliTA2a`G}Y3~|)h%AGsD^PgR-hPVIkqVp4I~Euz{_!A-uB_fn#zHiZKqZW3DNrQv%PXs@ zFxP|%@W;1rtY^-I$S?!{!8w8r+4^&B0D>~sYxwX>E`X*$BrJg0OvB4DzG zj13PHXc!mfa7#>TR7@=d?}C;9Ds;t zu!+Vz3Ler&yV2*s?C;z;D?w-!A7BvG%e6d``w1uVPk`sm%@4_eQNb8Kz2VoP!-vuN zhsKXODYh-2#aO2#Mz5GGYE?&wfJVxHacC_5ncsM71%L!23u@FcW}A z@UMvpgoa-zhAl7q&AK=_?S1$K{A>bOmj4lmqcWcLZM{j&!uO6)v>sqSaoE2Uo%1@ucSCy-6KONlDx# zSy@?k_f7A;l)tFKQNq|7y1QXA%y?cWq@I+#b+EGoP5*^F3%scD;?j9X%vd%sJ7TvA zvw9FikdWccW4tOXCWZ^d?zIV?`{LlcQm%XhOcF?LZf)I@Z)=8{HNph(QeRs;AHSMu zwwP?Bv#ZOx^TR<3iU;IuTwD&ewkODmLC`?Dji%hg*jOVZCxq(eB^ukIT!y!ejP4Vr zlCa!#@%acoEG#?p?SXLS-R??GOCz+DBTBGNaIeVr?PKTS5_6hk*4TBY@5?T9e9HZ) z1^D9NMv~Ut(RGAz5xM~Ba5bJ@^eOK2v9s>-Ha6Lh9z6;OsPVLD zIxF!V16o*C7&_Dy5Xb}nkuAip_M`iTvy_w%%BIDB43Ve!y-7)dD2QcS_O2KpyeGCk zzC=>yTjoB{_p_zNM(`Da&wfUf;~3klYsUAf&MLa`d8P~pxj4h zrk1nkEEocJ{R#`+oScLrYo^A>OP5?VG+GdG2{kBb247u61MQtdf(YNJmoNf^4n)X{ z7pyIMi4Vv)Jtw6w0te^?VHVUFl)gAnMcw0_e2~x@7F_^93yJ_Gi~O@`saW%aH3ENz zlD5tg$mO0FpI4e9cLusBL5wP_zNCc6!ry)9`wS6&8*RGbkXm9uzmY!^d5u7KVMKp$;DOUB{X`T0i}a!c?vrKNFbx?)RUt8EhK6oTuC8Ci ze8WI9c?7BRFq->1I&6piaSyX(NJ&XsE$^XF@~k$NVSe6E3tGtk0gf5j+5JBLe0Xxw z4W|%}*oK?$yuEj>u#n0QXoi@fn8e5v__XdTgVf+CAvbbu;kj<9@P)8Wd-ER<63?0M zxDgm0!{IALzkgBXT|&YmNhXMIO9viPS5v$8+0Nd6?@kF5lQ=C7jP?rf^2%Sif@%j! zBW@<6K=7~!n1XIvT5d=`~pKb$XKp0t03;< zD}bz{=5EfjlqSZNVx0*I3-_ziA3X{bBeMrBu?xozxcD%fzsGTG2q%_t)(0F?Vqy%D z21-gwm`n(+l$V#U+Y%Kzg(7O_&X=wQO2K?Cxbe*io;f0qPjS#M-sb57bjMYNF1AO65RaS^eWj zwBX%-uoc2MwEt<{bMYM3`&+#8*RL^}4rguXqld`yRkngbQ!O@k<~$AQ*DbSY(H;K? zFZ$fCJ$y|&v^%Ifl4{h?@A&oykF_LH6JL%r(W=2NZ_m(!!3b-t_>4)yhD&Lx>{EpG-AFtYk&fDG?;^pJRU=O{`%G@9b zwaRmU4hu>WDMGf;s)uPf1R`#3Zq(g`g<3tZvb?MZ-~)OSc(|WGZwpKb3kg}6ofQJs zi3JUUODy%odh(A)9#3%sFcCPz+rKk zl@+HRm|J}^7##+Es*GOQ)SHT=yr)NupI<{(mW`D)v8d=6qvUb&)wQ*y$qwn`nc_aD#`Vmq2%C?GY!AKUM6_ij>p`j7A5N%!wxoSAXNY_h%m0#X^V)sZ;78NH8o zzEW{uTn4U^e}V)JkWFy+sIe-KAaA0g@+M~ru9SXCZ*-QX;N)r+fD*!6sx<9>=>cP6 z=saPyL-!ty{q6}bK!4nC`-{H zFB!NvV~;WK0@oEA@cpy1ZN$Zitj|7>L0>*4J-z$AMHpa;m>5G1jlk0Y zl8K3eV3A>l?%c`Rh6ZkgFeLfn$H8eu=DvB0ifMqFlLvY#$cPykF*;g>wqHZTbMfO( zbTZRYQ<0IOg@9BVHxS_l3}}${n*bqgqMZ#;1E3X33M}Qgp|gazz(O7y*}e6)k*LH1 z=JM!w*O9A6NK(;UB_(pyl$4U%y=TwBt{F#XXJP8JM#-};MIyyUDdrR&kl{qFhYm&VV6g0w%} z=>wqpK@ZL2hNh+`j~~A*`Eyw_oDY17dJA_@60VW(vZjOl`rnu5-W~dX|4dZkvhCx4 z|Kho{-R|$V5D`u98u@cAe?Hy4ukKG`{^u_R)UW>?UM2j^kxTr)`Z`222A-UMzJ&0h zw@^I#nHETlwzk>+B>O&o`k16PX6oW1;BbKH;Oc+B$uqBfr`@*SOG_II!%3?jg$-mB z6znymoXe!glWc6_rn;Nkj^r7uWUgNQ z(f;)???YOi^^FE33QBVs;V2yeWej&=KL;Nnu;D5M*M$l(BCZE_#=kD0P|m-9QPadEf|gFKEn8hz zcQ~GhAm9GyMU&vGy}z!!nQTj0TRHm9B<<}jP!h;$X1@7 z@MZ{b=+HBCH^^dy+}O@-w$Fv6%!E?c#-yYtlMs{Q?s=^8&Nnff%5}@{Dr>T=9yXlV zvWgjg63&^PZc1^4u}R6$V`8aPqlG`^L`%Jk3*|sYQ2d)4Yd=2E+P%xu7i1V5W_TT& zgn)c5J@vl}pXF%6f}WXJ<2T8eaTgw7qFOmTmX`EvYn@$N5P~P|C!;no` zi=3x;L!M!Cs*D%<7TM$pAGDlqJFOXHelRb`&<44<>g1(CR@`t|N7SHxOT3I z{cZox1N)y_)EJiWPiJFT8`$tdVK}oISHFylUI$=pH;-;I-ub zh`TBO*j#N5m9m~akJ@*Cg*tIZ4} z9UtDeo3^29>%H0&YSV^Hn>%I<{6*1|`cX$3hbPsJyqDV|;d#6L{kTq5o3?<4g&JHh z_tiHvTPYkmg{N7}m$-(fORyQfUc8%4U*uB@@xrwu48jfBbP|tg=YU zR&R6l?S}BoVmAWIh~=Y${yFqi?fB6r-TwU}_01$I zy^|-9WE}cn&`0lgQw_W|`6mM$~j%g)hj5JbGzEPKyY%-QI{scpl_jT2m zZTA2Kt#}amt?m5j)6&Jur%5hCX1HaG^|1Z!gPdJl?t&Yqrg}u5-fA#=*nW@}BAiNC z|2}=lIVU8(1=VgMhx*ngu%-gL%c<+{`E&7g(n8)Ks4r$%ShT=G6_U;1;CBu)>Yx1p z_s~7mxdXryt^XMKhuXLE^Xo8S;b7=ng07?WY|?cS+4toPGQJsrK0!O`d0K~n$vb!M z60gJ7MXAY8rlt<@9zf)BDdc)Q%U&roZp>@@OssJ z{tVca74U{!ioEO6r9R5APcD+&kwH$IcBj6+9ylFTUOeE*%a=QK!70hmbN%V60bQak zR~Avdf#+cTLCe|uS=P6&U;E0+LYaZTA=|ev4jP%TtIwR#paB_Q@W+CMVzTJNq)ngp z!S8GHLBGl44c@z#dvGu^vazwT?$f6nMZ6KU7hN);5nm6>KgoSL^pU;Pf#_7Um*3w% z9E&#)^P2;S#FJpuH3~4Wm)BLg+zt*778X6Ufy8~u!%6rB6Bu*zuEw7zg1qu_awfBc z$f1e15QE*xc?B^?`o^JkSr=g!?C8?FbEi(|RM!=rnNKm8)uU_g-j(Zq($xH_z8QE_ zO;d9%9v}G7eB5(Eo6p|4vz`Uq_L^3xlrbz{{^?O{YgW=)Yo4`d5zSjVJ}>N zHxG}B^Pv~%|AA2}i$F}VKe);#067?{v-`4SeCo9rwfl*%t7tX?%GswUshXN8+FF#&m-PuZlt48!dSN+pX2ijRxsRsV+uOUk!t}0Y<3KzU z>E>o)Cxzh)p9b#@NaZDsB3fpKqedw``6A1S#j6Uyf%`>Al-hbAYMtJUcZ5*Gy5Kw0 zn7Xy+b+U$**7z}F%6l&x9mQ?Z-}o`4sq!a}mES;z5GV^+9sM%x*@Ar!jb82-8U3!1 z5EIE?zkkEP9;A%Qs*&~pEsX58=Ci2%XarHd-Gm_}F}+{ke*J!a|K0)_pVa|_@|}PC zwWbt&i(Xz?w}dCcQvjsZA3IjmQP;Jk2IA6fkBqt-dcy1*w!C~3;EZ8)l1UWSHyn2M*p6wlioCyp?U-v zQ=lCa--GkjfSecpz9X>4Y zFByCX=sqnq_0As8u=r+a6 zzQ$&NK>(kVl|TeQ5?ofVh81ycNtz`FI7S<+tnvXm*R%Nn^q?M)eTz^1)CpjK7ahA{ z8XA#eGNG< zZ%0VrMo7jn-jMzfY7fy9*c8ODHM{`}ACbeuhZc77OKok1P0N*|LYZ}VY}Z&lBX$5G zP9+R6oR_Tv;i)}j_#X#mFF6AG7J^Ar9o^Lk|Em?5;zBTP&m+|EDByxi8S~IjV$qZ? zrdoX6*M~cpp8iW{#=gJPeGrCa!I@&TgbYw3u6mY8A6-s)Q+u1QqN1W`Hh_n7qsUi%?7Zoc zw6TZ}scC7I6&2if^2Rc)ZE)jQrlkDQ6F~i8I=%(7)n0lv=bg?CgEi3#I(4&3f&5{f zYu`KgC-5bSf9d39N)|2LRdKf+?;uCR5LvRs$Hhf5DCE1_K;;uBPew8)5TF7O6ilYf z^BB50J`+MXz!f_Oq3}7Dpn619SXfzYExvPZdcwic_zt9!Hs28QxI_CT%O8yrE|ESV zUz4u&$J$z91Km?C8#-bHZB5ZFl=fSFec_f)dfME+R7);x_YkWwMrfq|vXw?^YrDcr z65ml4A0H3N%Ei$UidYycVQ=5A+2D+Ka&wVj`Xi%wxAj|3W3%bgS0Dw2EWsi9n)5`? zerws6FMHz;k6CG1{Z443`8s*&XrM! z$Um~@-P5NxvsHJQfB~>mzkdIY^ko>v2XB_z+Z#=ofRh-5knaGBqvj)@!hp4;L_wLZ z;?~N?gTo%J>OlShW}f9wW*}v(ny_3=u!!KxE#^^JTVGn4ufRszwZUZP?%nszoNBm1 zO%NSOI>KUE=QCdB1(X#?tQ~(uj=pxHRjePzTR7PTjFacOAZr^>o$CIv{)x-jmfH$4 z{pFA05L95QI9Sh3i7)qO=Qlx_VhPN$un5_``~Aq}F3!#Xn#x}fbb*QlWy+`d`)Q<6 z5D{Wx-m)pZyLaH%M88VfmC=)YGt?sVOjd~d_bQz`d%*$)(|>^@f|v3(d%}{Flaq;w zsO;T>B)gGAhIl~!21<8z_2+0H&qZ#8E+-~!A+7aT|F&W}Co~17_pSdM`RhcLaI`Myd^W?>%eeB|pkcWT!xowsH zZIvy*zJ*82M?Uan<3e$tIkUT~XO5oD;>F}y!7bRXtSLA?jrM%MUsa?=;Nn7Wd&!a` zM~}9#m%EQ$-wC1YzIz{l+enRpxan-7*%i#wplOUBPjIexJ$K^7{>Vts!oy(Yuut@SVJXvlVZ9(I0d^5K8M~2wAK6aU_;!vKEGQ%G z{TA8Tm0;@$yRu|p7xa4M1{44d`#ZpHC-Jf#)|bOXB(-O{YM2=fe{H)gu%m-+*9LL! zA~`V}218H@M@52vTwDi#*3RyQ|MIXY7X#+o)}FDUVmBfQzZszfZgPwAm5-4x!LMv! zRfF_8I;yzZ{N@W;#ppXPU;csfrlKMhoYyA^G(3=@N0G;dxs7;lpKgyKQ>}qdnG2r|$g*8ToA`8_T*U$rfJ%SPE~9 zoT&Q4hrYDHZ^70_NyR(8hrCnF{mr!6LuLfu6PNy=#W^lHZjfc(oY1u9e$T`en){3KB$Gi*h#eYHzm zW~L8!g3=~yQjG2w?jR4V%zxvbp%6Jn(|vtgrH(M}VTbv3)qpV}Qb;3YvZHqF=(v3j z3#oAmmxipluJ#{FCbEVO9XgZ;ud8~R09pIU)#uknl56zu(b?|7wg(j`MNy=d%XWCz zhrj&|T>oyT`-C7D`d$6iiP_a-m5P@g+}dM@=JoCH@ZIkDh7=u*1(=&|)#*FPn%SI`X;vHFsL zU4L#O-#V?Q#h=Uj^ZOi8z<;CD!v6Tz>;Dx7_ZqGwCT4a9vy55)8fK9-ke1uKO?^zZ zacBPLErc%Awi6|fFD(80XKE7h|NdL-;ymRtMRLFq%MC{>N^HR9N!4b zI$&*W#s9HGvW=M#$a;Ps0OG?_l4v)$?)pmo^8ke2liE|seHN-m5S8H1x z(y{N!v|{+J8#Zo)Hp;Q#+3Zp-*bKBy01PdGVKvRPddX|Zd1-R>UJ#S%xLxIK9LV>FS>=DJ>qjCr6ssB z-*(ro>5>yNGc3*CU$EUX((C8i@{d*r4wx?Lly>g&_wT18j-+kH9&e1Y0IMy-W|{yt z^Pncav!0$Dtm{j%Flgzby#LUlyA>O#rrCC|V5E&9#*FIcd^lVlI{npBmQC{E|w$lw5Z4m z<+VR@bd;S4s^4@16#De><3Cc?bLQL_*nhx)Yfl+;@f<;qDvk{^XW|8}Lk>#s(oD@V zYV@?5{Y6XE$pJVb!)y35cXZdPh0X|}+(Hf1(y|rQAu?pO#nq)>IKS8E?fbB2YFQ8e zxlv=(TUH&cH{}^&L|cnB_VB(l_;OT*JP1+Wq05{y?#CbWJ}UQUmhX4FRRf~hCT-d1 zbZzg2HZPf`^`p>J`P*<$uNRp`86_%2Y(DPe{M-?S!mowT8Svis{_U)_;-(K`XQGsZ zI|vF#PVlcFEFc=@e{O!#$-NarqX*L42AKsf!`v8B-_6jw{+jFrnz&?lb#-<5j~=y> zJ;5GZ4<7h5SLV>3o7r~iS9)Y+MW#E6cPOtD&neIJvU-canb`S#z?ivpZ_l4QwJ)pt ztVDo2+qLK_ zvuN*F$-<@Z>fKF6RaMw$&dzsMq=27->_J$`%=`_WAkpg;830Qf)(^SfAO?8|$+KT` z)ld@nuuRiGU1j`ij!cg~Z+Gpm+!CQ=txQ$9e>^ocH-RbeH|!W_WNzB;x?M8JDw>qPd!p)2zn~|9b#m3kL2J-T+ z{_C$2DJXlWV;Nu4-tgGW+2KSFxyR9PW})GtN`3vBMUQ1ref}4yUgW1BR4`2_)ft3S zZ*&G!gvu4ioaHIS;H=8Z$|foeR0S+Tcs0``kV4+^3^%#S_a8NFkJjuW7g{-A zwqwUu^^Xhe{H9RZsRqv6z=Q{ZD-0CGIsl(|Gjjv>&q5DSTU+!59yF+Ty$6INAW68s zloiy)uy?p;Tot-7I#7~vK%u)IifAPOP4ZF_flQQxN0QYFj_8LV&~Yfa{km~aW^NVM z9@!{rP)4ZT`tS_K-d|sUKC4JxVJK#WzFhkgl%FWf7xVI%Mri@n$Ue&}?!*ZpC$#gq z#K;2Jyll2n*c$*FX}wfQioct5<|48^^2EWBo}woL-S^z0_@pF78JYM~r!e_@1@Im> z8%8J?BBYb4>JgD6g&sm~@RVcv946)3D>!ocT{Yz)@!0w+U&fo7M>uQNqnetv;sJmp z((>~6-<|!+K7^i5@3%o$eVX53?3)ln0VGnl2*4S)vTY;4Kld)U-^gYvc|}97QLZJ1 zWiyVQJsWH^|8r52+=XM)?-!ChQnIm5X{R6yhqqJK#J+7xxdVM2nwp+Brz&^6vA$l) zf5)MHZ|>&j3x?w{mRPvQAa@i*{kkBW)21cR;{Zwr8MwO9|HP~LFU@3?>RyE0Ua-xO zy9%t%lj0Pm&7k6ME4eik{n_2jEA_p*23YIkvR&5HX~st)H7Ut}9yCwyEr0LVEi7$h ziQE*u8>+t9q6a;+6;M?%HlezDHK{YSDTEofruDn)KCh_mJO|dxSC)QuO9uWZvX@r$ z#}>i&d48{<|7H%#f55^^91SqSKa??L}v?9Xn z1R2WQ)6enc$F*s5Tgxx6cT|<=Bmf!*PuOs~uu#yL%Z-eDuxIyf2sxPc7gMHK9yR<` zyfU`z_fn|IyJbhv@IbiFqa8zqSYk)a7YOqRnf9raGT~4_?{>a;>PgTASLXfGc9+B?*+fzN_7g!-H1%@#<$1GbOAQ*-LXYG9nwZ#FqiUu3`Y|QN z#lJ8#KbxKHk1I;keY7#)+>RX@trT76 zIQk@hyx^Xch#U?AwqJcVsXh*pBpZp{f_FQw1?OyT1fwN3v$E1wQgQ$pp*Z8fVkxV} zxRQ)ggVWB2p=T=pb>vrxUwihqAL3*nacXe#4-4v_>JU5+R~z06r!Q-3IB?F;QNa+| zb`2N4nsq|Lk#_vJqrhHz=$NDNUoagxU zn!k7ax`RngZVk|@;5{uoXH!6Bg=Pge%rGt5T@NrNVFZP`s_NYN^QWmt5Y|y^)lV(m zSowIsz=51ayB}4s(BT#-`Kt zFZZz|IR_pd(XHc}uU?oe2_u>V5WTN}vq6sI61>XEc6%GO%%)SUuP-lG6Lvv}RBBNV zBUpse(gZck;7${1VHgSgncKGoKYPT7S&t;nsKT>rb5#GTki6{HKLYlaS$F-G4xCgN zkligLV5XUwnc3iV6%a55DXI3>6G>C49e}jh8x4w-Me^n z!=vQ*cwuA+Lt~^jzLp<;Gt6@C)rSsEQUpj4OGZtQVdOM~&Qr>pW1F3p8$0D$V*bU= zZZ&mv2JYWouuI-kyS!J>vx1Tf2?^`gIXzgB^4cydXYP#L+82918*Odu*_KI7awO?W zLDjW|TBhxnH|FIV_?unr7ZiIza;8tqr_7}6Ep|(SrK)Q_>1}L&9%{6;y?k#SjrwJ~=; zpfSUbQt9|dL*wQY26mGWpE7suvz#13RqT&kZaV%5Cdc`Uobz++?EF|mY%z?M1kjj% zsMfycXoBIwgWHfCvIfB!1A3zUj6Z$aJidTVph#}+#sqwH@$zya#Kval>po;8NHb zI&soJ#J<8ro3g>Q9@&f5ptZU_CPj89#R zGkiGFJeph{QBW#RYxF0(*Nal`sJ1_B0NN(xiswdrYtDzaRQhLD>$!MhtdP7|w#2cU>fkNs3V-}w+Y&D(DRDFWVsCRbM@!G2aUFkq zkNIhzVFZhXR5CZ)3J(bu0*`z~)tf1}!^w^u$MPT#bLYwZrcc6^L^(Y@kD z4kaVK)`|)W zy?XQjXVe`t24e)2No%;t*m=X{n8`W+|>df~cev73b#6ks+s#_j~c|*^W#((`!5Xl$>x|@G!=p5jFr(8QB0q`8vn8=zs;b zcJ$@ef86!wa6~=H7bu@1LD2D9yFF*T%9=SkWir+szTWaZMwT6aaFBWRbi0wtOJ@wx zjH1y21(7iBa@krZ@wnE~6>eTQGEgYH_0;_ML?(4_u2D%-Ces)3g)9gkB|ASgFI1sd zijC*bUa$1^&2?R2!39Y@eOBbUe)Wv&9x0)gvARafjl&0yHNrs?-tEUP4W)joJ>~~a zmYWO~^DAZLn~90~nOFaK)oh&m?9DOns|Gm_-#8kFcM$V(1wx<`i?1;R0?|I)+Q>Sj zj6qN&<7jHLfawZL7+IZ7N{UpoBo@&R0)Plz^+Ud7wJzrG)D}D-+E!TunTf24d42cp z13xu5n>k7j3O6`DOir+wIKk`LTKPn`Hb z7qJ;l9hC$fK@Qb%W5;qxVgyUL1zxbLFrzZ2d++dmhgiTGou}^8xWROR?gOC!Cm|4O z*EYl~Q9Xjd*r{aGn8eYetUuPf-f|cPwj!#mPP=>=hJKqO_pyY8Gk0!BR73X-?8hIW zO6CCW-cPf>vC#;lQ*xHc+e)`gRE;^7b8q)Of4dvGV+@5>J3?2x_%+YNCnS!z6Z^V+ zMDEQq_h(8OuRA|--T8KJb^ApNYR3Ea^AESXJXTrM_dvUk$MkM;j9=0iHA*TiaCE!h zh%x^0`;EF#wJbcp7<|{S=A{n769onf8#(<3y+Jg_49mPvxF(Q%v-J?_5lnCf;Wlti z)8Bt0Sz+2IeBovxw`B?zlh5D;##kc2>{F7+86Z~^nYEYh%B`~cZe>j`jAc&kZOWhb zVWP3p2$PQ?uv%azOfG%!{9Bf^jEg9ESbeROP!nfy*cl3tlyg-4}u;XJaYJOnd1~CsjZbw=WQEx0*%dmT82$p-(zzpoxZYd znQKpP&k~QZtZWy&Dnj*DN2fD~ANONCXlIf9ny^nuCu{Q!eiY{{t3#h<@dIk9pi|JobP{54`wgFG} z`dI_49Rw4uy)zwXU~jM5YpOPmwMPc2=|$6YTPywp&lFYMo( z{MAG+I&C(Z#3;*IvwF6T{nPb4_@DxmCq6s&EY5#MTbuUj+LR-KB!*wD`uydKA114Y zAt@~Mxz8nZ;672Ls7LHd3cFjr_X9sC5aO6jM`JS3G*&2r@#Y|011dI6k&>S|Kq_K_ zWE>ceq2u^TlZ3t4xa8u+i~AT!qUa_bF__UK*si(h0ZRe<%C! zw=DGDddEiWTH49f({mOaY_8HZTKDT`4W!$(_z#xDEY7e@FgKRL2j)=ImBBeof9902?#}_ZI&_AIN zFK@W)^1(F$3rX0AJeGjTqsEPc(6V;*>YMgjVHGRYTHeZdt;2PC;?onBN88%`RKjRa z5P`UeoOU>9U`d>VR~cll__Mz6uk!euV(Z3>RM>m$O< zFJLmtyW3GaOlM)+-PX_vsT{tHuB%qTn9GuTcFeu-+fuDG?5Suhb345p_TLS@8+%6Q z?Foc!l-9dUj`Lt1PY!GNwzB(<8#{x8Y4Iw%I)pWSZu*)Y78@HHq*m%rX#u=czoV6M zgOd=D6v_cgs1lQoVX2?Ncv{>#p%<3{LmK-vse4;p*oTwa974kdTQdT@m$Ss!SLVvFPy5 z&^AMluja3uoMdEP-}8*mRh__%D{F}@DTe#}+U~MW|JENK9-aNIw>(4t@*YkL1V=95y}bs}f@*>#>NRZ*djL3qK05;jzz<71h^u0H z_PMUkYUa!%h^3H>GonzKJE0Or4C0KL?yFc0%R{hW$DfA!6X*nw=5F6x^P|Slt2GcL zWXU#o9unrIem!?o3$N4C)>f334m)(ntM=76>u%2c_T*6Ua&t9ChWMF^8Jp$jT#auH4C!&lnuLo5;|-O$?yCHswoyF`~R-xQ`8Oqjs1lxRcm zJ_60;)@QkaYbN^B>j(5F`=($PJPWMG$$3k6vL3Q@%C3;u2Nj5!`3I;QHHHs|%euF( zk^dDK^8c42b7@{={vOWVwq`shrc9km2{##}89-^oi0(2!n;Pw}Uc6eXeQ?)gtv|Yj6ulZ)eyyYz|&PsZESC1cmPZ0y|D5*?bg*Lq_eci5**&iBb zE|0olruGyhi-@{nD6Q z|09SLX>>%nSii9bDj*&~Gf%&;x9e~lfUoPy3w z&vsQj253aErhm;EDv>pkKD=Ntz3Q2IKz-QiqQ)!Y5=oZ-H~Hkfzv(|_&|N=O3>BBW zm>d-%wfnkPTv}uH)bArkXh<0+l@(c;eKKCRE+*%gH|bxf!kfGRK2p%zo;!EmcByS_ z(caOTAm?KJ(+K-yq=x&$7-e<&a%tc*`}_ja!x@Ixhd+wPzUI1Tt-PIlH?#NS?3Hw= z+3HU$6-i+d>*`v0{z~gnRDFVFplVr%(y*49-DH)#HqUx#BKGj!orDWtyjM(bzE^Hq zG=1xdF{`Xm3Y~k{WB0k5=d0dp6dyeJarE^xN5IBY!M2uj)n?5aDcZODOm#?<-SExp zUr*5U-0Tt4`uQ^BzLIz0=j`g|cXU_P%Y(fHy^Y#XRn-*e-e9dLp0NpJWSq2gL!!)& zGk5Rb$8=!piOmH&(uy(o0$&E<)TP9wg^fWOu35SDzHP zY{eww_B}xWp^S#AKsCr^>|%0U%>x-LYV`vuwn`Y9&GOAjJDO*aw5V-k$Gn)%+ODzD zH7C2eFN{p;)?2cNh0pi;7mo&F%X|M-Zoa+SFGs$pgE%Ui(g4q-VtiIi{t+g5CwbU02>g7Go&K}Y_xI#v%Mn+20TQA!(_u{3RVZl2>WDm@+#dGF%?ytuIKaHeH zKYiM1->5oyd2REgh1*JPb#JWcP){%4r}6Q+e!&Un<53EZTDR`TkgyJ3a~($V$zs}7 zD;7153i=G^rDxujS5HjUj-?+|y}kmrXO7XW&x^V{yf^LOV3(4$^5J*KUcGL9{Vn{f zrXcr%1Y0eap-Rio8Ha7v%(3x+R%6iRv(KTKHP7t|l=+z~SG&SlEGD%+ajm`i{WgDv zaTC72zqdN-$M@F<-r9C_^7F|O?RPd`ac2Jz&(&v=&P780$@$&+%P`?1#GIgL{d40N zzbcs^(_%eY__IH+teF2zJ6ocIJu1Y=StrG_CP5r+ZB6wg(b+j}V(9>O*y zajtS09VyzDy?gc)SSs%juHbhHHQv2E7bzUAXBss-q?*AaFvl<1RIP5Ye*G5!kcM|q zl}X98WtPBghw*9p_8j;cu!NAo>*AC0mUB)N`3t{{8mPkOe3*3XPe#DmqGIGb&D=NP zDAhfU6r5WDtZIu>f&gq(!)YCodUUly{+SizFkvzqZXm517?Si6dQWO9{h^5KbU7VD z+DLw_K?*@I?TGkFB9zMvIG1Gpu3y6)xuh{Y!NLdi$}1{rJfJWHb8Q`+28bg!PVSNt ztcj58len0^r9AykvjA~M&hL!$bdpYG5q2qTY`ayLhCcaxZ)M1>GI-GbOv8;|&+xFG zJ$mqc?Wdkm-%SJU`t`O$c3u9^o`t@^_DWt1Izq@ z=E#GwQxCe8eCg8rn8P_M-pe@QWQyLZq~tkNr6a`!GTEr{|3#YUu3Ko=`^|0z zYM*tcTfMKQTAh3bqoox?GQ5zo+s2OS-=kaL*WD_W9_wrtEkZ?=PW8$lZ%O4pFzOYK zCv!(A06?nh5$zjIKaTrN?qN6Ql6~O9!};RS^Uy`msWW{`M!bmln(>I z=H>JjKmwBUUJvbMoAhnJ?rD$?%n!3XIb!(mhPL^CObrCS)(&UcJSU>`3o3?(i@u$DV70rIY=D%cokO}DC4BDC|Iqkog6kHe6UEo;&EUtT- zG0wnX$p?2QM@OU}fZlW)q>Tke#ETcxC1H!w_6emT8=guv*F#dWG-e_14=a~)lXDB) zSlbYcaL5or(uRnirYJppSQI>7vPGUR2R1Mr@B)9>qq8a|I}9t>+WAs(4U>>4N*QN_ zV;b;n^a|R46ir~;-2yMs-XdS32%%tETRghujrQo#PXV{70+W)E<+#IV7x(Rkc?j#8 zbdtm!7bDm$&{ZEjeoTT&#HPK^8}ixYjBHqR{6c?Z_wH`4jkHMLzjqW)qVTY=VnkPL zbbjz!R+f};sKP{Cu$E+cuCp>fy)WnATmY+l9KfK(lHN0l{I8mZjRAR*+2&uw1-%Hl zVPWCm;T=Ja$ku>!fZdrdVPt5S#Zf~kNFxL6m2XXrzDfUDX67GNK^pPpe`TletOn_C z8m6RF3JaD(jb;TEr!d3sIte8SC?{{PpdC^$FXWQmDUTlAr*}U7GkXjX%| zfMlYaxJWKfMFarpl(%=9i3yBuHuC!%Ces~T4f+ByWa+*ORmfnvw5 zz&|pp|3xl`PyI(ELMoVgM(OA*f{Rg- z2IUAJIv%l?FrENbh>{5U4KJFoiD%C2PRj!GWykq5MxCG?Jq;IF_Ml4s7m{|iwmC+=1Vgy@ zxR3D^NU6Ek)Q3*cyxE{rB{^}dEG^gLamde&Y+oTDJki;_A1bZMj?k!hf^mW=gk2v& zV4KtbzuKWkBO`+{#immQrfjH~0Y8c!8h96tW1Qw&=AgLT>H*PFn_m0B_fdc_84?#{`Tp4T{y(}~p%xZynMLeMHhoEySJDUwc**Jjk zO@srTfXeO0y&yz(?bkP zb#-AlDMX9h-vs6hi&FlvP|u_Hf9KA5o8;|AAHh=~mdTD-z|Yb;xtW{00zM^i2`-S= zHbKk&zmO-sdD`O^YrON(3Pn9PfxqHt8OL@1WdK~Q4Vnd>1v1|>nNy$jBq6@+L=R0y zXY}gT2B}`!nBWWObk*n-#IO(2*Z^Z^hgkM6zTjqUYJBn;I7|DFB>x|1RhdKjhdlBb zt_wf}p0r>?`Y_0`3iPh^7fD%~LrTZ9L~WHLcanz8{nxKEuU#9gthO&-H7509*cB}1 zH)6-v*r+{xc>2~~mjK^EZ7JZ5DfDO+PxNnllbhRlbAKRQZZp4)Hc{aLl-i8~acZOE zE%3jv`Gpd3^(xb6kW=lluv@e!iV=1Y>M>cA#^N=?oqIv|naZ91$A=HgMf(tP#8?{n zwdfs~K{kM->BFpvs8y0qoq{*(-Bhos_oqBn0I4qWMu*pW!gOg&mM>~V$`Xxm&Y1w%x%NG$JTxm9XXCOt2XC_s8)29%{G z^L2z0m_@DV*R+h182I>l)BEm%^Cq;CD{OtR8cdMabKJoy0>KUs@53R(jwcWtI(!%m z@9P#7QP;J(D^lF8?6+=(M4AL!k#3m3qm=O<#^^d!Fzi8{zgZZ}LUDRqG)Dj3v>dj= z2`?Z*8MqH&g=2{&hEG2H7dSOEE|~fEsy)BNH*cKBkDg*i#XHpY-PqrAS=a5`c9yOf z_TKpXmDP%=ug;`48!|s+!TF!59zRxb;QL)Zf4;l)fiv?@>n-YLBIR7yGhm<8rEhKS zugCUO7L}dJuFEs3-@7q?LgO2sjgKc*zPUf+zzj@7Kxj)iBskJ#WYD%l%fwWXb1m5| zckkff!uChHTbtZ!8ZVzcJ7R%3$xP*jbZ8g|yYnmQW;qyD=!gew%PS|;gIm*nvaNdq z#D#Af)+>X031d>AjypVHQD0nN4FcG=TPL41yeVIixGgw4D{mx*tE?3WO4H-_$d8*L zmk82vF-vPIOtMqc$f$0}18=!(1jAB%Jb2~>(!1G$p3zkWSX zx$mGsZ{RCMKInOc*-g&LHXQHj;l~PBlf3k(-oPLQW+xPE?F3(JlPxt<|0`n*UF;ng+qjgEWG$p799PjKFnyIA@ni4yv(uHHK z1J}KGy9#Tjbv`F7v??g>xUO~U)r;89uRCD%1r)5D5>Lp0xI@eVP8pjpvjzumDb85v3 zbz`%$h4S;ZNE|ijzNRAHh!_iaO_)Sq4O~)DO08d{H4Mugw{>yjEV77tw^gw zqi#eyoSbz;IFDVg|H^&!Y71`SozIK;_8a&u?RK{vQwE@2%ovFXkkdxrzyPjCtk0Kp z@Wi;;Hnz6s-`$%g?87!+!#_s?J! zJ`|qR$;^2kw;hugpU-VB8JMF{g3m*xT}Owplq|GlR;O;E)@`11v+ap&M22{x5^t{juHej9Xn&YCFY=&Z1V<#VJLv-n!^|)DJ98q zNfY8rVOpEds(!%-_U#)*KFT>gfm|P-Gqy6ah|QakydgNp(J#a}&cUgzcrDhWc4_Nl zs(#)2Ui8y*Y5c{a9fH%i%UJpion_V3BUXJ^T@K*@e`6DqL%rT?9V@?QM#7}_mTxX4~9IRW@qytO|VGlb^0L0ti&Cf2*>pyX>q;i6_!07V!zhIyDaYMS7p+Kn3STUMW2^%9Rda$wpw5StY zyV2z9-~HscJym?>(l!mR8S_-72pYz@%CKu`t4g^3@2*3j0nDS)9>!rUoC`KLKi{#4}ZiO z<>j~zaNn^`LSD_@Dsb5pFVf-YSE+GnOy6kRVVEgu|t7XT(ne0Du{C@ef z*P*t2)>nhaXb&Y3@|*JWf&%5f-MU2k=o4Ra|M|T-m5+OMw61yo zI%lUGW`^nT;`2-yxKVOnMTDQVukXYKjgsBEagvh6V!efe(BYWZ;>GeX4|?}58p)j{ z^~6t?LYC}5{}XgKIJfVv`7A8j5uZKaA5DV#gkW z5={RCTgLLxsAW6`^7LDs7kxq{B0pwDh~JOGO{L)EgyzsZW=fxXWNZ|>CvkDR?>L3f zyr1$m9a0!nCOe0y-DlVSn3z2tnYiVWFWyuaA2s+cq}U;S?s0~5<}mAI-D7uYV|_43sEAZWG`fNwjec18CKNQ7bjZn_Gzx6X;RI(w=Pw3s%t&}j$w_71GKyw+K*ugj_gSyu*Lg?ThYx)2 zWx@srFjb9sXkO@mF`bV%N-6gR$!3h`wZ;-30krAa(>B?08vc*u)m59Cg_$8;u|}Jb zFnZiL*#|0X?*RjXl^~YBjtRk}SR-tIP!>EZh<{c^n#MNGh;P*G=won_{fpO)j=6wEUxoUY;ayYK`OQNus+JPODGf@|TZh1oQ?rBTk>xkq-9p zlO^}`*ExRdSSh&#F-JSA{w7?yHO)J*DMosM8d!l@u|NV`HS#P>Ou%KIUUe@&WRbXjhEeOIiv>d6 z#!E8p$&)ASi~%O#7Bh;{{V-wI07Po?^|Z9@%ui5Xgxq-#Zv=(}NbhtOH35;-ZQ zEPN0En{~5J&tqKb)2dCjkzY@W|MWGn{dPM==t1!m;r@WoprL?iJ!Z^C5{!>Q#}=H$ zU$yb+Ol=0_oL}(z$&-4-42&+lb9?PNtI^O!`Rz4S`LnxjO%x1wDAl)j(G@FIBmhp2 zd$I3c-;iGh@5i-jvVOuc|ua* z>SWiujUy!1Di~-=4C+<%@}E9*z93Ia>B^m z)WstMCc|50o7|bYyEa~jv%NKG+ID}#(NWR+_SIi?0(5DY7$qfUxbe@4#z%>jns@BT zAOGt$YWXoC?)-gusZajnQ2pn3^%mRI|NR$YrBPx+y7TvyGp57gfB#x++e-1V|MPbF z5-xw`%);Lv?fT?@RMv(v|9^ha)F%>3^Hw4&w!Jj9;_A%8PmwsXDi_J>L>8p!s ze{MMyGs$A#y?=e9`utH6_7eTW7l`ThbKgIB+>5~LPCXiHLY7Udy+5mJo$r?+`=bgM ziS_8b9O?9*SIZcwAho{dWE~1z_iRY**IL}oZA(VSpy~Z5yC`4TpWt_HN8s_^xo*Yt zwoeb<8@bb8vnK0x;xTFWWUcQL!wkFkX^S~>-u`2-l(Eh|56QU5pe0`h=S`K287A!? z{cMi9wSLM@*G?&wK056?Kb(H$GPK!E%eisgvM95vRp!mhvpi0XobP`=XvnI@n4gQ2 zHMW`lS{=S;Uc%c=XMb3xJUlS%mBC)QRaUpgUoU*pT47u8XiJoJe9tR!Uk2uHOi_#4 z*jL72frm!g3dy9x&1s)K{I8Dnc{$8rb;P_@yXl{Q%{V!y-iG(j`eGC)d1-S30^@S>;ZGi(a4sh|JlUvQ<(@RDpN*Qu(0OO#%DrTq92 zR^zgA%k&*M<7H*7ZkBmY-|*JvMA6g5GxYmzmP_B)RqwR*K+khq4xgQNS;qGG z^R@Y_oxpNUy61k4R417=g9hA=k$$6<;Q6+&U$0Ktw?k!XErz~#iwIv` zW%B0ZoTVDlwRihjcWv4q)hlD^h82BuL*JX|KbiFCb5r8vzBxle2Tr$_b?`p9=;zaf zMBA{e104=ZDu*p~(jR2nx#7H&XGqGOz%v(q6fN#$acR+~M`I7)n>yb?K~4zy4`jPd zh}uR0zU56p2djvXkRCMsD!=WyFmm{CqAuP~-nWzg2A6g*YN>9i|5zkCJbWj8vMTRX zt#W_KW6xeDENENQZYo*)beHdocAqgJQ%oesna`Jua~L?I%`vjbbn&cBCz2GF{n#!y z=JdSnQkN2?gLEV%m4|jNc(8lzRMp)ds%xWedIT(}`^SCy>pATcpRNwmU1PsKQ_DuT zUqjQ_F8*3~p6$-k$hmZU?jqF%)i1W#g!>(KtaP5Hu+DT=y~BRbVOF_5h@@gf54>-9=iAtw>+ZXEX!*5K>-~-#zdE&`a*jofS7v(V(i3k6-y8Ti zK~y{^P2~RN@?9Cj{!2B=Hcl~JlBT~ZqjlcGW)suqxc-?T|9p8pYxLVPPt&g-eRP6! zcDe>#k~R)7ydNaJbfvn^jUCc!r=~A{y=UEv&3aDW?O&aXmq;D_mArJ(iO(L^@ll3P z<~G-WIs#;A6e>nKGr|=i8P*z|2bChh6kMQ8lE>hn#H5}q#sxh)0;ROfO&C!#Md5Mu zWkw(SkdEvylu}1osi_$W>anhko+ha8XG~boj(-xfhDI4d+)$w8XBd)#L#hG%Nmc zYR}8n5Z$%e`h4;Jx5FN+3v(WSU)tEC&w)tU^!)hmSK=)KrHnJ;%iYaRzt9-Fcyx!& zac4&4MqN1TV=#K>UJL6fM~ro^PL?y*IxzXBszGq}}h1rCs) zPGWfbNSlkt0M=f;%CHZB|CqjX{gxd!ru{v0w*|Sl92WE2qGZ?D*xar?w|4l%GoL=5 zt)3TW^f`Y+>d$K-S8nybz3j??k%GZr^$Nz z{8RsIm*HvaOx=?ca|0hMmC?{1=r8tuO*Jn(?H);)w8q0w7=(-!X@@_eR=C+k5yBJO&oK!=6D~s8{_ARo^&a` z=`ar5 z4`VEQckP$;^Y$vw`P%8S+U~7ukMEKF5t??}UF&;D z=crBtPR0)Fm;P?(`kb=<%P;LUyYSex^|QyPw+jM4<R+z%_t=t~KNiobDtv%CwhUIfsiZ&ob$H z^J+*1>kEDAuBBm@2n{qRCx<2`GDWHTj~}-cWw)h5ZXt{^xp*^^p$Mxs8=xHWD)FhC zXkd_uK>u*;L0URgZ&b$!T1!u7g(sL_C$Nuss9nHPx{E8@UP&#VRow6Kodv%xnHN=OL_AQd+H)z*^>SO?b(^$Exg(?jljJrn zP5S(J^?r93QEl0q&@Ym@Z&zn77&`0hf%W+=nM+3wwvhMvTCwl7bG5Jc;It#l?Ircw zd{dq44f;r1#!oZdeVezenI3g)TFKK^(~8O;4&#HjhZ@=XXW2v-4l`J+Y3F}_n$uRd z9m6~J%2SH)cwnFLW~^4S`pHFmrS7lazsKsFcSU33(X(Paun9DS$pSLuY9!<6bN3I; z!y3x#_D*S<4}!N9+$QFFT}%ZCpe20#SrsiJs@aE(l+)CF-g~abf$P8wY>gh>yQe^D z#dZ==;bf&JgB!T9%p{`*Ls~=C+Wgxt)03W1D;?tRm_csd3?kM@<7ZE93s8kHC0QX9 z#mDJ+8ou?V{||F-9#3W4zK?1kp@>K*LnWD~NEr$t3CR?pWGID5GE){ZSCT0tA!H_V zgs4>JA+sc7=6T%5>UrMxyT8A^Kl|^!{&+r5WmxOJ@9VnG^Ei*;fmI7oDh%iq0~n|O zrVfEpp69U>|K&Qf>!JkHE_+UWr!dcXWT z3e)$NR2`tE*KaQW3Q+^D49L+EEIw!rK*$)2gwhG`-|qf>SZBf*L0E}6EL>Y(2M?il z@#eoPIM!6%`crB9Yr#_%X7N;>) zC`W(zspyW@tgu&`{r(~2B(JYA6|0u(D0BYArc31&YK8Cv_aazpeb211=`XEI?FoDo zJFcWJ*j!5Tdpe>p&9Bb(l=SD8>SDbsF(O|lYf{cke2Uv+IA!K`seakU$|qf0`rF5! z>TlCXceZiWU(6t6u$DpHyaOkBeW`xS>W{H4Xqh;;%7OYxOu<;4!q7b)~9H$F?c}Y(TBKu z{jdt;Ak0-Ze7gbfW{mJ5Y|4C`lbsE((V#TwT7liP_v)qDfApg#0v}3Bf+ze&a)D8g zJO`3}-KGEu%1CFo!W^-oj%EGE_1FhhGligFykhn6jj);SQR3`U-AKb3Ez8Q4y z<%rMqO#5}E)cHf3DfgCaxQYU&PvnX`EEai~s^3|Z-F9a#*x0zHH|4eXXfY{ev_!6q z*=b2V-VJQ(%=6iwRYlKJxJ{nu>9LXY+*C zP2;3n2Ex~9WYJs!2y;~^XVVQ-5V_r+nZli;m!U$4CuRsHoK0=PMBV*Iwy9M9GPZ6| zkZ|6$-EARh1XG`ZSNE!*)S1`@?PN{Ztd?L^jQnwq@69xBzRKzJ56aMYjd}bEiHfka zX<}tV!H1wt_v&cg(Csr^y6dd$^6Y&Ica9;sqnUH#7~Zcp4V;f)1GqXIAB?n?J+jE* zg4gYHEAM3hvOJ+*F2*a&cdbKZBF_N_Elu~hvN9Qjp<^&i@{^8{Fm+W(^tZ^16Sf*FEmWv`QY zrtVunnN~lt2VtZMkQC2;M~-=LM8hK>+<}47GVU9o%7AqSK?{srdwO$AaC1>`;6)Vq z&Ci2w!!LUS{1+gTu0zrHak63F33)<*>+e3G)5JtTq>*3(g2M@14HG?Nr2>wFozhVn za?Brqo4aEsDm~zWJR>qs8RS(Jba0p-g~cTh^V#c90Z;>{gnj*& z!5QqsaP?T=!7Op;Bm8GUN(IXUYDq_aUf;}+!mu_Zvk6OY6G28)bAdrY6CxcaSkmjhuW@2xQ(v#%okT%} zjDBGh(Y@hKRysoCP8ND;-N8uvJ4rvpazHGusAjxLTQ#cFG6N=`ib`y7#w z9P|SF&`VE_^OE52$wy6$?q^K*Qf(*c+u71t<^1p02nzl$Y!2w4!*5CY{{n+`dl~-+ zD)V69_P@YCX$t&Xu$KU*mQ64N>usS}s>HZWyI6S`p$23=lB9|WiJx26@U9^7yO^0_d zZjdArykoB1@h9nv-9-dP`$jnT+;?02(No#$madWPE%vLba&vWMAUf^ag;LAuE%bw<^id2e@Z@8XB&uMf#kEzzi*O3+wFQUXSoprgX)iB%uE zm(*4LUi25(EUizLgJlgy*)Cyi$Oy~s4yjt-LN-+ye3l50wNo+qvFqrX>a1kT2{r_Br>P5;4{T+Bt;xlo@M2}AjMZg++Gn5Y zQSMM`p|f&9@*GDFAI2dpaq1Kn`?s&9xq5$2O_p4@YeAKb7)4RLJ))#Ol^Em|78UKb z%;eM%|8%u%_4ed@>US=yBQfk{kuj$cy2?mQ=OlW9;M6jk2!&DpNaK;&;2CUiFe7)K zTHX&5CkxAMyU^uD!`(h~h!Hk5Jq~S>`wh=*3l4g@TaSN8V;+u6&mQ>Xm|PU!wo|q1 zeC?iX8Je32?wu@|RYiQHTwvqXxy7S24kcHeV1~-b)ZM);qvp3s&s$y|`#ZM2;f&qA zu6#dUgpT!MIw${=rnhll*;=G>^5IKdiQ<+0ceY7a{Yn<$;FP~~Q?x0n-^SA-Gd+ci zkNfL=JNsKVEgaO@`tCShyMA;xXSw3nwzhrj^6?GeAAapR3j>Pv`Cg>K>gXU5LipMA z*qJgV$p8v9>tqq-)RxH0@=?sAM}Ddbdo>=}Bi`I{;>1a6jv%!yAnvYTbHk~M%*|xY zyJbmmvx(E>1|c3KXR;r(;6?Xza?ehdng~lsO1cO(3{S@G`jXgw7QB(-^<3U5`ity} z!^+?umY@9(i1-pCd4h%`I&~07A-;B+y8#a=C>U^fqXPm(x9a1^2v*HYuHD~w!iE_F zmLw=ao03&Z&@eSDo9XK@NVqaFJSr{i#9iB%a-L&jp-IYqcM#Qc(+j2%q@EH&Vm&{; zZPQm}qiMD3@}^12NPGWeMgQ(4&jfmB+pe$IRQcPbe`?;eLZCpvh|@NJHc(m$-Ox9-iJmV-RIhzvgQ5L$wR7Pk_F};uBtwY z_&xr+LEod-^_>pKMDqc=o}XcU6tlB;vkx8p7~sbUgQ=sR3ZvcRcrEVR*#rm0e!QBU z$#_kA znZm20wicw0%cyx#J6V@ZlM!KCFU$-tqq+cHM>(P6oh5UtDZFIzz#LWKR6Kij#I1wY zw+e6Jy7j2p*YG`i=h}86;CA(=zW|La^csEB4v3jnz{gtK1capjL2e&nZz(s$QH zl4#V$ey;nxo9TFB%G=k)#kG~S_kTVcIZT^8Y`C%fYoMocTNTH}^LOLZ)-&5jcJlJP zlh`pjJ`Sr>J}xfx)D~^{H}%I3X&y1B?yJVBgFsRjc^q6EP-jriDey8}-}Wy0 z#S7euOYr#zF%1fK>?L5sBMuj$y#S`;7R_%ilEzvy?SY7r3XdN zsZ;u(>wr#+0V9#RX9(^e`Ww(MZrm6K5qkc*8z3)q%zbwXAPL2%URqv`IFUroj>*W- zkYaoT$OP&9MJNHG6ajVpZxpHoSRp``Xnm#E=bAw5Lx}`_0O$p{e5h#*)NxFRGVw`E z_pCWv*GVG81;2r)F#K#{3(N7SZ;;tyhAv0Wccq{n&)u+L5eX*tL98BjOYo5f~c$VW+^iUAIrbC&1dkczY+i z9m-TZ52&j5_*Q|ogp-$u2Nm7M$Jnu(dvFlxXi$AY!Lays2p`#L; z0HOd%(~)m)YI`^#EUNb%Ziwg;j?nsosPOi3PNr>7=X`tT-K3!-k3mzpa^))sS+lbc z<{zd#2NE9&0jSyKIU-=Ov~dY7FH`9jCfE1z8&{&#DF2p-+nz*6!#5C71qFyr0;CCw zb3wrgxNc#uSxnu?(BQ5+!U~qmz^g<(!3_u1O}7n|g|u7SB_CY3ytLBSlYB^KbR}K9 zwe3q$!a>9L6|K*6e9P?aZ>EWL^54F&vV2wlRt`2+S$;L?m3Yk#ue20?fwW}ayLL8V z_UF>qp1<1U(n@Vf3R+WNd0GFh(*JX|ij;d|N=dG{rZeT4WOYrQ=XVQQE&0Bg)44xU zE_R}<7iZ&Qb9lBcc$Dy%)bn#rRulE6+k-xhFUMZDtdMPQ(GJ~oni)3oN$0xtCN-gf zucK4X>Pq1Wk7rMhJ==Xvzj~g>j#A-HJEKTl&=r37iNYbk0n!%DTuq*0yS{Aut7ih+ zgGlSiy-5cbXn;qtb>OxyqY8qv`@;8AlUP%@KaW3~;4;n3*b>z7)B{X}kr&ZAEV6b` zm@xq00-g~Nzwbfp07TL_i}954g$sdtY0#(TgO?8sES_~ge^@aTVT5`RgXYIJ5zgpM zcB;6{wD=;JCg@h+W8ta72{)}Xb5mdw0q{2^D?%)XwU1GS|7cde9aCj z#i?T#f+1NydQ@I~PF`NoEE{9vpFnruS}%I7V*9w_D9D(|LIS6x8t56>_U$DzUw8n4 zqJaf%2GA@>S`y&#%RZ_bx;~f!Hmh=i@t|^oMoV)uO!;xbY<-Z4L|^p1uxaFr1>Azg=DXY#)LY(=o0)rGVWRpBeL`{M$ch_wT=X?b-uNM6n3rv_-vbZ)bOP-$49l zdw7(;6>hzRxM-}d&Dq#Zz$n+yD#PlN;|VcR4)Zs}WBK~|ophK2mep*D9IFoCEBA~+ zkAq1&m^9?bITL>SK@}Wma~RP=xPjdiEWPhBQrL{U@ar)2U<_2LiwfOse-}p*xVpdb zd?3#;b5P1UhKy8S=5b6uTYN+Ph-2r72)*m`7Hl{k9wc~om~5~<0G|`*1%ivLpj(8I zbgR^}z?d5WXZBZf5XrI-FF=rrEelZle84rh!~wlFa{iMCUE5ni_mf< zPhe=4my-jW`*HdsrqY9f()XQ;w_}Gwh^oGI>BphjJ+e65uvS33Iu8KOK{>Ku%Yw;9 z-tyjmYeY~%LA8WGZF~b+Q<@&<7(*T<)QS^3Gmp^PnD=*Ikvu5lK2kfonOE_lp|CV9 z;g{Q%cL?bFYLLroU(K>Z(L6!+qQORf(tLD46nL^`d zt6WOTC~?fprMWqsf2S;$MTd&##^&X=CK_3rowF$ZoR&#Nn_KMsHo`+YTCcS~)!K}a z9&#i+&P;G5Io4v4ckF2JC)4ho0=z=AT70rM=7t-f=K-RL!D4dq=PH7~RIMCfs^a2P zPn5vE!|;hHB9oMcyaBvDg!A}R1|B%I0HmCp9bSkAbmhP$vr_cH|6dqr2Zy++=@Q2i z)XSiRuCALyIS76cqS+8N6{`GgobaQif6 z6D+95KK3j#3r5=C1x9<&rxN7zgTZZgxripsz=@Dqx7#P@?|G999}R81v(^_?#so{g zKbCyERr&2Gy#u4=6rH0s3s@1VeBQ<*r@0Owd+9Z&<38E6B@`nwhB%)j@GFib2eUXniy9=YZ9YJr`be+hM~_ z4ZS@<{mz{`@WTbOPe2D0M%g$Fav=i*rVAn`4LJdaY}3dbc3RGm%SJ{Sr+z~8h2SF; z9!M~`5G*C;ipEY~i#rt1p#Mhz{3}|Nu#&mm*9hbq&Nwf}xMkopO@KTFs)h;66h4v3 zQia*7t5MkJz>Ot5M!}N)BC5T%u`wIk0It0=(0eGla%MNb&;*WW`ZZh#s)X%ZKeV;! zEE*$O95RCEP=zeJ@IDRZ?1U=U`at5aU6DfkF>dZgi#%Ne9svQU7_E@Cgzu`W3$7bV zN=h1gcl3!8)(+4G@;Kmys2?CNBB*0U)p3%fX~Uk-^WLM{PoK!CsbQInIWDSGL8gcp zah_<%Dbeg$M^rdS>%@B@2X@rkWsDHHQ5Q;^sP&|pC zNk323Ou>r0?Pz_JX+KXTY~6_IUmD4xOqM8F6(+w52?=2iS=o=Amup9==JH-P<-EYV z1rHk49a;&vd}rxifu)`0?KvmWm9CLLw3)fNnBz1Z=*ESpso6nU-zUE~W^sJ8!^N-s z^xswyZzNC86;XGg%Ji(Pz53SY?iM&qo$Bm_39d40*X-Q>pcdzwc9bW(x3X9DUv6vD z_CM?H`fBIc#|!3ydt|%a->+2L+2X(Ui9Ta6nuLz| zrD0=_0K^mKU{1ze;olt3sk0OM;Kp-^uyQv^Tnvf9v&%#m%sUS|Fn<%C;emg z9RM8xd&ptov)z1uo-5yTbyOLim{3(wflneHVF$^cx!aurrE?m{x&x>Jp)Z)sSWB3# z&d$!ldJ!nI|9T2y7kPMiR*?#mWq=W>CO1+sF#1K20%K6{HdD}@Lh72HUd?Twm$pEh zw@vkJi6tJ}3IkvyTnOW78WKexf+`E0D>-|pGMMc?TKnc<5}T*jonwnG%PG}8^6%MQ z8hR4an}lX`9}nT2k&9Z+efFC;o-OE*gx@TOha_-nKpqE?o2BtSB-$4;Rv`2!vfWW9V5bOX7T-PQlhFx9+Q{P8)8y03YdC+$4dE~XJs~4KJ$&h|+ewzB z%jKzai8>s$maXfIS2_&+mZ%NuaN9S!d0R^1`q?|Ki4}Iq2zx`x*NC=M_mi{VLD8eps-zv!P^NtdXA<&FPIEtx3r%-0x2-CK+e$(L!&! zEb*iL*%pOY*KQuM*rysHvCp4c_R+2DJfngeJKt<1K0AH*4mz8YvP-9>K*l?M0PG7okg$r`F{T zRX$9MO(`=bL1F)e;-C%dG3i6`u_wi%E^vmlrRj@*iir5)H+hJl7s;d_xuIls^J4$7 z45c7L!tZJ)!sCRVvpxs1FEz7|Ap?^4+t^jxjWtKHsC6JC7#y(P82@93VGWQh#MBT2 zf$@;TAOWOA?3s9{EW6DC0FbkbMg95x`yH4Hp4)J;fk6)S7W6xSE1rjj!r~KY6dVMY zD8m40dDQw{_r##vh##Q;;Dptt0d^jw}VNIYEzyZnkqMlDB%0hz}gc` zV{!X7t^h1vUY_izufHnDq8BT%Xc+H^Bh<<2$B^Mkcy6ND1Btu<%ziX3cxUnMH{vf_ zywYWQ{jic~uofN^!~ZmxtrH9uUsX|*BgnVG5?V*(DQ-af?RRb&fe=u5>OVkGImY#l zj)mCsail68<`xh@sAfXM3(Du8O%~p=M#8|tPoBd|_RL03UI)Rg`}E4avQZKG#PiXo z*r$-p*EaQcsTPt2)Afh~9E?6--oxQPGHS@H-!6QEFKUfa-E(Y(5 zvdCKro1|u0?hQNe$5Q)tdPrw);v?#V2hOq4%-qeH+-ZAoFS)I-b;PV{W0QFSeH2QH zCn1ihzdn@e-waF6braq4re!p?Z1v}-4;g4uGr9KfQfCh{S~%A*7K0*6^Xo^DZ3zytJbia5z`o-2$BAqOx@n^*vepDUjMq{UQS`5l|tOD)S(9b5& ziZt;JO%tOwz?1+9LbpxZIyN?gQvN9HBpMUW!(I}MiT2w4+Z3A8V^jZXmcCZ8-8rz{ z{Nw*rTCJSzItCw}_=e%lp1BS8p7pZh)|P-j_$~ytvmGF)w|+}a3O=AJh8k7<7XY6d2$17PptbHnx+8sU$|*Af=d zeS@%dCC{P-p@Uf$lVL0dS{Ir+ra%SGkP!ujspU1e8^WLtLqsfIFn^4Ug6T!@gO8ug z&Cf?G78R5^k-#ELJ|>#lVu9Mx_b$E!;JnoBcERy7?AVBrYa7UiSs8aI<}V2FxL7tY z0enxBTMGr7z5TllTUWClXXjeFCY8z1=g&F!QcOEY2G>;bi>}Kte{1YXuZl?~r=&zZ z$0Z=3liGqQtawAlQiF*zFjSPPvP%46v2bV0nazl}f~5m$U$ez=|BtUUlA)~N;(7!3 z2ytfM#Gsui0ocyUye305-FVhSV!fBs;i?z3)i@#2F(rW1%phKxO( zskhTtq58`d3g@~P5}x0V>FVqImwpo)o&;V6btT5=VB#?Esu?zI&v}9E0)-+xM^iLY zptFaNH+)$BN9Wy|xuzE3T;VzC_c#Bm_m!;i)Z$Uw=s~`f{PeW;OMXQ-wZ2v%f5|W*~u6SeFCu_4< znO^=ZXx=uwbeU|@zMxg?E(2dN)?DrzDDw)ZOGC}@SA83%ivFxS$F$Cg9{Ui5IkUzjSjp0 zUf`v6k=`UazdJAT%RZ8gD<~?GUhKMyn}h=oAPa(WVSv)!=SZN5t&;)Y0iL-uvZ&Rd zf@&|{LZ}Cxj*zYgH3JyXGz}?kfvpbi6e_oyqKIj0M(u@=E@DJ(_v(Jg*1N6M;erZr z6)14i4nTE&yTS{MQx?4{XtW>T3IvkDK^B&PU75||V0lA>1rZXcH;@s=4W&l)GzMW> z&MP3$n{|ChY+bCdso#il@|n@+yq9f}ivxIV5BYZK*hvVt?ikGNj9RPv(Y%H(r6#jJ2SVVt7ZM^6E9T$j zhI33w$(#`tGI+0xv>ZZC^gl|vV`5{)R?JV7h>1D~SbgPF7O`jug|Miaibz)2|4o_( zIw_KJcR%Oqj)U;JRpk8NF&st!s!?J@)=JbXma*Pz&wS6{B+n^DXhBq4T277#VxUx$ zu3w5jL>RVP!E*v+2u`7Ruv}eS?wsgCd5gb^dhz1x!1Qx|gA^Hl5_YH%F;fKBHS1;% zgu`%QKB^Lab;So&`#PG2!SZ@>mb7Dr$CmIRHF zzCH{g%KPsuxon{J0HqTiy#60?aXU(##UGqTMKCbC>}p6^R9ipX!UW+Wfc0^I66_Jj zZHg!U6kcDsX&lsJ<)IKe`P(Q;Z4dYssgr3WOFNz*v8wROU&e)Jj3$ZX;ZFXxbSBHr zMSIR`MkR-yDrJ;nR&Go>=NkGWm#;%JUd|oE$FFdGSf#iKfhL5HiK@{l%-fb3T>;yI z`q#X9VfpPy+x#Qfy?4fc>Anr~+r4n{v<`K~kGirOCkb(UdH^iI7dI+(I*vfQ8=`nD z!Ms5a!kRM0x@ElbCRv(NyHD4~YE}YbZcOb({dn=saT8(E>l;BQF31$UtT>H*&>`~1w~3nF2Q%P8-Cb{m zTrqX7uZ}yH$yHvQm_~mYe2PIWq6cE*+~5_b@!?@0g1QYA?~lD)om##0I)82auI_P0 zs@a@%pm;?ehH&n|LJML?YH{0_n|&v@ZX^3kEAfa6!##TX6lz3xWvj$DFbEiS^~U&7 z?~JWu{q@zcPY5HGl(%o!{N)ojUMMo*w2B=1^O8=c!Y|^+KOjF@B>Ma9oeR&Vepg_;T3pT5XTXzE>rbh62cZ|XFBs}<8oOobNlwtC~M{4I&z%D zF+8Nu=roC1@x|a@PR;ab4d4G^j-2_+paIq}rJHM?oNZBc#4>xqYJMPya)~lZq3>?; zHC2@uQmQ5gZ^?&adwBHXqa&^`ZUL92Tr${+Tk6&&mRac_@_6(?DKqAx;Uve?uJN${G>iOux#7kr4;ytQcv|7MB4 z>mdEe?A+}`6b&GD>S;ZQVD4+vH2~#}H>D73CL5<);vfXCZyB2Z(kTvKWa4IZokJuf zGtuY5_;bH)ArX&`50JC4fUyYXiH>g+aROi)juNwMjLySk1Gz!SiJvc=1ic&a%OJS< z{W%4G0MS+_Qp)*Vbab~|;6fh|Dj2pRH7}>^6bMu>EwDjZOMOTiAER8Ry*!G9VrKHY za`>f71}*LFC$9g#jZzXA-(yvqQdxd_Mm5Q|ARW2>%!pz z{03$l{AQdKBv;u^w0G&hN?*7YgaIYIfiR}PAT5}NBjhs*?)8qrJ>?dw##u`kinn9L z6tc|tK7*gg#2A&MxN@JE*`kIJO+=ETIwL&(ivjArdpimDg;dOZU?HKjHt--lbzydS z&1df)b{NA#vOr>wO!|W}pYYj9>K;B2-*O{QPb`W~n)By}^;PqyAtkOZ{(c8}_20i@ z+ngvgs{3i=50QIWc$ag-ORqpgDL@8dCK2JP;3%rQ?lM7GgG%VVRp0AKxx^qE?JZ zf%L?z$gs%H_rq0Qko6H9j`0ds2nr88#)EfGNCgx7n}C1-INo9wXK))4;Quoj4O_!c z$G&rnhX-IW5M-cd=E4y;Zb2L*4$>l2#F%EQs^tHMks)-|hei(`eWj(P8x1I)L7s#u zp`?_QR!W()DyR`r08HW8Qc_~}EfSn#*xiDkeu706Wfh!p!1gx+|2!&+CsY}x%OePh zTG>0tAcf%wTmx2CoVY`a&{(63hVdN7lL7?y0X^5R*!A==()TW2Ji{4+kzhq-CGxuO zA#I*zcUVM(g!y+C7-rHP{RxRQHs!x|8FA|Gth$|$9FNlpOmz+dCbt(gHFI5-ZGofo zl|R6^3g;pzjCd3k58)Ao-_n(lkcopCARFyZm8iuZI2u6t-`-f%>5{7lblbxnTLVv)*_q2HO> z(y@@-(wgwDv?C?$(W9+Dw-#_jW%F=n-#C5Ro^~tyVMjxi$+f$eW#RGf-b*b|!E5ez z*Nijd?(Y{Owa?iJhOinL2$lgOi@7%slW?HM2M89$(|ahe=+Wka=d2jve-EKWvC%_bH5)G!*AVe-WrrrEIxo_b9pA{?7&h6Wfi(~)Js?bh*)wqcv>@n z2AY`Efpt;rFwJ2|>XDQQ6U&p){50en7&j6f@{kjX*b`X63kzrKb6|#t5iCpqIGJW~ z=c{UJ1TJUGWAiz3WDrjs#&YO+$m6h$fi_r2U6??G3p)yHt!+q)XHLnll>U=dpvE_4VqBJ40kCPkZ8$pBzn z7&U;~{O0XjNgPCo#==&C392sZ?i#KF@lt-lgg@pkGKWB)14`ZljtS=P zL~IcL7B=V4p9j>Lcp*wt3we&`;lZh$rZ*4T!CzYb;gHWx>2M!u6_Le;gZB&%^kEbk zBqUVLQzd&&2dc8}6O6gRebd}p=H-lx?3+x%-mZ#@h93z^h0~2GHjmtQ}O{JQUO(Z9Z@vjEOM>o*JqQ5HHld zs~f4kD=>?_DT?V)2XPiA<<#8v6rNu|rGYKNNswzVE#C|Dk|TB}Ww~TzdSL|B+KOnN zi3vj;9X!mxF2VQ|T`F7;E}TD)jai-qjTxS@fW1U zX&XHuF5%!NjP3IuY{Osyw09hnIJ&}WkEF0SHZ?&5hrLyhYIbq)=+nlQmXA@%2%x}v zE79K`R%>Zt!SR#zMm6j&@0?(vsw}vYj#@e{?pmEX{bT{aD6E3hY%p8XS&c;Tt_m`&P&^bS((uBDicsVaFZhvqZ zn-ex6Pnv8Z{<MQQr0U(!U~^yzbQmZXpEhZb6D&ymMnxTycWr_=QW zEBNt_wc4hQ$9TD>X5D>ikE^|RN|+ct|4N{I@Vsvc;%U{QosO|@Ts{l33>6i{!9Rn6 zb$qURwh|*6mKOqXCyRZ|PhWkEAn^g1zHP3|M&_~Zj|%VemvT|J8*s9i_uq%nUT)a^ zt9QsZ=pL&iBAd%7z@N``<=OYEG{;z%COV1ndG*h~!N7O+x4<2Hn?LvTODFs_SKP~v z2~kzLdvg#BFJ2{Qr}e#}`#9G24?^lngMw6bmrQO&m8D#T<#D4`FTViJ>7sxODoJ(W z$q8wJG_?L7Prb9coFzOnjg;t!{S42wDH-^l_xjt%P5F5Cj*X4f8Raro!k*@7q{|;e z`{x+H2n)wZnsUG2H*=~*$AP5e9GC_;JD`fl+jKtmS%&fmusRsBy^wZg%4mS!-50yB z)s$xPd0VHCG=aLWr$zRr5RgQ~0yej0$ zeLqGkQg03q{t@}oO@v3~zu=}9Iu5Lqj=#OfEUiGE^3K+}-?Xo+>Bc_DhvL!$1SzN1(zXib_xa7axu1 zUCe?MtzgGFHkRt5;kQetdZEjPP>%xy?v&Fp!b z7D0gu`e>-~J6^=xMF-bu&$>-WO)VMW7h*WN#fV^_RH$NsBtSX1+{fDtL%6D4hV1>p!@g1WlW zFmCQlw(teMw4$&)<1B}O*fOZDo@Ci%P`|)29zsjU!V=wMlt~l&bMVih*qMi3{<{JL zXk?vMR(f4$kH-irUJ3zD!kCzv>LalHDkZzuvcGx<8AjhxZI>o{YjNLQ%)3tTx2?61 zdSg`?<(ctqcz&&}wx0|uo=EKW4L=DlKDTTM<&8aqtVycxT`r%08}vkJ^1XP*5Owmi zTRO35JAYT+Tk=dyI-=%BLHV3l|H0y<;DBwcjtfo?3I3}kYkIC;JIa~k)6xRrJqFQp zP!JeYdzvskF`TFns6Qg;6QA+|wyV6t_=w&%ty#Q53!2k0iwBeJKqme?!70}Dvm zj=)1SI$1!D;^QG9{t0pN(7*suq+o9D6HHouRd6b?gFFs=R4{a~uE8XT`SW?loqDVo%RXlww}8?9vKsOb%ogH;Dml z$gD%^lyKSG9)zm}1a0Ie@P7`$X9 zoEP3=aDe{kAmMMETDY-FL*ZsS3B;Zf1D_r47(Iz|Gw{zZ6 zGgo|b#&rvRhT(=HIatew2uoX~Wk1z_()Fxdo^AfzSFet*GISQh7#73ISfT4q-TYp% zLTi&5aQw667>s%LgJE}N=F2`B{9CrLh{#0Z0jat8;-sOsKPK&Y%&2v)p5P2QC;2!| zgpo7ROduuY(d*Y5BeUjpDcp`o%aJ3`6BVaBYqxJ-e$3$JPao<_PcyznitL*d_Mman zByxElO&<`X5;-oC>NYKVMv0{43DH!|z@TjTH#0K3z^!~G^sclNw)ihXLg+$1iwX(( z{#5|FAlAsym)cbUa>zSO-?www;#_~>%o{wO^KLk$S1!ZNwpdi>_BG0xmX+Q}6 zbWk~k{^k7aDy6u}wI4&9LF&r@#o_9VC?%M`J<4K6&4!A15!<3Fcn{cnGPbcZ_+Qe{ z5TrtiX4!-j9=W;MSsosq&b(V;d3p1Mopi7Pr}u%O8&FmJy>A+|=r&B7@o+Cp_JR%~ z1%@RYGY6XfjE`^hZmzl$%Z%6Q>6l22|NKddNf(aC=xFSoos&H5_##wiAhZcm!DJ2_ zaHQb1hd&Fkqxl5~_ZHt5fFUhL*g`^aO(S@6K?&D^<3AYa_?Uul*&YUGmX~3S*svB- zV4b83!0Zj*0YDBAE+|-$;o;*wrJWx?nu631$334J89b3MsoqA&e46fjce|&+VZ@eM zU%zCY%~yW(o{|Ku@7!day=siG=`-ia;N9GgC9KqLy_UwG2)+(-9<^b#O_PbP@5jzB z|DnCRyw=K`oGc-+C`84)Pta|g{E*)8f4BezBvh5ZoRiE=&0fgtoBf=qmUqvt$Wqqk zi;lq2?)Ud*dyOWJ{9fpKuEN>*Zt#-vg9{foM;AO2KqLP$`1(}7)%Qq|w#ueidQ$sg zpKVlR*BhRiRz2$t-W)RRu2mCr^`rUnRjJH=(67k5C^RpR;_Q(l%N-RT&;L2VGL=PA z!RZwo>ipCl-)dlN1M7ERc`;!zy`r^kE-Tnh85n-m-gg-u9sL=p&#OOuCV$IrC+|fj zT9iUh-sD`8KN6y{af*K%i8b}wJx}>#>wl(OCmhhLfQJu7{FHJ(8eCLSqyjm^=Qy5> zLuL#c8@T*&hG^;N5M9zi?584&?=2**es$X5nz3g}$(mX(W_XMnrFXoUxcMfHM3Cyx z!9#S^udIPGjs4yQSD!OAl&>iEGW>?Mr{nBC+Dqw4hwqP3*6(BRKOl6kqv~9L#K?Vt zBb=ZmEv+oq3V2W_c6W3%=De0tFSWY0ew5jlbV_K?uZvvI&h>{(nwn}q3v*nX9Imfq z)K$aj&&x^4KKG{J1ph+Ui^9qNd4W(#L*<#{AICsMEOvHSS}C0!_%KO1GkfJqH;pV6 zndfJdbiEvHw{!FsGTW55kr?WKnLF=(s5JT%kX~LeuxPOcF|kJH@}ac(mFmH!Bai@`c^INA5R8Mn>`SI=QD7{+z;x2w-!0xdBJ@ zGiT3|Rtloqf(&9y0-SeFg3bcfMt{DnlvF9yB0Lg*Ju)&vbu?5(1O*XfscCj@&46TK zchC$SN+v<7u?0hq7_07*Ct)FUj4W^CQ&(SQr#!8>yEwdY(2UG;KMQSSI8E@i@EreC z^>+KA*0f_yNsIc=a84?a8x%YJsIGqgP1}9y<(pnhU{$THJ+)uHmb&-WcIqqYP@ zQY%YMR9HONF(F8x^cJ(ePX5KC?x*%JGMd~r=H5%eD$Pp~ zP1BmwFPG83g~X5tboqlLGz!)F#RH7q7s3V4ydT?OgTFOiyR7($OTds-E@i8F_Spog z`DGX8$!k^{WpYbz8b-{_y4+T`229V>-Lt#${@JIY+2c?w@1#?7c3iyj)qVT~y83AS zdcf82R2dwG^?xQocU!e0l%=YyBaiUC*<8KYIrvQAh1tUEM9qo7b{+ z8J<69kE3&TJ=KRYJS@voRu%>L9ck^uv_INAycAVFC?31ZJZPw;b#DxY;BA)93NgP*?DdW|~M_Kcm3yNS_Ycuf^KcKd9*f*q)5*4)70soSd$ zf(Hz`t>gy(@zubW^jV87ag$(vdDB!XAnxyX5&zTI!X9Y%-#?KoojOhb-#<-hdqCp( z@2fA3MC(8QPg1VGCFQ?=@W|h)`QNb*i8bjP;>!Hz)kC5Fk6i%qk0tak|HrY=f#?7K zzo=a1DH0EqeE#_?8`u6HZ{J$@;=Oz4t@xiRE1vxKPLzN0#5L>~?OflP(oDf*u&QaLowZ&2AEvx}_rs6=&;erh0bWT)lMP5a00L%l5pTL(9-5dOm2ZWJi53$XN3cZ0v`xjxD3%b8~0au!3Gw3jQv%d zM00>T>DAkUAO5+sQ)MslTv)SJ?icw)Rh@Ia#)NjKwAbM9jpYVK^2&|xg0TFRUYkN8 zIW(|IwqwWj&0SYf@_~w9P!O)1;3xkI6?Ig2_+04sHy7gp{KFx)ch4NpowX$!bf9!} z7zYSfy#_8`3=ABQ>$RQ#xCxY4;;MUytDg#9oEg=6wH8c6E9t1=KAYI^LSmcp4raa3 zGvHUPmCfv;0N?~KcI0twOu}^IEn76~TY+*6=JPyJ`eb5T=8y84_U0SDxM!baR>*Wexu&TGP2+00pS}`!d?ZXSs#44O2z{7j^Do|xZ^W+9-9ufmIv(d+I zX+HSZWVDuMad8CT zyuuKVC?*C14gQ_fef0-mG|MX};J1K9o{*Th`@h%p5OHbJhNdtx`Oz46wA)QDiy9bc zZS!<%gH2E`)JwoP0K5m$*xK10UU|`5bPpe?6k$vtni3$J;{kIe)@@~HY%xZS<>jXd z^{^?&iaaRggfvq~k!WNwPFmXGhzqu4hf2dLhY>a02Y}l+o;N^UE!Lu8BM?=zn5$t* z{m)cW2CWqch7PXV0gT!FB;fgxy@3x7Dm;GMG1*V${V!#XmWz^cJLJ_#|Y{sCcgkGKmm;0Sm5GNPuJIxPMn^eT$cINp`Ul-z zvhY6p608W1!T7&(hmF?8-u~c~tGHR1<6>)-G7p7QOMbrM7t;b=-gHDI7XCsr2lf## z{^jZpdi=@VO`(#ERl7J&57VIZVv7uOkj`p^eK`G`=;!}Z00 z3_|DkZKPmQL0?&KeG+6cn25{9-8rp48TRA}bjD9vIUaoCz;K5<)M@tjg^$M&cxwx# zJp8B1nbm1v^MCiQ$h0-cQ5mUdz0Xix`#a$wA+b7yFpt^6nB0*-lDJyTSP%w+Ld zcV~Ooi`v>J1AK|s0$U;V?%grs)`oZPWP%FqQnvs!8!dgcK)6d( zi`{@nK2#~bj64lEDxg=#TknO=*T-jvbQc@Hpx_iZJ>bJE8RO)F%gX>rTt24v|2>XL zZ~e~SrK2aq(r%=6`P|wm^9kqpE-7yw8xn7Sbcw$5(a{{-5hljQ!j1hTf=YM<3uJ)WhiO1YtneytsPd(d z3`ZwNx&b%pVpr#~+ZMOi90tq|6lT>MvHrLmak8lBO8T!r7g1f z)=@b78>tD2oJOadhJEahR8L#nqI-SV=+=Q5=1(gcp9iM(^%2=cLFp5>Z#wnP>hEuU zGc!+u{_~^CWy*1%F;u3F#hXIk7;2=0O%Jgn-+QE8Y^(f2Q=wUo2)~ono9FFXFlj|W zIs1)|mnGW3k7CAX#G6c+Go)XD*11LEpOuWNK2Yezfh~!uu|oG&0y4@v28K3+GGaGh zHVFwGpPyOy{8cG-@4++Xg6N2?zORpe{W?0jZ?B(Uw5My;vzu5%m=V10E)1kOxi)Zy zP>-Sgv8KdBgc;krR<9FV+uCeIk8ksQ=sQimd;Ly%b#-fbz2IO+3uqsf2cmB_nMX!O z9DDQ{eR$pG0sc10<W^0n<=+0+P}e$5$$9JIz{xC4edFYN|`#q(q8Ja0qR{Kts7Pf#+NpvbEaW zvxP(sNdc<>UV7NuqI3PDdAe0Rr&@#`jnmq21Li2%rkx9^VFEG^>IC+$5c*9$I_9uK z9)~$j@%@SBmeRw9npT$AbL^IPR7RzecwF1^FY(Re0h0y2hYIJdeH5ljoHA#58S?XX zK03x&F-%qM@iZ?lN3ARhHO0;AxAe6xJ1%Ry%Gf-0h8YTm`+KmR&aR5l2VGEIQ^Q0t0s~ zPMTs$$jHcuh!xBwYBpQ+C z)O;u>JAH(CbZp~n0|Lhwb^EV?^5sq@s3)5S?y8vFDBV?JE*sl`4CjX zb=RiOTp5>;J9M2|O^u+gZC3rUU=}wLJULR*Wn2RDrgcx#fPB*mll z@@dVO*!oOD6>!4Ar0~dyv*{b^%f@kJird($h}!CEPR^+O+eo?~XXm*UwNg~{aING~ za#Og<^CIt)vPyEE@tByb9d#^H~%PRz6xfYj? z#qvYMUF^7+g~iQzCb|D}qLZOQf4aL?FH2Xlx~>;Z#;5l7A0O#stxPR1X|L?vT${V; z8y2>h79}3Z#4HgRSr;o6qMQKKfIO~h$=_Q+VX{<)wT>r3#lGL=cKOn2mqoaSJbFh) z&hAnrj|sr!`=^|0(cW$H4yyr$_huC?-`r_P`q+8%y=Oe#hNH_>^=od1K1wF&XZ@fP7Dkjl6B#%5`ppV6w3t_p#fWe0V%c(0O|7a=oan~Irft| z6fa+v!}Te+s^^2yx)ogFJ>D}i?Z0*BgnP`%{VYrtlYL4heqCQWIAsL#4Y)Mpn`&dE zVI;e%c2LG?CD#O_^~)odpz3Du@8;jDt@%tXR>J=cPk*F7oXJFwi~a1>x_FWO%cf`I zckQFnIhSvj#E`N#9~pU?5s!%atOB}S_tXEgb21*2yG80@0(Wi$spa>*CKO(k{h!o6 z)cSx+uzjVuxt&0xp<{lCfCKU=E!{+Kt=Mr0yd&?P_dNbJa-zFTY35^7l}(9a+``qG?QTy0W$YMs5phdg+r$C+USN zUCZq@TLx-^D9Z)Ec2q+@6B-&eGBOI}azAraxW2A5-?9CF1`Q0g&2E}{(ZFE!??Z6T zcjwGa3=u{?eUuD9WS8bj+k@%-1JJ3=zA0$$s^GxIODu94&E0>4{J-}YaOV=Y$92VE z&6$`(1hc?#`a|b^e*jD*+PJcuGfH6RM4~uysY9I3_8wK9Nwh z9SxL`jJsGAs9e~tdN^sqZ3_2Ne608~>Y@^W+V}0RQaYN`RjiDAfBqa@k=dF3V|}8+ zeUV-cz8|jDi5{h;>slv?OC1?|0J0YM@m7r4kVU7GlsINuQz)JU6&bIoI=0SX$wu}$ z<0&l?`8s>(to8LPtu6Tkc<6oQ$=QA7!Bt8%Dp5~JX>Hb|^9Sz*E*q~J3LZYYJJCBk zvk=#Sr~;Qz(kcgJ(t{%@m_P$-p<86inz zL`G6dLb8(4up)bJg(M^-Ns&rcNRqv>GK#V?GD1XV_I!>@_x*jI@9XzG|39BU?or0) zb6w|kp6~bZK8B{Ij$%-30;I>)mjwqB=y%b7Ym;P%enflWiJo5lvJK-nRmo+ch166y zo>&bUEKc)gJo>+(&GSoiuPtsk*T-aS+4xYi#rd7wl}pFe>df2QED-9HBh)iV3Huy(B*vau6I0U<b6)EU2>&p7F)z>cq~9jLO$+>@`GPVCck$Og ztDvQI^5np5YBUNdrB}E`JNEk-1W9&(`Etd|>QH!f%)}qy#t)m>XDPC%@P!6#W$4yQJawuvH}|NquAT4w)TetR zYq7OQZvRoWDah)&<>$J(%PA>yS(aizN;EX2`2?V9adu`tcMkoYiQsK6EmG$V1u+`y zV-gY)o?i}0WT(%aQ9gG@6Y)qbU$$&{Dp*+`%W&FCPFwp@G#mF~5USwF`bTqvhvpX& zUd;2u73`v2S0SiF^XbJoIeAewxn0uNpjK^7)BmhgoFW&mbEzZfhbi@uM;~sv<2~3> zQ7r_R+2=*=**#8m8N@V!%gZZnZ6SAA^K$YIUVMMGKJCy%1w5?+BqRh36#M@yFfuC- z`3AfwESS9bbJs46@<5(6)kW5+N1y93_LXu?j6hpc*XGr(E@PGf1Z&5RMknwLjyO~X z*_pghS#{Jsd$yy!65{I5o=#&CwP#G~m#am@3}HiF%lym9YGt&qo0`5e znJb3FnzUc(Wy|jwJGvOw7{MA+*tXI$G;~aqjbtr5K7Js(uNbaquXQpVU%p^6CUo@M z9USi_8iobv8qoYxnlkVr;qwAVyqbnhP5PZPZmh2hwS25Ly;P#6TvPw zFQ9sR^^4%Mpwo`IKgM_4m$P5V;ty-q(i19g-yW=wITw9+$J*{PLD+=gYzj@ZGu-em z+AXL{Zm>z#L~w}u_A)*8A^?4sff=v~3KSVi^)B8F0!77DE-r2*YN|m~Gs^j86n0_z zRX}r){u=i$md(K8GfqL$CFlUlpnTW(=LN3|3-$C)_|y&*2@A-osCd2XWAtpG`{#oZ z5WFOrw^-1aYU91UNSM^XHE>NFto@>j+R-l}G8!nKocW z$RS+4El7V_Nh#>wy@#=2hWmIqAQ2#?d&CGo8S#tYM3igXW>V#zTk<&IwQ~+6`a1BC zVPFfM!dkY)q(-=mdZ%N<)J8rZgpq~38_o-^E}$fKRn47f%x)*=g#_1ft!IaPh`-8NldwA%bs!@f;X$q zr0ze43MN2Ci^Jd75fDdM*rHyqnn-nLi z^GSbxn4D}@Y$8dVMM-K&_B`EI>0?Z*39+8AS9$;D4TGzi$M+tvl;9@;jtTiwxpZ&_ z)Ab7#-LDsr_J>RfvP63JI;CJD2nT@P3q|nr#nr?|FTOI;6HAed6?yqGFm^)m*xC6c zENluBd{0ON0pG2pafMe4QeSve;_b=9qnvyQk7-ezaCs~@WXy>E05Zd%$Z_H&wrR}X zgSI$ID%neT;3@#307?QV2qvvD;x<^3EBi9&2b4C(PZcY6H)f}-b$ln8t2FlNIP!675 zI&ZvS**eu-Sx>xZ)}B0l>H+v@**ZTzzi$U3ER-tAN%sHC1>hDI5jjcG+|qKD;g!-t zv5Dxm^cdbuZGI?tX|D=J-4MMrISh=q;wpyMaRmd5%{w;%8TLP%rEg^oHL}en(_-G~ zy#9$(s}lERYF5U+PsB`6lXFT-uf7P8c5SZTUJ||j$X+fHr0%m8hpC1HwBFDGad2>~ z`-B6$z|{ft3~U#*YxSp39#j2WqCW}n^MiVsmz5<_lqb)T3*$3=eHJ`@laqTS9r@*W zxVcZkM-lKDE>2?NX>d(2BtgQj2uMLOpojyc4?umUlXF1{_LWEt zzXGxmzH)gQej$Gy{}6x(dsUd3L4Y*=03>#3KCrmp8U#j)ot>SZTrUCvpbTAXr$Zbf zb}VyK(>HJ54i7Jmd=kT47PefatRi!HuE1vz5D1+Bbe$3oe13B9N-BWgB?R0tFbVvVoN*G?YyZ4Ua_3A4WyB zVJHCq;E*fY#>PJ(^Tj)Im11?3dJDxcU}xa-z|C=4pn-w;9BMy!dtt*9V<|I<^>`2O z!)0$iX@RK+2HV-?xx)dl!ufg{J0pUDfjG=QmctHs^X74UdT`Z{rog|Z+k{v=Uf$}` z(zuSYuQ6?YwC&ke2CAwJkcPsR9Ta!D6DNQ^&rc1U#U?V>?G-B*$L8zG!oOe$q!K7w zdt2L?2Qrg?5N8};Q1C=C9+9uT1G^R;Au}8s`vgElXv85sy;=bQG921F^PSQ&GR~hp zYreX?aD*{6{lzo39oGA{S2s2aA3l7ZjTV+0cx>!)JH5S;(T2$h3o^AKg78%Zu864| zZZD8XdHIc=dS~~A5mKUo0UYRc(PH&L`uTUkJM3!jC=jW>s-q9HcKjTiI-AID z1_V^&#s`F9>2^W404WgmG>jxB-?P-jMo}V237Vzr;P}m-$-Qz6{elk)x`Oy#C-v8S=tkIz%pqP zn4HB9Im*h)m`qWVmwo=6HmJ)b95r7A-$BA=8md_k;jwxkU3sMxb!-30I8{rWPmn76 zsuCZU-nG!30;eHZQ!BU?P$57;VtPa;U2ONJJslV7nNT4|Q^CxP zlA5}yx%r&3vZa~X)bun8x0AMWla^JRtOWeYomsVho(+TM_uCCeS67MiXZ)F__vW^4 z_&zfC@|N9}g7?p!1NtVfudYriC;&-XO^q=M+JjbFb^%d3Zi({ zIDK(2L(Yf+*Bc^SqM!iBk!3Z6W{+wIAS;U4C^!PVUYG z1@<~5TSC4Fu=d)SGh4oVU&If^_J=nK>g58W9zm#pP8<&d?2(qf)BP36z}oOe$NNv+ z-3HJcQNJ1-#?z0uQhXPzC&L2+sr=-ij9f!9(=8vLY>SScy}ifnX}|^kD_uEJKP6KN zBNKEiSg(Xc^avzxnDoMx|BG{dJ*I1t;^IMoxiJ(+=)K2)em!TPf^xhXCRv2^1dP8T zvXU7$UGj{V$H;xISX!pdzlNX5^4_$=BbVvicC)g|fTe>6c44sYuP_H5!H;CTJmuub0G90f z^YTnMoYp|AAE;f+fn_7KM6hQ~LY1(8zkDboi=|~O&_ij5IUKe@#%*glJTH* zGHjZ=$l&)MQQ(F;+tAg$f18E!?;_u%MYxQ!19-ZzB-`i}3lwJ9As_&aFFUVSme z2ScVc_bzT?@)r^fg^emtxmaivbQ`-~VT$%6HnrM5x#(ZfBq0h*1 z{4Ox5SFgc$Ra8U-bn6PqF!;@+rh@c&HcmB1*Roz9sW44Bp%G34I2w$E_7wescnU4R zrAwE5@8{>cfiZDI(qKK7hH^_ zr0d0;u`>}p=u7~0FJZCj6?=ZiCUTq-Q(8P2C=Y-vef)SDqU+eP-rg(l4vAO8o0|~C zUW*vkUcvuZTbhG|f7`oVM zJ36A}Ifx6amH0!@dP8Bzfz_}FP}cwvg=`@_EUZ6)X6#{8+_=FHhPas6{_yJZ zUkPkKWBRpzpEcNmo)CT_KSG~KI4EK$?dm$4X9)95s26UX1DpRC5mtlh3T*%Uygc+! z1Bb*2ITJB2#{-Y)ZoJy{^ibg_CB&tX+ZxaA+zIC6>C@QCO1)40U>?eqe?q=N?zKom zt(i7YZ1og~NA*$_e|E)ojSrkq{rOYqSrC_{^@eu&blzz<1J$4Ur}{MvBE8Zd6rbfQ z-go;-p{F^o=z}Ha;^?x?O%#-rizw~k0DfobchA^IoV+V6rbb2kOUb<|s z6|8}zI6skm){N`D`=E}xfdOGrf&s!d|7(_((on`O5XJX{fHyfg+8m*e9zRCzH{!W1 z!FR&9)(;xw+HNwC^=zz(rNNjQdP}U#j(S&0zgtf6mEm05o=@=}D1LeDrYuBicX#(} zj=WV|?B(bvI?11x{#%WEHD+^Q$<+*3ixoFm=^^E;!1;begvhgxZo?xyJY^*%pdmua z$ZJr?x&2F16F(oHnh=@`yjrp45Dw|xMS81-we|If4jv>dufcezuZM$}lomG93I#QW z&chK-u(v}Fft}qS(o~V@(QQN8(+(F4)yf`KZ!{8M{b9(^`6>R;l$iJjZ&CJGx%4?d z%kC(Yi%W~PV~PM3UD)$!e6zjg4m@*EVxWbY@LH-#^W>G*MrRDr3gV39QbUc4%W~I^;=l_uRYAZ;!0{+Z#B;QQ{svnjONhVIZUu_mygZQDk%WZb z1m)+Z-DlC1fU3P}t4Qn&;l&R@_w$p(8^JMxBWdaY3N|6Lp3ai+S#MYMI%gUV+O9HdDY7t3SWCx4TaDpSk*m z+C|FBdg?)&d_8)aLumLgX@}QNb94Osu7-2O?y*}ZowrYnf7v{IewA63dL>LoU@G*0 z7b`3Cx^`Om`B!&qC&MG(SowNl$%t&Cl9GMg+&?saqiTnuq||@uZC2J+8X6f0>fl`p zL7n8%OoZJ3l+{GIWa`2D35pb8jCcoC!A$<$J%_0;y)!-U?!Jun8fzJ&uYiCpQA*no zL~-vPuKn!H4A)~raQ6WoqCO9*xatAUmwXKXBNU+E+X+Pl$;Cl20k0Ol1u1|wIMkuF z|FE_dJ0N&gh{;5E4-fPQ%ikMX@AcS0>fQyS6Wq6khD`ApWBP38@+6)rdrkBlcXuy< z5g#^`r%(6ZzVbgLK&^Z1Iq50E_!9`P2Db~m%sbgb@SwzhuRs^{?Zzx*ICm;5LD&L^ zcL~(F1f{4S&_x@Lg;w{2APC-+CsMUgoXV?MEniW-apU#fyERxd0SftrEW7_pBGb`P zRY5#`GkJy>(u0hI<0HGW8iAP`0=Hlu4HcanQ9Mu3($UeuuZt`6G)zN&&63#BE=o{R0!-lAzaNTP=(kZ(#0rD6 z1M~x-gOFv%2wox6S2f9O!@~~C@zaWmcuLh8vSL0N@87o%=Q47D!Q%Ph)3Kw~7PLAL z(ws)yjZ96&K_PuUg%B_xb{;d$TJyWfy6!p2RuK#`fIL$#qW10IFSee*0Eh+hKwP{i@`|t;2E&qbUUW{?u^3%ZRAmc>WbW^S&&?T5~{EMah>sL;fUKURv|>7B~Go%pgn|rBJ++NClVULnv?iyQy46umj{XZ<2VU zI6#1B4w4Q+w{7&6CY*i0W%PmLG}@BK;_bx)pA+6twWMV60j=_v8yI9Zt#9!i=<&9V z8wL_GZ}bG|_9Pb1O1xd8H%ttlj{geQ)ZC5D+rZn2-S+p(;c^1+R2xKS5o#7HvrLNp36C{p{w+NYe`q}A@J`dQouCc+ zbTtDWZ>OuK6d?qMow=UgR;$#_#Fx%15WIU5hGguGjKQF@3w^y=K(JPUnSmhu@*jSV z&t?sLmEgX;d-tN-D7_qH&z8;%A}hs4{0ZmYzwASXeT0O;n;ixDaMsEi5tIwq^!UCU zpl3*ip*||$OFKL?bU72deOnDbB9SYMGg0({gT1J8TbVFvp+0+q#Jd$nwj0!SFt;_PY>&G&xBD z>AK+H_RGx7aJfC7<20bALEwW7{~7EJSt3nPtts z@@HT~cmXs>1Y4(^?)>^SjNvNhzXKpP-@mhyJQVO+8DB~XFIaRBz;O}{gPEK=5)<#k zyzZE8l0`R*wC)*Fk}kP*$;t_A5sQ3VQIOR=l@t>ZfxE$cv{lg-YU=WY$cGP4ojmzH z*UrDj4VhNuE*4qjj2uU0!mq(7^ zlUEMd`afc1{C%(I+YM3A_voGs@*OR#3zcuDfiuy}1*eZQ1x6Qm=)ao2)5`wB9>W5- zABRPCef@rcKfSk#Z(q|+e&WhSPl-kl&S-%85Y@vka{y-uVnp!W7^IDiKwk{kR}No5 zfVUKI+yHE%mBWvTl5j}Ar2%Xnz#glNXV9E7wA|4+Vu~Vgtl&6Cg@jPXvF+&854I3v<;nBJ%H@7)%5s@t>^|Rvc z^B#<&>35S?mM&~#J`EVb!CG*BapYoORmYFU!@tvqlc%RuJlt2uldVi?U+b@|wdIfJ zaHkiN_U!jj+J5>Q#oLpcHX0@8ym@}dtyyBE{Je!lszXzY{%GpSQ48~ttW^EY0FfOYlWT)~s>O6g--DS8fWB(&cXd5{B);W9#xL0B*XhzD8Mzl@I34}cip=mNXJZ6Q@1 zz~aF8UY$wzV)y-<<#Z3^dZ9yyR79TQ?DY5bWj^L?jp)F?K!Tdb9KbXv=uzPyX6HLl zUJ$c93o|pZtgv*G$y-8~MjF0d_X1yeLf@OOGAS-BEwNuQpAB5cP5a^2h3KWAE6_{!oq0F!0AWBm9Crn_1ia7OUoiSnhQl? zQu#DAv~<9hiIEZ41ryl5k&%?guQC3EQ_`tZDSb$9^sQ>!cuD}EU zGkS>H5g#7s8jAN!zk7FUYbzn?!1rjVY-I;Fz{2CgTT8@Qhyv8dNZE{ClCV@6W;q!Z!eBSI#yQjq9(Q+!zXcb z%MS^mfm>8kk_(^$gFF&MU0K>slS>=CGyRg`vGikZG}@0=!gYE!?!*~|5P>~H<;(3^ z`x{@aO!rr_T)M>RdtYucP?aaHQD!Lg^I&Y%gGjONf`u)CCu{3o->>ek$)5TH3*qs$ z25Uji7gv|(eK=21GmF%avfGceX!_odHK>pKDPh}st`7i;v^ozxERk_}jP9P}HI?WLYErA;isS(DMkWoQ8fxR1nEKnb#832&W;oEP! zfF>Qf5p<<*P5hO(p?}%!#f}#3ds*2A_Lr%zU`mJ*0o@)&+{wUQu&?eZ+Z|W|*nkLt zhlm}x1nNT!jj%*v1cB2F26u$~LZ1e82YSt*PsR|IV9L?a)wK$u1nwNB7c(qPnoKEP zM$?OjNhi#X6Po7&0qBI5pfjSA!?Hr7is-tpm{`=KIZKf3k>vfC3y|Q125|Xx58{y@ zL$l!2?UB&;rF6aT`UPPmJZCUnoTS+sZ&ds6B5?=cE(mL#M9h^s^I8&FbLXPv;*cLh zuw9*;6et4Zp92^}f!hVQ1U^19G*RN(upx!|g_phtR2jhDFi7^JMQjdk0+Z+sbg}Kl zUd5Q7q57%RwfDt+fjFhtS{%!6H^oM5xK$R%q+`7hYJ^!3@Nu97C*|dlKb3YU3eW+e z*szya!N8f=b8M-L7uhi>Az_Chn&5UaT>wreH^*#1RTP z40O$(V`aP$%88#%uuVWu04zY~DGFpJ(K84n16)01CLKI*psaXaLq<|MwitCa5tg@RFg4a=5;8n3D=TYf zm${fb+&6%q4*o0F7m^nNCc8bE1#<%E9fn8f91wdns?)6f2;d)7GPw6`-@akZCz50Q zcd^hl>)yaol%t*y4SIWf<9R@fiV&rNOJp~DP}ZUR#H<~*WyKI$f~Eto3)2gYjx|a@ zG7}V*iYQ7!{Qxe;*9|Z+6~^`AnAkc>6`9O3j4mk`rurbSX(8(;1i%?2m$7Xxt zHZ_rSx1D(voi5yg*x1+v1>Y1FNoHyDb2Kys&_UT^< z;l&Hwq)w#nGa8+7Cy-hLM+PR*ppZKsscGuxe`oSad`(I;-6QSJ7Sr7QBKPxU)%OAQ_kN}++`;^TN5U<;s%0>2lx&(qA` zAmNKC;z;l~CHspy{?;bD`7AvhQ&coE&pA0Q*da6qmSqAP))!we`D&E5{=u;?Vx?`Vq!pD2LtL zfaNA}gHvLMYlEj9D;=LwPY*u}WH?llR)&W1Y_!WOD{k^%5T#HA(Ku)vh~vWj#u#WJ z2YeCil`v|`J1 zi^;FN2IGDdYxo&mUHTsMW#|tOYUY_k%rWpFZ z^Bs@kW7eV2&mlT2L_ieaYiul%1Mku@ir&EPoObVP@^0>f2O-3(FD<>P#69P{`g?dd z+0ErMW{=nok*3N@%a2i$RT znCSeg@K;2-;dmDzE`|{ci55TEO<4sOd-+m-N5s!U=!g0Nh|munU_9WryhmG(ZP`fZ zBCCuCXhqAc`1*a@fdQU9O9d3fG3;?v6uU2CdfeP3*Y({vBi4pf()(>)FspEK62r(+ z$nXx59k*^>!7x7zlR(?t_rKM7BY)UAWZk&YKk5A86}P^J#~^f7lT%9@6q+P#f7<|(cI*r3pA0ewI9 z0tYb6Opq5_)IE>NJZE!FYb&T}6i%INzE}#A?(dqK)KP4K2!;y?%#S5xZu-}STwPD> zIXyk_&$|XY{ej&nXvJZtii?XaNtUhTkI%d2cLD+e^W+&>S)(>LF;4hlo&{P8Vi~{DDgQ{&SBB z5o(b_Q)A;=^@lPiWkpIe=77?L=z(BYJMb;9u zz*U0c;R@~d^t3(dzqk^vpu2ZJ6dzw%UT#Wwisk^`TLWrza&fd`=QNU7crC@*MIaJT zxCUM}F#BCQcLGkX93o%OWEqApq-nN`=LRN8R>ezQoK2P`mh| zk4Pm-H@AY*T83V1Wd^Mjph4_m%lo50=@+^>fZ+$&ADm6Mx~sB$k-ozKW9ZBR_SsWacv4_IakpQNNr=@ zd-^7058r=pZA}}e8?4)-ufJMfUcNsdK!sanb+zQC z%cb`PKHXu8Yfi~rVbZB3Q_pj+6?V0sj+aKVLm@yJG;o+R!w3j4|Dsdhg(P)2TWt@R z5P4S6gu*|9N)4H1+x#25y1H;HfxGArGZbxyJSbh{;8*oR*e@Fy8uHNJMKg+F0QbIq za81Uc<6dg|+MiCYCIyjoa0;7yWaq!A$z;CNvZ2Sphw!O!)|KNU@>4zpyJ1!Iqf08%PK0BNqX^EkWEPaA`b*~6D{tDN7n8Yx9$Pk7}*j& zJ{w~E>wB%SvAYJ*H5c~C_?N*u6wS0}b<|$$dd?HK)ZoK_TLxp_)BA}31`h107Zv)R z*zYmpg!fks{*7LHQT)@Tr|&mqqof;70Pchg4nY9lL?<#afjj=A)nI5!mI5hZcp=3H zE7}bEObxj#eyXY}ZH#RY?c$)!8em{Nv&b-uIJkA7QF-RW8*TpOARV#bB%55_fzfnD zfk+}lo}h3ZJXqo5gL38JAp@Xl%dl?7Z2CvS7zI0bcoMRBu=};ORU2ncDqW|hp_!bR zU=XupmP@P>BE{{IW$U4vuMtk?yerFQ4Jx^V2}rZ6%9jS++Dh}wY~V;BoZYV%i?*{T1jsZGhsI4nmoFbFx1$;ilsnVBSG z=c+ixgx<<>A=B;rzZH6 zxus?02-#4B`MH!(Fl<$MfP6*)Wk7yIX66B0?H$_pAG&Jqgu!QcH7-!HU1UQ_N-(MO zUj06Kk__!mOp2@6fyqzI{lS5O;S*fBVJU~S_nyj*=O+XICf5UJKqGSqDbA&vrCRR{ zvkMFV$saF*A2qlGTdAnvtd*=H3M2)D{Fq}dZ*dZ!0v^#%Dr)TnG+~2-0yhOT9iy`^ zSYfn`o*w}-j%%wc*pKj>pny{4@s;bv%y{wXZ>o%U@0wa$L3}`75>Ce&mOV5yA;34$ zQlKoMr__j+YCq<+iukZgxgEDMG7g7VH)Sj>qFn~RU!QmDpP89Lv;`(63AmTwR!sIM z0D1uiiP9HXXxRn@IysC6@BqI~N;*!F1@;yE{&kd5NeM(U?cNRM4=R8V_DOKZv)~zl ztr|Ew2=YCl9W@DFNP9#`wjqXl?@`Yf0UJgrBd#xY@5RH|d%6o;)&bxn2;zfQ%?d=E!#P!ga%XE&b<%BW=5w3BnJqn>Umre*o zqCe-o)I`CKhW%K67eH`O0=5Uh{(?${?5j2dhW>b4f9KKH;#D*lFW5ObrDLKGx9e&{ zG|_OWC`(s)d<3xuN>3#SF#sn1z;6#6I1ADGd79){ltd+G9l*!o!&DHn#pJ=w?64-s z>&gB5&z=b0>g8p!&0Pj$g!VRPznsE@J9q9FcrI|kmVli-4lX8mE_3GqXMhrlV0Upq zoM46WN7iC5wdrF$bdqkz4m-l!XgZ9|cOr-3Nh>nACgl<~l94(!EH8DhNn-+m84aPa zK^8po0L(OS>Y&F2>xcN^wzV|i(5@9N4Ds3$r8&kxPKL82sL!pD&8x~YMxr4j`b0bEQv7e3tO zt@R@-h|JX7JTNdofRFD%?Eq@27b{gt+a51U2$8{|=^jMy9W|!tC_w*TsFGPdY~54x z=8fR;Mx--Um6y9?%nwu=sxg#MFxxyuF{53`8uF)VX#w*Fpp;A4pNUWpu;6h#Xt3HK zjL99@TWFy<7498_N3Z83_G|UDKSZ$e^wKGxc3Z7Qh)wV*39e7*X;cWV#~jclOR+?m z`KVC%mrc&i6~puy(F&l^feQ1{I1~HzauvU~5=STi6jW0)AzsU6m6gWx6TS1TOo0_T zsA{nG5b*3%%5c>7l4u(1E&wN{{7+sHA{ET6{c|f0%@6oEo4XAu|=7=z{}=Ondeq3vvpu zA;wS;HDSbFBXS7q0apZ>B!@9c0DgeqrGIFZiA!cC81Xvkxop0gY0OgBD(m;|{Z6&Zd9-t(J2nUKN~GdI zw`X*Y=gQF?J616N`8|4$R<0vk0XbVW^zp^SDC`VScQ;EeLoOCEn6@ zuc}%N>eY;Ue~OkgJs22WQStB?p6fm|G3O)?5%=sqo}uCmwT+FnPQP=M;=}wt#5(lf z!zREYam1_f6;*I>0gVjx{OXdEhRWkgK%VGXFoHyf&*=-A0BFO|$}D;I;rPH~MzN6$ zwX0K?i-MGg?k~L@YtnHFlo8{7!{#8`VI~9w9%TqTa+@>Eea0SZR@qdPmt$w&$&Pqh z!~=_9?$^xmE6pDliUreRMn)uqpsEuu_)tOBTnTXF?OP&qL|b^LcdKv1=MmQ|UgSfv z9$of%%Uavj#qM0G^nIjl$a>Vw-Bo8ea_w8I`NyBHUU{u8hbLsWHud~ksii95LNx|; zY2Zov?R1B{HLdkPW(TL1{^Gkw zoo}rHHab@K{e+Wq{NrIWeUk(~zmxi1ecl0#x5<-g>ub#|EcQr$*s)gKYc0Jno$2{t z58N|vgSdR|+}7}F_r^^wqhNdhcF?DxDbPWe0s0mU&S)bPF#-liTPggGl%%Kr8m8Nr zv!JtkrOJZ`2_gxPJ;pR7^O-IcdL+&kEHkZ}^z;@MT%?OUhpnz47}s%jR`k8&LWtec zw@uI7>~z4_xCZ8YM%xYP*!0d@BOyelg#SRr;2+rJ9I-6lq`%##R2x$iCjJsgq9S%A zkdj!nw4~m=lucgrOU=}~mF%}cClnHe?H@=;7DsnFkphU~zEGSJ7($zzlvd=q07s(J#P=Ra^g5_D&q3rpHy&dm4 ze5KcHY5e3?uD0HLmQ;GJYR!o>h& zg}9C;<>t11D>rQUoeQ_-2_U(@D`)!ag8VW2E+I*|E^MrG5wiwRhj!;X;@5#z&n-1` z9DdTNPrr9AP-*kerX2Mk@h;{TAS9g_Yp+#)x(1$4gktZ_b>(!4L3@fWm28~qu^g}Z zrMYv`fd0#-->n#o2j9zUI!GJD_`*Rl9B=e}OH14dJ#y`f;NJHSNVPEhhP=O`K1RUJ z%P%x^@?mPM&Nhb2=H}T(BMFz@dnzW(b@t@tB@ah>t${Dy?P2w$spoopMTJ7ha#O01 zHA@LdwRd!IGSWoiMvi)J zJYClUxWZL43A1-z<`71hANb58Gd`I=esF4PHX|!DTGHyK^o6zFGJB(Px)}Y^##eUY z%x-R*G2MI{7Pk8IFm&8oo+>-p+F~OD&JPS2aR})}W1+eNRUMKj=Lvbdf`T^1x-V!? z`dG8l#{0DcyFWku88^qAgoKVa(g#Cu!__s_m7dTic6v5`D~CzOETX#mpRHMT z*Idnbuy-@u4k_4KLaIcB`1tq@Gqio4Je|C>k?hK|;B(*q4Azvl@ku%|GBEID%fLtj zpdCWNnw!B1!C8AGEqF=``CN#!2|fi@uKR^cEMP-{52ZD-)1DNq$RCprl%CxbvI3Fa zIiYX44OdLPQaRT&dM}djwuWCw+ke17{rhhGZR}P_KU!BE?QaKZ8}>+5EvF#Va%k>$ zVHmsr1s%25hr#ZarQp3!#$MhxIq$xzW#FFX>iynvww>cg45)1-JoJ=D9)T)^|BP*{ zbtFaSl6fT|X4g($131j5Xr^bqd-wYqCAJqti^IUXM$7V*t`>eZxRYF8X=GOWKlZY2 zPv@$8ES%kXWO7Uw+j;UKM@Rcq4jj;Y+xDCHf)DGf z1Pv{X-d0}qyW0C&9&!6r? z2TNpx`Y3`->UIbMhVq$r1~AQPYPKMkC`3p&kP>>jDSAEzZM&RpfR!dy^HF@Z zhO<&y;9@^%KG=^b#!H%ENA;(IG384 zn~2%X-XL`JI{BW3xw#coTw!zKk*6b@HX*BtioSt&F(2Iusi1F{7 z(i68UD|L(9e{ty78ASN`4YWHj(aQA>)>l+jK@aQqy8Bzzmb~$zY#z4DSIvffx;+=> zB8GS*o*rNIxOn{EH_~(HE~WmkCNl;WKjNIwuKm{;wweX%LJnPqA6DBQddr5id zYigR!@5V}HvY37{oGtn){qNtCbUlk~rw4?$l|`suW9R>7P^QeZ7KMQfMgDPvMY@7BZp)!`#jec8{S`GxPJ#PEJnbKD|%^K6w&k zKxCv5H8LF?(Ri%qUqd0a%eMiYup>HXj8({PzA>q1AxxJD!94@@Z9qwAT7Bi>T(3jh zhbbnIOq9XBPV+p_+G6FSdIGNnpuB!<_1_iPqe4wA9vzHg&;?>Tjp&m-OiY}<2&Ded zH_0O9Y7Z0)ShkAvg8a2|%)VcvrvT|4bsetpdCw((b1c{6`_eZpxIl?vVx8 ze6%AQUUX>4kU0gS39THsamD!EPQdFB^#TzLT2`Dmtu|l(-h=tZTX;yk$stHa0L6L+ zTXT7NKiC))aqtX&`RWy{#@aCm0iUG9s<_a)_g3W)7#FcXxG~2CBn`gCL?EGe9gOvo zHgDmF=_VGUQp_=UE!55*#Q#D{!oGv0i;b4pw*f>Z+#AeOuv+m_2xjEk6$oZV^NT)* zjkI!LP^~vYy+erP5MBO`F*X=w)`CI{UL#=)3=CkeB_>2Yd?<=}`7u^fc47((lG?+E zEu7l0Ex?z9Scldc%w=SMZrS(&A0BrElaU9xf1C?Y%|%KP3B!0T#}k{C?1pXreM3Vz zE`N+6?!d(D$L;~!1)x*y8WetVC?m|xoJC0eri+i0#-9vHNSg%*LMkb>Egn| zz3gCd0G3t*LIJP^>m+t9v+XzRY_4LQ0RajyVwZ`Yo9{{gIYO3$3D%SBZfpP`O~X^g z&;%xS;NarIL2h>hp3`0{BhZMXjGuuo<03c=AVC0B!Q>ijUiUZwl5PHfP`g9Lgog;q zZ7bk%Sgci6n>KD#<#~YUc6#=ANN7d)(qEDcia_r0T%%fSK(N`MVHPJqCO`#Xo1~=u za{!iHxjhxR})@bJl#--Clyz1Cg! zU;cih^B>~aoR~Y#MvJQeke{5ILGW^kH*(ytDlmgfwB-8xl_i%(M3gtu+B-;jJ_&67 z@qwCpD-6HGu#$heDEg#-Ns_%IGwIy+8B^H0~wH+CbsnWf-=*7iJySgxX zGqUbqVV5Rk`JM<{6(NW8o?vTQEAiXxxqEXqniQ*JJ9A{ z*w(L`o^>I;YGE;WdWI?K;9as6t9aS8P&&E9o->}`lEPuF=$jI-MGF)gnMK1CjH9gA zy851A!!v$=^CmKnaSLC&YLHOBEM-;|5RXw&t^zH8~zcVOw(w0W+$eNJV1Nr*J1 z$FO?D=<~Ree>M7UT~n^j<+mMm;U{*Bwn8BMO3oamJBv4DD3CH zAhX=r*7HmFc3uu&nWVUc$8>eeIL+Q^R>{vDRsKpGoW3lt;s<0t@0BtRiepbmeAA;N zSCA2q5tzbs@9Wo2`_;~<>I=7&KGl7@u_58OkE{H6GaBn-g$1o?-QQYT7#)ZEvwTzj z?B@SX2bs$;>Dij!xqqIm(3EtL$C&)>)QaC}b#7{Su>#+4VPO{6rFlS>*8@LX7HWNc z$q6ld+nYudDn*qiASra}oIcuKOcQAEiB{ z5Bz(LN}}iZ@(D+8{jO^-rjpUM)04STG8CpI86?DYx&8teH^fD*4qA~?=fREh~vY_e2@O~ zT=t|7_%RLV?O|k8-uAdXWVSfWFMhyu?XX2^DrWA(<1t$$F zmDHlvg!k`_9Zr7)s`02c(sg>=H@a5=dXLH304WMBbCF;PR_;JXc3b%KR=_1cfU}P z%^k6@{^y9nCU||ui^IF)%@tUYQm}hOEc{89=eVM1JH=*VlJ{A_`__IH+qao-Gg-Fo z8J6Q7iHMAluBl@X^CZ)+vjV6E(FoHeN#FZ8W=>UBM(v@&GiNBYP?(<$!kT@$Py?sL zda@oAUGSbd!Z>=8rme0H8dnh^MoCNenwkD9EM+KZ437L~qwNVE^4eX32a--stFLe4 zErDQCEX_YX?83&MzCQg7aE4LH-qckGUUZX`ejm!4>`On)9lIS;GXD9A@Zi^qJ7{Df zG?3iNI6d~^v+NKn(}PEbwM?&jRy|Fvtw%Gl0Bn{nY~^-#)V;zlP2>kE)} zARj9{m6#VwIurjDV-P}QirH2(1M%d6ObdX?$kv4m3I&|d=$rJ< zn8DG?b9#twac%I=`0*J|h`ED8LdKocAcMe2=n&%poXQ~lcSjYuldc|vCBWQhM=NBs zU4gl$PF-IzmK&la?&?#Kub%ebwihCy zxtW;?FU&_#gvX{_vDsNpmI{SkB4z#)-KLU87ryOXl!S7!ESXcry6>SG{2BT&8 ztF*v7@giD75Tv{9kC((U5`}1qc|yA&%i*i#2b3<(4AQ;7Qbvx4F-e`Ea-r;k_m$o? zc>yFk+KN1U!#eK{9S(c=T2MFdaKezokd3s%QjZS}cxt!_FwlT}f@S;m=c98r7`LPx z=woUuW_{tY*5tZ!$AP}*kj-uMYh%4*R>M552fx)`Sg{6$3`9+kD^WwLn=?V9x_7Uh zreZr&SD`%yst>&*QZnwAL50y*V~u$ph%)WZ*?b{xhlU=&D=0jnq32~~OWs^5 zv*y6e81?1o&=4YO;CYiHWQ9Sc{m}i4j7iKi>Ey(BANze)AacAjcL)3QSpGOS7Z>z9 z+7~Zce0xL6zAr)%&LkLGqD{!r9Rq!HGKxO10?Z_IMGsH!!(15@Fk45*%3RE=6JEZA z-t(^y4#D_G!rhE6`XGWeolinZNr?~SX0djF{%(=`y+aoQajPCd5wad-j%EQ&r!Y9z z6x)r9g`P$^y*lr1@YUeC@&>EU*vUagY-bDq4{6a>n1^GOk5o$>bx@H%NcX>e8!85m zkN4RLHsD4?J)m^Qp?8vE=YOkj!fOZ2sCWIhR^rI(v#{F-sU-Bl1MCL8^on42BOg+m zpXG>Y14P0YUE<+_-COqcM(%-L!od!P23U&(N!jg{X%Ipstgc?2`rRfh9SdU>b#O~i z)FQtICWuJ11(fg^JuO5&5c7awgj)#pjucA>0&tMdhrSmSyj@UV+FumVE0842ZlRnfynrnTv$ff!`-`-+~G$dTmfSY9Xh6c8#iwTR~zK2 zVwg@qE(G=jz`bNWLB@IuL&JUkWl+FkLU@wmpw7FG2wl!v#wiBI4mw!;0JUFU30+As zDl=1wUSPFeFYzYDG+PF({go?mfq`ei{s0o;;({4jl(@}vL}}n;g{Pi8M;laa2?-{u zs)R=!o(V{ZqoUdX?d0mFy&q9^Sva4h4$TV4EuBJbXfiRs2chZ?tpsMR*f!C~gwU#~ zTLSFgWmrwbW-BZ zY!!a31a+hmfwKh$VaW<{ll#C31n31h(uJg^EjzejGLt;m_2o<4lKx2OE3;BC4cQLP)Pes7 zQzEd?(T~ES$a(?CV|Qm~U9UC9iRkMic!B-m^GO~(ip>x_ZZH&Z8lX`}!w9(vMx`La zL7%g2kI+VTLqo%toRo4y#MV7JioJe4(4DaJ%b{Y!Pvhpky>6rkmsFTG0O2xP(#<{_ zDR2~jCoT>Z{tqoMNT()xPf+?@MN-h0FQL)VflP$Z2_#e8EhqrN&_;)<4aQ(_Ff#0k z@MqH_?ReNhq68ZrA}H70C4g*@*qCNZMM()eOU$`&({QTIyBFc8gqRT2qmYiOj*d$U zN0YVW#cd#e!3+@)4@?oTKB2~#7C$vpe}3WN6nVMB$;+27qhh;s>5{ChH!v^spg8W( zAd+p^;3gH`KFs?4I+C~0=c6+G{8<@{IepKW{Cv!^f$E&1z%f=2RSS4*5`2yp`!8Or z0J{tOALvys$5>*nXCYPyZM{Xecl$QoYZBP7P=|o=gEfqvl~@-SD7%!`QQH;FCLm*i z%U%QOH()bxuEMrIkPrG^MMVWn#voK>H2DbbM`2o;CB7Xedv>=cli+1SHZ;_hbHL7op|_PqFO72ZXc0xde}h2n)B|$Li`cNB5&)9|VZb7Xfw>Kr&FI zuoYti{?^d}r>qBC>hRnAClVZ&@ zUD!b}1AGVzduv#|-H0By9As~3b@69tGccuRF;Tnb@=of`HKG4S-FyFY{r~@?XbEK$ zWoEU^kWp4WDO&R^YKs0$07O2Z?- zdjh55M6vz8(_i%u@K2oocuY7=NCGT5S917!(i$MpgNCcQqXS$bO!PoEw6(RpM+X4> z1Z7@+{?EZdWX`}p(jR3lBV(+L`)_ED3aBxWII>3sgxhcDug-I)4BD8QyeI zmI(=2@GnMffqM8fH#m>?!I2Rin0@B40=V(eu8Wy>rX??eUk!E<$)g3xJn4slf=8YG zPE({k^F8G9EUkjy3m#PL{6Ow=!4^ru4! zfimo4NI5(vA>Dw)8VpRfZ|OYhBt=S5cWY~Y6@v~cF{r5!5e>W*waRFYMP7s=Qny1I z-s5e->iTQ62u?CM-m(O+W>L}iAE>%R&x6ejO`FfTwd3RSzsF2!gw?l(IP1#e-=SCl z6;1gca(I$pN#n0jldp*+P0kv^OlW8b&i=U75T7`mV|Pt)jkeMr?*(rYQwZv;F#MYhN(C1z_i2t z`(-dQ!qW9|d+mjycMLZW-Xq8|Hvsd(UP)J|&2`7veZqn8KpJM~r7=A5{qsE#WJ;N4 z{Gqs{B+Q{!$M^XDDCp_kQ}C9Oi`YgE(_FkSc<_Imxro!VUQZ1%EI`))8jKHwVXFrT zmY8(eN)%;e*aAw15QTd3WMdTlx+!YSmsjay=rE;|P?Y*!6G*KMEga6e;l}ftAE3n_N%(NnzFt}{SIOVpm zRm-Eio*w0Q_A1v7GFzqXMYAvy{j$jtH#mwglrvS5&+<35Mctp=Md`a*nd~2Aoi#5m;>9myfzJ&m6Ksb1dYF@?PQ^812VJ?cTuv+B zFMpQz;R()PGll(QS#7nM`wo{`GJDi%tSwvF*qG#Wq(v%cMyG9S#ro7d5RL}`7kQ+a z4&>)f-g_i@1&;`2aeM>BG8j0I?t3swU($GngPnb1a`JwWj7N!2v${`$m>*mr&HDVU zC*Muwl_vKsvMOGceX(BsL#N{pZ~FQ+E_7$OTEuW(V?Q1U#}Gs)LfP?~9xMCB$3l8f zAQ-}==*krjoaCUa$((#9oO_;qYT)?cKhJ+S6`~)g*)yYUhd~DJ3v*Lb8T1Uev5SkJ zHVkjuycuTr-+z*-Z4^&2F{LU#yJ7vW7Hn>~8@h-&C{^feBq%3jY<8w3`$kjY03{xqxvd#Jw@l zXYStpQY6Zbm*Frdq{okUmY3f`exMW^CJ%dhDxUdfPdkF;fr$(!5kNoKi7|DT*Uk$v3cwK%?_ zL_yKg+xt2@McBhmN8s`Dth**l?Ta1p4NzEA`%M)X%{T#LGbaH$4_^0%PE@|aW_E?E%G?UC}%w3yEF z8k*H?8P5H4Y)N{mcwlt2W_Z>!cX`@@PllpQ_#)=O_!N9-3-p%x`dV3~>Iy+QfMXoB z23i`lXay}H`+5f0Wv8{1teq#ByK)gU8?!dEVsA zOJ(SvK&#Xidg4RYE4ashC4B9##$W4CS-Xf4-IcBHRYeB5$D zMFk2<3V%)^p?b(!;WToaYCYB)6LC`XEsFYzyNorm)Gqsy!ox}C(EwB#c_$;Nk?zhwftFd#smSJOF0XH%Nap3)~W1VQpsz-~3Cd%`j`my$!2qp-3{L>vWu4M$)-9H!({Sd4&aQ10J}jSif_6c+vwd95MpBti(FY*?jKDf*r=G2-U|tV@#i=8|3z`}N1u|C@&qO9EY_g#`Y=ph_R%;y zO67ol(#67uH|=oMWBTj1<0cj=ti2ZtI;;=^Fg}i%GA5}Xus~shzY4>q54DjH^RL4G z=(ea76BtjEWd)bGrdISPFl&t5^A9{@WKN?EDZX zJ2)kDm{S7ddm5EAQ>%2NB3*=?M4iIQ4XZYVpv7!bXL@lfY5v)t7bWNI0jo<(%M^Gw zK(gN)?+0TY{W705cw(W?{rc4j{W3_)C}vQOflgUd!zU%BZIUHtCnt&S59k$AG_Xrh z-XZTa8UY_gb#jG**CgntlsF*m;tO3wZJ2k0niwwj=v z#hPsOj>7vZ!_k2BE&0Bzw{Kxf|AC(!>>V6pRhWYJmBpXtM!N?Kjm1Li=7lF$lgvZiKq~68OWIUJniJ*}Z!=Jw4W- z2;zf>uJnNbC~MXd`lY)1u*~X4dr?Edq1S6h{T9?$JGMMNprrGTQv28Cj6=qf7w=WJ zGn{)axvW~86qO#NA0o1tt+?y_Q4s}tdPeR$hgf#g9i~>EDw+72pEKkx0+%A)mT?mrpFm5jK>=g8vlAlR0Tk3RF4^a$K3u1?5ujxO$HQYdP0)KBJLV2}slloKrWWh#l5%ilp$9~VkeweX#r7It2eOLdHVjhYZXent z{5hC^@b;$+wL|c0kvIBCv{2pYr&U>do!QpP>SBlr%Hsx)i9Mf-@qb`%FZ6VW_#((~OxOJRR{LgRk zi;U#|`~}FlOn)sA|MTwzPvE=y&&Tu?Ka&6BzmNXBzYdlE{^z~T|1)r_jY8vpm>Oi6 zTS!Ka|M}3T{{PPx`o5$=PPuvY>9_zETzK_wr(-fgi-o8EXX@=Y9Pmfi_}E6R@X(Oi zZmKPz2Pp$69v3b>-dKrJ@{$YNME3q1fiJ?`!UB*xK=*7|Oh7aZ1OZMRhur`1IG$-W zd_P=LoRM2xOv8myM>f8Q3OhM!;#sF-+h-(m_w<~*Q13OT#JgMW+^TZo@5YT%S=YhFoYNF!ztZ7`7_wIc zCuGV`&<`cJxqmRfKnssnopirfy5$ZH4)!|~z@=&847z5xhwoqT1w?FU$QhxGfeXnJ zNuB`)qAre(7w6trR0L4>Jp22;zCSk}eTBSRS*0NIX~uQr=v>zr+#+lrKg8eLwC^ly z=v&`DUvYC|az`n)kPDKcEQ33@j2?s464T?yy>dL2_t+H=gnRA)lf{zQ4vWY_ycUOc$24Kq2UJr#}PhZS=rg{_eEF%BS4;V4Tl7-L=ryxaQ`_F*C0S& z*&PHZSc!L8%Prsb-}0NLkp1?}r9Gnq;ecHWaZ zSJ5MB56*_`^>k~5JDZq{$KPms<@=aTPEkEM@LiE7WdKqbzIMH307;-v@2$V`ixJxW zbkpH>``>xez#etF;SDS^V8D!FK%)o$pe)HyXtl4C88F*Yon#*xI?Mw)P=CyR{@I6_ zpzJwhK|u(Yy>SB;QNA1Nz>`ZalRMwI0dt`>{<*`1e|u-^*Bl>u!<5*b#st?=pY^HN zSIeAQp6sW$FL~=z{^@Ku05BK^%x`dOS;(5+NslQSMP;$TEVj@c4F^A|<2z^PXyRpu zdt6vyRX<>yInSc}$5xMvY_9-Z;()kpK%|?y2WcFnDXX}Zk&)wQ^Wkw{;4hy(eS-Tt zLlEwrB#yKfF9y(>;x-`x<_KsTeQ`W$AlI9{EP!_()Wn3#G)D~vtRW#Ud=^sf5%<4)5qsJtSxtL!Vd zE{*8wE0?&Lf~l#0V+;}Rd*bH{8atb@gI#i>FM0fYszNz{8c$_hxph7%IZ;mOEKvQ+ zd=c$zk~bDxZ2C@74w+i)N3u(2r*S2`M2}y~&5Y;UdgBHy>(#E8pJG7i#Xym_oI1oZ4y06!F!@m94LTAg$VP8&S zskH0nza;#^**%;@Ya463RSqpZO(4$RYpbU$ZW{@o^Q_||+oZtDu(nvX;XM!{2{xoG z?)UOdm>m8DPK|4bWzzt9p;(0%AP+-i3{dw5AhhmowySXKLs(_RlP7!(L0}$3A>Bo? zKmsonGs1Q%0Qs<_00{t7G8v930Jkty?FPdcWZM=Sau_}3!4Lv~08nTn(2X(5XpAmL z&w|PjE&v!3XV^>syBGX?3oOzoC}}vty@vBIrS7Ku6SRG%{Y#AXi%s_z#?~BJcp_^x zWo;d$p4Mkt%c`grFuM)7Y`z*Y-ErO4_8L7Qm3Gpgj77}7M&m}PQ3NC7 z#jrg<*q`d@X8VDX3KZ8<%=mEFiDI|!s}09baG!)zU^sZW z_^+c>H|+lL$N~gWs9_X(l<@fzG-nww?a`s+!py_S$e->V;?+DnmT_#-6X33j5A77p z!+k5TRRRVrAat5;?td#>pSeL}%liS6Z6}tB z7%+|;^#kEtL?AP@-A}tZ@6!Fa;ljMPW$0X3r0^Nz4PXk_*4$zij(0>ymzNZ;t*+4% z!jo0%1_tl!XV{}98KxHHFt8ZJ6`s@(6-4J`n&U1r*)u4ecF>(EIL~SR%J}(}cE zz2e5of$T4Jo;y+kQ=<s?K8f zobP?_5LML_2ap)5>W#jQ6<(w` zJP?^$cK6fwnVz0YM71+#APb$DrBxHeV?_44W;o5(Q{n>A040`Zn@ZaJJW_mxcW|BN zW!TSf*68Gi*silXcFcRp?MtU?;$)!0&R$*Jq`~^p)d_Yn*JR?>GboN6f`wro*uWU$ zrqNQhhngQIF#&>3Z!G$5SU`MdOcvWHLm*X}kc3dl#Ao-f?BKalSeX1~*t8s8}b~XjQAv-NS z4Hg*--;h$JNLis*=E@^<*&FdujU17>NCKyMjDyI{!vj^Zfp}oGsWHz27ZJ5S%@R#7 z`d+w62t7i8tHyk;tgMXdgE%A+gQ!nU zO)Yab5hyV+!y}^SQJCYo@}IIoVI!T)&9`*xr{MMt&y=<$*b z_tkH&KE+(97oxWp{1yf3J4#4I+H2ezWlrfMudP+i5#6_C>lV175Y^1i1mxrdkDj^> zoFVT(&}jwAvx%yT$6q#$+_!agbZkPMV)#IQT6G2yQ)~E{(yCFw;X1(>{ar!9D$GYo zRR8sUh~P0_19UPfhKP!HCRID?%gZ-w#)>0RLplq8PGBX4^2(=sbA&7OT+qa>hr(V;nuXgp|0IR zO{T7;b@i$`M4Flx6P7v+xFZ&>Y-wz7SJTi=dBPiZ_QHiHu`Z5MnA2P{I!WFt7_FT6 z1Zp_$FoooXr;I*=KS57gn43c=SK|Ktcw8Liw?|ZSRmrbjy#hp-NMWR7RSh|D0(>eh zWZ9#;YigDq_3iY90za7kbdh7$`7$^czTHK^RRh~MKj(>&y|Mmr>ORN%(w9*G zlO`!gt*@OAAqd4wS-l}0DG$I4Yd#3bw9s192XiPqwX|xu+oiAD+uOI@N9w8WO0+vT z1np6)a1+HO!zblQ88ipu@wl!?b)K}ud?uN(tPLFjwe_W`CFJa>v<#w*ZnoKX^uP*i z(wOB$|8rjn$5^ytrf0SjdZa;mwjO?wORTweu@4ct0>TL+e=EA~I2{Ca~ei~Xg z>5o`Qif>rG<9(~YV_;h*?f7-a zOR2=u?_teE>+1U7mqaME(hwCx&^-|u&I?A34;G@<-%?Do$*uOqd$l&UHwsR)vWtfq zn#mGB7|uy=caaf#`!3CT{bTZ`hw!Tfw15d*(CIXJ&i}q3S!0d{IVUmY=#!kB+S!`B zKIQ^Uw>}im?~xW0=)PBhq98Fj@$v3GnaBV)6#bviT75BJ#`FHYjg{Sn;%GIUix}vs zsGNs@llb6lYwM}4(gywewvvJ`{(k672zx5}`CC|-&A0x3yGZ$;sZ={xA~kt0%Gh1AM$m}2i>bLwRYY1NJ6AaQL9X9m@DOBz14zwjbo zM4#8}c~{r`^%gKB(W^)v(P7z3;nVg(R{H*UmsP)4qdgL&L21ER+#uPB+(W=%ain+x zOqAz&u4rDAoNnH$3${}G1u4fLpU@j^J3gH47WZjNR}XTPA}1VF}=x0{w}pLf#D zv(GOBx3PwLv#cJBGnlAsJ0Rcii&5$hYz@F~#GzgRSK#|}n8K=|ok2bpXd`BCaP`!oN7S9W8E+y+BU(OcgxL157Z$(Z5GBOeRH@qZWg&IpGk( z&r>z(;Zg`h&Q@aO*n!T@Zs*Cs7nBK!>8)40cAlYRU!K}Snc(ZaY_`E|JM7rtb%Ty; zP_Emv_2&Kt;p7rEz6hO>#hiUfcPpNA<-4kX{F(JdaGQXO3v%n$a;?5Sjg55?(&UQ( z_&kE|cbk;ft=hi6eW6pcSIO5rFR||o6q{}?fcDbZ7#9R+Ul?MkC#j%uaTjv`)dHde z_%;MfB*cI&^vg_;Ms`R!LG5K?BAnN^&oBBJlYE=OM#H7?-J!suj-No80FxjvrW|qP zVjP?x-ZV-=>o4Y#(AzV2SKR{Wt{3P1S=i7x; zjWpGTsX&*S*qAlS#83(YpLn%PCqh5j|F0H!*XgFV9dc=80)AQv@@sMNE{buz`M4(@dLM(#%Zk zY2%-3D*)qXs|N)RCKoR++d-F`fIFQ)wV(e`%ClUJ=W(Cx%VuuV`VtaMJ34=sF7|$l zMMZ);Iiy9U#F8YA!@46yl@RF`o=LrL*hm?Ev7nn$kNQp(oaT2iAl&^`z3w|@j1V?3 zcyNJ}R5*AE^eLE*z_Ka0c4_wO6m{qI;xBTF!gD`XFRjtI(d#cP1O0S!mjbI(QW8l} z++k=(SlHNfuUt8f5liAFxIBewl8^V5`GU%d(HRIBI3fP#YTE;)$HIk^G8#z?1~;yr zkNvz``MjCCrhDp(oOJ60pJ@GQp6sKRgwGE!|JSc3R3#Wo2%9h0if z6kJkLZtz^EOhA1K-2~1bI5;3i2aa9PsqWgP4&#;NZ$OJMX!pPj5u_Nn%t7~q1m^vq zCd$k2BbmFxW|DNGVBr~^MX{S}kNOtVC$OY2LIZjPiUwr@5HEnDZ~`~a8Lo># z8l+FfqUIvk>@Z01fYnc97jwrlb~_7HeM2wcv@)O z5!Z9fX%Gh)NwU4Na4l5>N`myeIzo{)Q$*ws!|ob$UpVU#8?V}z1jx1;qjiB8fQ5=S7n!Zm=$ljRL71$l23d*$t#592#-h-6gs~I+Nb9Ssv8yY7G`EL? zq7}g(dq&U2nv)1lJ7zF1FQpb0t$^7FGEeTJSnLJpMT$>wB3EoLte3%$!G!f+%EjBa zp?B^Wf*k9Pa((OM11SD+@I!hRuJjUM2Po2(RnVu2QONc-!TIWHXvj=S zQCj0<+OsF!;21(T(@eREsD!~2$E021J{!pxj>6vo{}y)x+yfxZ7#kyjGl0S1$!ltE z{==aFiVir-?%XG*%cB+Va|P9KBlVuA{CvFNco7?eb_w?Rbh-T?zDPc}U#|4}!uZ#N zs>SWL41{0P-+wm9XG*&@%JC8}>Ks0M!RLx}mic)Mi57c`I4-3k`{-_6j7@!oGn$#Z;ijjzc$bk;G4%MC zxNDuw&E8{|4@&F{EXM%?Swmq_QTlKh?2JG)uN{IAB&}`GI$j5uA^rr_KdzbGRA%5s z;%37{9X{uv3WGJ#8K^RVWawm%kn5N)LVkg6(MzrmcovAI05nW?;rT$#f(r$)4IrQ8 zg+7U+4p^vm`}u`gB1RS@N1__m+Qo}a5C`ODCXzhH2PY@v;^V;(RU@itYBK)yApKUj zsl|Q>UjXk+D;Y+a9^%nf66c%TXo(>3@00aF(eb6O4qNa- z!s@)^5NJo(`+(N4nxOpvPadRWDz4^l-y4MlGx`3Gu1?{L@kMktHX2%3Xu-n{-iuh7 zpND>fA}YgS4=?m=9}HMAK1QJWZMwUmp~8m`yMr(RU+vbwELFCry4HL(Q+fd#ZIMO7*CylatHa8_Q!ND(|PPQ_{07q@|^b24$4_1;13KksVpI>v5Q!gEMUl zqnUdLGr7sZPU*tEVb$CTS-I2OcLrW}b_FM{-u;opr`G!BFU1)J{R%3BPiW&x4>JT4 zk1<97YAhaK-BYhD#1HM^C#yuro>}{|Zk4Z}lU(L^e!!Z^Rps6)9 z@K^(Dtyk@hUfs{OV+RET)?%QqA%vh0awq_!D|pWrAH~C}1CYyM^&}8&jjv;sy*4N- zMRFI{soRKJ1f#_qoP@O2S{(CWt>ZukOuw5dF*ny4#Vg3QNl9BhZ-0+>Z7g{3!9^&qYFLet#Q^tPK)yhpc6J% zdOAApYuyDGIqAl`-U=T%;sD{2Zv>rxKNej)%#>j^0eBASHWKpE(w^8qm`fFUEr~KE zSH@`|=B?SF`JA#cs3>4#>oEm0va@>+*RxM-yT}MCJ~jk|caWCBYXCzukP6|O(NpT} z*<0++;@&94C_C{0Ivf}rqBMq|d3X0cI{1ck&e-hUItjx_V(S<+n!HY|o@5F=$G z0|h*A3?1-LSEXoK&AQJtstrBdg^V*JGgQ!8XE81`OTv^4!RIi z0>R&PGIs~fOCF;67ej8Ms3`H+vFAUG_ee^Q$fhgYHmTN0p`i_EYy9_XsHyc&OoWtw_fWoAasnF>dIu!#XsO->86`&g#_Pz) zHt>sZjAs?8s5_WgtnxVnLH=K|MjBaesdx||GU8;CPm9pm6uWxPI! z`03(eFQD#l65X5@B+4e z_6GF4(8y>DFu~?jpSTc|aaH1@d`e+EN!$^$|_2c%=V=3m385uc= z{FkL7P%vs*x)Hh~l>Ud3o0jpG3Xx znVZSgnUyK_I;8RBw7}1N2^0SQnLmuI>+`KoLKJu(YH)wQ;c7X|H{?q2KHoCPoDz_tKhX&_#xqVt-M0gSdxgefIU;2fy<&&VhOpOHw>V!J!T0%912M|8xJ^0;oSr^ z1_SiivpB;*P=-3;)NfE^E?vC%VPHl;Kp<;T4|-6{>a;@}@j1Yuabc&n;#WaoVMWRa zkP4TUX55Og^S}}U(eZd}{dWgYWuW+?BOo>aMX>e@gTzb6ATb=*QUYHWnT)}~2)bYs zF(&evPsIAwE&l%fQMA%LM{|DnC?vyh4gd#G5MR8vjE|X_8Se$&Nf=C{DAO$AotvG7 zB5!Zd>E8Zq|5ke}LwXW>i!?ZWe9lUMa1Bta#k#Crj`s(cZ6 zXx4ki<6vmhVsE?yENt9L?fjX~o^gT_XPlkImX_Jt*~u4PjeUnfJ(NE>I?>kjmkYrr z1W`XYgy}XNYWMaeOt*^)3sZll;|>^;J$p`0)wqH}yqvcNZ?jwsEgT?kt}Qy=^EOjZZSpMos~9S1%}V z0D?sK!XZ@xX<}&B?pFMW%YU1>Sb*9;-CzupW|#v)>gnLnD1<`4RaRi!33(gX3LErcGmL?>eOi(iv&cHgwIfVIKJs+8-%~6z13_)`nDov_<^ebCJYP}z= z9})~uNM`+dH|_+dVfnT+etw}7l;X`TRGWiN^YDbJHL6{eZT1fltnhhFAEZFZr8)5R z`9b%@0M#$rOeP1gACt13&jPRA3lAq*PJzmd(HyoH_8`gGwt|!scKiZ5Dy$%p=r5QgKz)st z9ZT2oBXPS72mD>w5Kb4YD8OV=HVazXQP^K0f~4d9>X#?tW3b|a>F*RaC8_%~GQuX; zSX06m02OUHxfpXPsCGiD;L#6mo)b!S9GggLXdMM<4O(gTC?<$8X%MJnkl=zu`c;nc}2L0N&bj=e*00V(cmF$a1OKT?P=xBJ@=B1cYR5gua40 zlSmhPL5nW}Dod~oQ8FP3!BcHUZh{Vj0MyA7o#N3dOmMfJob0t(jRM&@=rn4To7e8d zQ6$9@<4j(`?iL{(KuGkmJUg}U=^OQ*zB`QaTkZ*kA-_;$(e>dAq$Kv*>guN6K=AV| z0*m6j++3rR zC!HsjjvF=Pc-*$*q@#;ne_QTf&c!{GNv7RK*0KTRqrm=v_@~`2bC$FIn?h9M+>CZm zQEtBJaYm4Er)pqCrouxuCu?#nZNrnDy7IyGng>!Kd4ngBGEK6ayMG^3LRa{O(ouF= z=w`;e@DUwN)_V@waC*AU$&>z&+$r&XTrQq_^qgzUrGN{`DE#4k3P28row1AQ)=Lv7 zCW_*gtvkwWmr%C&Fda_p17LZlwTPtL)?p#Y50)7&3=g9`svo}5G!R4)$h zme5s$z}LS#!3t7%Q>qHzapI#c$!g!;_&b}q2}*nshazf(^fJ4}l|KD=Qsac_^oYS! z$~o#;O--^+B886=K>!4?*dn@gPPa$Pihz{*|C}{Bm87ull~$Uh+>mmt(H7;K|bwl_CV@`!wmIJK^>7T;`48!?^6 z%iO-b6+&Y`K_FFtKbo;42O9(e8HKCf<2{e4kYK$oSr zs}~kp<+hAt_;w#j^FgO!N_H5$nI{oWQcsbH9U?R55{QsWP*}sjkVJzIZwy69<6T!- zSYhPjiY5ZiT(tb}Wf`;L9v&IgPQO#}0~^LRi!9{ktDa%XQ!ko;09Jk@#5+hm1tZ2V z_Bp;)aBWE>j}RAhLb-uQa7al=7*ANrtxlhsr-a2RC|p73NdYsUM)UHXZa8f94E?zP zD`a3TBFbx5nvC_}cZTa&jvFJw8QT>skcMs_ag@u4S?$Hz2?$d=T zwzreZI=UoMZod1|JUW7rp6jIu8>hb?fpG5>;hy}T_g_EW43F6V^k|U3v-l(~-s5Gv z+mpp==^DnkzqPk3y=cPv_7HrJ87l0wv$vJuEH@Tw34O8-#Fn|KkDrr3+%FmlysG*Tv0%aVBB#s#n+klH18{edZU`mSZezobsoR{2#MJbi|omKoJE%w8> z9~#19WA)&BhJ^F*@Lhz@I4Hn8!i8bMPv!z4A!=eMS8{T8c~&>lzM!bwD;D)o{_3|T zW);x@?g*v&H3vZ010}sLv&}bzCgb+`EVKm1d*@kp@DbIlvP&y-&z2eN3L-k2D10}m zk0rK$tSW5JocR6YrcGE`YulWtxl}ZvLP6-Wn*%LGy1kDbCVt~zz3Zh&D}vBmN$E4R zeI&Y%xa1j1EFcnCfr#2v4cvFoV4&p#ExS;+-c%G`ArR$eXB%Z}qfo|8f-|zEChUV@ zb8BnOkQ3t3kok2W94LxrHE08DJHf^cT$6($Mr%!`g7@G-=pO(UfIc)4f`9_ZUpqUm zAUHQFN-6o9c;zICv0YPx{Q)f$3?(o%0IZ{Z>LFO0&_9EkiOV=!``!+n3cpX+qOkB;q zz4Ze#&I%BrfM*@s8)i@9?>o)CIJCydezXBwvjDby+ z2tghD1ubV*-6x5Y7ALC%twcGM-Lwq~*Rj#j0$n@U3=jx6tqjpr5Fenrb#z3zL<$x^cWzAF6F(t(!Um8fOV%dGc8(t=r4yCS zw_b%hnb?7MLI!R!97UO_ZyCNy8374RFWt@^ zM#-8D{v<3a#szj#Q7J1aAxD*gDgf&lz1;C_EbnOsWp{o{E}v1pc^P}RaU0A(KYb!9 zCmI{{VqOPGk>u{&<)sSveHS}>33d=t&mKIWi=A@tIK#_u>wwCId6~#Ex;Mk5h2{^YpHgBbf4~_ z%Z$wh?3quH? zk0_{t(WY5&Bwj+c7R*fH;SVFx>>DpRI5@xy1RLjlDP5*2=n!f<_3)E3K`#Q~KoaSce>R zEhKVFNJt4HF9E$FYjZ9mqca@ej=F5(+?D3+9v85taLFM<+qR!Mo-;2Z-j+PZnO;Vb*2zYYKF{67RUqxa&K6Vs^5fouZY!aNX8Pky9L{0BBm z&P=#aPf%Lzv%&H1>A3>BQicmzOdTL1#1BKgt4reEC|P{CEc`s}ojk;*cma&7S-f&L zZo|wDpmrOthnpK|r=M_jb_VVis>Ev?%aXAK9^tS09HlHF^u0>wE%v0n`SoK@kOFa5}br8cd(}6^4@h|ue7xMHQQpV@Cbtc z!sIpWGJR`%)y{YGRu|>HpOiS7xF{*nbA+1Li5_$MlrW5QZbEWcGo3Hv)iEKV!J%3m zt=B0W-rLWfjor2r(PVeOm#1pIF6eBRnK+@3E=^=>5xn{Vy&;W_o|$iyU)R2&?{Z$MJ-RvZ*mjR6CDKZ-ugt?E8| zNo%2uFkodErQ8nPP4?a}OgRzXPA|fFXW47PPB+162Q%A<$`o^KO|Ty}uvp_vuADdp zHwxq^V)(aBn#cRLcj0+W*_mbJm*2g2uRF_V6S6`N?FQEZ-UnCnZAE0ZuH7g(S$2?{ zG(AF)-kk3U+1ypsF&eKq!#?jV-}Gbm);zb5|70}6!qFeYT?c~kg1 zLV^?m%;Lz~F*P>qv-w&7gvn`nX~4SboCg!_`0aq6oJYzSBJGlB zefE8>Z+`1y+#Nb=d;2nv`82K zHk`ateTiOV`W!H$5FI>c-yi?6p@DYAnetEa`>mt$9&;&SVf4WBrl+Go-j6qK^lfA9 z_T(mjOC@Ab%C@4*|7ZB-eP|^&v6H_)H`cgzd*pSJK2_;ippG3YhAy0{>SgFctyYAounV; zSv<5EC|N+4^8SWO7HB;v93q$qtUyBAIfg<6Iez>RHE0wMU`%l0_n*kWY$40$>-i_+ zbKllF7JN|*C60<)Or1`J_rnNQ@k_8<=O(SAWMIDKrXgfPRH7v)6yG&6G`6a=Y24K z!rbI|`SQxj3f#>ae$cw?#HA{-W%7Er@v|rBz$>%p;)FNd(1$82dj)cZT?3t z=bvZ06sva#%O&GWlDX~t%eh+K9$3y?kaVeIk<86M8L&2A)h%NXv zV?w_(a%pYx6$eLX^q28FcbvkM{OQtOO;mmtt^49cM<6HPBBgs^XJkjOkRl}pVW{`d z@%q+==1(lLNWY{aHik$(WqK#FbZJX4;g5CkeA%i19U(BMAfQ;^nDl7h*OJMR;tafD zdgX#tYhd!gdvTZYMcl1}1fm2}DtNX5N&#yaASRGyG;rnRn;CR zYWn&dV0(0Qj7&|*WAYg%fjm4@Xwcd>P?G-hd_Va3cyI;Z;lp5gfLR6HyrUzRRk?$V zjDGy=>602AaGSs#i<-7Ae&hcf<&(l2BMp4G=qPdQk_@(mgv>>wQAJ}K0euu$pE5FR z!Gh35!U%>T$P}$U^stap;{fG9d>A9!9R!4Duj58QG0>#MEg+y`QUt3^_YLp#AIA1U zr=ueee*EdRa%~`J*ZsJ-M}Pj*cjTOlmzgonIZK&P9vCCPQ9Rjya^(S?f>|Q(u_ddC z_aAQ6$*(ngEM%Z*UCL<~{aME^C@{y(5Z_95I0Eig@4^qVmlUTQKJ3NA!$zSJ}yorLUK5po>fxVT5#Y>IlytlPjaH66zYim|% z5um1_qt?`nfKj6=z3W*C?Y6qJ*WAe`zuZ}I;8yf2%7mQIu7wM1 zUu}9xEAB|a-_1;usKJNmWD9fid>mj2YJV_{G}0u402(p1SI}Gp210ar88AES5$Oro z#PGSmTLW+tzX8NZ@<0r(fSkP)prEDYAp+(~hd4P6(G{SD24DMY3dJElJ|_nUuu}B( z^?~7l$)j1d=aaoo%UsGu3%VV85(_n^%=V!3awFF3PodmS!QOY2H%i_ z6e{9VBzJ>}-jbD9Z+o5Kl6ezk_&P{1z>XtLwq9^tg{mG_ZZLesJO<(c*nTC?9wcsY4Fqbs)SR=wr`JZ=Orj5oRGfJxpnJTdV-kw5qbhM^T(%b7ag;M zV^}+CgBkYqrKX*CTh(?RQue&kne~kG_+u)Gvj5NV=FR$vOG|^hSWQfdvqgNCoy`?) z8?JerTN~?YZ%0)2NGio4o5-4V+s{s~GG?#nSfsp|**MU}O?;RZFQM&6>hH+j%YVH7 zi;{EvvhvW8opdmiX=`uSh8WU!-3#Pt<7|y<&7jxdfg^W>@EIxPiHTcmF2B;?!%!6E z26SGjsiaCnQW8G$z}JNZ1U`L)*9L|dG+gi=K(nbp?F!PT@h3`RBiNnI@qwOH7)axk z>vJ2}fu8cOsVyKZ;B0$o6uiAl`2OIy`{n!&%PtWrq}rCkZ0@i-goIzZrm!IU`SW(- zg#+Q)lgsdcdiCl&y!;;e%Kn=vx(Gdi2ULiHNj5315i9ZbrzCZUBYNI%63?`@9|BK- z!iFQX+^n~xHZ$b`Cy|BaU7@bK66GnLtU?5(?b^$xd;^|{ua`uk z?;%=b*-hSfvu55QVb#+K{aMQtE@oy7#0Pv4VLVn&$I?=Md8?e>wvAzd_Ll$f%;2(? z0wr9{kcc;C&1ai*v77rKHQ!7Rv2#P#y26~LTaZ*wklh;5xk}zlZF)VkO?`Vodd@YS zX8qoCq;~|5j}=L`K1VS2$993!?#Bb$H{T>-2&$cup08w@ach>w)_=WDQ&;+;}` z{WD>T^B(}75dgep+2b}!#$CI_oCcLL>Um|wqtlK4({}iKA|`;Q&6kG z>{KiMFTj2u;C{Oq-DZq!AC`ZA6cK^@F$fXTe_`VC za0N=(ogxZ(#Y1-N@CJ)G_3hBK6qwL`GR~$WkWkyn6W(7cC>^}51p=`nf)2fO?>ji^!)iAA))0sf6zuL{GS)$iXg*b#Irl<3B#Y&WZH?AmfJr3VJeke#CJvF zHd}}Ut`LQ9j6V)<-7eo($D8)YD$LcCWrEEnR=YwglS2D@OMDYIsq8-TJ}#B#M2?z% zmGAQMp-}$VJy#oc&G+`hjbJ?iARJl`fbktYJ$gv6j*kzm+b3?Vfuj-dIsD3lD=?Gq zGy+Bmw_$Y*xk(MiFtTS4VE<;-Z`lhDq-@_7I;sGOty-Tb%R-T3zVsoaxRJ-zrYJ|@fK5Y1 zMWDo-7Rld^h1~!M;MmmigyrnqXt1zt*>c+Y+(_#i(Q0siY2`D{s*Gz0cIG61PmV7z zGkb^;ZIP?&+A>7mj{|p#S5&wR4hOeoX1>YcG4fvb{4u3EJD)hw)Ada4*+YivrCDD_ zGJE^cn_H5miq#!w%`J4IdHK>N#&v`UpL^qWGgWrK%R3;Z9`*RZpYfb`cPN=!iCmn1 zagUlint8*OBhaa{ya}P?;$yV8vDv-rTWiPRJ;57kl;{$X8mmAFC>A5U5t^bKKj?OS z?duXxSu5*kW4rRVCEB2bptHZ4d+oRhW%Tr%#e1<i{|W7EW4u@eY9DtvOtx&BMGiNlO<+cpEsv(dI+)~E6F5ITjrgT9h{}ON z`5@po&ZD0+!~l4jQC`M(`!BnKDRvCC+w{^ZNLdqrYj8CJ)dM4sG666T5W|ZREpc!e zMW8XvGEy3xot)A#GMe{g?OR%$o`(5MUycRXuQY^17;*03Zw81;_8QCW|AHyYuoMED zr`>QfCWuIqm4=oL(_=W7BzP=khMmrou*>Z(@%+_hAnD;Dr&C-|oSog(u{5%2BI*2P z1D|8gQ@yvpm&a%5s9RYr<&uAXEZ90#Y?AF{HuS4$>D8+@=~{Z?oeMTA08p@VT3esK z?R%|V`ZTfh*SJn{s(Lj4Weqn^`K9GC1;wi5d8uU8oQZKIF0L~P2^B9CzujkZeE&03 z+lYhVBhsp5tTjrliG)*Li?QVq{1ZQa9@DU9TDW+Es79K+x)ZAgkXJUA5$q_wUr+CS z{!0cr!s1v!!6x@_!m@(H_Oz0+N2)8QWk{#AA>H@RqRkC^D_&WDe?wHLj_09RjtXCH z;^8dPVQ|f>uWPo93!YId71lHPXdd=u%~tcrY6AHwkExeb`c4?v;(kkHU?9f~R=&N1 zynjgZ;>8&_3&A^OhpWPSY7GMeINhSbw?1{*ZujT=rg{2@M>57AiJskTU^BWLmQncH zJLMMX8#$p0dFV^0EkUO%_j1rB|0*vU9iBepXSFle!k*e8@u__MW6`eaKh`=Mtg)q1 zGLFJ^>S(811_lRF3AEVU+A;?1ZSjj!6nx*}wC=oZnMUynhgMqCo_-OnHv*+i->ayKzA@U^iHlRkE3j&DMY$%r zex@CowBWxXKWJ1(_l~i~JJgNG=hd6#Qm>DRPihl=H4m*u^;u#4pZ%lty1U`BkJH9T z+dVr?>N?fO;=!gd4`VvyHQzl=UA>{4uHsKei0`)FQL255?g@vwg~#*p0r@K{rGaRG z_gO*S0cG5+Sn6pCV6L!j-sy^vDjbL>;#3*QmUEc=h#Tolh9`AP$m6-83K=&)tC?*3 zn8*9ke)mJMd)3#q`Ziw(=ABd4bJ1E{pJ7rwsFQzpw;4M;<3g8WYZ+JqzlK~;%~?O{ z=TfHMyk8Ru!}}%Jzt|awcMnD~pIXg0gdf~Hva8qRqwhhj=Z7Q5C^8PG22aS-n#Ou{ z)9ZW*rNeBHF?@TbyMbAI3W+m8=5}7@nD_vLXM{$ zxB4?js)X-!g3AlJ z4;yh6Y3ABqkgL&{vQEc)sgA*~zf1VfzQ12wRr&kxum6Ali63_V&$Bo3b@slas!Cr| z%WTv3T>0%^yj1)8tZO+<+oawrKjjm=8NK!4S9$e)vRvljyFTSU>-7tD@tX6DYrE>+ z_u$JP4&2(5w434HYks@y#*;J{Y(kQ(gW_jA+j^Jzvh``%K<7nmCey5i_A*SadNalT zQpm%u=l?m?|4w|c=Hr*#mGwTgb&7M6C)tXwb6K+TlIX0t)<4U4xkroNKI?h@>XUWg zBAH=bw)ST32Pg6m{+<5(|6E?z&WjA;;_sOfe7hcC{)Gd+}X&nzn`!=&O# z6~*-yT1s)VwT$F@q%!$5KuLljA@<}J!3D~j|HQlOVqYeGN~Zkhn$F|z&VB|OX0~3UtlrfX*l0(TGXHRurt{&pLan-54tx-1ru1ufq$K$rID(7<8{H^6b z?(bT+@R!l=_Fh*_@0b4-z(EzGEcupc#fK*i-j`ug0@3{Z3@>A#I!}s}L=fC~%cI~YBQZKfyd~01ZdDq7GuO|vOKkS$4UiImc z?ECrIrn0NP{xy`m`+4U7g8z@+H3Jj%{bg0Argin}m)+Y_kmB%32<+C?elt1RjCR^t zB%8=emp#*v@h>E*yW3{MjL133Yi-gFIN6I z2YSur8upVn|A{J3foO_QpH%#BsVF1Vj5YEf&(vrB(}&5Xubc6oTNR>o6AO&Ngqv}w XzISQbDSg}23XmpGS3j3^P6yPpx6D7zs^lHFwAw^H_G%VejlAxqgAM9DIiYzd+CvzGBgh{=|+#E_)H z*qJO7ligUxdHTKYdC$47_m6Yl>pkbWuJ1K7_k8DjKhM2>KKCS;8ta{6;9-D3Ag2uU zwap@qTu_Gx`Z?+PrhjPLD+(?D$QGL~z9nHPYQ;!o zXC|a1xy$?O$UQr;l%Jo|?~2u3u%-7fD}tpLi}FcBX+9=5?{(F(*c6HOoDV)fy`NJZ zho$+G8QtLcK4K&y)wS08@VJ1Xpc{$gbwWG_L&`1TWQc9u?}{4R=`NVOmff;8Tot0h zr^UkU?3T@RQm9v!wK{e7=;IMfAL1-R!yeD6Gbq0@{i=|upO4VFCFwb@2@Bl#vcnUL7ZhL_3Vbm>4#UD{>+0&upz~=6|4TzYowlGs)WHin ztzC50rNa*QsO{w=-lOrth)&PCqCnHNyNZOf1BVMeG^In0@J;f1;CSq2sR1hKp9Y#)%y@d;Do7tI=6FMZLHG~7*b+i(DG~Vca26G+b)*a)?1ti4qsVKk0CLFWRhd{mIlh&py zREpXZY4Xq8UElfgaKZ*`H7`8RGm1}rz_a26*=&`9)p(hJJW&A1asCld3%1T@{ID6M zMC+Di6fR2kTj1d|)#Th*YwIQ?57+q+g6Fc3bJ2=*PBKW}%#uQBX7`p?RCw5k=TlR; z90dgU=#yj$XkanoafmXP_hz@Mt?VSThdqbouMf#*_ihbKp{NV3yTzA3Ec@j#9y<+T zWv#aDQugw3a0@EGC9{^+Z&+A^=%t{j50{oK9S-d!v-iIhOxSyUSLS63fLqiDs9tAG zx%U`R1}|o$w?JmOHkyiZFwhCq*i)$`nq_?cnNJny}=VnD$#*haXfZ#{I%XIMgOpUh0wsBh9SLr^{T3sy4RntMj#Nl zLcT99E{@i^*N*-axkTwP6%80FGIJFXFh^!NmO0PsLX&Qf)#sjs zeBZC>dU=t?>bx}g2CkzYXFUxkW?5c&X=-AU+D@R8exPFgq{k)YtQwplw*Ky@xlIqb ztXPGsXSu1susHFPldWyuzydq%?Nx!+M?tH#yF3{A_dDZi8@>}CX-E`x;(?=(!K_r7 zM{bcQ%CP3^VU&^vqc{D#YmCnqc%p8Xov`NbUH7VLcB>r?B2U_fb<`k^W|*V6PoGY6 zRbheMCDd19Fg`9W^Sf(v+5wx3W`zSgU#>Fa>{07IBAhy*3;Ds1ug}5F0Z^o~m)ZCe4lT4hspfdP?l>T!+uS-H)gzRIou|&v$LnFuj^Y{;x{(~e0_Z_EiJEKziw-5>*zT3@@iZY z7JC?ZG_KP*(vu-Fx3;@Ffd#Imt#r_v?uR3;Q2MG+9p`A1Kg}FfhM* z^{OCS=>AH>&d<@>+Z~U!1@2J~C<;GrNobH_fhp(rr=+Bej*g-<9X+?Rh3TGSpY^z49GaV)yHYOmx7nWR=;%l+I?2qu zut5P1Zk$-XB|S1a8oITN6fhLdkj$3gJ{hK702XkxSYoy9~&F9v9%4Ai=JAx6~78hTjScRs;X)yX$dSX%{_0sw7gtVS*Z|I`r%NV z1;(rF_dv-_rE_F?_;v8gm@DdblBV7h*HH3gbGD?t>b=>IGaYf>if0_je##*EloS;~ z=ui^EmI4lgoT|B5&uWCdeXGmy$w-(T{fQy=1EbXYHcQXkPJ+#A%PKw|p1t9!$l>w7 z*5Kgz#M$|IK~@Dt#dZ2?>0sY#a&jG9T*@nj;9NO5p;XEOrKqCf4r5za+uU?_+J#2D z{*V0pbG0v;nYXDpPe+7ngQm%RPE%b*=HB7n)=;Slc4GAyJyYiDj8yZR z5|7}d^VCcb32}U3Wp6zuU&8#V4DWsU`qk+s%agSQ*ujW@qa8MAg@=cyDQrueYW0;B@{U}mo4fmjPXl4)M@KkA%=FGaXy*JdRCCA7pM(|dZy;tssFjqI zfYSoCM#jdGzuM^!bcBV4cSU_;ubhXYhlhtJd|nl|Pt!zSM!wqP@r`xiugHeZEbC4W=77vU%GR3m-sUXOBfsL zf36}YE1Rw_I2o}saX~L-v8ly#SRAD9!R}gldASuL2)qfN42_Gg8T|&T^(vW6UR<1ZpHsT1sHEgBn=?5%Nu@>#j5Yd~4lQxe z-lnV*Gcq!`B<$Z_82; zmLhR1GgXb6^5EVRXvK%KU0R*QdyvbI5CDq;psL+X1DSq8_rDRi{CcO$J%8*L>&4Y~ zOP#J-!WoTo0Ui*)9e8jP|6ENQfKc`j)B2=d8uTZpk$T9q!%H#?Bpy7x?RWo#0d2gX zfBw6I=Px%dj8~}Y={k(xUXjp6A|K1XIp*f3wNzVGVA$sM07G)M;xv+Pps_%?iVj1? zYqg~>GVZoa9}RFJ?W=wnwsEu5)>vy(cUERE59;H~i*{&bbm8|3wwf>t=v)km(~h0n z`QtMrn_zX4`2#r$uhx*fJ^pCM^`2kF&mde80bi_Hcf&O)VHOoflU6dg;eJQZ(D}qe zv>R_}mgmH#Qfk`7-V9IVyjO0C$5`Pdcd^f$XK00@DDm~!8(fdpmn-E&7!8wY?D4=% z;_lbDjEsej{o!v|UA9hn^~0Ozq^{VF7w(!@ZHRnKNsEg*dn-C&Mf(>>f%e(1Dp|GN zp2R4Lc?R(`eb=D+JNKiaOFTX~nGIDq846iHMeFFK3u>|asDzFRRK5}Mpz2;FS`oBM zC8JzU`Eqcebp%QcVr4TcDsnrOYkSxA-0ICk;N3NLLjD->#1B(<=?a;n?&g+=C7KI` z>mr9`-)smMR{v5iOXo2~`ffXmc62x=^sOjMo%^xlkV)XPHb-u`kvW4>8v6!lAfog? z+_kI&3lVh{VYPlyGM5-3FL?R?=6R$s8?4kDxW6KM$k1_8%OP%*D9YSTQ|4eS5fLd7 z`h-sVcSK^=$uMzNxVqGvX+rcZNnMMkOHV9MM5l!~CzqHF-+UzgIY#07JQkNPwZv=x z&h4&8o1lW^*!%U4)`=j2B5!Z`42mBv{77#|%%8!n3EbV0=W%`L;7FcB2X28rE*0Ui z9~ZR|)ZTvmkI8rJPWR!~rgT)QQ0+B{>-1+@jjcK6BaHu0YZRKg%_R?4sxu-&BjWy% z8^hN`#6>wZzy6$fT|}jMkoWQHW-QsaNYWoN z5UH3CUp(!hic^zE)t%yY^daNt5u!M$Q0FR(Wv#Z|C`OagrNA%y&EIMhGe74W8Qt1! zefVuUZ=tZFOgMA&O~vyZ>$aVEepoVJBR?szBGc{L>pzy>?uKV-_mIsgCwm)S(@T&% zg6R*pX^I(+XAdgF(|F!*j_l>(H=5t}S&DKf=pZ-G^oh=~)mVEM2|iu8^BR$d>z^Pe ze7x(wA$v@*PlN}FRLJNNWJ|CR&%(JOk(KXL3uS~8i-wjqL(~-%6eP2+aeN|N$2!D@ zOx)lQ0xW?oAwV@B=jLi%vhJmGlt8QH*J#I=+C|<`%Qtp7b&?RKnqOjm?cg}oZQOICQU>Xw ziA0qPhfXtvdzF>4&(L_<*TaTcR_s3_H;eafc_#R{MNXY(^~k;Hv+tUadAs*dUJK-P z(GED&5{~DZhC!JW+Owfxf=c)qlya8kslCo z2XF5cftK8R*3%m}C0{rslYXw|g?d*c9faw>#oxcB{GWF7e<5)3gBt-DY+~Y-+sU;- zIapl0Bb$S$ghFb$bLkfP^GRfKwrftji!~oFuX_0QT?Bk6aH87@0WWYpSb>a_`&9J4 z$a@C_Y<|v?nDGk%ZLvr+*F5RcU|(M!0MfOiZ${~$R ztlvmDqujy}i3B)kXTS2MgfoICIkBkB!$vaOIVrT+A+_rQ49qm-Z|1gH1 z#q6c2z91U~<&Z8|IIwWP(Z}*}h`OeVN_oZd$jGyb3Xl#5oRHNU!Y*0}csRLv$J5jE zd!;R4c!m;E_Dz{MH-+oYNp)}EKI*uQ{&atBR!7GSU|PjI9Pxf#UERdQ1XJ7vI2yEj zPPEP>o`osS*2ZR+YYPwyl;%0sQ_Re%$;m4d*x;a`?fIUJ89(JboLjB6j@cN2;O_38 z(c@BW_130RLqkKe(8MgWy}iAs$3Vv{zI$N<9H!9@6WS}Spb&Vt7l=ga>FOfjXgo;= z-WGvdTm}!C0y_>-ZwcG-jO%E(6i>XrI^KxVYz2%Y?p)-%#>U2m1|>LpZB9K+UtV5* z6Y!s)ASPz!jh4>n=;#2|W{;r~z;p56z9l6muN@1yeFl(|roh*N2IQ7~OfPW^VEBj3 zn%t>f6tlC*x>a_KH7LqD_(hd%!zv)OfLT>k^xHlL6a%mW>&oxotGJHa2D0aoPyrN=Q^CaL#s=O&*XU?8H4(tVN4!DDmfnn)T69!!* znkeAA(EwIm-P%SB-P?wS{X=R~Qxkw_e#(IM5O?r{l1ON60prpk;{DhwFV*;-6w}8S-Kn-RM91*o$t@v) zde~3A|M1~M6ew>1%TfOf?fp|e9M;CG>#iluefO^gg1ou8nJ-m@1@_C~p;L7kN!8g1 zzjfv1tvVa7kh5AWfO+01w?M$p@bKh5e?H#mFLKE)&|a#!Un2|WRK0sh#pNk&tb?hO z!Pm2SXCPVai~h9KX3yGDMW699(a*%*Z2!jRU2_00gDJ&QK$8^$@J$PGq@!aLc8Vv^ zz7;qN7+RgrM48v2+Ue8gru-4~3d^IMoSZ8!!OQ`$2J(`42_Wd8QS`X%o`6N=tF>g? zNd_y~b3$DE-||%fRtKI?a4AZY1@@?81~^(@u!z(&;ZvBK3)q~ur)QIW9ItbqQ}xMH zr-=7eUJvsm>t) z`ukP$jqMyEt{5u>8|%L4?|#^cT~z)(h|SB(&arZWSTP)QRngTz99{pX&U3Q)`01T( zDB`J3>y6152vZKBj2;B)H8W&f1N~|Cej~gkf2V*ulP+BlR7B@`I#VHd!%OdR6`JEm zP%ArhxY56W(N71TlJzmCeRsyqzA_a75xpQhS?_EI|JBo*27_#fU!V8>?t*pG4Z)zp(Va$vb8v<^DvK_cKQm&z|Jzry18K*AG8KbSOn1D&Tz*xak^P)++X!Dg) zeEielFa5)reS@#L65=hAUF^7QCZ5m@>kNxp3JQGg{i94!;+!PSi{F&zi)5M2kXTq{ zD#wt|qv#qixizPYEfT9`gc513O`H8{x%*>p zgCYBw5RCM^EuOmK-m^|XKC?R;r3+?v)Q2_Zm33yy0y~nPGR}m34M^*LUd|8sd>W+B zpce`WRIi0vG_Y?7L&sA@6K}pAep3ky2&SL(&{@dz%_JEx!F{$pRB+Fl-{2kQ#0%8S t-rsi;2LQML0I+_568>e}|6jooGZ`kizWmHm5&S~}G0-vA#$34-^B-Ep8N>hp diff --git a/docs/demos/App_erstellen_Ionic/src/assets/mobile_screenshot.png b/docs/demos/App_erstellen_Ionic/src/assets/mobile_screenshot.png deleted file mode 100644 index a3b91e7329eb9f4e736e6ade560dd3a2dc349407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78553 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 a&or)DxFsMU%TEjbJT~}zabrFGU;hR}jzr7= diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.editorconfig b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.editorconfig deleted file mode 100644 index 51873bc..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 2 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false \ No newline at end of file diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.gitignore b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.gitignore deleted file mode 100644 index 38344b1..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -resources -www -.sourcemaps \ No newline at end of file diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/config.xml b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/config.xml deleted file mode 100644 index 7290d53..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/config.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - kaffeeapp - An awesome Ionic/Cordova app. - Ionic Framework Team - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/ionic.config.json b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/ionic.config.json deleted file mode 100644 index 07cdedd..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/ionic.config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "kaffeeapp", - "app_id": "", - "type": "ionic-angular", - "integrations": { - "cordova": {} - } -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/package.json b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/package.json deleted file mode 100644 index 092cc06..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "kaffeeapp", - "version": "0.0.1", - "author": "Ionic Framework", - "homepage": "http://ionicframework.com/", - "private": true, - "scripts": { - "clean": "ionic-app-scripts clean", - "build": "ionic-app-scripts build", - "lint": "ionic-app-scripts lint", - "ionic:build": "ionic-app-scripts build", - "ionic:serve": "ionic-app-scripts serve" - }, - "dependencies": { - "@angular/common": "5.0.3", - "@angular/compiler": "5.0.3", - "@angular/compiler-cli": "5.0.3", - "@angular/core": "5.0.3", - "@angular/forms": "5.0.3", - "@angular/http": "5.0.3", - "@angular/platform-browser": "5.0.3", - "@angular/platform-browser-dynamic": "5.0.3", - "@ionic-native/core": "4.4.0", - "@ionic-native/splash-screen": "4.4.0", - "@ionic-native/status-bar": "4.4.0", - "@ionic/storage": "2.1.3", - "ionic-angular": "3.9.2", - "ionicons": "3.0.0", - "rxjs": "5.5.2", - "sw-toolbox": "3.6.0", - "zone.js": "0.8.18" - }, - "devDependencies": { - "@ionic/app-scripts": "3.1.5", - "typescript": "2.4.2" - }, - "description": "An Ionic project" -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.component.ts b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.component.ts deleted file mode 100644 index ab78376..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from '@angular/core'; -import { Platform } from 'ionic-angular'; -import { StatusBar } from '@ionic-native/status-bar'; -import { SplashScreen } from '@ionic-native/splash-screen'; - -import { HomePage } from '../pages/home/home'; -@Component({ - templateUrl: 'app.html' -}) -export class MyApp { - rootPage:any = HomePage; - - constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) { - platform.ready().then(() => { - // Okay, so the platform is ready and our plugins are available. - // Here you can do any higher level native things you might need. - statusBar.styleDefault(); - splashScreen.hide(); - }); - } -} - diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.html b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.html deleted file mode 100644 index 7b88c96..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.module.ts b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.module.ts deleted file mode 100644 index f1af90a..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { ErrorHandler, NgModule } from '@angular/core'; -import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; -import { SplashScreen } from '@ionic-native/splash-screen'; -import { StatusBar } from '@ionic-native/status-bar'; - -import { MyApp } from './app.component'; -import { HomePage } from '../pages/home/home'; -import { LaProvider } from '../providers/la/la'; - -@NgModule({ - declarations: [ - MyApp, - HomePage - ], - imports: [ - BrowserModule, - IonicModule.forRoot(MyApp) - ], - bootstrap: [IonicApp], - entryComponents: [ - MyApp, - HomePage - ], - providers: [ - StatusBar, - SplashScreen, - {provide: ErrorHandler, useClass: IonicErrorHandler}, - LaProvider - ] -}) -export class AppModule {} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.scss b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.scss deleted file mode 100644 index 1392a6e..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/app/app.scss +++ /dev/null @@ -1,16 +0,0 @@ -// http://ionicframework.com/docs/theming/ - - -// App Global Sass -// -------------------------------------------------- -// Put style rules here that you want to apply globally. These -// styles are for the entire app and not just one component. -// Additionally, this file can be also used as an entry point -// to import other Sass files to be included in the output CSS. -// -// Shared Sass variables, which can be used to adjust Ionic's -// default Sass variables, belong in "theme/variables.scss". -// -// To declare rules for a specific mode, create a child rule -// for the .md, .ios, or .wp mode classes. The mode class is -// automatically applied to the element in the app. diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/icon/favicon.ico b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/icon/favicon.ico deleted file mode 100644 index d76fa29d65b869e7df297c06a637b9dceef46966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1981 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 - */ - login() { - if (!this._options.loginRequired) { - return undefined; - } - return new Promise((resolve, reject) => { - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": "my.living-apps.de", - "port": 443, - "path": "/gateway/login", - "headers": { - "content-type": "application/json" - } - }; - let req = http.request(options, (res) => { - let chunks = [];; - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - let body = Buffer.concat(chunks); - resolve(JSON.parse(body.toString()).auth_token); - }); - }); - req.write(JSON.stringify({ username: 'rene.schwarzinger@milleniumfrog.de', - password: 'Kl9BgZriXzxmLdpo' })); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/login`, { - dataType: "json", - data: JSON.stringify({ - 'username': this._userName, - 'password': this._password - }), - method: 'POST', - error: function (error) { - reject(error); - }, - success: function (body) { - resolve(body.auth_token); - } - }); - } - }); - } - - /** - * - */ - get(appID, templateName) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - if (commonjs) { - // let options = { - // headers: { - // 'accept': 'application/la-ul4on', - // 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - // }, - // method: 'GET', - // url: `${this._options.url}gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : '' }`, - // }; - // request(options, (error, response, body) => { - // if (error) - // reject(error); - // switch (response.statusCode) { - // case 200: - // let dump = ul4on.loads(body); - // dump.get('globals').Login = this; - // dump.set('datasources', dump.get('viewtemplates').entries().next().value[1].get('datasources')); - - // resolve(dump); - // break; - // case 403: - // this.session = this.login(); - // console.log("token is not valid"); - // resolve(this.get(appID, templateName)); - // break; - // default: - // reject("an error happend"); - // } - // }) - let options = { - "ecdhCurve": 'auto', - "method": "GET", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : '' }`, - "headers": { - 'accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on("data", function (chunk) { - chunks.push(chunk); - }); - - res.on("end", () => { - if (res.statusCode === 200) { - let body = Buffer.concat(chunks).toString(); - let dump = ul4on.loads(body.toString()); - dump.get('globals').Login = this; - dump.set('datasources', dump.get('viewtemplates').entries().next().value[1].get('datasources')); - - resolve(dump); - } else if (res.statusCode === 403) { - this.session = this.login(); - console.log("token is not valid"); - resolve(this.get(appID, templateName)); - } - }); - }); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : '' }`, { - headers: { - 'accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'GET', - statusCode: { - 500: () => { - reject('internal error httpStatus: 500'); - }, - 403: () => { - this.session = this.login(); - console.log("token is not valid"); - resolve(this.get(appID, templateName)); - }, - 200: (body) => { - let dump = ul4on.loads(body); - dump.get('globals').Login = this; - dump.set('datasources', dump.get('viewtemplates').entries().next().value[1].get('datasources')); - resolve(dump); - } - } - }) - } - }); - }); - } - - _insert(app, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`insert() got an unexpected keyword argument ${ident}`); - } - // add data to fields - - fields[ident] = app.controls.get(ident).asjson(values[ident]); - } - let data = {};{ - - } - data.id = app.id; - data.data = [{"fields": fields}]; - if (commonjs) { - // let options = { - // url: `${this._options.url}gateway/v1/appdd/${app.id}.json`, - // form: {"appdd": JSON.stringify(data)}, - // headers: { - // 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - // }, - // method: 'post' - // }; - - // request(options, (error, response, body) => { - // //console.log(response); - // if (error) reject(error); - // //console.log(response.statusCode); - // if (response.statusCode !== 200) { - // reject('HTTP Code ' + response.statusCode); - // } - // let returnObj = { - // HTTPstatusCode: response.statusCode, - // recordid: JSON.parse(body).id, - // Record: livingApi.Record.create({ - // id: JSON.parse(body).id, - // createdat: new Date(Date.now()), - // updatedat: null, - // updatedby: null, - // updatecount: 0 - // }) - // }; - // resolve(returnObj); - // }) - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - let body = Buffer.concat(chunks).toString(); - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: livingApi.Record.create({ - id: JSON.parse(body).id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({"appdd": data})); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - method: 'post', - data: {"appdd": JSON.stringify(data)}, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - statusCode: { - 200: function (body) { - let returnObj = { - recordid:body.id, - Record: livingApi.Record.create({ - id: body.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - } - } - }); - } - }) - }); - } - - _update(record, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`update() got an unexpected keyword argument ${ident}`); - } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{"id": record.id, "fields": fields}]; - if (commonjs) { - // let options = { - // url: `${this._options.url}gateway/v1/appdd/${app.id}.json`, - // form: {"appdd": JSON.stringify(data)}, - // headers: { - // 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - // }, - // method: 'post' - // }; - // request(options, (error, response, body) => { - // //console.log("hello"); - // if (error) { - // reject(error); - // } - // switch (response.statusCode) { - // case 200: - // for (let ident in values) - // record.fields.get(ident).value = values[ident]; - // let returnObj = { - // HTTPstatusCode: response.statusCode, - // recordid: JSON.parse(body).id, - // Record: record - // }; - // resolve(returnObj); - // break; - // default: - // reject(`an unexpexted error happend, Statuscode ${response.statusCode}`); - // } - // }); - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - let body = Buffer.concat(chunks).toString(); - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: record - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({"appdd": data})); - req.end(); - - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - data: {"appdd": JSON.stringify(data)}, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'post', - statusCode: { - 200: (body) => { - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: 200, - recordid: body.id, - Record: record - }; - resolve(returnObj); - } - } - }) - } - }); - }); - } - - _delete (record) { - return new Promise ((resolve, reject) => { - this.session.then((auth_token) => { - let app = record.app; - let recordId = record.id; - if (commonjs) { - // let options = { - // headers: { - // 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - // }, - // url: `${this._options.url}gateway/v1/appdd/${app.id}/${recordId}.json`, - // method: 'delete' - // }; - // request(options, (error, response, reject) => { - // if (error) - // reject(error); - // switch (response.statusCode) { - // case 200: - // resolve (response.statusCode); - // break; - // default: - // reject ('an unexpexted error happend'); - // } - // }) - let options = { - "ecdhCurve": 'auto', - "method": "DELETE", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}/${recordId}.json`, - "headers": { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - if (res.statusCode === 200) - resolve(200); - }); - }); - req.end(); - - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}/${recordId}.json`, { - method: 'delete', - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - statusCode: { - 200: () => { - resolve (200); - } - } - }); - } - }) - }) - } - } - - // export livingsdk - if (commonjs) { - module.exports = livingSDK; - } else { - root.livingSDK = livingSDK; - } - - -})(this); diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/livingapi.js b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/livingapi.js deleted file mode 100644 index 962f0dc..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/livingapi.js +++ /dev/null @@ -1,916 +0,0 @@ -;(function(root){ - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - let la = {}; - - let ul4, ul4on; - - if (commonjs) { - ul4 = require('./ul4').ul4; - ul4on = require('./ul4').ul4on; - module.exports = la; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - root.livingapi = la; - } - -la.Base = ul4._inherit( - ul4.Proto, - { - create: function() - { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - - ul4onload: function ul4onload(decoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - } - } -); - -la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.FlashMessage = ul4._inherit( - la.Base, - { - _ul4onattrs: ["timestamp", "type", "title", "message"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.App = ul4._inherit( - la.Base, - { - insert: function (values) { - return this.globals.Login._insert(this, values); - }, - - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagment_identifier"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.View = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.DataSource = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "app", "apps"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.Record = ul4._inherit( - la.Base, - { - delete: function () { - return this.app.globals.Login._delete(this); - }, - - update: function (values) { - return this.app.globals.Login._update(this, values); - }, - - __repr__: function repr() - { - return ""; - }, - - search: function search(search) - { - for (var identifier in search) - { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) - { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } - } - return true; - }, - - ul4ondump: function ul4ondump(encoder) - { - encoder.dump(this.id); - encoder.dump(this.app); - encoder.dump(this.createdat); - encoder.dump(this.createdby); - encoder.dump(this.updatedat); - encoder.dump(this.updatedby); - encoder.dump(this.updatecount); - - var fieldvalues = {}; - for (var id in this.fields) - { - var field = this.fields[id]; - - if (field.value !== null) - fieldvalues[id] = field.value; - } - encoder.dump(fieldvalues); - - encoder.dump(this.attachments); - }, - - ul4onload: function ul4onload(decoder) - { - this.id = decoder.load(); - this.app = decoder.load(); - this.createdat = decoder.load(); - this.createdby = decoder.load(); - this.updatedat = decoder.load(); - this.updatedby = decoder.load(); - this.updatecount = decoder.load(); - var self = this; - this.fields = ul4on._havemap ? new Map() : {}; - - var fieldvalues = decoder.load(); - - this.app.controls.forEach(function(control, id){ - var fieldvalue = fieldvalues.get(control.identifier); - if (typeof(fieldvalue) === "undefined") - fieldvalue = null; - - var field = la.Field.create(control, self.app, fieldvalue); - self.fields.set(id, field); - }); - - this.attachments = decoder.load(); - }, - } -); - -la.Control = ul4._inherit( - la.Base, - { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], - - __repr__: function repr() - { - return ""; - }, - - asjson: function asjson(value) { - return value; - }, - - _logsearch: function _logsearch(value, search) - { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, - - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) - { - return false; - } - } -); - -la.BoolControl = ul4._inherit( - la.Control, - { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } - } -); - -la.IntControl = ul4._inherit( - la.Control, - { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } - } -); - -la.NumberControl = ul4._inherit( - la.Control, - { - type: "number", - __type__: "NumberControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } - } -); - -la.StringControl = ul4._inherit( - la.Control, - { - type: "string", - - asjson: function (value) { - return value; - }, - - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") - { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; - } - } - } -); - -la.TextControl = ul4._inherit( - la.StringControl, - { - subtype: "text", - __type__: "TextControl" - } -); - -la.EmailControl = ul4._inherit( - la.StringControl, - { - subtype: "email", - __type__: "EmailControl" - } -); - -la.URLControl = ul4._inherit( - la.StringControl, - { - subtype: "url", - __type__: "URLControl" - } -); - -la.TelControl = ul4._inherit( - la.StringControl, - { - subtype: "tel" - } -); - -la.PasswordControl = ul4._inherit( - la.StringControl, - { - subtype: "password" - } -); - -la.TextAreaControl = ul4._inherit( - la.StringControl, - { - subtype: "textarea", - __type__: "TextAreaControl" - } -); - -la.DateControl = ul4._inherit( - la.Control, - { - type: "date", - subtype: "date", - __type__: "DateControl", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, - - /** - * @param {Date} value - */ - asjson: function asjson(value) { - if (value instanceof Date){ - value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, - - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) - { - this._logsearch(value, search); - - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); - - if (search.operator === "equals") - return searchvalue === value; - else if (search.operator === "contains") - { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } - else - return false; - } - } -); - -la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M"; - else - return "%m/%d/%Y %H:%M"; - } - } -); - -la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } - } -); - -la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), - - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (this.lookupapp === null) - { - if (search.operator === "equals") - { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } - else - return false; - } - else - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } - } -); - -la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } -); - -la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } -); - -la.LookupChoiceControl = ul4._inherit( - la.LookupControl, - { - subtype: "choice", - __type__: "LookupChoiceControl" - } -); - -la.AppLookupControl = ul4._inherit( - la.Control, - { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } -); - -la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } -); - -la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "radio", - __type__: "AppLookupRadioControl" - } -); - -la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "choice", - __type__: "AppLookupChoiceControl" - } -); - -la.MultipleLookupControl = ul4._inherit( - la.LookupControl, - { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (this.lookupapp === null) - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].key === search.value) - return true; - } - return false; - } - else - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - } - else - return false; - } - } -); - -la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "select", - __type__: "MultipleLookupSelectControl" - } -); - -la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" - } -); - -la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, - { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - else - return false; - } - } -); - -la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } -); - -la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } -); - -la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", - __type__: "GeoControl", - - asjson: function asjson(value) - { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - } - } -); - -la.FileControl = ul4._inherit( - la.Control, - { - type: "file", - __type__: "FileControl" - } -); - -la.ButtonControl = ul4._inherit( - la.Control, - { - type: "button", - __type__: "ButtonControl" - } -); - -la.Field = ul4._inherit( - la.Base, - { - create: function create(control, record, value) - { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, - - search: function search(searchvalue) - { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() - { - return ""; - } - } -); - -la.LookupItem = ul4._inherit( - la.Base, - { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.User = ul4._inherit( - la.Base, - { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - //_ul4onattrs: ["id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.File = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.Geo = ul4._inherit( - la.Base, - { - create: function create(lat, long, info) - { - var geo = la.Base.create.call(this); - geo.lat = lat; - geo.long = long; - geo.info = info; - return geo; - }, - - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.Attachment = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.NoteAttachment = ul4._inherit( - la.Attachment, - { - type: "noteattachment", - __type__: "NoteAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } -); - -la.URLAttachment = ul4._inherit( - la.Attachment, - { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } -); - -la.FileAttachment = ul4._inherit( - la.Attachment, - { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } -); - -la.ImageAttachment = ul4._inherit( - la.Attachment, - { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) - } -); - -la.JSONAttachment = ul4._inherit( - la.Attachment, - { - type: "jsonattachment", - __type__: "JSONAttachment", - ul4ondump: function ul4ondump(encoder) - { - la.Attachment.ul4ondump.call(this, encoder); - encoder.dump(ul4._asjson(this.value)); - }, - ul4onload: function ul4onload(decoder) - { - la.Attachment.ul4onload.call(this, decoder); - this.value = ul4._fromjson(decoder.load()); - } - } -); - -la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.Category = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], - - __repr__: function repr() - { - var v = []; - var category = this; - while (category !== null) - { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } - } -); - -la.KeyView = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], - - __repr__: function repr() - { - return ""; - } - } -); - -la.AppParameter = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], - - __repr__: function repr() - { - return ""; - } - } -); - -var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" -]; - -for (var i = 0; i < classes.length; ++i) -{ - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); -} - -})(this); diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/ul4.js b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/ul4.js deleted file mode 100644 index 0ca2b53..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/modules/ul4.js +++ /dev/null @@ -1,9049 +0,0 @@ -/*! - * UL4/UL4ON JavaScript Library - * http://www.livinglogic.de/Python/ul4c/ - * http://www.livinglogic.de/Python/ul4on/ - * - * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany - * Copyright 2011-2017 by Walter Dörwald - * - * All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/*jslint vars: true */ - - -;(function(undefined){ - - var root = this, ul4 = {}, ul4on = {}; - - var isamd = typeof(define) === "function" && define.amd; - var iscommon = typeof(module) === "object" && module.exports; - - if (isamd) - { - // AMD - define(['../../node_modules/blueimp-md5/js/md5.min'], function (md5F) - { - window.md5 = md5F; - - return {ul4: ul4, ul4on: ul4on}; - }); - } - else if (iscommon) - { - // COMMONJS - module.exports.ul4 = ul4; - module.exports.ul4on = ul4on; - } - else - { - // DEFAULT - root.ul4 = ul4; - root.ul4on = ul4on; - } - - ul4.version = "42"; - - // - // UL4ON - // - - ul4on._registry = {}; - - ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); - - ul4on._havemapconstructor = false; - - if (ul4on._havemap) - { - try - { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) - { - } - } - - ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); - - ul4on._havesetconstructor = false; - - if (ul4on._haveset) - { - try - { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) - { - } - } - - // helper functions that work with Maps and objects - if (ul4on._havemap) - { - ul4on._makemap = function _makemap(...items) - { - let map = new Map(); - - for (let i = 0; i < items.length; ++i) - map.set(items[i][0], items[i][1]); - return map; - }; - - ul4on._setmap = function _setmap(map, key, value) - { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else - map[key] = value; - }; - - ul4on._emptymap = function _emptymap() - { - return new Map(); - }; - - ul4on._getmap = function _getmap(map, key, value) - { - if (map.__proto__ === Map.prototype) - return map.get(key); - else - return map[key]; - }; - } - else - { - ul4on._makemap = function _makemap(...items) - { - let map = {}; - - for (let i = 0; i < items.length; ++i) - map[items[i][0]] = items[i][1]; - return map; - }; - - ul4on._setmap = function _setmap(map, key, value) - { - map[key] = value; - }; - - ul4on._emptymap = function _emptymap() - { - return {}; - }; - - ul4on._getmap = function _getmap(map, key, value) - { - return map[key]; - }; - } - - // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) - if (ul4on._haveset) - { - ul4on._emptyset = function _emptyset() - { - return new Set(); - }; - } - else - { - ul4on._emptyset = function _emptyset() - { - return ul4._Set.create(); - }; - } - - ul4on._makeset = function _makeset(...items) - { - let set = ul4on._emptyset(); - - for (let i = 0; i < items.length; ++i) - set.add(items[i]); - return set; - }; - - // Register the object ``obj`` under the name ``name`` with the UL4ON machinery - ul4on.register = function register(name, obj) - { - obj.ul4onname = name; - ul4on._registry[name] = function(){return obj.create();}; - }; - - // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) - { - let encoder = ul4on.Encoder.create(indent); - encoder.dump(obj); - return encoder.finish(); - }; - - // Load an object from the string ``data``. - // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) - { - let decoder = ul4on.Decoder.create(data, registry); - return decoder.load(); - }; - - // Helper "class" for encoding - ul4on.Encoder = { - // Create a new Encoder object - create: function create(indent) - { - let encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line, ...args) - { - if (this.indent !== null) - { - for (let i = 0; i < this._level; ++i) - this.data.push(this.indent); - } - else - { - if (this.data.length) - this.data.push(" "); - } - this.data.push(line); - - if (args.length) - { - let oldindent = this.indent; - this.indent = null; - for (let i = 0; i < args.length; ++i) - this.dump(args[i]); - this.indent = oldindent; - } - - if (this.indent !== null) - this.data.push("\n"); - }, - - // Return the complete string written to the buffer - finish: function finish() - { - return this.data.join(""); - }, - - dump: function dump(obj) - { - if (obj === null) - this._line("n"); - else if (typeof(obj) == "boolean") - this._line(obj ? "bT" : "bF"); - else if (typeof(obj) == "number") - { - let type = (Math.round(obj) == obj) ? "i" : "f"; - this._line(type + obj); - } - else if (typeof(obj) == "string") - { - let index = this._strings2index[obj]; - if (typeof(index) !== "undefined") - { - this._line("^" + index); - } - else - { - this._strings2index[obj] = this._backrefs++; - let dump = ul4._str_repr(obj).replace("<", "\\x3c"); - this._line("S" + dump); - } - } - else if (ul4._iscolor(obj)) - this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); - else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); - else if (ul4._istimedelta(obj)) - this._line("t", obj.days(), obj.seconds(), obj.microseconds()); - else if (ul4._ismonthdelta(obj)) - this._line("m", obj.months()); - else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) - this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) - { - if (obj.__id__) - { - let index = this._ids2index[obj.__id__]; - if (typeof(index) != "undefined") - { - this._line("^" + index); - return; - } - } - if (obj.__id__) - this._ids2index[obj.__id__] = this._backrefs++; - this._line("O", obj.ul4onname); - ++this._level; - obj.ul4ondump(this); - --this._level; - this._line(")"); - } - else if (ul4._islist(obj)) - { - this._line("l"); - ++this._level; - for (let i = 0; i < obj.length; ++i) - this.dump(obj[i]); - --this._level; - this._line("]"); - } - else if (ul4._ismap(obj)) - { - this._line("e"); - ++this._level; - obj.forEach(function(value, key) { - this.dump(key); - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else if (ul4._isdict(obj)) - { - this._line("d"); - ++this._level; - for (let key in obj) - { - this.dump(key); - this.dump(obj[key]); - } - --this._level; - this._line("}"); - } - else if (ul4._isset(obj)) - { - this._line("y"); - ++this._level; - obj.forEach(function(value) { - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else - throw "can't handle object"; - } - }; - - // Helper "class" for decoding - ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) - { - let decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof(registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, - - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() - { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, - - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() - { - let re_white = /\s/; - - for (;;) - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - let c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; - } - }, - - // Read ``size`` characters from the buffer - read: function read(size) - { - if (this.pos+size > this.length) - size = this.length-this.pos; - let result = this.data.substring(this.pos, this.pos+size); - this.pos += size; - return result; - }, - - // "unread" one character - backup: function backup() - { - --this.pos; - }, - - // Read a number from the buffer - readnumber: function readnumber() - { - let re_digits = /[-+0123456789.eE]/, value = ""; - for (;;) - { - let c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else - { - let result = parseFloat(value); - if (isNaN(result)) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; - } - } - }, - - _beginfakeloading: function _beginfakeloading() - { - let oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, - - _endfakeloading: function _endfakeloading(oldpos, value) - { - this.backrefs[oldpos] = value; - }, - - _readescape: function _readescape(escapechar, length) - { - let chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - let codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, - - // Load the next object from the buffer - load: function load() - { - let typecode = this.readblackchar(); - let result; - switch (typecode) - { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - let delimiter = this.readblackchar(); - for (;;) - { - let c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") - { - let c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); - else - result.push("\\" + c2); - } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load()/1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - let key = this.load(); - let value = this.load(); - ul4on._setmap(result, key, value); - } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - let oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - let name = this.load(); - let proto; - if (this.registry !== null) - { - proto = this.registry[name]; - if (typeof(proto) === "undefined") - proto = ul4on._registry[name]; - } - else - proto = ul4on._registry[name]; - if (typeof(proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; - } - } - }; - - - // - // UL4 - // - - // REs for parsing JSON - ul4._rvalidchars = /^[\],:{}\s]*$/; - ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - - /// Helper functions - - // Crockford style object creation - ul4._simpleclone = function _simpleclone(obj) - { - function F(){}; - F.prototype = obj; - let result = new F(); - return result; - }; - - // Crockford style object creation + prototype chain + object ids - ul4._clone = function _clone(obj) - { - let result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; - }; - - // Adds attributes from on object to another and returns it - ul4._extend = function _extend(obj, attrs) - { - for (let name in attrs) - obj[name] = attrs[name]; - return obj; - }; - - // Clone an object via ``_simpleclone`` and extend it - ul4._simpleinherit = function _simpleinherit(baseobj, attrs) - { - return ul4._extend(ul4._simpleclone(baseobj), attrs); - }; - - // Clone an object via ``_clone`` and extend it - ul4._inherit = function _inherit(baseobj, attrs) - { - return ul4._extend(ul4._clone(baseobj), attrs); - }; - - // Convert a map to an object - ul4._map2object = function _map2object(obj) - { - if (ul4._ismap(obj)) - { - let newobj = {}; - obj.forEach(function(value, key){ - if (typeof(key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; - }; - - // Clip a number to the range [0;max) - ul4._bound = function _bound(value, upper) - { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; - }; - - // Create a pretty stacktrace from an exception - ul4._stacktrace = function _stacktrace(exc) - { - let output = ul4._type(exc); - let s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; - }; - - // Call a function ``f`` with UL4 argument handling - ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) - { - let finalargs; - if (needsobject) - { - if (signature === null) - { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; - } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else - { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); - }; - - ul4._callfunction = function _callfunction(context, f, args, kwargs) - { - let name = f._ul4_name || f.name; - if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", ul4._repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); - }; - - ul4._callobject = function _callobject(context, obj, args, kwargs) - { - if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4._repr(obj) + " is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); - }; - - ul4._callrender = function _callrender(context, obj, args, kwargs) - { - if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4._repr(obj) + " is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); - }; - - ul4._call = function _call(context, f, args, kwargs) - { - if (typeof(f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof(f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); - }; - - ul4._unpackvar = function _unpackvar(lvalue, value) - { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else - { - let newvalue = []; - let iter = ul4._iter(value); - - for (let i = 0;;++i) - { - let item = iter.next(); - - if (item.done) - { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else - { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } - }; - - ul4._formatsource = function _formatsource(out) - { - let finalout = []; - let level = 0, needlf = false; - for (let i = 0; i < out.length; ++i) - { - if (typeof(out[i]) === "number") - { - level += out[i]; - needlf = true; - } - else - { - if (needlf) - { - finalout.push("\n"); - for (let j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; - } - finalout.push(out[i]); - } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); - }; - - // Compare ``obj1`` and ``obj2`` if they have the same value - ul4._eq = function _eq(obj1, obj2) - { - let numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof(obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 == obj2; - else - return false; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); - else - return false; - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (let i = 0; i < obj1.length; ++i) - { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } - else - return false; - } - else if (ul4._isobject(obj1)) - { - if (ul4._isobject(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (let key in obj1) - { - if (obj2.hasOwnProperty(key)) - { - if (!ul4._eq(obj1[key], obj2[key])) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (let key in obj2) - { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (let key in obj1) - { - if (obj2.has(key)) - { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - let result = true; - obj2.forEach(function(value, key){ - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; - } - else - return false; - } - else if (ul4._ismap(obj1)) - { - if (ul4._isobject(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - let result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; - } - }); - if (!result) - return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (let key in obj2) - { - if (!obj1.has(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - let result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2.get(key))) - result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) - { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - let result = true; - obj1.forEach(function(value){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(value)) - result = false; - } - }); - return result; - } - else - return false; - } - else - return obj1 === obj2; - }; - - // Compare ``obj1`` and ``obj2`` if they don't have the same value - ul4._ne = function _ne(obj1, obj2) - { - if (obj1 && typeof(obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof(obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); - }; - - ul4._unorderable = function _unorderable(operator, obj1, obj2) - { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); - }; - - // Return: - // -1 when ``obj1 < obj2``, - // 0 when ``obj1 == obj2``, - // 1 when ``obj1 > obj2``, - // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) - // raise TypeError if objects are uncomparable - // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= - // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - - ul4._cmp = function _cmp(operator, obj1, obj2) - { - let numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - { - let v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); - } - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return 0; - for (let i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return 1; - let res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; - } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - let in1only = false; - let in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (let value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (let value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); - }; - - // Return whether ``obj1 < obj2`` - ul4._lt = function _lt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 < obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (let i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - let eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length < obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) - { - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (let value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (let value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); - }; - - // Return whether ``obj1 <= obj2`` - ul4._le = function _le(obj1, obj2) - { - let numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (let i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - let eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length <= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - let in1only = false; - let in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (let value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (let value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); - }; - - // Return whether ``obj1 > obj2`` - ul4._gt = function _gt(obj1, obj2) - { - let numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 > obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (let i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - let eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length > obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - let in1only = false; - let in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (let value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (let value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); - }; - - // Return whether ``obj1 >= obj2`` - ul4._ge = function _ge(obj1, obj2) - { - let numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (let i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - let eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length >= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - let in1only = false; - let in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (let value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (let value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (let value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); - }; - - // Return an iterator for ``obj`` - ul4._iter = function _iter(obj) - { - if (typeof(obj) === "string" || ul4._islist(obj)) - { - return { - index: 0, - next: function() - { - if (this.index < obj.length) - return {value: obj[this.index++], done: false}; - else - return {done: true}; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof(obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) - { - var keys = []; - obj.forEach(function(value, key){ - keys.push(key); - }); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - else if (ul4._isset(obj)) - { - let values = []; - obj.forEach(function(value, key){ - values.push(value); - }); - return { - index: 0, - next: function() - { - if (this.index >= values.length) - return {done: true}; - return {value: values[this.index++], done: false}; - } - }; - } - else if (ul4._isul4set(obj)) - { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) - { - let keys = []; - for (let key in obj) - keys.push(key); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); - }; - - ul4._str_repr = function _str_repr(str, ascii) - { - let result = ""; - let squote = false, dquote = false; - - for (let i = 0; i "; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof(obj) === "undefined") - return ""; - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; - }; - - // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` - ul4._repr = function _repr(obj) - { - return ul4._repr_internal(obj, false); - }; - - ul4._ascii = function _ascii(obj) - { - return ul4._repr_internal(obj, true); - }; - - ul4._date_str = function _date_str(obj) - { - let year = obj.getFullYear(); - let month = obj.getMonth()+1; - let day = obj.getDate(); - let hour = obj.getHours(); - let minute = obj.getMinutes(); - let second = obj.getSeconds(); - let ms = obj.getMilliseconds(); - - let result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; - }; - - ul4._str = function _str(obj) - { - if (typeof(obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof(obj) === "string") - return obj; - else if (typeof(obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") - return obj.__str__(); - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; - }; - - // Convert ``obj`` to bool, according to its "truth value" - ul4._bool = function _bool(obj) - { - if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else - { - if (typeof(obj) === "object", typeof(obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) - { - for (var key in obj) - { - if (!obj.hasOwnProperty(key)) - continue; - return true; - } - return false; - } - return true; - } - }; - - // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) - ul4._int = function _int(obj, base) - { - var result; - if (base !== null) - { - if (typeof(obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else - { - if (typeof(obj) == "string") - { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else if (typeof(obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } - }; - - // Convert ``obj`` to a float - ul4._float = function _float(obj) - { - if (typeof(obj) === "string") - return parseFloat(obj); - else if (typeof(obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); - }; - - // Convert ``obj`` to a list - ul4._list = function _list(obj) - { - var iter = ul4._iter(obj); - - var result = []; - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } - }; - - // Convert ``obj`` to a set - ul4._set = function _set(obj) - { - var iter = ul4._iter(obj); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } - }; - - // Return the length of ``sequence`` - ul4._len = function _len(sequence) - { - if (typeof(sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) - { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); - }; - - ul4._type = function _type(obj) - { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof(obj) === "undefined") - return "undefined"; - else if (typeof(obj) === "string") - return "str"; - else if (typeof(obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof(obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; - }; - - - // Return the attribute with the name ``attrname`` of the object ``obj`` - // If ``obj`` doesn't have such an attribute, return ``default_`` - ul4._getattr = function _getattr(obj, attrname, default_=null) - { - var proto = ul4.Protocol.get(obj); - try - { - return proto.getattr(obj, attrname); - } - catch (exc) - { - if (ul4.AttributeError.isprotoof(exc) && exc.obj === obj) - return default_; - else - throw exc; - } - }; - - // Return wether the object ``obj`` has an attribute with the name ``attrname`` - ul4._hasattr = function _hasattr(obj, attrname) - { - var proto = ul4.Protocol.get(obj); - return proto.hasattr(obj, attrname); - }; - - // Return the names of the attributes of the object ``obj`` as a set. - ul4._dir = function _dir(obj) - { - var proto = ul4.Protocol.get(obj); - return proto.dir(); - }; - - // Return whether any of the items in ``iterable`` are true - ul4._any = function _any(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } - }; - - // Return whether all of the items in ``iterable`` are true - ul4._all = function _all(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } - }; - - // Check if ``obj`` is undefined - ul4._isundefined = function _isundefined(obj) - { - return typeof(obj) === "undefined"; - }; - - - // Check if ``obj`` is *not* undefined - ul4._isdefined = function _isdefined(obj) - { - return typeof(obj) !== "undefined"; - }; - - // Check if ``obj`` is ``None`` - ul4._isnone = function _isnone(obj) - { - return obj === null; - }; - - // Check if ``obj`` is a boolean - ul4._isbool = function _isbool(obj) - { - return typeof(obj) == "boolean"; - }; - - // Check if ``obj`` is a int - ul4._isint = function _isint(obj) - { - return (typeof(obj) == "number") && Math.round(obj) == obj; - }; - - // Check if ``obj`` is a float - ul4._isfloat = function _isfloat(obj) - { - return (typeof(obj) == "number") && Math.round(obj) != obj; - }; - - // Check if ``obj`` is a string - ul4._isstr = function _isstr(obj) - { - return typeof(obj) == "string"; - }; - - // Check if ``obj`` is a date - ul4._isdate = function _isdate(obj) - { - return Object.prototype.toString.call(obj) == "[object Date]"; - }; - - // Check if ``obj`` is a color - ul4._iscolor = function _iscolor(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); - }; - - // Check if ``obj`` is a timedelta object - ul4._istimedelta = function _istimedelta(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); - }; - - // Check if ``obj`` is a monthdelta object - ul4._ismonthdelta = function _ismonthdelta(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); - }; - - // Check if ``obj`` is a template - ul4._istemplate = function _istemplate(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); - }; - - // Check if ``obj`` is a function - ul4._isfunction = function _isfunction(obj) - { - return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); - }; - - // Check if ``obj`` is a list - ul4._islist = function _islist(obj) - { - return Object.prototype.toString.call(obj) == "[object Array]"; - }; - - // Check if ``obj`` is a set - ul4._isset = function _isset(obj) - { - return Object.prototype.toString.call(obj) == "[object Set]"; - }; - - // Check if ``obj`` is an exception (at least a UL4 exception) - ul4._isexception = function _isexception(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); - }; - - ul4._isul4set = function _isul4set(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); - }; - - // Check if ``obj`` is an iterator - ul4._isiter = function _isiter(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; - }; - - // Check if ``obj`` is a JS object - ul4._isobject = function _isobject(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; - }; - - if (ul4on._havemap) - { - // Check if ``obj`` is a ``Map`` - ul4._ismap = function _ismap(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - }; - - // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) - ul4._isdict = function _isdict(obj) - { - return ul4._isobject(obj) || ul4._ismap(obj); - }; - } - else - { - ul4._ismap = function _ismap(obj) - { - return false; - }; - - ul4._isdict = function _isdict(obj) - { - return ul4._isobject(obj); - }; - } - - // Repeat string ``str`` ``rep`` times - ul4._str_repeat = function _str_repeat(str, rep) - { - let result = ""; - for (; rep>0; --rep) - result += str; - return result; - }; - - ul4._list_repeat = function _list_repeat(list, rep) - { - let result = []; - for (; rep>0; --rep) - for (let i = 0; i < list.length; ++i) - result.push(list[i]); - return result; - }; - - ul4._str_json = function _str_json(str) - { - let result = ""; - for (let i = 0; i < str.length; ++i) - { - let c = str[i]; - switch (c) - { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - case '<': - result += '\\u003c'; - break; - default: - let code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; - }; - - // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) - ul4._asjson = function _asjson(obj) - { - if (obj === null) - return "null"; - else if (typeof(obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof(obj) === "string") - return ul4._str_json(obj); - else if (typeof(obj) === "number") - { - return "" + obj; - } - else if (ul4._islist(obj)) - { - let v = []; - v.push("["); - for (let i = 0; i < obj.length; ++i) - { - if (i != 0) - v.push(", "); - v.push(ul4._asjson(obj[i])); - } - v.push("]"); - return v.join(""); - } - else if (ul4._ismap(obj)) - { - let v = []; - v.push("{"); - let i = 0; - obj.forEach(function(value, key){ - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); - v.push("}"); - return v.join(""); - } - else if (ul4._isobject(obj)) - { - let v = []; - v.push("{"); - let i = 0; - for (let key in obj) - { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(obj[key])); - } - v.push("}"); - return v.join(""); - } - else if (ul4._isdate(obj)) - { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) - { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) - { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) - { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) - { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); - }; - - // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object - ul4._fromjson = function _fromjson(string) - { - // The following is from jQuery's parseJSON function - string = ul4._strip(string); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); - }; - - // Encodes ``obj`` in the UL4 Object Notation format - ul4._asul4on = function _asul4on(obj) - { - return ul4on.dumps(obj); - }; - - // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object - ul4._fromul4on = function _fromul4on(string) - { - return ul4on.loads(string); - }; - - ul4._format_date = function _format_date(obj, fmt, lang) - { - let translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - let translation = translations[lang]; - - let firstday; - - let result = []; - let inspec = false; - for (let i = 0; i < fmt.length; ++i) - { - let c = fmt[i]; - if (inspec) - { - switch (c) - { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth()+1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; - } - result.push(c); - inspec = false; - } - else - { - if (c == "%") - inspec = true; - else - result.push(c); - } - } - return result.join(""); - }; - - ul4._format_int = function _format_int(obj, fmt, lang) - { - let work = fmt; - - // Defaults - let fill = ' '; - let align = '>'; // '<', '>', '=' or '^' - let sign = '-'; // '+', '-' or ' ' - let alternate = false; - let minimumwidth = 0; - let type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) - { - type = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract minimum width - if (/\d+$/.test(work)) - { - let minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) - { - align = '='; - fill = '0'; - } - minimumwidth = parseInt(minimumwidthStr); - } - - // Alternate form? - if (/#$/.test(work)) - { - alternate = true; - work = work.substring(0, work.length-1); - } - - // Determine sign - if (/[+ -]$/.test(work)) - { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) - { - if (/[<>=^]$/.test(work)) - { - align = work[1]; - fill = work[0]; - } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) - { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - - // Basic number formatting - let neg = obj < 0; - - if (neg) - obj = -obj; - - let output; - switch (type) - { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } - - // The rest of the formatting - if (align === '=') - { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; - - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; - - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else - { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) - { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth-output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - else // if (align == '^') - { - let pad = minimumwidth - output.length; - let padBefore = Math.floor(pad/2); - let padAfter = pad-padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } - } - } - return output; - }; - - // Format ``obj`` using the format string ``fmt`` in the language ``lang`` - ul4._format = function _format(obj, fmt, lang) - { - if (typeof(lang) === "undefined" || lang === null) - lang = "en"; - else - { - let translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; - lang = lang.toLowerCase(); - if (typeof(translations[lang]) === "undefined") - { - lang = lang.split(/_/)[0]; - if (typeof(translations[lang]) === "undefined") - lang = "en"; - } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); - }; - - ul4._lpad = function _lpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; - }; - - ul4._rpad = function _rpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; - }; - - ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) - { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - - isprotoof: function isprotoof(obj) - { - while (true) - { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; - } - }, - - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) - { - return this === other; - }, - - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) - { - return !this.__eq__(other); - }, - - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` - - __bool__: function __bool__() - { - return true; - } - }; - - ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create(...args) - { - let signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - let nextDefault = false; - let lastArgname = null; - for (let i = 0; i < args.length; ++i) - { - let argName = args[i]; - if (nextDefault) - { - signature.args.push({name: lastArgname, defaultValue: argName}); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else - { - if (argName.substr(argName.length-1) === "=") - { - lastArgname = argName.substr(0, argName.length-1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else - { - signature.args.push({name: argName}); - signature.argNames[argName] = true; - } - } - } - return signature; - }, - - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) - { - let finalargs = []; - let decname = name !== null ? name + "() " : ""; - - for (let i = 0; i < this.args.length; ++i) - { - let arg = this.args[i]; - if (i < args.length) - { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else - { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else - { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } - } - } - - // Do we accept additional positional arguments? - if (this.remargs === null) - { - // No, but we have them -> complain - if (args.length > this.args.length) - { - let prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else - { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } - - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) - { - // No => complain about unknown ones - for (let key in kwargs) - { - if (!this.argNames[key]) - { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else - { - // Yes => Put the unknown ones into an object and add that to the arguments array - let remkwargs = ul4on._emptymap(); - for (let key in kwargs) - { - if (!this.argNames[key]) - ul4on._setmap(remkwargs, key, kwargs[key]); - } - finalargs.push(remkwargs); - } - - return finalargs; - }, - - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) - { - args = this.bindArray(name, args, kwargs); - let argObject = {}; - let i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, - - __repr__: function __repr__() - { - return ""; - }, - - __str__: function __str__() - { - return this.toString(); - }, - - toString: function toString() - { - let v = []; - for (let i = 0; i < this.args.length; ++i) - { - let arg = this.args[i]; - - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); - } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; - } - } - ); - - // Adds name and signature to a function/method and makes the method callable in templates - ul4.expose = function expose(signature, options, f) - { - if (typeof(f) === "undefined") - { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; - }; - - // Protocol objects for all builtin types - ul4.Protocol = { - attrs: ul4on._emptyset(), - - dir: function dir() { - return this.attrs; - }, - - get: function get(obj) - { - if (ul4._isstr(obj)) - return ul4.StrProtocol; - else if (ul4._islist(obj)) - return ul4.ListProtocol; - else if (ul4._isset(obj)) - return ul4.SetProtocol; - else if (ul4._ismap(obj)) - return ul4.MapProtocol; - else if (ul4._isobject(obj)) - return ul4.ObjectProtocol; - else if (ul4._isdate(obj)) - return ul4.DateProtocol; - else - return ul4.Protocol; - }, - - getattr: function getattr(obj, attrname) - { - if (obj === null || typeof(obj) === "undefined") - throw ul4.AttributeError.create(obj, attrname); - else if (typeof(obj.__getattr__) === "function") - return obj.__getattr__(attrname); - else if (this.attrs.has(attrname)) - { - let attr = this[attrname]; - let realattr = function realattr(...args) { - return attr.apply(this, [obj, ...args]); - }; - realattr.name = attr.name; - realattr._ul4_name = attr._ul4_name || attr.name; - realattr._ul4_signature = attr._ul4_signature; - realattr._ul4_needsobject = attr._ul4_needsobject; - realattr._ul4_needscontext = attr._ul4_needscontext; - return realattr; - } - else - throw ul4.AttributeError.create(obj, attrname); - }, - - hasattr: function hasattr(obj, attrname) - { - if (obj === null || typeof(obj) === "undefined") - return false; - else if (typeof(obj.__getattr__) === "function") - { - try - { - obj.__getattr__(attrname); - return true; - } - catch (exc) - { - if (ul4.AttributeError.isprotoof(exc) && exc.obj === object) - return false; - else - throw exc; - } - } - else - return this.attrs.has(attrname); - } - }; - - ul4.StrProtocol = ul4._inherit(ul4.Protocol, { - name: "str", - - attrs: ul4on._makeset( - "split", - "rsplit", - "splitlines", - "strip", - "lstrip", - "rstrip", - "upper", - "lower", - "capitalize", - "startswith", - "endswith", - "replace", - "count", - "find", - "rfind", - "join" - ), - - count: ul4.expose(["sub", "start=", null, "end=", null], function count(obj, sub, start, end){ - return ul4._count(obj, sub, start, end); - }), - - find: ul4.expose(["sub", "start=", null, "end=", null], function find(obj, sub, start, end){ - return ul4._find(obj, sub, start, end); - }), - - rfind: ul4.expose(["sub", "start=", null, "end=", null], function rfind(obj, sub, start, end){ - return ul4._rfind(obj, sub, start, end); - }), - - replace: ul4.expose(["old", "new", "count=", null], function replace(obj, old, new_, count){ - return ul4._replace(obj, old, new_, count); - }), - - strip: ul4.expose(["chars=", null], function strip(obj, chars){ - return ul4._strip(obj, chars); - }), - - lstrip: ul4.expose(["chars=", null], function lstrip(obj, chars){ - return ul4._lstrip(obj, chars); - }), - - rstrip: ul4.expose(["chars=", null], function rstrip(obj, chars){ - return ul4._rstrip(obj, chars); - }), - - split: ul4.expose(["sep=", null, "count=", null], function split(obj, sep, count){ - return ul4._split(obj, sep, count); - }), - - rsplit: ul4.expose(["sep=", null, "count=", null], function rsplit(obj, sep, count){ - return ul4._rsplit(obj, sep, count); - }), - - splitlines: ul4.expose(["keepends=", false], function splitlines(obj, keepends){ - return ul4._splitlines(obj, keepends); - }), - - lower: ul4.expose([], function lower(obj){ - return obj.toLowerCase(); - }), - - upper: ul4.expose([], function upper(obj){ - return obj.toUpperCase(); - }), - - capitalize: ul4.expose([], function capitalize(obj){ - return ul4._capitalize(obj); - }), - - join: ul4.expose(["iterable"], function join(obj, iterable){ - return ul4._join(obj, iterable); - }), - - startswith: ul4.expose(["prefix"], function startswith(obj, prefix){ - return ul4._startswith(obj, prefix); - }), - - endswith: ul4.expose(["suffix"], function endswith(obj, suffix){ - return ul4._endswith(obj, suffix); - }) - }); - - ul4.ListProtocol = ul4._inherit(ul4.Protocol, { - name: "list", - - attrs: ul4on._makeset("append", "insert", "pop", "count", "find", "rfind"), - - append: ul4.expose(["*items"], function append(obj, items){ - return ul4._append(obj, ...items); - }), - - insert: ul4.expose(["pos", "*items"], function insert(obj, pos, items){ - return ul4._insert(obj, pos, ...items); - }), - - pop: ul4.expose(["pos=", -1], function pop(obj, pos){ - return ul4._pop(obj, pos); - }), - - count: ul4.expose(["sub", "start=", null, "end=", null], function count(obj, sub, start, end){ - return ul4._count(obj, sub, start, end); - }), - - find: ul4.expose(["sub", "start=", null, "end=", null], function find(obj, sub, start, end){ - return ul4._find(obj, sub, start, end); - }), - - rfind: ul4.expose(["sub", "start=", null, "end=", null], function rfind(obj, sub, start, end){ - return ul4._rfind(obj, sub, start, end); - }) - }); - - - ul4.MapProtocol = ul4._inherit(ul4.Protocol, { - name: "dict", - - attrs: ul4on._makeset("get", "items", "values", "update", "clear"), - - getattr: function getattr(obj, attrname) - { - if (this.attrs.has(attrname)) - { - let attr = this[attrname]; - let realattr = function realattr(...args) { - return attr.apply(this, [obj, ...args]); - }; - realattr.name = attr.name; - realattr._ul4_name = attr._ul4_name || attr.name; - realattr._ul4_signature = attr._ul4_signature; - realattr._ul4_needsobject = attr._ul4_needsobject; - realattr._ul4_needscontext = attr._ul4_needscontext; - return realattr; - } - else - return obj.get(attrname); - }, - - get: ul4.expose(["key", "default=", null], function get(obj, key, default_){ - return ul4._get(obj, key, default_); - }), - - items: ul4.expose([], function items(obj){ - return ul4._items(obj); - }), - - values: ul4.expose([], function values(obj){ - return ul4._values(obj); - }), - - update: ul4.expose(["*other", "**kwargs"], function update(obj, other, kwargs){ - return ul4._update(obj, other, kwargs); - }), - - clear: ul4.expose([], function clear(obj){ - return ul4._clear(obj); - }) - }); - - ul4.SetProtocol = ul4._inherit(ul4.Protocol, { - name: "set", - - attrs: ul4on._makeset("add", "clear"), - - add: ul4.expose(["*items"], function add(obj, items){ - for (let i = 0; i < items.length; ++i) - obj.add(items[i]); - }), - - clear: ul4.expose([], function clear(obj){ - return ul4._clear(obj); - }) - }); - - ul4.DateProtocol = ul4._inherit(ul4.Protocol, { - name: "date", - - attrs: ul4on._makeset("weekday", "week", "day", "month", "year", "hour", "minute", "second", "microsecond", "mimeformat", "isoformat", "yearday"), - - weekday: ul4.expose([], function weekday(obj){ - return ul4._weekday(obj); - }), - - week: ul4.expose(["firstweekday=", null], function week(obj, firstweekday){ - return ul4._week(obj, firstweekday); - }), - - day: ul4.expose([], function day(obj){ - return obj.getDate(); - }), - - month: ul4.expose([], function month(obj){ - return obj.getMonth()+1; - }), - - year: ul4.expose([], function year(obj){ - return obj.getFullYear(); - }), - - hour: ul4.expose([], function hour(obj){ - return obj.getHours(); - }), - - minute: ul4.expose([], function minute(obj){ - return obj.getMinutes(); - }), - - second: ul4.expose([], function second(obj){ - return obj.getSeconds(); - }), - - microsecond: ul4.expose([], function microsecond(obj){ - return obj.getMilliseconds() * 1000; - }), - - mimeformat: ul4.expose([], function mimeformat(obj){ - return ul4._mimeformat(obj); - }), - - isoformat: ul4.expose([], function isoformat(obj){ - return ul4._isoformat(obj); - }), - - yearday: ul4.expose([], function yearday(obj){ - return ul4._yearday(obj); - }) - }); - - ul4.ObjectProtocol = ul4._inherit(ul4.Protocol, { - name: "dict", - - getattr: function getattr(obj, attrname) - { - let result; - if (obj && typeof(obj.__getattr__) === "function") // test this before the generic object test - result = obj.__getattr__(attrname); - else - result = obj[attrname]; - if (typeof(result) !== "function") - return result; - let realresult = function(...args) { - // We can use ``apply`` here, as we know that ``obj`` is a real object. - return result.apply(obj, args); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } - }); - - ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) - { - if (vars === null || typeof(vars) === "undefined") - vars = {}; - let context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, - - /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. - * This is used by the various comprehensions to avoid leaking loop variables. - */ - inheritvars: function inheritvars() - { - let context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); - return context; - }, - - /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) - { - let context = ul4._clone(this); - if (indent !== null) - { - context.indents = this.indents.slice(); - context.indents.push(indent); - } - return context; - }, - - /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() - { - let context = ul4._clone(this); - context._output = []; - return context; - }, - - clone: function clone(vars) - { - return ul4._clone(this); - }, - - output: function output(value) - { - this._output.push(value); - }, - - getoutput: function getoutput() - { - return this._output.join(""); - }, - - get: function get(name) - { - return this.vars[name]; - }, - - set: function set(name, value) - { - this.vars[name] = value; - } - } - ); - - /// Exceptions - - ul4.Exception = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Exception", - "cause": null, - - create: function create(result) - { - let exception = ul4._clone(this); - return exception; - }, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - default: - throw ul4.AttributeError.create(this, attrname); - } - } - } - ); - - // Exceptions used internally by UL4 for flow control - ul4.InternalException = ul4._inherit(ul4.Exception, {}); - - // Control flow exceptions - ul4.ReturnException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ReturnException", - - create: function create(result) - { - let exception = ul4.InternalException.create.call(this); - exception.result = result; - return exception; - } - } - ); - - ul4.BreakException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.BreakException" - } - ); - - ul4.ContinueException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ContinueException" - } - ); - - // Real exceptions raised by various parts of UL4 - ul4.SyntaxError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.SyntaxError" - } - ); - - ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, - { - __type__: "ul4.LValueRequiredError", - - toString: function toString() - { - return "lvalue required!"; - } - } - ); - - ul4.TypeError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.TypeError", - - create: function create(operation, message) - { - let exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ValueError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ValueError", - - create: function create(message) - { - let exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ArgumentError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ArgumentError", - - create: function create(message) - { - let exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.IndexError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.IndexError", - - create: function create(obj, index) - { - let exception = ul4._clone(this); - exception.obj = obj; - exception.index = index; - return exception; - }, - - toString: function toString() - { - return "index " + this.index + " out of range for " + ul4._type(this.obj); - } - } - ); - - ul4.AttributeError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.AttributeError", - - create: function create(obj, attrname) - { - let exception = ul4._clone(this); - exception.obj = obj; - exception.attrname = attrname; - return exception; - }, - toString: function toString() - { - return "object of type " + ul4._type(this.obj) + " has no attribute " + ul4._repr(this.attrname); - } - } - ); - - /// Exception that wraps other exceptions while they bubble up the stack - ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", - - create: function create(location, cause) - { - let exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, - - _templateprefix: function(template) - { - let out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - let first = true; - while (template != null) - { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; - } - return out.join(""); - }, - - _template: function _template() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else - { - let tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; - } - }, - - _innerpos: function _innerpos() - { - return this.location.pos; - }, - - toString: function toString() - { - let template = this._template(); - let templateprefix = this._templateprefix(template); - let outerpos = this._outerpos(); - let innerpos = this._innerpos(); - - let prefix = template.source.substring(outerpos.start, innerpos.start); - let code = template.source.substring(innerpos.start, innerpos.stop); - let suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - let text = prefix + code + suffix; - let underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - let lineno = 1, colno = 1; - for (let i = 0; i < innerpos.start; ++i) - { - if (template.source[i] === "\n") - { - ++lineno; - colno = 1; - } - else - ++colno; - } - - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - var message = templateprefix + ": " + pos + "\n" + text + "\n" + underline; - if (this.cause !== null) - message += "\n\n" + this.cause.toString(); - return message; - }, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - throw ul4.AttributeError.create(this, attrname); - } - } - } - ); - - - /// Classes for the syntax tree - ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) - { - let ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() - { - let out = []; - this._str(out); - return ul4._formatsource(out); - }, - __repr__: function __repr__() - { - let out = []; - this._repr(out); - return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, value) - { - try - { - return this._eval_set(context, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_set: function _eval_set(context, value) - { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) - { - try - { - return this._eval_modify(context, operator, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_modify: function _eval_modify(context, operator, value) - { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) - { - }, - _str: function _str(out) - { - }, - ul4ondump: function ul4ondump(encoder) - { - for (let i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) - { - for (let i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) - { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } - ); - - ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) - { - let text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() - { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) - { - context.output(this._text()); - }, - _str: function _str(out) - { - out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) - { - let indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) - { - if (typeof(this.template) !== "undefined") - { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() - { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); - else - return this.text; - }, - _eval: function _eval(context) - { - for (let i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) - encoder.dump(null); - else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) - { - out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.LineEndAST = ul4._inherit( - ul4.TextAST, - { - _str: function _str(out) - { - out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) - { - let tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() - { - if (typeof(this.template) !== "undefined") - { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else - { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } - ); - - ul4.CodeAST = ul4._inherit( - ul4.AST, - { - create: function create(tag, pos) - { - let code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) - { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - } - } - ); - - ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) - { - let constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this.value; - } - } - ); - - ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, - { - _handle_eval_list: function _handle_eval_list(context, result) - { - try - { - return this._eval_list(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, result) - { - try - { - return this._eval_set(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) - { - try - { - return this._eval_dict(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) - { - try - { - return this._eval_call(context, args, kwargs); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - throw ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - let seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - let value = this.value._handle_eval(context); - result.push(value); - }, - _eval_set: function _eval_set(context, result) - { - let value = this.value._handle_eval(context); - result.add(value); - } - } - ); - - - ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - let unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - let value = this.value._handle_eval(context); - for (let iter = ul4._iter(value);;) - { - let item = iter.next(); - if (item.done) - break; - result.push(item.value); - } - }, - _eval_set: function _eval_set(context, result) - { - let value = this.value._handle_eval(context); - for (let iter = ul4._iter(value);;) - { - let item = iter.next(); - if (item.done) - break; - result.add(item.value); - } - } - } - ); - - ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) - { - let dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - let key = this.key._handle_eval(context); - let value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); - } - } - ); - - ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - let unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - let item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (let i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - let key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - ul4on._setmap(result, key, value); - }); - } - else if (ul4._isobject(item)) - { - for (let key in item) - ul4on._setmap(result, key, item[key]); - } - } - } - ); - - ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - let arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - let value = this.value._handle_eval(context); - args.push(value); - } - } - ); - - ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) - { - let arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - let value = this.value._handle_eval(context); - kwargs[this.name] = value; - } - } - ); - - ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - let arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - let item = this.item._handle_eval(context); - args.push(...item); - } - } - ); - - ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - let arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - let item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (let i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - let key = item[i][0], value = item[i][1]; - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - }); - } - else if (ul4._isobject(item)) - { - for (let key in item) - { - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = item[key]; - } - } - } - } - ); - - ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - let list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let result = []; - for (let i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); - return result; - } - } - ); - - ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - let listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let container = this.container._handle_eval(context); - - let localcontext = context.inheritvars(); - - let result = []; - for (let iter = ul4._iter(container);;) - { - let item = iter.next(); - if (item.done) - break; - let varitems = ul4._unpackvar(this.varname, item.value); - for (let i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.push(this.item._handle_eval(localcontext)); - } - return result; - } - } - ); - - ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - let dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let result = ul4on._emptymap(); - for (let i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); - return result; - } - } - ); - - ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) - { - let listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let container = this.container._handle_eval(context); - - let localcontext = context.inheritvars(); - - let result = ul4on._emptymap(); - - for (let iter = ul4._iter(container);;) - { - let item = iter.next(); - if (item.done) - break; - let varitems = ul4._unpackvar(this.varname, item.value); - for (let i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - { - let key = this.key._handle_eval(localcontext); - let value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); - } - } - - return result; - } - } - ); - - ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - let set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (let i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); - - return result; - } - } - ); - - ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - let setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let container = this.container._handle_eval(context); - - let localcontext = context.inheritvars(); - - let result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (let iter = ul4._iter(container);;) - { - let item = iter.next(); - if (item.done) - break; - let varitems = ul4._unpackvar(this.varname, item.value); - for (let i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); - } - - return result; - } - } - ); - - ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - let genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let container = this.container._handle_eval(context); - let iter = ul4._iter(container); - - let localcontext = context.inheritvars(); - - let self = this; - - let result = { - next: function(){ - while (true) - { - let item = iter.next(); - if (item.done) - return item; - let varitems = ul4._unpackvar(self.varname, item.value); - for (let i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) - { - let value = self.item._handle_eval(localcontext); - return {value: value, done: false}; - } - } - } - }; - - return result; - } - } - ); - - ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) - { - let variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) - { - this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) - { - let result = context.get(name); - if (typeof(result) === "undefined") - result = ul4.functions[name]; - return result; - }, - _set: function _set(context, name, value) - { - context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) - { - var newvalue = operator._ido(context.get(name), value); - context.set(name, newvalue); - } - } - ); - - ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) - { - let unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" obj="); - this.obj._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - let obj = this.obj._handle_eval(context); - return this._do(obj); - } - } - ); - - // Negation - ul4.NegAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - if (obj !== null && typeof(obj.__neg__) === "function") - return obj.__neg__(); - return -obj; - } - } - ); - - // Bitwise not - ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return -obj-1; - } - } - ); - - // Not - ul4.NotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return !ul4._bool(obj); - } - } - ); - - // If expression - ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) - { - let ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(+1); - out.push("objif="); - this.objif._repr(out); - out.push(0); - out.push("objcond="); - this.objcond._repr(out); - out.push(0); - out.push("objelse="); - this.objelse._repr(out); - out.push(-1); - out.push(">"); - }, - _eval: function _eval(context) - { - let result; - var condvalue = this.objcond._handle_eval(context); - if (ul4._bool(condvalue)) - result = this.objif._handle_eval(context); - else - result = this.objelse._handle_eval(context); - return result; - } - } - ); - - ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - let result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) - { - out.push("return "); - this.obj._str(out); - } - } - ); - - ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - let obj = this.obj._handle_eval(context); - let output = ul4._str(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("print "); - this.obj._str(out); - } - } - ); - - ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - let obj = this.obj._handle_eval(context); - let output = ul4._xmlescape(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("printx "); - this.obj._str(out); - } - } - ); - - ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) - { - let binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.type); - out.push(" obj1="); - this.obj1._repr(out); - out.push(" obj2="); - this.obj2._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - let obj1 = this.obj1._handle_eval(context); - let obj2 = this.obj2._handle_eval(context); - return this._do(obj1, obj2); - } - } - ); - - // Item access and assignment: dict[key], list[index], string[index], color[index] - ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - let result = this._get(obj1, obj2); - return result; - }, - _eval_set: function _eval_set(context, value) - { - let obj1 = this.obj1._handle_eval(context); - let obj2 = this.obj2._handle_eval(context); - this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - let obj1 = this.obj1._handle_eval(context); - let obj2 = this.obj2._handle_eval(context); - this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) - { - if (typeof(container) === "string" || ul4._islist(container)) - { - if (ul4.slice.isprotoof(key)) - { - let start = key.start, stop = key.stop; - if (typeof(start) === "undefined" || start === null) - start = 0; - if (typeof(stop) === "undefined" || stop === null) - stop = container.length; - return container.slice(start, stop); - } - else - { - let orgkey = key; - if (key < 0) - key += container.length; - if (key < 0 || key >= container.length) - throw ul4.IndexError.create(container, orgkey); - return container[key]; - } - } - else if (container && typeof(container.__getitem__) === "function") // objects without ``_getitem__`` don't support item access - return container.__getitem__(key); - else if (ul4._ismap(container)) - return container.get(key); - else if (ul4._isobject(container)) - return container[key]; - else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) - { - if (ul4._islist(container)) - { - if (ul4.slice.isprotoof(key)) - { - let start = key.start, stop = key.stop; - if (start === null) - start = 0; - else if (start < 0) - start += container.length; - if (start < 0) - start = 0; - else if (start > container.length) - start = container.length; - if (stop === null) - stop = container.length; - else if (stop < 0) - stop += container.length; - if (stop < 0) - stop = 0; - else if (stop > container.length) - stop = container.length; - if (stop < start) - stop = start; - container.splice(start, stop-start); // Remove old element - for (let iter = ul4._iter(value);;) - { - let item = iter.next(); - if (item.done) - break; - container.splice(start++, 0, item.value); - } - } - else - { - let orgkey = key; - if (key < 0) - key += container.length; - if (key < 0 || key >= container.length) - throw ul4.IndexError.create(container, orgkey); - container[key] = value; - } - } - else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test - container.__setitem__(key, value); - else if (ul4._ismap(container)) - container.set(key, value); - else if (ul4._isobject(container)) - container[key] = value; - else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) - { - this._set(container, key, operator._ido(this._get(container, key), value)); - } - } - ); - - // Identifty test operator ``is`` - ul4.IsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 === obj2; - } - } - ); - - // Inverted tdentifty test operator ``is not`` - ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 !== obj2; - } - } - ); - - // Comparison operator == - ul4.EQAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._eq(obj1, obj2); - } - } - ); - - // Comparison operator != - ul4.NEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ne(obj1, obj2); - } - } - ); - - // Comparison operator < - ul4.LTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._lt(obj1, obj2); - } - } - ); - - // Comparison operator <= - ul4.LEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._le(obj1, obj2); - } - } - ); - - // Comparison operator > - ul4.GTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._gt(obj1, obj2); - } - } - ); - - // Comparison operator >= - ul4.GEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ge(obj1, obj2); - } - } - ); - - // Containment test: string in string, obj in list, key in dict, value in rgb - ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - if (typeof(obj) === "string" && typeof(container) === "string") - { - return container.indexOf(obj) !== -1; - } - else if (ul4._islist(container)) - { - return container.indexOf(obj) !== -1; - } - else if (container && typeof(container.__contains__) === "function") // test this before the generic object test - return container.__contains__(obj); - else if (ul4._ismap(container) || ul4._isset(container)) - return container.has(obj); - else if (ul4._isobject(container)) - { - for (let key in container) - { - if (key === obj) - return true; - } - return false; - } - else if (ul4._iscolor(container)) - { - return container._r === obj || container._g === obj || container._b === obj || container._a === obj; - } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); - } - } - ); - - // Inverted containment test - ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - return !ul4.ContainsAST._do(obj, container); - } - } - ); - - // Addition: num + num, string + string - ul4.AddAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__add__) === "function") - return obj1.__add__(obj2); - else if (obj2 && typeof(obj2.__radd__) === "function") - return obj2.__radd__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) - return [...obj1, ...obj2]; - else - return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - ul4._append(obj1, ...obj2); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Substraction: num - num - ul4.SubAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__sub__) === "function") - return obj1.__sub__(obj2); - else if (obj2 && typeof(obj2.__rsub__) === "function") - return obj2.__rsub__(obj1); - else if (ul4._isdate(obj1) && ul4._isdate(obj2)) - return this._date_sub(obj1, obj2); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); - return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) - { - let swap = (obj2 > obj1); - - if (swap) - { - let t = obj1; - obj1 = obj2; - obj2 = t; - } - // From now on obj1 is > than obj2 - - let year1 = obj1.getFullYear(); - let yearday1 = ul4._yearday(obj1); - let year2 = obj2.getFullYear(); - let yearday2 = ul4._yearday(obj2); - - let diffdays = 0; - - while (year1 > year2) - { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); - ++year2; - } - diffdays += yearday1 - yearday2; - - let hours1 = obj1.getHours(); - let minutes1 = obj1.getMinutes(); - let seconds1 = obj1.getSeconds(); - let hours2 = obj2.getHours(); - let minutes2 = obj2.getMinutes(); - let seconds2 = obj2.getSeconds(); - - let diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - - let diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - - if (swap) - { - diffdays = -diffdays; - diffseconds = -diffseconds; - diffmilliseconds = -diffmilliseconds; - } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Multiplication: num * num, int * str, str * int, int * list, list * int - ul4.MulAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__mul__) === "function") - return obj1.__mul__(obj2); - else if (obj2 && typeof(obj2.__rmul__) === "function") - return obj2.__rmul__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) - { - if (typeof(obj2) === "string") - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj2, obj1); - } - else if (ul4._islist(obj2)) - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj2, obj1); - } - } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) - { - if (typeof(obj1) === "string") - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj1, obj2); - } - else if (ul4._islist(obj1)) - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj1, obj2); - } - } - return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._isint(obj2)) - { - if (obj2 > 0) - { - let i = 0; - let targetsize = obj1.length * obj2; - while (obj1.length < targetsize) - obj1.push(obj1[i++]); - } - else - obj1.splice(0, obj1.length); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Truncating division - ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__floordiv__) === "function") - return obj1.__floordiv__(obj2); - else if (obj2 && typeof(obj2.__rfloordiv__) === "function") - return obj2.__rfloordiv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); - return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // "Real" division - ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__truediv__) === "function") - return obj1.__truediv__(obj2); - else if (obj2 && typeof(obj2.__rtruediv__) === "function") - return obj2.__rtruediv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); - return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Modulo - ul4.ModAST = ul4._inherit( - ul4.BinaryAST, - { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) - { - let div = Math.floor(obj1 / obj2); - let mod = obj1 - div * obj2; - - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) - { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise left shift - ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 *= 2; - return obj1; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise right shift - ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 /= 2; - return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise and - ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise exclusive or - ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise or - ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - ul4.AndAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - let obj1 = this.obj1._handle_eval(context); - if (!ul4._bool(obj1)) - return obj1; - let obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.OrAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - let obj1 = this.obj1._handle_eval(context); - if (ul4._bool(obj1)) - return obj1; - let obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) - { - let attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let obj = this.obj._handle_eval(context); - let result = this._get(obj, this.attrname); - return result; - }, - _eval_set: function _eval_set(context, value) - { - let obj = this.obj._handle_eval(context); - this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - let obj = this.obj._handle_eval(context); - this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) - { - let proto = ul4.Protocol.get(object); - try - { - return proto.getattr(object, attrname); - } - catch (exc) - { - if (ul4.AttributeError.isprotoof(exc) && exc.obj === object) - return undefined; - else - throw exc; - } - }, - _set: function _set(object, attrname, value) - { - if (typeof(object) === "object" && typeof(object.__setattr__) === "function") - object.__setattr__(attrname, value); - else if (ul4._ismap(object)) - object.set(attrname, value); - else if (ul4._isobject(object)) - object[attrname] = value; - else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) - { - let oldvalue = this._get(object, attrname); - let newvalue = operator._ido(oldvalue, value); - this._set(object, attrname, newvalue); - } - } - ); - - ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) - { - let call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) - { - out.push(""); - }, - _makeargs: function _makeargs(context) - { - let args = [], kwargs = {}; - for (let i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return {args: args, kwargs: kwargs}; - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - throw ul4.LocationError.create(this, exc); - } - }, - _eval: function _eval(context) - { - let obj = this.obj._handle_eval(context); - let args = this._makeargs(context); - let result = ul4._call(context, obj, args.args, args.kwargs); - return result; - } - } - ); - - ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) - { - let render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) - { - out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); - } - }, - _handle_eval: function _handle_eval(context) - { - let localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - let obj = this.obj._handle_eval(localcontext); - let args = this._makeargs(localcontext); - - try - { - let result = ul4._callrender(localcontext, obj, args.args, args.kwargs); - return result; - } - catch (exc) - { - throw ul4.LocationError.create(this, exc); - } - } - } - ); - - // Slice object - ul4.slice = ul4._inherit( - ul4.Proto, - { - create: function create(start, stop) - { - let slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() - { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; - } - } - ); - - - // List/String slice - ul4.SliceAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, index1, index2) - { - let slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - let index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - let index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); - } - } - ); - - - ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, lvalue, value) - { - let changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" lvalue="); - out.push(ul4._repr(this.lvalue)); - out.push(" value="); - this.value._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - let value = this.value._handle_eval(context); - let items = ul4._unpackvar(this.lvalue, value); - for (let i = 0; i < items.length; ++i) - { - let item = items[i]; - item[0]._handle_eval_set(context, item[1]); - } - } - } - ); - - ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, - { - _eval: function _eval(context) - { - let value = this.value._handle_eval(context); - let items = ul4._unpackvar(this.lvalue, value); - for (let i = 0; i < items.length; ++i) - { - let item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); - } - } - } - ); - - ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); - - ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); - - ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); - - ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); - - ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); - - ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); - - ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); - - ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); - - ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); - - ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); - - ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); - - ul4.BlockAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - let block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) - { - for (let i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) - { - if (this.content.length) - { - for (let i = 0; i < this.content.length; ++i) - { - this.content[i]._str(out); - out.push(0); - } - } - else - { - out.push("pass"); - out.push(0); - } - } - } - ); - - ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) - { - let for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str_varname: function _str_varname(out, varname) - { - if (ul4._islist(varname)) - { - out.push("("); - for (let i = 0; i < varname.length; ++i) - { - if (i) - out.push(", "); - this._str_varname(out, varname[i]); - } - if (varname.length == 1) - out.push(","); - out.push(")"); - } - else - varname._str(out); - }, - _eval: function _eval(context) - { - let container = this.container._handle_eval(context); - - for (let iter = ul4._iter(container);;) - { - let value = iter.next(); - if (value.done) - break; - let varitems = ul4._unpackvar(this.varname, value.value); - for (let i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("for "); - this._str_varname(out, this.varname); - out.push(" in "); - this.container._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - let while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("while "); - this.container._repr(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _eval: function _eval(context) - { - while (true) - { - let cond = this.condition._handle_eval(context); - if (!ul4._bool(cond)) - break; - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - } - } - ); - - ul4.BreakAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.BreakException; - }, - _str: function _str(out) - { - out.push("break"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.ContinueException; - }, - _str: function _str(out) - { - out.push("continue"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, - { - _eval: function _eval(context) - { - for (let i = 0; i < this.content.length; ++i) - { - let block = this.content[i]; - let execute = block._execute(context); - if (execute) - { - block._handle_eval(context); - break; - } - } - } - } - ); - - ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - let block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" condition="); - this.condition._repr(out); - out.push(">"); - }, - _str: function _str(out) - { - out.push(this._strname); - out.push(" "); - this.condition._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - let cond = this.condition._handle_eval(context); - let result = ul4._bool(cond); - return result; - } - } - ); - - ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); - - ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); - - ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, - { - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("else:"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - return true; - } - } - ); - - ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) - { - let template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) - { - let signature; - encoder.dump(ul4.version); - encoder.dump(this.name); - encoder.dump(this.source); - encoder.dump(this.whitespace); - encoder.dump(this.startdelim); - encoder.dump(this.enddelim); - encoder.dump(this.docpos); - encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) - signature = this.signature; - else - { - signature = []; - for (let i = 0; i < this.signature.args.length; ++i) - { - let arg = this.signature.args[i]; - if (typeof(arg.defaultValue) === "undefined") - signature.push(arg.name); - else - signature.push(arg.name+"=", arg.defaultValue); - } - if (this.signature.remargs !== null) - signature.push("*" + this.signature.remargs); - if (this.signature.remkwargs !== null) - signature.push("**" + this.signature.remkwargs); - } - encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) - { - let version = decoder.load(); - let signature; - - if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); - - if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); - this.name = decoder.load(); - this.source = decoder.load(); - this.whitespace = decoder.load(); - this.startdelim = decoder.load(); - this.enddelim = decoder.load(); - this.docpos = decoder.load(); - this.parenttemplate = decoder.load(); - signature = decoder.load(); - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - this.signature = signature; - this._ul4_callsignature = signature; - this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) - { - return ul4on.loads(string); - }, - _eval: function _eval(context) - { - let signature = null; - if (this.signature !== null) - signature = this.signature._handle_eval(context); - let closure = ul4.TemplateClosure.create(this, signature, context.vars); - context.set(this.name, closure); - }, - _repr: function _repr(out) - { - out.push("") - { - out.push(" enddelim="); - out.push(ul4._repr(this.enddelim)); - } - out.push(">"); - }, - _str: function _str(out) - { - out.push("def "); - out.push(this.name ? this.name : "unnamed"); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) - { - let localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (!ul4.ReturnException.isprotoof(exc)) - throw exc; - } - }, - __render__: function __render__(context, vars) - { - this._renderbound(context, vars); - }, - render: function render(context, vars) - { - this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) - { - let localcontext = context.replaceoutput(); - this._renderbound(localcontext, vars); - return localcontext.getoutput(); - }, - renders: function renders(vars) - { - vars = vars || {}; - let context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._rendersbound(context, vars); - }, - doc: function doc() - { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - default: - throw ul4.AttributeError.create(this, attrname); - } - }, - _callbound: function _callbound(context, vars) - { - let localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (ul4.ReturnException.isprotoof(exc)) - return exc.result; - else - throw exc; - } - return null; - }, - call: function call(vars) - { - vars = vars || {}; - let context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) - { - return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } - ); - - ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - let signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.CodeAST.ul4ondump.call(this, encoder); - - let dump = []; - - for (let i = 0; i < this.params.length; ++i) - { - let param = this.params[i]; - if (param[1] === null) - dump.push(param[0]); - else - dump.push(param); - } - encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) - { - ul4.AST.ul4onload.call(this, decoder); - let dump = decoder.load(); - this.params = []; - for (let i = 0; i < dump.length; ++i) - { - let param = dump[i]; - if (typeof(param) === "string") - this.params.push([param, null]); - else - this.params.push(param); - } - }, - _eval: function _eval(context) - { - let args = []; - for (let i = 0; i < this.params.length; ++i) - { - let param = this.params[i]; - if (param[1] === null) - args.push(param[0]); - else - { - args.push(param[0] + "="); - args.push(param[1]._handle_eval(context)); - } - } - return ul4.Signature.create(...args); - }, - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" params="); - this.params._repr(out); - out.push(">"); - } - } - ); - - ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) - { - let closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; - // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) - { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) - { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) - { - let self = this; - switch (attrname) - { - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - case "signature": - return this.signature; - default: - return this.template.__getattr__(attrname); - } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } - ); - - // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` - ul4._rgb = function _rgb(r, g, b, a) - { - return this.Color.create(255*r, 255*g, 255*b, 255*a); - }; - - // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference - ul4._xmlescape = function _xmlescape(obj) - { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; - }; - - // Convert ``obj`` to a string suitable for output into a CSV file - ul4._csv = function _csv(obj) - { - if (obj === null) - return ""; - else if (typeof(obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; - }; - - // Return a string containing one character with the codepoint ``i`` - ul4._chr = function _chr(i) - { - if (typeof(i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); - }; - - // Return the codepoint for the one and only character in the string ``c`` - ul4._ord = function _ord(c) - { - if (typeof(c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); - }; - - // Convert an integer to a hexadecimal string - ul4._hex = function _hex(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); - }; - - // Convert an integer to a octal string - ul4._oct = function _oct(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); - }; - - // Convert an integer to a binary string - ul4._bin = function _bin(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); - }; - - // Return the minimum value - ul4._min = function _min(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - let iter = ul4._iter(obj); - let result; - let first = true; - while (true) - { - let item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; - } - if (first || (item.value < result)) - result = item.value; - first = false; - } - }; - - // Return the maximum value - ul4._max = function _max(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - let iter = ul4._iter(obj); - let result; - let first = true; - while (true) - { - let item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; - } - if (first || (item.value > result)) - result = item.value; - first = false; - } - }; - - // Return the of the values from the iterable starting with ``start`` (default ``0``) - ul4._sum = function _sum(iterable, start=0) - { - for (let iter = ul4._iter(iterable);;) - { - let item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; - }; - - // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._first = function _first(iterable, defaultValue=null) - { - let item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; - }; - - // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._last = function _last(iterable, defaultValue=null) - { - let value = defaultValue; - - for (let iter = ul4._iter(iterable);;) - { - let item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; - }; - - // Return a sorted version of ``iterable`` - ul4._sorted = function _sorted(context, iterable, key=null, reverse=false) - { - if (key === null) - { - // FIXME: stability - let cmp = reverse ? function cmp(a, b) - { - return -ul4._cmp("<=>", a, b); - } : function cmp(a, b) - { - return ul4._cmp("<=>", a, b); - }; - let result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else - { - var sort = []; - - for (var i = 0, iter = ul4._iter(iterable);;++i) - { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); - } - cmp = function cmp(s1, s2) - { - let res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; - }; - - sort.sort(cmp); - - let result = []; - for (let i = 0; i < sort.length; ++i) - result.push(sort[i][2]); - return result; - } - }; - - // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` - ul4._range = function _range(args) - { - let start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - let lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) - { - lower = start; - heigher = stop; - } - else - { - lower = stop; - heigher = start; - } - let length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function() - { - if (this.index >= length) - return {done: true}; - return {value: start + (this.index++) * step, done: false}; - } - }; - }; - - // Return a iterable object returning a slice from the argument - ul4._slice = function _slice(args) - { - let iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) - { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - let next = start, count = 0; - let iter = ul4._iter(iterable); - return { - next: function() { - let result; - while (count < next) - { - result = iter.next(); - if (result.done) - return result; - ++count; - } - if (stop !== null && count >= stop) - return {done: true}; - result = iter.next(); - if (result.done) - return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } - }; - }; - - // ``%`` escape unsafe characters in the string ``string`` - ul4._urlquote = function _urlquote(string) - { - return encodeURIComponent(string); - }; - - // The inverse function of ``urlquote`` - ul4._urlunquote = function _urlunquote(string) - { - return decodeURIComponent(string); - }; - - // Return a reverse iterator over ``sequence`` - ul4._reversed = function _reversed(sequence) - { - if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length-1, - next: function() { - return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; - } - }; - }; - - // Returns a random number in the interval ``[0;1[`` - ul4._random = function _random() - { - return Math.random(); - }; - - // Return a randomly select item from ``range(start, stop, step)`` - ul4._randrange = function _randrange(args) - { - let start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - let width = stop-start; - - let value = Math.random(); - - let n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step*Math.floor(value * n); - }; - - // Return a random item/char from the list/string ``sequence`` - ul4._randchoice = function _randchoice(sequence) - { - let iscolor = ul4._iscolor(sequence); - if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; - }; - - // Round a number ``x`` to ``digits`` decimal places (may be negative) - ul4._round = function _round(x, digits=0) - { - if (digits) - { - let threshhold = Math.pow(10, digits); - return Math.round(x*threshhold)/threshhold; - } - else - return Math.round(x); - }; - - // Return a hex-encode MD5 hash of the argument - // This uses the md5 function from https://github.com/blueimp/JavaScript-MD5 - if (iscommon) { - ul4._md5 = function _md5(string) - { - let md5 = require('blueimp-md5'); - return md5(string); - }; - } else { - ul4._md5 = function _md5(string) - { - return md5(string); - }; - } - - // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) - ul4._enumerate = function _enumerate(iterable, start=0) - { - return { - iter: ul4._iter(iterable), - index: start, - next: function() { - let item = this.iter.next(); - return item.done ? item : {value: [this.index++, item.value], done: false}; - } - }; - }; - - // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) - ul4._isfirst = function _isfirst(iterable) - { - let iter = ul4._iter(iterable); - let isfirst = true; - return { - next: function() { - let item = iter.next(); - let result = item.done ? item : {value: [isfirst, item.value], done: false}; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) - ul4._islast = function _islast(iterable) - { - let iter = ul4._iter(iterable); - let lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - let item = iter.next(); - let result = {value: [item.done, lastitem.value], done: false}; - lastitem = item; - return result; - } - }; - }; - - // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._isfirstlast = function _isfirstlast(iterable) - { - let iter = ul4._iter(iterable); - let isfirst = true; - let lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - let item = iter.next(); - let result = {value: [isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._enumfl = function _enumfl(iterable, start=0) - { - let iter = ul4._iter(iterable); - let i = start; - let isfirst = true; - let lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - let item = iter.next(); - let result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) - ul4._zip = function _zip(iterables) - { - let result; - if (iterables.length) - { - let iters = []; - for (let i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); - - return { - next: function() { - let items = []; - for (let i = 0; i < iters.length; ++i) - { - let item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return {value: items, done: false}; - } - }; - } - else - { - return { - next: function() { - return {done: true}; - } - }; - } - }; - - // Return the absolute value for the number ``number`` - ul4._abs = function _abs(number) - { - if (number !== null && typeof(number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); - }; - - // Return a ``Date`` object from the arguments passed in - ul4._date = function _date(year, month, day, hour=0, minute=0, second=0, microsecond=0) - { - return new Date(year, month-1, day, hour, minute, second, microsecond/1000); - }; - - // Return a ``TimeDelta`` object from the arguments passed in - ul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0) - { - return this.TimeDelta.create(days, seconds, microseconds); - }; - - // Return a ``MonthDelta`` object from the arguments passed in - ul4._monthdelta = function _monthdelta(months=0) - { - return this.MonthDelta.create(months); - }; - - // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) - ul4._hls = function _hls(h, l, s, a) - { - let _v = function(m1, m2, hue) - { - hue = hue % 1.0; - if (hue < 1/6) - return m1 + (m2-m1)*hue*6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2/3) - return m1 + (m2-m1)*(2/3-hue)*6.0; - return m1; - }; - - let m1, m2; - if (typeof(a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0+s); - else - m2 = l+s-(l*s); - m1 = 2.0*l - m2; - return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); - }; - - // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) - ul4._hsv = function _hsv(h, s, v, a) - { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - let i = Math.floor(h*6.0); - let f = (h*6.0) - i; - let p = v*(1.0 - s); - let q = v*(1.0 - s*f); - let t = v*(1.0 - s*(1.0-f)); - switch (i%6) - { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } - }; - - // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` - ul4._get = function _get(container, key, defaultvalue) - { - if (ul4._ismap(container)) - { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) - { - var result = container[key]; - if (typeof(result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); - }; - - // Return a ``Date`` object for the current time - ul4.now = function now() - { - return new Date(); - }; - - // Return a ``Date`` object for the current time in UTC - ul4.utcnow = function utcnow() - { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); - }; - - ul4.functions = { - repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), - ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), - str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), - float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), - list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), - set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), - bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), - len: ul4.expose(["sequence"], {name: "len"}, ul4._len), - type: ul4.expose(["obj"], {name: "type"}, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), - any: ul4.expose(["iterable"], {name: "any"}, ul4._any), - all: ul4.expose(["iterable"], {name: "all"}, ul4._all), - zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), - getattr: ul4.expose(["obj", "attrname", "default=", null], {name: "getattr"}, ul4._getattr), - hasattr: ul4.expose(["obj", "attrname"], {name: "hasattr"}, ul4._hasattr), - dir: ul4.expose(["obj"], {name: "dir"}, ul4._dir), - isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), - isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), - isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), - isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), - isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), - isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), - isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), - isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), - iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), - istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), - isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), - islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), - isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), - isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), - asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), - fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), - asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), - fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), - isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), - islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), - isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), - abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), - xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), - csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), - chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), - ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), - hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), - oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), - bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), - min: ul4.expose(["*obj"], {name: "min"}, ul4._min), - max: ul4.expose(["*obj"], {name: "max"}, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), - first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), - last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), - range: ul4.expose(["*args"], {name: "range"}, ul4._range), - slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), - urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), - urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), - reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), - random: ul4.expose([], {name: "random"}, ul4._random), - randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), - randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), - md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) - }; - - // Functions implementing UL4 methods - ul4._replace = function _replace(string, old, new_, count=null) - { - if (count === null) - count = string.length; - - let result = []; - while (string.length) - { - let pos = string.indexOf(old); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); - }; - - ul4._strip = function _strip(string, chars=null) - { - chars = chars || " \r\n\t"; - if (typeof(chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._lstrip = function _lstrip(string, chars=null) - { - chars = chars || " \r\n\t"; - if (typeof(chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; - }; - - ul4._rstrip = function _rstrip(string, chars=null) - { - chars = chars || " \r\n\t"; - if (typeof(chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._split = function _split(string, sep=null, count=null) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) - { - let result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - let result = []; - while (string.length) - { - let pos = string.indexOf(sep); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); - } - return result; - } - else - { - let result = []; - while (string.length) - { - string = ul4._lstrip(string, null); - let part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); - } - return result; - } - } - }; - - ul4._rsplit = function _rsplit(string, sep=null, count=null) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); - - if (count === null) - { - let result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - let result = []; - while (string.length) - { - let pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) - { - result.unshift(string); - break; - } - result.unshift(string.substr(pos+sep.length)); - string = string.substr(0, pos); - } - return result; - } - else - { - let result = []; - while (string.length) - { - string = ul4._rstrip(string); - let part; - if (!count--) - part = string; // Take the rest of the string - else - { - part = string.split(/[ \n\r\t]+/); - part = part[part.length-1]; - } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length-part.length); - } - return result; - } - } - }; - - ul4._splitlines = function _splitlines(string, keepends=false) - { - let pos = 0; - let lookingAtLineEnd = function lookingAtLineEnd() - { - let c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') - { - if (pos == length-1) - return 1; - if (string[pos+1] === '\n') - return 2; - return 1; - } - return 0; - }; - - let result = [], length = string.length; - - for (pos = 0, startpos = 0;;) - { - if (pos >= length) - { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; - } - let lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else - { - let endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; - } - } - }; - - ul4._count = function _count(obj, sub, start=null, end=null) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - - let isstr = ul4._isstr(obj); - - if (isstr && !sub.length) - { - if (end < 0 || start > obj.length || start > end) - return 0; - let result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } - - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - let count = 0; - if (ul4._islist(obj)) - { - for (let i = start; i < end; ++i) - { - if (ul4._eq(obj[i], sub)) - ++count; - } - return count; - } - else // string - { - let lastIndex = start; - - for (;;) - { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; - } - return count; - } - }; - - ul4._find = function _find(obj, sub, start=null, end=null) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - let result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._rfind = function _rfind(obj, sub, start=null, end=null) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - let result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._capitalize = function _capitalize(obj) - { - if (typeof(obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; - }; - - ul4._items = function _items(obj) - { - if (ul4._ismap(obj)) - { - let result = []; - obj.forEach(function(value, key){ - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) - { - let result = []; - for (let key in obj) - result.push([key, obj[key]]); - return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); - }; - - ul4._values = function _values(obj) - { - if (ul4._ismap(obj)) - { - let result = []; - obj.forEach(function(value, key){ - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) - { - let result = []; - for (let key in obj) - result.push(obj[key]); - return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); - }; - - ul4._join = function _join(sep, iterable) - { - let resultlist = []; - for (let iter = ul4._iter(iterable);;) - { - let item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); - }; - - ul4._startswith = function _startswith(string, prefix) - { - if (typeof(prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; - }; - - ul4._endswith = function _endswith(string, suffix) - { - if (typeof(suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length-suffix.length) === suffix; - }; - - ul4._isoformat = function _isoformat(obj) - { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - let result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - let hour = obj.getHours(); - let minute = obj.getMinutes(); - let second = obj.getSeconds(); - let ms = obj.getMilliseconds(); - if (hour || minute || second || ms) - { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; - }; - - ul4._mimeformat = function _mimeformat(obj) - { - let weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - let monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; - }; - - ul4._weekday = function _weekday(obj) - { - let d = obj.getDay(); - return d ? d-1 : 6; - }; - - ul4._week = function _week(obj, firstweekday=null) - { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - let yearday = ul4._yearday(obj)+6; - let jan1 = new Date(obj.getFullYear(), 0, 1); - let jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) - { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday/7); - }; - - ul4._isleap = function _isleap(obj) - { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; - }; - - ul4._yearday = function _yearday(obj) - { - let leap = ul4._isleap(obj) ? 1 : 0; - let day = obj.getDate(); - switch (obj.getMonth()) - { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } - }; - - ul4._append = function _append(obj, ...items) - { - for (let i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; - }; - - ul4._insert = function _insert(obj, pos, ...items) - { - if (pos < 0) - pos += obj.length; - - for (let i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; - }; - - ul4._pop = function _pop(obj, pos) - { - if (pos < 0) - pos += obj.length; - - let result = obj[pos]; - obj.splice(pos, 1); - return result; - }; - - ul4._update = function _update(obj, others, kwargs) - { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (let i = 0; i < others.length; ++i) - { - let other = others[i]; - if (ul4._ismap(other)) - { - other.forEach(function(value, key){ - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) - { - for (let key in other) - ul4on._setmap(obj, key, other[key]); - } - else if (ul4._islist(other)) - { - for (let j = 0; j < other.length; ++j) - { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); - } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - kwargs.forEach(function(value, key) { - ul4on._setmap(obj, key, value); - }); - return null; - }; - - ul4._clear = function _clear(obj) - { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) - { - for (let key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; - }; - - ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r=0, g=0, b=0, a=255) - { - let c = ul4._clone(this); - c._r = r; - c._g = g; - c._b = b; - c._a = a; - return c; - }, - - __repr__: function __repr__() - { - let r = ul4._lpad(this._r.toString(16), "0", 2); - let g = ul4._lpad(this._g.toString(16), "0", 2); - let b = ul4._lpad(this._b.toString(16), "0", 2); - let a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) - return "#" + r[0] + g[0] + b[0] + a[0]; - else - return "#" + r + g + b + a; - } - else - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __str__: function __str__() - { - if (this._a !== 0xff) - { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; - } - else - { - let r = ul4._lpad(this._r.toString(16), "0", 2); - let g = ul4._lpad(this._g.toString(16), "0", 2); - let b = ul4._lpad(this._b.toString(16), "0", 2); - let a = ul4._lpad(this._a.toString(16), "0", 2); - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __iter__: function __iter__() - { - return { - obj: this, - index: 0, - next: function() { - if (this.index == 0) - { - ++this.index; - return {value: this.obj._r, done: false}; - } - else if (this.index == 1) - { - ++this.index; - return {value: this.obj._g, done: false}; - } - else if (this.index == 2) - { - ++this.index; - return {value: this.obj._b, done: false}; - } - else if (this.index == 3) - { - ++this.index; - return {value: this.obj._a, done: false}; - } - else - return {done: true}; - } - }; - }, - - __getattr__: function __getattr__(attrname) - { - let self = this; - switch (attrname) - { - case "r": - return ul4.expose([], function r(){ return self._r; }); - case "g": - return ul4.expose([], function g(){ return self._g; }); - case "b": - return ul4.expose([], function b(){ return self._b; }); - case "a": - return ul4.expose([], function a(){ return self._a; }); - case "lum": - return ul4.expose([], function lum(){ return self.lum(); }); - case "hls": - return ul4.expose([], function hls(){ return self.hls(); }); - case "hlsa": - return ul4.expose([], function hlsa(){ return self.hlsa(); }); - case "hsv": - return ul4.expose([], function hsv(){ return self.hsv(); }); - case "hsva": - return ul4.expose([], function hsva(){ return self.hsva(); }); - case "witha": - return ul4.expose(["a"], function witha(a){ return self.witha(a); }); - case "withlum": - return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); - case "abslum": - return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); - case "rellum": - return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); - default: - throw ul4.AttributeError.create(this, attrname); - } - }, - - __getitem__: function __getitem__(key) - { - let orgkey = key; - if (key < 0) - key += 4; - switch (key) - { - case 0: - return this._r; - case 1: - return this._g; - case 2: - return this._b; - case 3: - return this._a; - default: - return undefined; - } - }, - - __eq__: function __eq__(other) - { - if (ul4._iscolor(other)) - return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; - return false; - }, - - r: ul4.expose([], function r() { return this._r; }), - - g: ul4.expose([], function g() { return this._g; }), - - b: ul4.expose([], function b() { return this._b; }), - - a: ul4.expose([], function a() { return this._a; }), - - lum: ul4.expose([], function lum() {return this.hls()[1]; }), - - hls: ul4.expose([], - function hls() - { - let r = this._r/255.0; - let g = this._g/255.0; - let b = this._b/255.0; - let maxc = Math.max(r, g, b); - let minc = Math.min(r, g, b); - let h, l, s; - let rc, gc, bc; - - l = (minc+maxc)/2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc-minc) / (maxc+minc); - else - s = (maxc-minc) / (2.0-maxc-minc); - rc = (maxc-r) / (maxc-minc); - gc = (maxc-g) / (maxc-minc); - bc = (maxc-b) / (maxc-minc); - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() - { - let hls = this.hls(); - return hls.concat(this._a/255.0); - } - ), - - hsv: ul4.expose([], - function hsv() - { - let r = this._r/255.0; - let g = this._g/255.0; - let b = this._b/255.0; - let maxc = Math.max(r, g, b); - let minc = Math.min(r, g, b); - let v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - let s = (maxc-minc) / maxc; - let rc = (maxc-r) / (maxc-minc); - let gc = (maxc-g) / (maxc-minc); - let bc = (maxc-b) / (maxc-minc); - let h; - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, s, v]; - } - ), - - hsva: ul4.expose([], - function hsva() - { - var hsv = this.hsv(); - return hsv.concat(this._a/255.0); - } - ), - - witha: ul4.expose(["a"], - function witha(a) - { - if (typeof(a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), - - withlum: ul4.expose(["lum"], - function withlum(lum) - { - if (typeof(lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - let hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } - ); - - ul4.TimeDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.TimeDelta", - - create: function create(days=0, seconds=0, microseconds=0) - { - let td = ul4._clone(this); - let total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); - - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - let total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); - days = Math.floor(total_seconds / 86400); - if (seconds < 0) - { - seconds += 86400; - --days; - } - - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, - - __repr__: function __repr__() - { - if (!this._microseconds) - { - if (!this._seconds) - { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, - - __str__: function __str__() - { - let v = []; - if (this._days) - { - v.push(this._days + " day"); - if (this._days !== -1 && this._days !== 1) - v.push("s"); - v.push(", "); - } - let seconds = this._seconds % 60; - let minutes = Math.floor(this._seconds / 60); - let hours = Math.floor(minutes / 60); - minutes = minutes % 60; - - v.push("" + hours); - v.push(":"); - v.push(ul4._lpad(minutes.toString(), "0", 2)); - v.push(":"); - v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) - { - v.push("."); - v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); - } - return v.join(""); - }, - - __bool__: function __bool__() - { - return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, - - __abs__: function __abs__() - { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._istimedelta(other)) - return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds < other._microseconds; - } - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds <= other._microseconds; - } - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds > other._microseconds; - } - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds >= other._microseconds; - } - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) - { - let year = date.getFullYear(); - let month = date.getMonth(); - let day = date.getDate() + days; - let hour = date.getHours(); - let minute = date.getMinutes(); - let second = date.getSeconds() + seconds; - let millisecond = date.getMilliseconds() + microseconds/1000; - return new Date(year, month, day, hour, minute, second, millisecond); - }, - - __add__: function __add__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); - else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __sub__: function __sub__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) - { - let myValue = this._days; - let otherValue = other._days; - let hasSeconds = this._seconds || other._seconds; - let hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) - { - myValue = myValue*86400+this._seconds; - otherValue = otherValue*86400 + other._seconds; - if (hasMicroseconds) - { - myValue = myValue * 1000000 + this._microseconds; - otherValue = otherValue * 1000000 + other._microseconds; - } - } - return myValue/otherValue; - } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, - - __getattr__: function __getattr__(attrname) - { - let self = this; - switch (attrname) - { - case "days": - return ul4.expose([], function days(){ return self._days; }); - case "seconds": - return ul4.expose([], function seconds(){ return self._seconds; }); - case "microseconds": - return ul4.expose([], function microseconds(){ return self._microseconds; }); - default: - throw ul4.AttributeError.create(this, attrname); - } - }, - - days: function days() - { - return this._days; - }, - - seconds: function seconds() - { - return this._seconds; - }, - - microseconds: function microseconds() - { - return this._microseconds; - } - } - ); - - ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", - - create: function create(months=0) - { - let md = ul4._clone(this); - md._months = months; - return md; - }, - - __repr__: function __repr__() - { - if (!this._months) - return "monthdelta()"; - return "monthdelta(" + this._months + ")"; - }, - - __str__: function __str__() - { - if (this._months) - { - if (this._months !== -1 && this._months !== 1) - return this._months + " months"; - return this._months + " month"; - } - return "0 months"; - }, - - __bool__: function __bool__() - { - return this._months !== 0; - }, - - __abs__: function __abs__() - { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._ismonthdelta(other)) - return this._months === other._months; - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months < other._months; - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._ismonthdelta(other)) - return this._months <= other._months; - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months > other._months; - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._ismonthdelta(other)) - return this._months >= other._months; - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) - { - let year = date.getFullYear(); - let month = date.getMonth() + months; - let day = date.getDate(); - let hour = date.getHours(); - let minute = date.getMinutes(); - let second = date.getSeconds(); - let millisecond = date.getMilliseconds(); - - while (true) - { - // As the month might be out of bounds, we have to find out, what the real target month is - let targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - let result = new Date(year, month, day, hour, minute, second, millisecond); - if (result.getMonth() === targetmonth) - return result; - --day; - } - }, - - __add__: function __add__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); - else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __sub__: function __sub__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); - else if (ul4._ismonthdelta(other)) - return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, - - __truediv__: function __truediv__(other) - { - if (ul4._ismonthdelta(other)) - return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, - - __getattr__: function __getattr__(attrname) - { - let self = this; - switch (attrname) - { - case "months": - return ul4.expose([], function months(){ return self._months; }); - default: - throw ul4.AttributeError.create(this, attrname); - } - }, - - months: function months() - { - return this._months; - } - } - ); - - // When we don't have a real ``Set`` type, emulate one that supports strings - ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create(...items) - { - let set = ul4._clone(this); - set.items = {}; - set.add(...items); - return set; - }, - - add: function add(...items) - { - for (let i = 0; i < items.length; ++i) - { - this.items[items[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) - { - let self = this; - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ self.add(...items); }); - default: - throw ul4.AttributeError.create(this, attrname); - } - }, - - __contains__: function __contains__(item) - { - return this.items[item] || false; - }, - - __bool__: function __bool__() - { - for (let item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - - __repr__: function __repr__() - { - let v = []; - v.push("{"); - let i = 0; - for (let item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function(other) - { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) - { - let count = 0; - for (let item in this.items) - { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) - { - let count = 0; - for (let item in this.items) - { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (let item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function(other) - { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) - { - let count = 0; - for (let item in this.items) - { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) - { - let count = 0; - for (let item in this.items) - { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function(other) - { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) - { - let result = true; - other.forEach(function(value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) - { - let count = 0; - for (let item in other.items) - { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); - } - } - ); - - const classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" - ]; - - for (let i = 0; i < classes.length; ++i) - { - let name = classes[i]; - let ul4onname = name; - if (ul4onname.substr(ul4onname.length-3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length-3); - ul4onname = ul4onname.toLowerCase(); - let object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); - } - - })(); diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/index.html b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/index.html deleted file mode 100644 index dda05fd..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Ionic App - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/manifest.json b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/manifest.json deleted file mode 100644 index f6456bb..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/manifest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "Ionic", - "short_name": "Ionic", - "start_url": "index.html", - "display": "standalone", - "icons": [{ - "src": "assets/imgs/logo.png", - "sizes": "512x512", - "type": "image/png" - }], - "background_color": "#4e8ef7", - "theme_color": "#4e8ef7" -} \ No newline at end of file diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.html b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.html deleted file mode 100644 index 2682126..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - Mein Kaffee - - - - - - - - Kaffeesorte: - - Mocha - - - - - - - - - - - - - Konsument - - - - - - - diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.scss b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.scss deleted file mode 100644 index d4cc8fc..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.scss +++ /dev/null @@ -1,3 +0,0 @@ -page-home { - -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.ts b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.ts deleted file mode 100644 index 181b94c..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/pages/home/home.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; -import { LaProvider }from '../../providers/la/la'; - - -@Component({ - selector: 'page-home', - templateUrl: 'home.html' -}) -export class HomePage { - - private coffee: any = "Mocha"; - private number: number = 1; - private consumer: any = "Der Herr des Kaffees"; - constructor(public navCtrl: NavController, private laProv: LaProvider) { - - - } - changeNumber (diffrence: number) { - if ((this.number <= 1 && diffrence < 0) || (this.number >= 5 && diffrence > 0)) { - return; - } - this.number += diffrence; - } - - - add(){ - console.log("add entry" + JSON.stringify({ - kaffeesorte: this.coffee, - runde: this.number, - mitarbeiter: this.consumer - })); - this.laProv.addCoffee({ - kaffeesorte: this.coffee, - runde: this.number.toString(), - mitarbeiter: this.consumer - }).then((res)=>{ - alert("erfolgreich einen Datensatz hinzugefügt"); - }); - } - -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/providers/la/la.ts b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/providers/la/la.ts deleted file mode 100644 index 97b7e6a..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/providers/la/la.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class LaProvider { - private window: any; - constructor() { - this.window = window; - } - - addCoffee (input) { - return new Promise((resolve, reject) => { - let lsdk = new this.window.livingSDK({},this.window.username, this.window.password); - lsdk.get("appid of your Livingapp").then((LAAPI) => { - let app = LAAPI.get('datasources').get('coffee').app; - app.insert(input).then((res) => { - console.log(res); - resolve(res); - }) - }) - }); - } - -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/service-worker.js b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/service-worker.js deleted file mode 100644 index ffbbb06..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/service-worker.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Check out https://googlechromelabs.github.io/sw-toolbox/ for - * more info on how to use sw-toolbox to custom configure your service worker. - */ - - -'use strict'; -importScripts('./build/sw-toolbox.js'); - -self.toolbox.options.cache = { - name: 'ionic-cache' -}; - -// pre-cache our key assets -self.toolbox.precache( - [ - './build/main.js', - './build/vendor.js', - './build/main.css', - './build/polyfills.js', - 'index.html', - 'manifest.json' - ] -); - -// dynamically cache any other local assets -self.toolbox.router.any('/*', self.toolbox.fastest); - -// for any other requests go to the network, cache, -// and then only use that cached resource if your user goes offline -self.toolbox.router.default = self.toolbox.networkFirst; diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/theme/variables.scss b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/theme/variables.scss deleted file mode 100644 index 18276a4..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/src/theme/variables.scss +++ /dev/null @@ -1,88 +0,0 @@ -// Ionic Variables and Theming. For more info, please see: -// http://ionicframework.com/docs/theming/ - -// Font path is used to include ionicons, -// roboto, and noto sans fonts -$font-path: "../assets/fonts"; - - -// The app direction is used to include -// rtl styles in your app. For more info, please see: -// http://ionicframework.com/docs/theming/rtl-support/ -$app-direction: ltr; - - -@import "ionic.globals"; - - -// Shared Variables -// -------------------------------------------------- -// To customize the look and feel of this app, you can override -// the Sass variables found in Ionic's source scss files. -// To view all the possible Ionic variables, see: -// http://ionicframework.com/docs/theming/overriding-ionic-variables/ - - - - -// Named Color Variables -// -------------------------------------------------- -// Named colors makes it easy to reuse colors on various components. -// It's highly recommended to change the default colors -// to match your app's branding. Ionic uses a Sass map of -// colors so you can add, rename and remove colors as needed. -// The "primary" color is the only required color in the map. - -$colors: ( - primary: #488aff, - secondary: #32db64, - danger: #f53d3d, - light: #f4f4f4, - dark: #222 -); - - -// App iOS Variables -// -------------------------------------------------- -// iOS only Sass variables can go here - - - - -// App Material Design Variables -// -------------------------------------------------- -// Material Design only Sass variables can go here - - - - -// App Windows Variables -// -------------------------------------------------- -// Windows only Sass variables can go here - - - - -// App Theme -// -------------------------------------------------- -// Ionic apps can have different themes applied, which can -// then be future customized. This import comes last -// so that the above variables are used and Ionic's -// default are overridden. - -@import "ionic.theme.default"; - - -// Ionicons -// -------------------------------------------------- -// The premium icon font for Ionic. For more info, please see: -// http://ionicframework.com/docs/ionicons/ - -@import "ionic.ionicons"; - - -// Fonts -// -------------------------------------------------- - -@import "roboto"; -@import "noto-sans"; diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tsconfig.json b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tsconfig.json deleted file mode 100644 index 2d2df92..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "allowSyntheticDefaultImports": true, - "declaration": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ - "dom", - "es2015" - ], - "module": "es2015", - "moduleResolution": "node", - "sourceMap": true, - "target": "es5", - "typeRoots": [ - "../node_modules/@types" - ] - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules", - "src/**/*.spec.ts", - "src/**/__tests__/*.ts" - ], - "compileOnSave": false, - "atom": { - "rewriteTsconfig": false - } -} diff --git a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tslint.json b/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tslint.json deleted file mode 100644 index dd8e8d8..0000000 --- a/docs/demos/App_erstellen_Ionic/src/kaffeeapp_ionic/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rules": { - "no-duplicate-variable": true, - "no-unused-variable": [ - true - ] - }, - "rulesDirectory": [ - "node_modules/tslint-eslint-rules/dist/rules" - ] -} diff --git a/docs/demos/Gruesse_nodejs/README.md b/docs/demos/Gruesse_nodejs/README.md deleted file mode 100644 index 4c11b04..0000000 --- a/docs/demos/Gruesse_nodejs/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# Schöne Grüße an A, B, C, D und Z -Tja, eine Namensliste ist doch etwas praktisches, Sie können -in ihr Emailadressen hinterlegen, Sonderwünsche abspeichern -und Namen abfragen. Aber die alten Papierlisten sind schon -schwer UpToDate zu halten oder falls sich eine Sache ändert -muss sich eine ganze Menge drum herum ändern, da die Liste -ansonsten sehr unübersichtlich wird. -Heute wollen wir Ihnen eine gute Alternative zu dem Zettelchaos -vorstellen, LivingApps. -In diesem Beitrag soll es darum gehen, wie Sie mit nodejs mit -LivingApps kommunizieren können. -Am Ende des Beitrags sollen Sie ein Skript haben, das alle -auf Namen in ihrer LivingApp grüßt. - -## Todo Liste -- eine LivingApp anlegen (Siehe App_erstellen_ionic) -- Daten von LivingApps abholen - -## eine LivingApp anlegen -Das wird in dem Beitrag nicht weiter erläutert, -da dazu bereits eine detailierte Anleitung im -Beitrag App_erstellen_Ionic ist. -[Siehe hier](https://github.com/milleniumfrog/LivingApps.Javascript.LivingAPI/tree/updatedoc/docs/demos/App_erstellen_Ionic) - -## Daten von LivingApps abholen -Binden Sie hierzu livingSDK.js ein. Klonen Sie dazu das letzte, -offizielle Repository von Github und kopieren dessen src Ordner in ihren -Projektordner und binden es mit: -```Javascript -const LivingSDK = require('path to livingSDK.js'); -``` - -Instanziieren Sie das SDK mit -```Javascript -let lsdk = new LivingSDK({}, 'username', 'password'); -``` - -Sie haben sich soeben mit dem SDK bei LivingApps angemeldet und können -mit -```Javascript -lsdk.get('appid').then((LAAPI) => {...}); -``` - -den Zugang zu den Datenquellen holen. In den nächsten Schritten -wird im ... Bereich eingesetzt. - -Zunächst wollen Sie auf die Datenquelle, die Sie vorhin im Anzeigetemplate -hinterlegt haben zugreifen und von dort aus auf die App. -Kombiniert sähe das folgendermaßen aus: -```Javascript - let app = LAAPI.get('datasources').get('Datenquellenidentifizierer').app; -``` - -Von dort haben Sie dann Zugriff auf alle Einträge/Records: -```Javascript - let records = app.records.values(); // app.records ist ein dictonary, in JS eine Map -``` - -Jetzt müssen Sie das ganze nur noch ausgeben. -```Javascript - console.log('Schöne Grüße an: '); - for(let record of records) { - console.log(record.fields.get('name').value); // Sie fragen den Wert von Name von der Liste ab - } -``` - -und schon gibt das Skript folgendes aus: -```bash - Schöne Grüße an: - Name3 - Name2 - Name1 -``` - -So einfach ist es Daten von LivingApps als Backend zu -benutzen und Leute via Konsole zu Grüßen - -Viel Spaß mit dem SDK \ No newline at end of file diff --git a/docs/demos/Gruesse_nodejs/src/index.js b/docs/demos/Gruesse_nodejs/src/index.js deleted file mode 100644 index 962b3fc..0000000 --- a/docs/demos/Gruesse_nodejs/src/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const config = require('../../../../test/config'); -const LivingSDK = require('../../App_erstellen_Ionic/src/kaffeeapp_ionic/src/assets/scripts/src/livingSDK'); - -console.log("started script"); -let lsdk = new LivingSDK({}, config.username, config.password); -lsdk.get('5a33c42ac10bb04e6cf76e1c').then((LAAPI) => { - let app = LAAPI.get('datasources').get('default').app; - let records = app.records.values(); - console.log('Schöne Grüße an: '); - for(let record of records) { - console.log(record.fields.get('name').value); - } -}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0828a25 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,790 @@ +{ + "name": "livingapi", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/estree": { + "version": "0.0.38", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", + "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==", + "dev": true + }, + "@types/node": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.3.tgz", + "integrity": "sha512-J7nx6JzxmtT4zyvfLipYL7jNaxvlCWpyG7JhhCQ4fQyG+AGfovAHoYR55TFx+X8akfkUJYpt5JG6GPeFMjZaCQ==", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "1.4.1", + "is-buffer": "1.1.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "blueimp-md5": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", + "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "rollup": { + "version": "0.58.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", + "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", + "dev": true, + "requires": { + "@types/estree": "0.0.38", + "@types/node": "10.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "typescript": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", + "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index df832c8..a2e2251 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,27 @@ { - "name": "livingapps", - "version": "0.2.0", - "description": "the livingapps api for nodejs", - "main": "src/livingSDK.js", + "name": "livingapi", + "version": "1.0.0", + "description": "livingapps api for javascript (nodjs and browser) written in typescript", + "main": "dist/livingSDK.js", "repository": { "type": "git", "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "mocha" + "test": "mocha", + "build": "sh shellscripts/build.sh" }, "author": "", "license": "ISC", "dependencies": { + "axios": "^0.18.0", "blueimp-md5": "^2.10.0" }, "devDependencies": { "chai": "^4.1.2", "express": "^4.15.4", - "mocha": "^3.5.2" + "mocha": "^3.5.2", + "rollup": "^0.58.2", + "typescript": "^2.8.3" } } diff --git a/shellscripts/build.sh b/shellscripts/build.sh new file mode 100644 index 0000000..0f62881 --- /dev/null +++ b/shellscripts/build.sh @@ -0,0 +1,2 @@ +echo build LivingApps.Javascript.LivingAPI +tsc -p ./tsconfig.json \ No newline at end of file diff --git a/src/livingSDK.js b/src/livingSDK.ts similarity index 92% rename from src/livingSDK.js rename to src/livingSDK.ts index 2c3922e..ec711f6 100644 --- a/src/livingSDK.js +++ b/src/livingSDK.ts @@ -1,27 +1,17 @@ -;(function (root) { - let livingAppsVersion = 0.2; - // amd is not implemented yet - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); +import axios from 'axios'; - let livingApi, ul4on, request, http; - if (commonjs) { - livingApi = require('./modules/livingapi'); - ul4on = require('./modules/ul4.js').ul4on; - http = require('https'); - } else { - livingApi = root.livingapi; - ul4on = root.ul4on; - } +export interface LivingAPIOptions { + url: string; + loginRequired: boolean; +} - class livingSDK { - /** - * @param {String} [username] - * @param {String} [password] - * @param {Object} [options={}] - * @param {String} [options.url] - */ - constructor(options = {}, username, password) { +export default class livingSDK { + private _password: string; + private _userName: string; + private _options: LivingAPIOptions + private hostName: string; + private session: Promise; + constructor(options: any = {}, username: string, password: string) { /** @type {String} */ this._password = password; /** @type {String} */ @@ -45,9 +35,9 @@ * get token for Session * @return {Promise.} */ - login() { + login(): Promise { if (!this._options.loginRequired) { - return undefined; + return Promise.resolve(undefined); } return new Promise((resolve, reject) => { @@ -74,7 +64,7 @@ res.on('end', () => { let body = Buffer.concat(chunks); - resolve(JSON.parse(body.toString()).auth_token); + resolve(JSON.parse(body.toString()).auth_token); }); }); req.write(JSON.stringify({ @@ -90,10 +80,10 @@ 'password': this._password }), method: 'POST', - error: function (error) { + error: function (error: Error) { reject(error); }, - success: function (body) { + success: function (body: any) { resolve(body.auth_token); } }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..10e03e0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,57 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + } +} \ No newline at end of file From 9d4428ed9dda6ed3b3c2423bc513b4452dae9ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 4 May 2018 16:57:59 +0200 Subject: [PATCH 03/43] v0.3.0 - rewrote sdk in typescript (not ul4 not livingapi) - axios as http request library - rollup as bundler - test: get without login --- client_testing/index.html | 5 +- dist/app/app.component.js | 23 - dist/app/app.module.js | 40 - dist/app/main.js | 3 - dist/bundle.js | 163 + dist/livingSDK.js | 356 -- dist/livingsdk.js | 162 + dist/modules/livingapi.js | 1060 +++++ dist/modules/ul4.js | 8804 +++++++++++++++++++++++++++++++++++++ dist/pages/home/home.js | 43 - dist/providers/la/la.js | 28 - package-lock.json | 6502 ++++++++++++++++++++++++--- package.json | 13 +- rollup.config.js | 9 + shellscripts/build.sh | 4 +- src/livingSDK.ts | 388 -- src/livingsdk.ts | 200 + src/modules/ul4.js | 1 - test/node_test.js | 31 +- tsconfig.cjs.json | 53 + tsconfig.json | 5 +- 21 files changed, 16493 insertions(+), 1400 deletions(-) delete mode 100644 dist/app/app.component.js delete mode 100644 dist/app/app.module.js delete mode 100644 dist/app/main.js create mode 100644 dist/bundle.js delete mode 100644 dist/livingSDK.js create mode 100644 dist/livingsdk.js create mode 100644 dist/modules/livingapi.js create mode 100644 dist/modules/ul4.js delete mode 100644 dist/pages/home/home.js delete mode 100644 dist/providers/la/la.js create mode 100644 rollup.config.js delete mode 100644 src/livingSDK.ts create mode 100644 src/livingsdk.ts create mode 100644 tsconfig.cjs.json diff --git a/client_testing/index.html b/client_testing/index.html index 6322723..db0bd63 100644 --- a/client_testing/index.html +++ b/client_testing/index.html @@ -15,9 +15,10 @@ - + + - + diff --git a/dist/app/app.component.js b/dist/app/app.component.js deleted file mode 100644 index 2d9ac15..0000000 --- a/dist/app/app.component.js +++ /dev/null @@ -1,23 +0,0 @@ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -import { Component } from '@angular/core'; -import { HomePage } from '../pages/home/home'; -let MyApp = class MyApp { - constructor(platform, statusBar, splashScreen) { - this.rootPage = HomePage; - platform.ready().then(() => { - statusBar.styleDefault(); - splashScreen.hide(); - }); - } -}; -MyApp = __decorate([ - Component({ - templateUrl: 'app.html' - }) -], MyApp); -export { MyApp }; diff --git a/dist/app/app.module.js b/dist/app/app.module.js deleted file mode 100644 index 5b39cd9..0000000 --- a/dist/app/app.module.js +++ /dev/null @@ -1,40 +0,0 @@ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -import { BrowserModule } from '@angular/platform-browser'; -import { ErrorHandler, NgModule } from '@angular/core'; -import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; -import { SplashScreen } from '@ionic-native/splash-screen'; -import { StatusBar } from '@ionic-native/status-bar'; -import { MyApp } from './app.component'; -import { HomePage } from '../pages/home/home'; -import { LaProvider } from '../providers/la/la'; -let AppModule = class AppModule { -}; -AppModule = __decorate([ - NgModule({ - declarations: [ - MyApp, - HomePage - ], - imports: [ - BrowserModule, - IonicModule.forRoot(MyApp) - ], - bootstrap: [IonicApp], - entryComponents: [ - MyApp, - HomePage - ], - providers: [ - StatusBar, - SplashScreen, - { provide: ErrorHandler, useClass: IonicErrorHandler }, - LaProvider - ] - }) -], AppModule); -export { AppModule }; diff --git a/dist/app/main.js b/dist/app/main.js deleted file mode 100644 index 5b2f55c..0000000 --- a/dist/app/main.js +++ /dev/null @@ -1,3 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app.module'; -platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/dist/bundle.js b/dist/bundle.js new file mode 100644 index 0000000..79a197f --- /dev/null +++ b/dist/bundle.js @@ -0,0 +1,163 @@ +var LivingSDK = (function () { + 'use strict'; + + let commonjs = (typeof module === 'object' && module.exports); + let nodejs = {}; + let axios = undefined; + let ul4on; + let livingApi; + if (commonjs) { + livingApi = require('./modules/livingapi'); + nodejs.https = require('https'); + axios = require('axios'); + ul4on = require('./modules/ul4').ul4on; + } + else { + axios = window.axios; + ul4on = window.ul4on; + livingApi = window.livingapi; + } + class LivingSDK { + constructor(options = {}, username, password) { + this._password = password; + this._userName = username; + this._options = { + url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[LivingSDK] You want to login without a username'); + } + this.session = this.login(); + } + login() { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); + } + let url = `https://${this.hostName}/gateway/login`; + return axios.post(url, { + username: this._userName, + password: this._password + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + "Content-Type": "application/json" + } + }) + .then((a) => a.data.auth_token); + } + get(appId, templateName) { + return this.session.then((auth_token) => { + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + Accept: 'application/la-ul4on' + } + }) + .then((res) => { + let dump; + dump = ul4on.loads(res.data); + dump.get('globals').Login = this; + return dump; + }); + }); + } + _insert(app, values) { + return this.session.then((auth_token) => { + let fields = {}; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`insert() got an unexpected keyword argument ${ident}`); + } + fields[ident] = app.controls.get(ident).asjson(values[ident]); + } + let data = {}; + data.id = app.id; + data.data = [{ 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }) + .then((res) => { + return { + HTTPstatusCode: res.status, + recordid: res.data.id, + Record: livingApi.Record.create({ + id: res.data.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + }); + }); + } + _update(record, values) { + return this.session.then((auth_token) => { + let fields = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; + } + let data = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + 'Content-Type': 'application/json' + } + }) + .then((res) => { + let body = res.data; + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.status, + recordid: body.id, + Record: record + }; + return returnObj; + }); + }); + } + _delete(record) { + let app = record.app; + return this.session.then((auth_token) => { + return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }); + }); + } + } + + return LivingSDK; + +}()); diff --git a/dist/livingSDK.js b/dist/livingSDK.js deleted file mode 100644 index e4d0806..0000000 --- a/dist/livingSDK.js +++ /dev/null @@ -1,356 +0,0 @@ -export default class livingSDK { - constructor(options = {}, username, password) { - this._password = password; - this._userName = username; - this._options = { - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', - loginRequired: options.loginRequired !== undefined ? options.loginRequired : true - }; - this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; - this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); - if (this._options.loginRequired && !this._userName) { - throw new Error('[livingSDK] You want to login without a username'); - } - this.session = this.login(); - } - login() { - if (!this._options.loginRequired) { - return Promise.resolve(undefined); - } - return new Promise((resolve, reject) => { - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), - "port": 443, - "path": "/gateway/login", - "headers": { - "Content-Type": "application/json" - } - }; - let req = http.request(options, (res) => { - let chunks = []; - ; - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - res.on('data', (chunk) => { - chunks.push(chunk); - }); - res.on('end', () => { - let body = Buffer.concat(chunks); - resolve(JSON.parse(body.toString()).auth_token); - }); - }); - req.write(JSON.stringify({ - username: this._userName, - password: this._password - })); - req.end(); - } - else { - $.ajax(`${this._options.url}gateway/login`, { - dataType: 'json', - data: JSON.stringify({ - 'username': this._userName, - 'password': this._password - }), - method: 'POST', - error: function (error) { - reject(error); - }, - success: function (body) { - resolve(body.auth_token); - } - }); - } - }); - } - get(appID, templateName) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "GET", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), - "port": 443, - "path": `/gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : ''}`, - "headers": { - 'Accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on('data', function (chunk) { - chunks.push(chunk); - }); - res.on('end', () => { - if (res.statusCode === 200) { - let body = Buffer.concat(chunks).toString(); - let dump; - try { - dump = ul4on.loads(body.toString()); - } - catch (err) { - reject(err); - return; - } - dump.get('globals').Login = this; - resolve(dump); - } - else if (res.statusCode === 403) { - this.session = this.login(); - console.log('token is not valid'); - resolve(this.get(appID, templateName)); - } - else { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - }); - }); - req.end(); - } - else { - $.ajax(`${this._options.url}gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : ''}`, { - headers: { - 'Accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'GET', - error: (error) => { - if (error.status === 403) { - this.session = this.login(); - console.log('token is not valid'); - resolve(this.get(appID, templateName)); - } - reject(error); - }, - success: (body) => { - let dump = ul4on.loads(body); - dump.get('globals').Login = this; - resolve(dump); - } - }); - } - }); - }); - } - _insert(app, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`insert() got an unexpected keyword argument ${ident}`); - } - fields[ident] = app.controls.get(ident).asjson(values[ident]); - } - let data = {}; - { - } - data.id = app.id; - data.data = [{ 'fields': fields }]; - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - "Content-Type": "application/json", - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - res.on('end', () => { - if (res.statusCode !== 200) { - reject(res.statusCode); - return; - } - let body = Buffer.concat(chunks).toString(); - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: livingApi.Record.create({ - id: JSON.parse(body).id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({ 'appdd': data })); - req.end(); - } - else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - method: 'post', - data: { 'appdd': JSON.stringify(data) }, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - success: (body) => { - let returnObj = { - recordid: body.id, - Record: livingApi.Record.create({ - id: body.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - }, - error: (error) => { - reject(error); - } - }); - } - }); - }); - } - _update(record, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`update() got an unexpected keyword argument ${ident}`); - } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{ 'id': record.id, 'fields': fields }]; - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - "Content-Type": "application/json", - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - res.on('end', () => { - let body = Buffer.concat(chunks).toString(); - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: record - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({ 'appdd': data })); - req.end(); - } - else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - data: { 'appdd': JSON.stringify(data) }, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'post', - success: (body) => { - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: 200, - recordid: body.id, - Record: record - }; - resolve(returnObj); - }, - error: (error) => { - reject(error); - } - }); - } - }); - }); - } - _delete(record) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let app = record.app; - let recordId = record.id; - if (commonjs) { - let options = { - 'ecdhCurve': 'auto', - 'method': 'DELETE', - 'hostname': this.hostName, - 'port': 443, - 'path': `/gateway/v1/appdd/${app.id}/${recordId}.json`, - 'headers': { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - res.on('end', () => { - if (res.statusCode === 200) - resolve(200); - }); - }); - req.end(); - } - else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}/${recordId}.json`, { - method: 'delete', - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - success: () => { - resolve(200); - }, - error: () => { - reject(error); - } - }); - } - }); - }); - } -} -if (commonjs) { - module.exports = livingSDK; -} -else { - root.livingSDK = livingSDK; -} -(this); diff --git a/dist/livingsdk.js b/dist/livingsdk.js new file mode 100644 index 0000000..986aa1d --- /dev/null +++ b/dist/livingsdk.js @@ -0,0 +1,162 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +let commonjs = (typeof module === 'object' && module.exports); +let nodejs = {}; +let axios = undefined; +let ul4on; +let livingApi; +if (commonjs) { + livingApi = require('./modules/livingapi'); + nodejs.https = require('https'); + axios = require('axios'); + ul4on = require('./modules/ul4').ul4on; +} +else { + axios = window.axios; + ul4on = window.ul4on; + livingApi = window.livingapi; +} +class LivingSDK { + constructor(options = {}, username, password) { + this._password = password; + this._userName = username; + this._options = { + url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[LivingSDK] You want to login without a username'); + } + this.session = this.login(); + } + login() { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); + } + let url = `https://${this.hostName}/gateway/login`; + return axios.post(url, { + username: this._userName, + password: this._password + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + "Content-Type": "application/json" + } + }) + .then((a) => a.data.auth_token); + } + get(appId, templateName) { + return this.session.then((auth_token) => { + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + Accept: 'application/la-ul4on' + } + }) + .then((res) => { + let dump; + dump = ul4on.loads(res.data); + dump.get('globals').Login = this; + return dump; + }); + }); + } + _insert(app, values) { + return this.session.then((auth_token) => { + let fields = {}; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`insert() got an unexpected keyword argument ${ident}`); + } + fields[ident] = app.controls.get(ident).asjson(values[ident]); + } + let data = {}; + { + } + data.id = app.id; + data.data = [{ 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }) + .then((res) => { + return { + HTTPstatusCode: res.status, + recordid: res.data.id, + Record: livingApi.Record.create({ + id: res.data.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + }); + }); + } + _update(record, values) { + return this.session.then((auth_token) => { + let fields = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; + } + let data = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + 'Content-Type': 'application/json' + } + }) + .then((res) => { + let body = res.data; + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.status, + recordid: body.id, + Record: record + }; + return returnObj; + }); + }); + } + _delete(record) { + let app = record.app; + return this.session.then((auth_token) => { + return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }); + }); + } +} +exports.default = LivingSDK; +; diff --git a/dist/modules/livingapi.js b/dist/modules/livingapi.js new file mode 100644 index 0000000..a5d6faa --- /dev/null +++ b/dist/modules/livingapi.js @@ -0,0 +1,1060 @@ +(function(root){ + + + let amd = (typeof define === 'function' && define.amd); + let commonjs = (typeof module === 'object' && module.exports); + + let la = {}; + + let ul4, ul4on; + + if (commonjs) { + ul4 = require('./ul4.js').ul4; + ul4on = require('./ul4').ul4on; + module.exports = la; + } else { + ul4 = root.ul4; + ul4on = root.ul4on; + root.livingapi = la; + } + la.Base = ul4._inherit( + ul4.Proto, + { + create: function() + { + return ul4._clone(this); + }, + + ul4ondump: function ul4ondump(encoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + return this[name]; + }, + + ul4onload: function ul4onload(decoder) + { + for (var i = 0, iter = decoder.loadcontent();; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); + } + for (; i < this._ul4onattrs.length; ++i) + { + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); + } + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + this[name] = value; + }, + + _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) + { + this[name] = null; + } + } + ); + + la.Globals = ul4._inherit( + la.Base, + { + _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], + + __repr__: function repr() + { + return ""; + }, + + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + geodist: function geodist(geo1, geo2) + { + var sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; + var sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; + var deg2rad = Math.PI/180; // Conversion factor degree -> radians + var radius = 6378.137; // Equatorial radius of earth in km + var flat = 1/298.257223563; // Earth flattening + + var lat1 = geo1.lat * deg2rad; + var long1 = geo1.long * deg2rad; + var lat2 = geo2.lat * deg2rad; + var long2 = geo2.long * deg2rad; + var F = (lat1 + lat2)/2; + var G = (lat1 - lat2)/2; + var l = (long1 - long2)/2; + var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + var w = Math.atan(Math.sqrt(S/C)); + var D = 2 * w * radius; + var T = Math.sqrt(S*C)/w; + var H1 = (3*T-1)/(2*C); + var H2 = (3*T+1)/(2*S); + var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; + } + } + ); + + la.FlashMessage = ul4._inherit( + la.Base, + { + _ul4onattrs: ["timestamp", "type", "title", "message"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.App = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], + + insert: function (values) + { + return this.globals.Login._insert(this, values); + }, + + __repr__: function repr() + { + return ""; + } + } + ); + + la.View = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.DataSource = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "app", "apps"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Record = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + + delete: function () + { + return this.app.globals.Login._delete(this); + }, + + update: function (values) + { + return this.app.globals.Login._update(this, values); + }, + + __repr__: function repr() + { + return ""; + }, + + search: function search(search) + { + for (var identifier in search) + { + var fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) + { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; + } + } + return true; + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + if (name === "values") + return this._sparsevalues; + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + if (name === "values") + { + this._sparsevalues = value; + this._values = null; + this._fields = null; + } + else + this[name] = value; + } + } + ); + + Object.defineProperty(la.Record, "values", { + get: function() + { + if (this._values === null) + { + this._values = ul4on._havemap ? new Map() : {}; + var self = this; + this.app.controls.forEach(function(control, id){ + var fieldvalue = self._sparsevalues.get(control.identifier); + if (typeof(fieldvalue) === "undefined") + fieldvalue = null; + self._values.set(id, fieldvalue); + }); + } + return this._values; + } + }); + + Object.defineProperty(la.Record, "fields", { + get: function() + { + if (this._fields === null) + { + this._fields = ul4on._havemap ? new Map() : {}; + var self = this; + this.values.forEach(function(value, id){ + var field = la.Field.create(self.app.controls.get(id), self.app, value); + self._fields.set(id, field); + }); + } + return this._fields; + } + }); + + la.Control = ul4._inherit( + la.Base, + { + type: null, + subtype: null, + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app" && this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + __repr__: function repr() + { + return ""; + }, + + asjson: function(value) + { + return value; + }, + + _logsearch: function _logsearch(value, search) + { + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); + }, + + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search: function search(value, search) + { + return false; + } + } + ); + + la.BoolControl = ul4._inherit( + la.Control, + { + type: "bool", + __type__: "BoolControl", + + // ``search`` must by ``null``, ``false`` or ``true`` + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } + } + ); + + la.IntControl = ul4._inherit( + la.Control, + { + type: "int", + __type__: "IntControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } + } + ); + + la.NumberControl = ul4._inherit( + la.Control, + { + type: "number", + __type__: "NumberControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") + { + if (value === null) + return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); + } + else + return false; + } + } + ); + + la.StringControl = ul4._inherit( + la.Control, + { + type: "string", + + asjson: function (value) + { + return value; + }, + + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") + { + if (search.value === null || value === null) + return search.value === value; + else + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; + } + } + } + ); + + la.TextControl = ul4._inherit( + la.StringControl, + { + subtype: "text", + __type__: "TextControl" + } + ); + + la.EmailControl = ul4._inherit( + la.StringControl, + { + subtype: "email", + __type__: "EmailControl" + } + ); + + la.URLControl = ul4._inherit( + la.StringControl, + { + subtype: "url", + __type__: "URLControl" + } + ); + + la.TelControl = ul4._inherit( + la.StringControl, + { + subtype: "tel" + } + ); + + la.PasswordControl = ul4._inherit( + la.StringControl, + { + subtype: "password" + } + ); + + la.TextAreaControl = ul4._inherit( + la.StringControl, + { + subtype: "textarea", + __type__: "TextAreaControl" + } + ); + + la.DateControl = ul4._inherit( + la.Control, + { + type: "date", + subtype: "date", + __type__: "DateControl", + + asjson: function (value) + { + if (value instanceof Date){ + value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; + } + return value; + }, + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; + }, + + // searchvalue must be ``null``, a ``Date`` object or a string + search: function search(value, search) + { + this._logsearch(value, search); + + var searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") + { + if (searchvalue === null || value === null) + return searchvalue === value; + else + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; + } + else + return false; + } + } + ); + + la.DatetimeMinuteControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimeminute", + __type__: "DatetimeMinuteControl", + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; + } + } + ); + + la.DatetimeSecondControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimesecond", + __type__: "DatetimeMinuteSecond", + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; + } + } + ); + + la.LookupControl = ul4._inherit( + la.Control, + { + type: "lookup", + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app") + { + if (this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + ul4onattrs.push("lookupdata"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + // ``search.value`` must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (this.lookupapp === null) + { + if (search.operator === "equals") + { + if (value === null) + return search.value === null; + else + return value.key === search.value; + } + else + return false; + } + else + { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } + } + ); + + la.LookupSelectControl = ul4._inherit( + la.LookupControl, + { + subtype: "select", + __type__: "LookupSelectControl" + } + ); + + la.LookupRadioControl = ul4._inherit( + la.LookupControl, + { + subtype: "radio", + __type__: "LookupRadioControl" + } + ); + + la.LookupChoiceControl = ul4._inherit( + la.LookupControl, + { + subtype: "choice", + __type__: "LookupChoiceControl" + } + ); + + la.AppLookupControl = ul4._inherit( + la.Control, + { + type: "applookup", + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app") + { + if (this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + ul4onattrs.push("lookupapp"); + ul4onattrs.push("lookupcontrols"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + ul4onattrs: function ul4onattrs() + { + var ul4onattrs = la.Control.ul4onattrs.call(this); + return ul4onattrs; + }, + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } + ); + + la.AppLookupSelectControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "select", + __type__: "AppLookupSelectControl" + } + ); + + la.AppLookupRadioControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "radio", + __type__: "AppLookupRadioControl" + } + ); + + la.AppLookupChoiceControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "choice", + __type__: "AppLookupChoiceControl" + } + ); + + la.MultipleLookupControl = ul4._inherit( + la.LookupControl, + { + type: "multiplelookup", + + // search.value must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (search.operator === "equals") + { + if (this.lookupapp === null) + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].key === search.value) + return true; + } + return false; + } + else + { + if (search.value === null) + return value.length === 0; + else + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].search(search.value)) + return true; + } + return false; + } + } + } + else + return false; + } + } + ); + + la.MultipleLookupSelectControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "select", + __type__: "MultipleLookupSelectControl" + } + ); + + la.MultipleLookupCheckboxControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "checkbox", + __type__: "MultipleLookupCheckboxControl" + } + ); + + la.MultipleAppLookupControl = ul4._inherit( + la.AppLookupControl, + { + type: "multipleapplookup", + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (search.operator === "equals") + { + if (search.value === null) + return value.length === 0; + else + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].search(search.value)) + return true; + } + return false; + } + } + else + return false; + } + } + ); + + la.MultipleAppLookupSelectControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "select", + __type__: "MultipleAppLookupSelectControl" + } + ); + + la.MultipleAppLookupCheckboxControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "checkbox", + __type__: "MultipleAppLookupCheckboxControl" + } + ); + + la.GeoControl = ul4._inherit( + la.Control, + { + type: "geo", + + + asjson: function(value) + { + if (la.Geo.isprotoof(value)) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + }, + + __type__: "GeoControl" + } + ); + + la.FileControl = ul4._inherit( + la.Control, + { + type: "file", + __type__: "FileControl" + } + ); + + la.ButtonControl = ul4._inherit( + la.Control, + { + type: "button", + __type__: "ButtonControl" + } + ); + + la.Field = ul4._inherit( + la.Base, + { + create: function create(control, record, value) + { + var field = la.Base.create.call(this); + field.control = control; + field.record = record; + field.value = value; + return field; + }, + + search: function search(searchvalue) + { + return this.control.search(this.value, searchvalue); + }, + + __repr__: function repr() + { + return ""; + } + } + ); + + la.LookupItem = ul4._inherit( + la.Base, + { + _ul4onattrs: ["key", "label"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.User = ul4._inherit( + la.Base, + { + _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.File = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Geo = ul4._inherit( + la.Base, + { + _ul4onattrs: ["lat", "long", "info"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Attachment = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "record", "label", "active"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.NoteAttachment = ul4._inherit( + la.Attachment, + { + type: "noteattachment", + __type__: "NoteAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.URLAttachment = ul4._inherit( + la.Attachment, + { + type: "urlattachment", + __type__: "URLAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.FileAttachment = ul4._inherit( + la.Attachment, + { + type: "fileattachment", + __type__: "FileAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.ImageAttachment = ul4._inherit( + la.Attachment, + { + type: "imageattachment", + __type__: "ImageAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + } + ); + + la.JSONAttachment = ul4._inherit( + la.Attachment, + { + type: "jsonattachment", + __type__: "JSONAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value + } + } + ); + + la.Installation = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Category = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + + __repr__: function repr() + { + var v = []; + var category = this; + while (category !== null) + { + v.splice(0, 0, category.identifier); + category = category.parent; + } + return ""; + } + } + ); + + la.KeyView = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "key", "user"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.AppParameter = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "identifier", "description", "value"], + + __repr__: function repr() + { + return ""; + } + } + ); + + var classes = [ + "Globals", + "App", + "View", + "DataSource", + "Record", + "BoolControl", + "IntControl", + "NumberControl", + "TextControl", + "EmailControl", + "URLControl", + "TelControl", + "PasswordControl", + "TextAreaControl", + "DateControl", + "DatetimeMinuteControl", + "DatetimeSecondControl", + "LookupControl", + "LookupSelectControl", + "LookupRadioControl", + "LookupChoiceControl", + "AppLookupControl", + "AppLookupSelectControl", + "AppLookupRadioControl", + "AppLookupChoiceControl", + "MultipleLookupControl", + "MultipleLookupSelectControl", + "MultipleLookupCheckboxControl", + "MultipleAppLookupControl", + "MultipleAppLookupSelectControl", + "MultipleAppLookupCheckboxControl", + "GeoControl", + "FileControl", + "ButtonControl", + "Field", + "LookupItem", + "User", + "File", + "Geo", + "NoteAttachment", + "URLAttachment", + "FileAttachment", + "ImageAttachment", + "JSONAttachment", + "Installation", + "Category", + "KeyView", + "AppParameter" + ]; + + for (var i = 0; i < classes.length; ++i) + { + var name = classes[i]; + var object = la[name]; + ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); + } + + })(this); \ No newline at end of file diff --git a/dist/modules/ul4.js b/dist/modules/ul4.js new file mode 100644 index 0000000..cad6ec8 --- /dev/null +++ b/dist/modules/ul4.js @@ -0,0 +1,8804 @@ +/*! + * UL4/UL4ON JavaScript Library + * http://www.livinglogic.de/Python/ul4c/ + * http://www.livinglogic.de/Python/ul4on/ + * + * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany + * Copyright 2011-2017 by Walter Dörwald + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/*jslint vars: true */ + +(function(undefined){ + + let amd = (typeof define === 'function' && define.amd); + let commonjs = (typeof module === 'object' && module.exports); + + var root = this, ul4 = {}, ul4on = {}; + + root.ul4 = ul4; + + root.ul4on = ul4on; + + + if (commonjs) { + module.exports.ul4 = ul4; + module.exports.ul4on = ul4on; + } else { + ul4 = root.ul4; + ul4on = root.ul4on; + } + + ul4.version = "41"; + + // + // UL4ON + // + + ul4on._registry = {}; + + ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); + + ul4on._havemapconstructor = false; + + if (ul4on._havemap) + { + try + { + if (new Map([[1, 2]]).size == 1) + ul4on._havemapconstructor = true; + } + catch (error) + { + } + } + + ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); + + ul4on._havesetconstructor = false; + + if (ul4on._haveset) + { + try + { + if (new Set([1, 2]).size == 2) + ul4on._havesetconstructor = true; + } + catch (error) + { + } + } + + // Function used for making maps, when the Map constructor doesn't work + ul4on._makemap = function _makemap() + { + var map = new Map(); + + for (var i = 0; i < arguments.length; ++i) + { + var argument = arguments[i]; + map.set(argument[0], argument[1]); + } + return map; + }; + + // Function that creates en empty Map (if supported) or an empty object + ul4on._emptymap = function _emptymap() + { + return ul4on._havemap ? new Map() : {}; + }; + + // Function that adds a (key, value) item to an object (or map) + if (ul4on._havemap) + { + ul4on._setmap = function _setmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; + } + else + { + ul4on._setmap = function _setmap(map, key, value) + { + map[key] = value; + }; + } + + // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) + if (ul4on._haveset) + { + ul4on._makeset = function _makeset() + { + var set = this._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; + } + else + { + ul4on._makeset = function _makeset() + { + var set = ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; + } + + // Register the object ``obj`` under the name ``name`` with the UL4ON machinery + ul4on.register = function register(name, obj) + { + obj.ul4onname = name; + ul4on._registry[name] = function(){return obj.create();}; + }, + + // Return a string that contains the object ``obj`` in the UL4ON serialization format + ul4on.dumps = function dumps(obj, indent) + { + var encoder = ul4on.Encoder.create(indent); + encoder.dump(obj); + return encoder.finish(); + }, + + // Load an object from the string ``data``. + // ``data`` must contain the object in the UL4ON serialization format + // ``registry`` may be null or a dictionary mapping type names to objects with a create method + ul4on.loads = function loads(data, registry) + { + var decoder = ul4on.Decoder.create(data, registry); + return decoder.load(); + }, + + // Helper "class" for encoding + ul4on.Encoder = { + // Create a new Encoder object + create: function create(indent) + { + var encoder = ul4._clone(this); + encoder.indent = indent || null; + encoder.data = []; + encoder._level = 0; + encoder._strings2index = {}; + encoder._ids2index = {}; + encoder._backrefs = 0; + return encoder; + }, + + _line: function _line(line) + { + var i, oldindent; + + if (this.indent !== null) + { + for (i = 0; i < this._level; ++i) + this.data.push(this.indent); + } + else + { + if (this.data.length) + this.data.push(" "); + } + this.data.push(line); + + if (arguments.length > 1) + { + oldindent = this.indent; + this.indent = null; + for (i = 1; i < arguments.length; ++i) + this.dump(arguments[i]); + this.indent = oldindent; + } + + if (this.indent !== null) + this.data.push("\n"); + }, + + // Return the complete string written to the buffer + finish: function finish() + { + return this.data.join(""); + }, + + dump: function dump(obj) + { + if (obj === null) + this._line("n"); + else if (typeof(obj) == "boolean") + this._line(obj ? "bT" : "bF"); + else if (typeof(obj) == "number") + { + var type = (Math.round(obj) == obj) ? "i" : "f"; + this._line(type + obj); + } + else if (typeof(obj) == "string") + { + var index = this._strings2index[obj]; + if (typeof(index) !== "undefined") + { + this._line("^" + index); + } + else + { + this._strings2index[obj] = this._backrefs++; + this._line("S" + ul4._str_repr(obj)); + } + } + else if (ul4._iscolor(obj)) + this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); + else if (ul4._isdate(obj)) + this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + else if (ul4._istimedelta(obj)) + this._line("t", obj.days(), obj.seconds(), obj.microseconds()); + else if (ul4._ismonthdelta(obj)) + this._line("m", obj.months()); + else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) + this._line("r", obj.start, obj.stop); + else if (obj.ul4onname && obj.ul4ondump) + { + if (obj.__id__) + { + var index = this._ids2index[obj.__id__]; + if (typeof(index) != "undefined") + { + this._line("^" + index); + return; + } + } + if (obj.__id__) + this._ids2index[obj.__id__] = this._backrefs++; + this._line("O", obj.ul4onname); + ++this._level; + obj.ul4ondump(this); + --this._level; + this._line(")"); + } + else if (ul4._islist(obj)) + { + this._line("l"); + ++this._level; + for (var i in obj) + this.dump(obj[i]); + --this._level; + this._line("]"); + } + else if (ul4._ismap(obj)) + { + this._line("e"); + ++this._level; + obj.forEach(function(value, key) { + this.dump(key); + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else if (ul4._isdict(obj)) + { + this._line("d"); + ++this._level; + for (var key in obj) + { + this.dump(key); + this.dump(obj[key]); + } + --this._level; + this._line("}"); + } + else if (ul4._isset(obj)) + { + this._line("y"); + ++this._level; + obj.forEach(function(value) { + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else + throw "can't handle object"; + } + }; + + // Helper "class" for decoding + ul4on.Decoder = { + // Creates a new decoder for reading from the string ``data`` + create: function create(data, registry) + { + var decoder = ul4._clone(this); + decoder.data = data; + decoder.pos = 0; + decoder.backrefs = []; + decoder.registry = typeof(registry) === "undefined" ? null : registry; + return decoder; + }, + + // Read a character from the buffer + readchar: function readchar() + { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + return this.data.charAt(this.pos++); + }, + + // Read a character from the buffer (return null on eof) + readcharoreof: function readcharoreof() + { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + }, + + // Read next not-whitespace character from the buffer + readblackchar: function readblackchar() + { + var re_white = /\s/; + + for (;;) + { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + var c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } + }, + + // Read ``size`` characters from the buffer + read: function read(size) + { + if (this.pos+size > this.length) + size = this.length-this.pos; + var result = this.data.substring(this.pos, this.pos+size); + this.pos += size; + return result; + }, + + // "unread" one character + backup: function backup() + { + --this.pos; + }, + + // Read a number from the buffer + readnumber: function readnumber() + { + var re_digits = /[-+0123456789.eE]/, value = ""; + for (;;) + { + var c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else + { + var result = parseFloat(value); + if (result == NaN) + throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; + return result; + } + } + }, + + _beginfakeloading: function _beginfakeloading() + { + var oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + }, + + _endfakeloading: function _endfakeloading(oldpos, value) + { + this.backrefs[oldpos] = value; + }, + + _readescape: function _readescape(escapechar, length) + { + var chars = this.read(length); + if (chars.length != length) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + var codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + return String.fromCharCode(codepoint); + }, + + // Load the next object from the buffer + load: function load() + { + var typecode = this.readblackchar(); + var result; + switch (typecode) + { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + var delimiter = this.readblackchar(); + for (;;) + { + var c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") + { + var c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } + else + result.push(c); + } + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = ul4.Color.create(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load()/1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = ul4.TimeDelta.create(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = ul4.slice.create(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = ul4.MonthDelta.create(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "]") + return result; + this.backup(); + result.push(this.load()); + } + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4on._havemap && (typecode == "e" || typecode == "E")) + throw "ordered dictionaries are not supported!"; + result = ul4on._emptymap(); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + var key = this.load(); + var value = this.load(); + ul4on._setmap(result, key, value); + } + return result; + case "y": + case "Y": + result = ul4on._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + result.add(this.load()); + } + return result; + case "o": + case "O": + var oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + var name = this.load(); + var proto; + if (this.registry !== null) + { + proto = this.registry[name]; + if (typeof(proto) === "undefined") + proto = ul4on._registry[name]; + } + else + proto = ul4on._registry[name]; + if (typeof(proto) === "undefined") + throw "can't load object of type " + ul4._repr(name); + result = proto(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); + typecode = this.readblackchar(); + if (typecode !== ")") + throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; + return result; + default: + throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + } + }, + + // Return an iterator for loading the content of a object + loadcontent: function load(loadcontent) + { + let self = this; + return { + next: function() + { + let typecode = self.readblackchar(); + self.backup(); + if (typecode == ")") + return {done: true}; + else + return {done: false, value: self.load()}; + } + }; + } + }; + + + // + // UL4 + // + + // REs for parsing JSON + ul4._rvalidchars = /^[\],:{}\s]*$/; + ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; + + /// Helper functions + + // Crockford style object creation + ul4._simpleclone = function _simpleclone(obj) + { + function F(){}; + F.prototype = obj; + var result = new F(); + return result; + }; + + // Crockford style object creation + prototype chain + object ids + ul4._clone = function _clone(obj) + { + var result = ul4._simpleclone(obj); + result.__prototype__ = obj; + result.__id__ = ul4.Proto._nextid++; + return result; + }; + + // Adds attributes from on object to another and returns it + ul4._extend = function _extend(obj, attrs) + { + for (var name in attrs) + obj[name] = attrs[name]; + return obj; + }; + + // Clone an object via ``_simpleclone`` and extend it + ul4._simpleinherit = function _simpleinherit(baseobj, attrs) + { + return ul4._extend(ul4._simpleclone(baseobj), attrs); + }; + + // Clone an object via ``_clone`` and extend it + ul4._inherit = function _inherit(baseobj, attrs) + { + return ul4._extend(ul4._clone(baseobj), attrs); + }; + + // Convert a map to an object + ul4._map2object = function _map2object(obj) + { + if (ul4._ismap(obj)) + { + var newobj = {}; + obj.forEach(function(value, key){ + if (typeof(key) !== "string") + throw ul4.TypeError.create("keys must be strings"); + newobj[key] = value; + }); + return newobj; + } + return obj; + }; + + // Clip a number to the range [0;max) + ul4._bound = function _bound(value, upper) + { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; + }; + + // Create a pretty stacktrace from an exception + ul4._stacktrace = function _stacktrace(exc) + { + var output = ul4._type(exc); + var s = exc.toString(); + if (s) + output += ": " + s; + if (exc.cause) + output += "\n\n" + ul4._stacktrace(exc.cause); + return output; + }; + + // Call a function ``f`` with UL4 argument handling + ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) + { + var finalargs; + if (needsobject) + { + if (signature === null) + { + if (args.length) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; + } + else + finalargs = [signature.bindObject(name, args, kwargs)]; + } + else + { + if (signature === null) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); + }; + + ul4._callfunction = function _callfunction(context, f, args, kwargs) + { + var name = f._ul4_name || f.name; + if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") + throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); + } + + ul4._callobject = function _callobject(context, obj, args, kwargs) + { + if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") + throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); + } + + ul4._callrender = function _callrender(context, obj, args, kwargs) + { + if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") + throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); + } + + ul4._call = function _call(context, f, args, kwargs) + { + if (typeof(f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof(f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); + else + throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); + } + + ul4._unpackvar = function _unpackvar(lvalue, value) + { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else + { + var newvalue = []; + var iter = ul4._iter(value); + + for (var i = 0;;++i) + { + var item = iter.next(); + + if (item.done) + { + if (i === lvalue.length) + break; + else + throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); + } + else + { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); + } + } + return newvalue; + } + }; + + ul4._formatsource = function _formatsource(out) + { + var finalout = []; + var level = 0, needlf = false; + for (var i = 0; i < out.length; ++i) + { + if (typeof(out[i]) === "number") + { + level += out[i]; + needlf = true; + } + else + { + if (needlf) + { + finalout.push("\n"); + for (var j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; + } + finalout.push(out[i]); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); + }; + + // Compare ``obj1`` and ``obj2`` if they have the same value + ul4._eq = function _eq(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof(obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 == obj2 + else + return false; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 == obj2; + else + return false; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; + } + else + return false; + } + else if (ul4._isobject(obj1)) + { + if (ul4._isobject(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) + { + if (obj2.hasOwnProperty(key)) + { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) + { + if (!obj1.hasOwnProperty(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) + { + if (obj2.has(key)) + { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + var result = true; + obj2.forEach(function(value, key){ + if (!obj1.hasOwnProperty(key)) + result = false; + }); + return result; + } + else + return false; + } + else if (ul4._ismap(obj1)) + { + if (ul4._isobject(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function(value, key){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.hasOwnProperty(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + result = false; + } + }); + if (!result) + return false; + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) + { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function(value, key){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2.get(key))) + result = false; + } + }); + return result; + } + else + return false; + } + else if (ul4._isset(obj1)) + { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + var result = true; + obj1.forEach(function(value){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(value)) + result = false; + } + }); + return result; + } + else + return false; + } + else + return obj1 === obj2; + }; + + // Compare ``obj1`` and ``obj2`` if they don't have the same value + ul4._ne = function _ne(obj1, obj2) + { + if (obj1 && typeof(obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof(obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); + } + + ul4._unorderable = function _unorderable(operator, obj1, obj2) + { + throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); + }; + + // Return: + // -1 when ``obj1 < obj2``, + // 0 when ``obj1 == obj2``, + // 1 when ``obj1 > obj2``, + // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) + // raise TypeError if objects are uncomparable + // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= + // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + + ul4._cmp = function _cmp(operator, obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + { + var v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); + } + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return 0; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return 1; + var res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; + } + return obj2.length > obj1.length ? -1 : 0; + } + } + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + else + ul4._unorderable(operator, obj1, obj2); + } + + // Return whether ``obj1 < obj2`` + ul4._lt = function _lt(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 < obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1)) + { + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<", obj1, obj2); + }; + + // Return whether ``obj1 <= obj2`` + ul4._le = function _le(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length <= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<=", obj1, obj2); + }; + + // Return whether ``obj1 > obj2`` + ul4._gt = function _gt(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 > obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length > obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">", obj1, obj2); + }; + + // Return whether ``obj1 >= obj2`` + ul4._ge = function _ge(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length >= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">=", obj1, obj2); + }; + + // Return an iterator for ``obj`` + ul4._iter = function _iter(obj) + { + if (typeof(obj) === "string" || ul4._islist(obj)) + { + return { + index: 0, + next: function() + { + if (this.index < obj.length) + return {value: obj[this.index++], done: false}; + else + return {done: true}; + } + }; + } + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof(obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) + { + var keys = []; + obj.forEach(function(value, key){ + keys.push(key); + }); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + else if (ul4._isset(obj)) + { + var values = []; + obj.forEach(function(value, key){ + values.push(value); + }); + return { + index: 0, + next: function() + { + if (this.index >= values.length) + return {done: true}; + return {value: values[this.index++], done: false}; + } + }; + } + else if (ul4._isul4set(obj)) + { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) + { + var keys = []; + for (var key in obj) + keys.push(key); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); + }; + + ul4._str_repr = function _str_repr(str, ascii) + { + var result = ""; + var squote = false, dquote = false; + + for (var i = 0; i "; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (typeof(obj) === "undefined") + return ""; + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; + }; + + // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` + ul4._repr = function _repr(obj) + { + return ul4._repr_internal(obj, false); + } + + ul4._ascii = function _ascii(obj) + { + return ul4._repr_internal(obj, true); + } + + ul4._date_str = function _date_str(obj) + { + var year = obj.getFullYear(); + var month = obj.getMonth()+1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + + var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; + }; + + ul4._str = function _str(obj) + { + if (typeof(obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return obj; + else if (typeof(obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") + return obj.__str__(); + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; + }; + + // Convert ``obj`` to bool, according to its "truth value" + ul4._bool = function _bool(obj) + { + if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else + { + if (typeof(obj) === "object", typeof(obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) + { + for (var key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } + }; + + // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) + ul4._int = function _int(obj, base) + { + var result; + if (base !== null) + { + if (typeof(obj) !== "string" || !ul4._isint(base)) + throw ul4.TypeError.create("int()", "int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else + { + if (typeof(obj) == "string") + { + result = parseInt(obj); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else if (typeof(obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); + } + }; + + // Convert ``obj`` to a float + ul4._float = function _float(obj) + { + if (typeof(obj) === "string") + return parseFloat(obj); + else if (typeof(obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); + }; + + // Convert ``obj`` to a list + ul4._list = function _list(obj) + { + var iter = ul4._iter(obj); + + var result = []; + for (;;) + { + var value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } + }; + + // Convert ``obj`` to a set + ul4._set = function _set(obj) + { + var iter = ul4._iter(obj); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (;;) + { + var value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } + }; + + // Return the length of ``sequence`` + ul4._len = function _len(sequence) + { + if (typeof(sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) + { + var i = 0; + for (var key in sequence) + ++i; + return i; + } + throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); + }; + + ul4._type = function _type(obj) + { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (typeof(obj) === "string") + return "str"; + else if (typeof(obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (ul4._islist(obj)) + return "list"; + else if (ul4._isset(obj)) + return "set"; + else if (ul4._isdate(obj)) + return "date"; + else if (typeof(obj.__type__) !== "undefined") + return obj.__type__; + else if (ul4._istimedelta(obj)) + return "timedelta"; + else if (ul4._isdict(obj)) + return "dict"; + else if (ul4._istemplate(obj)) + return "template"; + else if (ul4._isfunction(obj)) + return "function"; + return null; + }; + + + // Return whether any of the items in ``iterable`` are true + ul4._any = function _any(iterable) + { + if (typeof(iterable) == "string") + { + for (var i = 0; i < iterable.length; ++i) + { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else + { + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } + }; + + // Return whether all of the items in ``iterable`` are true + ul4._all = function _all(iterable) + { + if (typeof(iterable) == "string") + { + for (var i = 0; i < iterable.length; ++i) + { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else + { + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } + }; + + // Check if ``obj`` is undefined + ul4._isundefined = function _isundefined(obj) + { + return typeof(obj) === "undefined"; + }; + + + // Check if ``obj`` is *not* undefined + ul4._isdefined = function _isdefined(obj) + { + return typeof(obj) !== "undefined"; + }; + + // Check if ``obj`` is ``None`` + ul4._isnone = function _isnone(obj) + { + return obj === null; + }; + + // Check if ``obj`` is a boolean + ul4._isbool = function _isbool(obj) + { + return typeof(obj) == "boolean"; + }; + + // Check if ``obj`` is a int + ul4._isint = function _isint(obj) + { + return (typeof(obj) == "number") && Math.round(obj) == obj; + }; + + // Check if ``obj`` is a float + ul4._isfloat = function _isfloat(obj) + { + return (typeof(obj) == "number") && Math.round(obj) != obj; + }; + + // Check if ``obj`` is a string + ul4._isstr = function _isstr(obj) + { + return typeof(obj) == "string"; + }; + + // Check if ``obj`` is a date + ul4._isdate = function _isdate(obj) + { + return Object.prototype.toString.call(obj) == "[object Date]"; + }; + + // Check if ``obj`` is a color + ul4._iscolor = function _iscolor(obj) + { + return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); + }; + + // Check if ``obj`` is a timedelta object + ul4._istimedelta = function _istimedelta(obj) + { + return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); + }; + + // Check if ``obj`` is a monthdelta object + ul4._ismonthdelta = function _ismonthdelta(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); + }; + + // Check if ``obj`` is a template + ul4._istemplate = function _istemplate(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); + }; + + // Check if ``obj`` is a function + ul4._isfunction = function _isfunction(obj) + { + return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); + }; + + // Check if ``obj`` is a list + ul4._islist = function _islist(obj) + { + return Object.prototype.toString.call(obj) == "[object Array]"; + }; + + // Check if ``obj`` is a set + ul4._isset = function _isset(obj) + { + return Object.prototype.toString.call(obj) == "[object Set]"; + }; + + // Check if ``obj`` is an exception (at least a UL4 exception) + ul4._isexception = function _isexception(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); + }; + + ul4._isul4set = function _isul4set(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); + }; + + // Check if ``obj`` is an iterator + ul4._isiter = function _isiter(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; + }; + + // Check if ``obj`` is a JS object + ul4._isobject = function _isobject(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; + }; + + // Check if ``obj`` is a map + ul4._ismap = function _ismap(obj) + { + if (ul4on._havemap) + return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + return false; + }; + + // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj) || ul4._ismap(obj); + }; + + + // Repeat string ``str`` ``rep`` times + ul4._str_repeat = function _str_repeat(str, rep) + { + var result = ""; + for (; rep>0; --rep) + result += str; + return result; + }; + + ul4._list_repeat = function _list_repeat(list, rep) + { + var result = []; + for (; rep>0; --rep) + for (var i = 0; i < list.length; ++i) + result.push(list[i]); + return result; + }; + + ul4._str_json = function _str_json(str) + { + var result = ""; + for (var i = 0; i < str.length; ++i) + { + var c = str[i]; + switch (c) + { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + default: + var code = str.charCodeAt(i); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; + }; + + // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) + ul4._asjson = function _asjson(obj) + { + if (obj === null) + return "null"; + else if (typeof(obj) === "undefined") + return "{}.undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof(obj) === "string") + return ul4._str_json(obj); + else if (typeof(obj) === "number") + { + return "" + obj; + } + else if (ul4._islist(obj)) + { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) + { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) + { + var v = []; + v.push("{"); + var i = 0; + obj.forEach(function(value, key){ + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) + { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) + { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) + { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) + { + return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) + { + return "ul4.MonthDelta.create(" + obj.months + ")"; + } + else if (ul4._iscolor(obj)) + { + return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) + { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); + }; + + // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object + ul4._fromjson = function _fromjson(string) + { + // The following is from jQuery's parseJSON function + string = ul4._strip(string, null); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw ul4.TypeError.create("fromjson()", "invalid JSON"); + }; + + // Encodes ``obj`` in the UL4 Object Notation format + ul4._asul4on = function _asul4on(obj) + { + return ul4on.dumps(obj); + }; + + // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object + ul4._fromul4on = function _fromul4on(string) + { + return ul4on.loads(string); + }; + + ul4._format_date = function _format_date(obj, fmt, lang) + { + var translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p " + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + var translation = translations[lang]; + + var firstday; + + var result = []; + var inspec = false; + for (var i = 0; i < fmt.length; ++i) + { + var c = fmt[i]; + if (inspec) + { + switch (c) + { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4._yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth()+1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else + { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); + }; + + ul4._format_int = function _format_int(obj, fmt, lang) + { + var work = fmt; + + // Defaults + var fill = ' '; + var align = '>'; // '<', '>', '=' or '^' + var sign = '-'; // '+', '-' or ' ' + var alternate = false; + var minimumwidth = 0; + var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) + { + type = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract minimum width + if (/\d+$/.test(work)) + { + var minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) + { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) + { + alternate = true; + work = work.substring(0, work.length-1); + } + + // Determine sign + if (/[+ -]$/.test(work)) + { + if (type == 'c') + throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract fill and align char + if (work.length >= 3) + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) + { + if (/[<>=^]$/.test(work)) + { + align = work[1]; + fill = work[0]; + } + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) + { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + var neg = obj < 0; + + if (neg) + obj = -obj; + + var output; + switch (type) + { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw ul4.ValueError.create("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') + { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else + { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) + { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth-output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + else // if (align == '^') + { + var pad = minimumwidth - output.length; + var padBefore = Math.floor(pad/2); + var padAfter = pad-padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; + }; + + // Format ``obj`` using the format string ``fmt`` in the language ``lang`` + ul4._format = function _format(obj, fmt, lang) + { + if (typeof(lang) === "undefined" || lang === null) + lang = "en"; + else + { + var translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; + lang = lang.toLowerCase(); + if (typeof(translations[lang]) === "undefined") + { + lang = lang.split(/_/)[0]; + if (typeof(translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_date(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); + }; + + ul4._lpad = function _lpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; + }; + + ul4._rpad = function _rpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; + }; + + ul4.Proto = { + __prototype__: null, + __id__: 0, + _nextid: 1, + isa: function isa(type) + { + if (this === type) + return true; + if (this.__prototype__ === null) + return false; + return this.__prototype__.isa(type); + }, + + isprotoof: function isprotoof(obj) + { + while (true) + { + if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") + return false; + if (obj === this) + return true; + obj = obj.__prototype__; + } + }, + + // equality comparison of objects defaults to identity comparison + __eq__: function __eq__(other) + { + return this === other; + }, + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__: function __ne__(other) + { + return !this.__eq__(other); + }, + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__: function __bool__() + { + return true; + } + }; + + ul4.Signature = ul4._inherit( + ul4.Proto, + { + create: function create() + { + var signature = ul4._clone(this); + signature.args = []; + signature.argNames = {}; + signature.remargs = null; + signature.remkwargs = null; + + var nextDefault = false; + var lastArgname = null; + for (var i = 0; i < arguments.length; ++i) + { + var argName = arguments[i]; + if (nextDefault) + { + signature.args.push({name: lastArgname, defaultValue: argName}); + signature.argNames[lastArgname] = true; + nextDefault = false; + } + else + { + if (argName.substr(argName.length-1) === "=") + { + lastArgname = argName.substr(0, argName.length-1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + signature.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + signature.remargs = argName.substr(1); + else + { + signature.args.push({name: argName}); + signature.argNames[argName] = true; + } + } + } + return signature; + }, + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray: function bindArray(name, args, kwargs) + { + var finalargs = []; + var decname = name !== null ? name + "() " : ""; + + for (var i = 0; i < this.args.length; ++i) + { + var arg = this.args[i]; + if (i < args.length) + { + if (kwargs.hasOwnProperty(arg.name)) + throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else + { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else + { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) + { + // No, but we have them -> complain + if (args.length > this.args.length) + { + var prefix = name === null ? "expected" : name + "() expects"; + throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else + { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) + { + // No => complain about unknown ones + for (var key in kwargs) + { + if (!this.argNames[key]) + { + if (name === null) + throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else + { + // Yes => Put the unknown ones into an object and add that to the arguments array + var remkwargs = {}; + for (var key in kwargs) + { + if (!this.argNames[key]) + remkwargs[key] = kwargs[key]; + } + finalargs.push(remkwargs); + } + + return finalargs; + }, + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject: function bindObject(name, args, kwargs) + { + args = this.bindArray(name, args, kwargs); + var argObject = {}; + var i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + }, + + __repr__: function __repr__() + { + return ""; + }, + + __str__: function __str__() + { + return this.toString(); + }, + + toString: function toString() + { + var v = []; + for (var i = 0; i < this.args.length; ++i) + { + var arg = this.args[i]; + + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + } + ); + + // Adds name and signature to a function/method and makes the method callable in templates + ul4.expose = function expose(signature, options, f) + { + if (typeof(f) === "undefined") + { + f = options; + options = {}; + } + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + + return f; + }; + + ul4.Context = ul4._inherit( + ul4.Proto, + { + create: function create(vars) + { + if (vars === null || typeof(vars) === "undefined") + vars = {}; + var context = ul4._clone(this); + context.vars = vars; + context.indents = []; + context._output = []; + return context; + }, + + /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. + * This is used by the various comprehensions to avoid leaking loop variables. + */ + inheritvars: function inheritvars() + { + var context = ul4._clone(this); + context.vars = ul4._simpleclone(this.vars); + return context; + }, + + /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ + withindent: function withindent(indent) + { + var context = ul4._clone(this); + if (indent !== null) + { + context.indents = this.indents.slice(); + context.indents.push(indent); + } + return context; + }, + + /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ + replaceoutput: function replaceoutput() + { + var context = ul4._clone(this); + context._output = []; + return context; + }, + + clone: function clone(vars) + { + return ul4._clone(this); + }, + + output: function output(value) + { + this._output.push(value); + }, + + getoutput: function getoutput() + { + return this._output.join(""); + }, + + get: function get(name) + { + return this.vars[name]; + }, + + set: function set(name, value) + { + this.vars[name] = value; + } + } + ); + + /// Exceptions + + ul4.Exception = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Exception", + "cause": null, + + __getattr__: function __getattr__(attrname) + { + switch (attrname) + { + case "cause": + return this.cause; + default: + return undefined; + } + } + } + ); + + // Exceptions used internally by UL4 for flow control + ul4.InternalException = ul4._inherit(ul4.Exception, {}); + + // Control flow exceptions + ul4.ReturnException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ReturnException", + + create: function create(result) + { + var exception = ul4._clone(this); + exception.result = result; + return exception; + } + } + ); + + ul4.BreakException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.BreakException" + } + ); + + ul4.ContinueException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ContinueException" + } + ); + + // Real exceptions raised by various parts of UL4 + ul4.SyntaxError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.SyntaxError" + } + ); + + ul4.LValueRequiredError = ul4._inherit( + ul4.SyntaxError, + { + __type__: "ul4.LValueRequiredError", + + toString: function toString() + { + return "lvalue required!"; + } + } + ); + + ul4.TypeError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.TypeError", + + create: function create(operation, message) + { + var exception = ul4._clone(this); + exception.operation = operation; + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + ul4.ValueError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ValueError", + + create: function create(message) + { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + ul4.ArgumentError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ArgumentError", + + create: function create(message) + { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + /// Exception that wraps other exceptions while they bubble up the stack + ul4.LocationError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.LocationError", + + create: function create(location, cause) + { + var exception = ul4._clone(this); + exception.location = location; + exception.cause = cause; + return exception; + }, + + _templateprefix: function(template) + { + var out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + var first = true; + while (template != null) + { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + }, + + _template: function _template() + { + if (ul4.Tag.isprotoof(this.location)) + return this.location.template; + else + return this.location.tag.template; + }, + + _outerpos: function _outerpos() + { + if (ul4.Tag.isprotoof(this.location)) + return this.location.pos; + else + { + var tag = this.location.tag; + if (tag === null) // A top level template as no tag + return this.location.pos; + else + return tag.pos; + } + }, + + _innerpos: function _innerpos() + { + return this.location.pos; + }, + + toString: function toString() + { + var template = this._template(); + var templateprefix = this._templateprefix(template); + var outerpos = this._outerpos(); + var innerpos = this._innerpos(); + + var prefix = template.source.substring(outerpos.start, innerpos.start); + var code = template.source.substring(innerpos.start, innerpos.stop); + var suffix = template.source.substring(innerpos.stop, outerpos.stop); + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + var text = prefix + code + suffix; + var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + // find line numbers + var lineno = 1, colno = 1; + for (var i = 0; i < innerpos.start; ++i) + { + if (template.source[i] === "\n") + { + ++lineno; + colno = 1; + } + else + ++colno; + } + + pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; + + return templateprefix + ": " + pos + "\n" + text + "\n" + underline; + }, + + __getattr__: function __getattr__(attrname) + { + switch (attrname) + { + case "cause": + return this.cause; + case "location": + return this.location; + case "template": + return this._template; + case "outerpos": + return this._outerpos; + case "innerpos": + return this._innerpos; + default: + return undefined; + } + } + } + ); + + + /// Classes for the syntax tree + ul4.AST = ul4._inherit( + ul4.Proto, + { + create: function create(pos) + { + var ast = ul4._clone(this); + ast.pos = pos; + return ast; + }, + __str__: function __str__() + { + var out = []; + this._str(out); + return ul4._formatsource(out); + }, + __repr__: function __repr__() + { + var out = []; + this._repr(out); + return ul4._formatsource(out); + }, + _handle_eval: function _handle_eval(context) + { + try + { + return this._eval(context); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, value) + { + try + { + return this._eval_set(context, value); + } + catch (exc) + { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_set: function _eval_set(context, value) + { + throw ul4.LValueRequiredError; + }, + _handle_eval_modify: function _handle_eval_modify(context, operator, value) + { + try + { + return this._eval_modify(context, operator, value); + } + catch (exc) + { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_modify: function _eval_modify(context, operator, value) + { + throw ul4.LValueRequiredError; + }, + _repr: function _repr(out) + { + }, + _str: function _str(out) + { + }, + ul4ondump: function ul4ondump(encoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this[this._ul4onattrs[i]]); + }, + ul4onload: function ul4onload(decoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + this[this._ul4onattrs[i]] = decoder.load(); + }, + __setitem__: function __setitem__(attrname, value) + { + throw ul4.TypeError.create("mutate", "object is immutable"); + }, + // used in ul4ondump/ul4ondump to automatically dump these attributes + _ul4onattrs: ["pos"] + } + ); + + ul4.TextAST = ul4._inherit( + ul4.AST, + { + create: function create(template, pos) + { + var text = ul4.AST.create.call(this, pos); + text.template = template; + return text; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), + _text: function _text() + { + return this.template.source.substring(this.pos.start, this.pos.stop); + }, + _eval: function _eval(context) + { + context.output(this._text()); + }, + _str: function _str(out) + { + out.push("text "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.IndentAST = ul4._inherit( + ul4.TextAST, + { + create: function create(template, pos, text) + { + var indent = ul4.TextAST.create.call(this, template, pos); + indent._maketext(text); + return indent; + }, + _maketext: function _maketext(text) + { + if (typeof(this.template) !== "undefined") + { + if (text === null) + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + else + this.text = text; + } + else + this.text = null; + }, + _text: function _text() + { + if (this.text === null) + return this.template.source.substring(this.pos.start, this.pos.stop); + else + return this.text; + }, + _eval: function _eval(context) + { + for (var i = 0; i < context.indents.length; ++i) + context.output(context.indents[i]); + context.output(this._text()); + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.TextAST.ul4ondump.call(this, encoder); + + if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + encoder.dump(null); + else + encoder.dump(this.text); + }, + ul4onload: function ul4onload(decoder) + { + ul4.TextAST.ul4onload.call(this, decoder); + // Recreate ``text`` attribute + this._maketext(decoder.load()); + }, + _str: function _str(out) + { + out.push("indent "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.LineEndAST = ul4._inherit( + ul4.TextAST, + { + _str: function _str(out) + { + out.push("lineend "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.Tag = ul4._inherit( + ul4.AST, + { + create: function create(template, tag, tagpos, codepos) + { + var tago = ul4.AST.create.call(this, tagpos); + tago.template = template; + tago.tag = tag; + tago.codepos = codepos; + tago._maketext(); + return tago; + }, + _maketext: function _maketext() + { + if (typeof(this.template) !== "undefined") + { + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); + } + else + { + this.text = null; + this.code = null; + } + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.AST.ul4ondump.call(this, encoder); + encoder.dump(this.template); + encoder.dump(this.tag); + encoder.dump(this.codepos); + }, + ul4onload: function ul4onload(decoder) + { + ul4.TextAST.ul4onload.call(this, decoder); + this.template = decoder.load(); + this.tag = decoder.load(); + this.codepos = decoder.load(); + // Recreate ``text`` attribute + this._maketext(); + } + } + ); + + ul4.CodeAST = ul4._inherit( + ul4.AST, + { + create: function create(tag, pos) + { + var code = ul4.AST.create.call(this, pos); + code.tag = tag; + return code; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), + _str: function _str(out) + { + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + } + } + ); + + ul4.ConstAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, value) + { + var constant = ul4.CodeAST.create.call(this, tag, pos); + constant.value = value; + return constant; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + return this.value; + } + } + ); + + ul4.ItemArgBase = ul4._inherit( + ul4.CodeAST, + { + _handle_eval_list: function _handle_eval_list(context, result) + { + try + { + return this._eval_list(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, result) + { + try + { + return this._eval_set(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_dict: function _handle_eval_dict(context, result) + { + try + { + return this._eval_dict(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_call: function _handle_eval_call(context, args, kwargs) + { + try + { + return this._eval_call(context, args, kwargs); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } + ); + + ul4.SeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); + seqitem.value = value; + return seqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_list: function _eval_list(context, result) + { + var value = this.value._handle_eval(context); + result.push(value); + }, + _eval_set: function _eval_set(context, result) + { + var value = this.value._handle_eval(context); + result.add(value); + } + } + ); + + + ul4.UnpackSeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackseqitem.value = value; + return unpackseqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_list: function _eval_list(context, result) + { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + result.push(item.value); + } + }, + _eval_set: function _eval_set(context, result) + { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + result.add(item.value); + } + } + } + ); + + ul4.DictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, key, value) + { + var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); + dictitem.key = key; + dictitem.value = value; + return dictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) + { + var key = this.key._handle_eval(context); + var value = this.value._handle_eval(context); + ul4on._setmap(result, key, value); + } + } + ); + + ul4.UnpackDictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackdictitem.item = item; + return unpackdictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) + { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (var i = 0; i < item.length; ++i) + { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + ul4on._setmap(result, key, value); + } + } + else if (ul4._ismap(item)) + { + item.forEach(function(value, key){ + ul4on._setmap(result, key, value); + }); + } + else if (ul4._isobject(item)) + { + for (var key in item) + ul4on._setmap(result, key, item[key]); + } + } + } + ); + + ul4.PosArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var value = this.value._handle_eval(context); + args.push(value); + } + } + ); + + ul4.KeywordArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, name, value) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.name = name; + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + if (kwargs.hasOwnProperty(this.name)) + throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); + var value = this.value._handle_eval(context); + kwargs[this.name] = value; + } + } + ); + + ul4.UnpackListArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var item = this.item._handle_eval(context); + args.push.apply(args, item); + } + } + ); + + ul4.UnpackDictArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (var i = 0; i < item.length; ++i) + { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + } + } + else if (ul4._ismap(item)) + { + item.forEach(function(value, key){ + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + }); + } + else if (ul4._isobject(item)) + { + for (var key in item) + { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = item[key]; + } + } + } + } + ); + + ul4.ListAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var list = ul4.CodeAST.create.call(this, tag, pos); + list.items = []; + return list; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = []; + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_list(context, result); + return result; + } + } + ); + + ul4.ListCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.item = item; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = []; + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.push(this.item._handle_eval(localcontext)); + } + return result; + } + } + ); + + ul4.DictAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var dict = ul4.CodeAST.create.call(this, tag, pos); + dict.items = []; + return dict; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = ul4on._emptymap(); + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_dict(context, result); + return result; + } + } + ); + + ul4.DictCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, key, value, varname, container, condition) + { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.key = key; + listcomp.value = value; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._emptymap(); + + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + { + var key = this.key._handle_eval(localcontext); + var value = this.value._handle_eval(localcontext); + ul4on._setmap(result, key, value); + } + } + + return result; + } + } + ); + + ul4.SetAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var set = ul4.CodeAST.create.call(this, tag, pos); + set.items = []; + return set; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_set(context, result); + + return result; + } + } + ); + + ul4.SetCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var setcomp = ul4.CodeAST.create.call(this, tag, pos); + setcomp.item = item; + setcomp.container = container; + setcomp.condition = condition; + return setcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); + } + + return result; + } + } + ); + + ul4.GenExprAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var genexp = ul4.CodeAST.create.call(this, tag, pos); + genexp.item = item; + genexp.varname = varname; + genexp.container = container; + genexp.condition = condition; + return genexp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + var iter = ul4._iter(container); + + var localcontext = context.inheritvars(); + + var self = this; + + var result = { + next: function(){ + while (true) + { + var item = iter.next(); + if (item.done) + return item; + var varitems = ul4._unpackvar(self.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) + { + var value = self.item._handle_eval(localcontext); + return {value: value, done: false}; + } + } + } + }; + + return result; + } + } + ); + + ul4.VarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, name) + { + var variable = ul4.CodeAST.create.call(this, tag, pos); + variable.name = name; + return variable; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + return this._get(context, this.name); + }, + _eval_set: function _eval_set(context, value) + { + this._set(context, this.name, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + this._modify(context, operator, this.name, value); + }, + _get: function _get(context, name) + { + var result = context.get(name); + if (typeof(result) === "undefined") + result = ul4.functions[name]; + return result; + }, + _set: function _set(context, name, value) + { + context.set(name, value); + }, + _modify: function _modify(context, operator, name, value) + { + var newvalue = operator._ido(context.get(name), value) + context.set(name, newvalue); + } + } + ); + + ul4.UnaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj) + { + var unary = ul4.CodeAST.create.call(this, tag, pos); + unary.obj = obj; + return unary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" obj="); + this.obj._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + return this._do(obj); + } + } + ); + + // Negation + ul4.NegAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + if (obj !== null && typeof(obj.__neg__) === "function") + return obj.__neg__(); + return -obj; + } + } + ); + + // Bitwise not + ul4.BitNotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + return -obj-1; + } + } + ); + + // Not + ul4.NotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + return !ul4._bool(obj); + } + } + ); + + // If expression + ul4.IfAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, objif, objcond, objelse) + { + var ifexpr = ul4.CodeAST.create.call(this, tag, pos); + ifexpr.objif = objif; + ifexpr.objcond = objcond; + ifexpr.objelse = objelse; + return ifexpr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(+1); + out.push("objif="); + this.objif._repr(out); + out.push(0); + out.push("objcond="); + this.objcond._repr(out); + out.push(0); + out.push("objelse="); + this.objelse._repr(out); + out.push(-1); + out.push(">"); + }, + _eval: function _eval(context) + { + var result; + var condvalue = this.objcond._handle_eval(context); + if (ul4._bool(condvalue)) + result = this.objif._handle_eval(context); + else + result = this.objelse._handle_eval(context); + return result; + } + } + ); + + ul4.ReturnAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var result = this.obj._handle_eval(context); + throw ul4.ReturnException.create(result); + }, + _str: function _str(out) + { + out.push("return "); + this.obj._str(out); + } + } + ); + + ul4.PrintAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var output = ul4._str(obj); + context.output(output); + }, + _str: function _str(out) + { + out.push("print "); + this.obj._str(out); + } + } + ); + + ul4.PrintXAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var output = ul4._xmlescape(obj); + context.output(output); + }, + _str: function _str(out) + { + out.push("printx "); + this.obj._str(out); + } + } + ); + + ul4.BinaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj1, obj2) + { + var binary = ul4.CodeAST.create.call(this, tag, pos); + binary.obj1 = obj1; + binary.obj2 = obj2; + return binary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.type); + out.push(" obj1="); + this.obj1._repr(out); + out.push(" obj2="); + this.obj2._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + return this._do(obj1, obj2); + } + } + ); + + // Item access and assignment: dict[key], list[index], string[index], color[index] + ul4.ItemAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + var result = this._get(obj1, obj2); + return result; + }, + _eval_set: function _eval_set(context, value) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._set(obj1, obj2, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._modify(operator, obj1, obj2, value); + }, + _get: function _get(container, key) + { + if (typeof(container) === "string" || ul4._islist(container)) + { + if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) + { + var start = key.start, stop = key.stop; + if (typeof(start) === "undefined" || start === null) + start = 0; + if (typeof(stop) === "undefined" || stop === null) + stop = container.length; + return container.slice(start, stop); + } + else + { + var orgkey = key; + if (key < 0) + key += container.length; + return container[key]; + } + } + else if (container && typeof(container.__getitem__) === "function") // test this before the generic object test + return container.__getitem__(key); + else if (ul4._ismap(container)) + return container.get(key); + else if (Object.prototype.toString.call(container) === "[object Object]") + return container[key]; + else + throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); + }, + _set: function _set(container, key, value) + { + if (ul4._islist(container)) + { + if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) + { + var start = key.start, stop = key.stop; + if (start === null) + start = 0; + else if (start < 0) + start += container.length; + if (start < 0) + start = 0; + else if (start > container.length) + start = container.length; + if (stop === null) + stop = container.length; + else if (stop < 0) + stop += container.length; + if (stop < 0) + stop = 0; + else if (stop > container.length) + stop = container.length; + if (stop < start) + stop = start; + container.splice(start, stop-start); // Remove old element + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + container.splice(start++, 0, item.value); + } + } + else + { + var orgkey = key; + if (key < 0) + key += container.length; + container[key] = value; + } + } + else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test + container.__setitem__(key, value); + else if (ul4._ismap(container)) + container.set(key, value); + else if (Object.prototype.toString.call(container) === "[object Object]") + container[key] = value; + else + throw ul4.NotSubscriptableError.create(container); + }, + _modify: function _modify(operator, container, key, value) + { + this._set(container, key, operator._ido(this._get(container, key), value)); + } + } + ); + + // Identifty test operator ``is`` + ul4.IsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return obj1 === obj2; + } + } + ); + + // Inverted tdentifty test operator ``is not`` + ul4.IsNotAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return obj1 !== obj2; + } + } + ); + + // Comparison operator == + ul4.EQAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._eq(obj1, obj2); + } + } + ); + + // Comparison operator != + ul4.NEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._ne(obj1, obj2); + } + } + ); + + // Comparison operator < + ul4.LTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._lt(obj1, obj2); + } + } + ); + + // Comparison operator <= + ul4.LEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._le(obj1, obj2); + } + } + ); + + // Comparison operator > + ul4.GTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._gt(obj1, obj2); + } + } + ); + + // Comparison operator >= + ul4.GEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._ge(obj1, obj2); + } + } + ); + + // Containment test: string in string, obj in list, key in dict, value in rgb + ul4.ContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) + { + if (typeof(obj) === "string" && typeof(container) === "string") + { + return container.indexOf(obj) !== -1; + } + else if (ul4._islist(container)) + { + return container.indexOf(obj) !== -1; + } + else if (container && typeof(container.__contains__) === "function") // test this before the generic object test + return container.__contains__(obj); + else if (ul4._ismap(container) || ul4._isset(container)) + return container.has(obj); + else if (ul4._isobject(container)) + { + for (var key in container) + { + if (key === obj) + return true; + } + return false; + } + else if (ul4._iscolor(container)) + { + return container._r === obj || container._g === obj || container._b === obj || container._a === obj; + } + throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + } + } + ); + + // Inverted containment test + ul4.NotContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) + { + return !ul4.ContainsAST._do(obj, container); + } + } + ); + + // Addition: num + num, string + string + ul4.AddAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__add__) === "function") + return obj1.__add__(obj2); + else if (obj2 && typeof(obj2.__radd__) === "function") + return obj2.__radd__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + var result = []; + ul4._append(result, obj1); + ul4._append(result, obj2); + return result; + } + else + return obj1 + obj2; + }, + _ido: function _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + ul4._append(obj1, obj2); + return obj1; + } + else + return this._do(obj1, obj2); + } + } + ); + + // Substraction: num - num + ul4.SubAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__sub__) === "function") + return obj1.__sub__(obj2); + else if (obj2 && typeof(obj2.__rsub__) === "function") + return obj2.__rsub__(obj1); + else if (ul4._isdate(obj1) && ul4._isdate(obj2)) + return this._date_sub(obj1, obj2); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + return obj1 - obj2; + }, + _date_sub: function _date_sub(obj1, obj2) + { + var swap = (obj2 > obj1); + + if (swap) + { + var t = obj1; + obj1 = obj2; + obj2 = t; + } + // From now on obj1 is > than obj2 + + var year1 = obj1.getFullYear(); + var yearday1 = ul4._yearday(obj1); + var year2 = obj2.getFullYear(); + var yearday2 = ul4._yearday(obj2); + + var diffdays = 0; + + while (year1 > year2) + { + diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + ++year2; + } + diffdays += yearday1 - yearday2; + + var hours1 = obj1.getHours(); + var minutes1 = obj1.getMinutes(); + var seconds1 = obj1.getSeconds(); + var hours2 = obj2.getHours(); + var minutes2 = obj2.getMinutes(); + var seconds2 = obj2.getSeconds(); + + var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + + var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + + if (swap) + { + diffdays = -diffdays; + diffseconds = -diffseconds; + diffmilliseconds = -diffmilliseconds; + } + return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Multiplication: num * num, int * str, str * int, int * list, list * int + ul4.MulAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__mul__) === "function") + return obj1.__mul__(obj2); + else if (obj2 && typeof(obj2.__rmul__) === "function") + return obj2.__rmul__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) + { + if (typeof(obj2) === "string") + { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj2, obj1); + } + else if (ul4._islist(obj2)) + { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj2, obj1); + } + } + else if (ul4._isint(obj2) || ul4._isbool(obj2)) + { + if (typeof(obj1) === "string") + { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj1, obj2); + } + else if (ul4._islist(obj1)) + { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj1, obj2); + } + } + return obj1 * obj2; + }, + _ido: function _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._isint(obj2)) + { + if (obj2 > 0) + { + var i = 0; + var targetsize = obj1.length * obj2; + while (obj1.length < targetsize) + obj1.push(obj1[i++]) + } + else + obj1.splice(0, obj1.length); + return obj1; + } + else + return this._do(obj1, obj2); + } + } + ); + + // Truncating division + ul4.FloorDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__floordiv__) === "function") + return obj1.__floordiv__(obj2); + else if (obj2 && typeof(obj2.__rfloordiv__) === "function") + return obj2.__rfloordiv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + return Math.floor(obj1 / obj2); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // "Real" division + ul4.TrueDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__truediv__) === "function") + return obj1.__truediv__(obj2); + else if (obj2 && typeof(obj2.__rtruediv__) === "function") + return obj2.__rtruediv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + return obj1 / obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Modulo + ul4.ModAST = ul4._inherit( + ul4.BinaryAST, + { + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + _do: function _do(obj1, obj2) + { + var div = Math.floor(obj1 / obj2); + var mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) + { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise left shift + ul4.ShiftLeftAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftRightAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 *= 2; + return obj1; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise right shift + ul4.ShiftRightAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftLeftAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 /= 2; + return Math.floor(obj1); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise and + ul4.BitAndAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 & obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise exclusive or + ul4.BitXOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 ^ obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise or + ul4.BitOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 | obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + ul4.AndAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + if (!ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } + ); + + ul4.OrAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + if (ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } + ); + + ul4.AttrAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, attrname) + { + var attr = ul4.CodeAST.create.call(this, tag, pos); + attr.obj = obj; + attr.attrname = attrname; + return attr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var result = this._get(obj, this.attrname); + return result; + }, + _eval_set: function _eval_set(context, value) + { + var obj = this.obj._handle_eval(context); + this._set(obj, this.attrname, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + var obj = this.obj._handle_eval(context); + this._modify(operator, obj, this.attrname, value); + }, + _get: function _get(object, attrname) + { + if (typeof(object) === "string") + { + switch (attrname) + { + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); + case "replace": + return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count){ return ul4._replace(object, old, new_, count); }); + case "strip": + return ul4.expose(["chars=", null], function strip(chars){ return ul4._strip(object, chars); }); + case "lstrip": + return ul4.expose(["chars=", null], function lstrip(chars){ return ul4._lstrip(object, chars); }); + case "rstrip": + return ul4.expose(["chars=", null], function rstrip(chars){ return ul4._rstrip(object, chars); }); + case "split": + return ul4.expose(["sep=", null, "count=", null], function split(sep, count){ return ul4._split(object, sep, count); }); + case "rsplit": + return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count){ return ul4._rsplit(object, sep, count); }); + case "splitlines": + return ul4.expose(["keepends=", false], function splitlines(keepends){ return ul4._splitlines(object, keepends); }); + case "lower": + return ul4.expose([], function lower(){ return object.toLowerCase(); }); + case "upper": + return ul4.expose([], function upper(){ return object.toUpperCase(); }); + case "capitalize": + return ul4.expose([], function capitalize(){ return ul4._capitalize(object); }); + case "join": + return ul4.expose(["iterable"], function join(iterable){ return ul4._join(object, iterable); }); + case "startswith": + return ul4.expose(["prefix"], function startswith(prefix){ return ul4._startswith(object, prefix); }); + case "endswith": + return ul4.expose(["suffix"], function endswith(suffix){ return ul4._endswith(object, suffix); }); + default: + return undefined; + } + } + else if (ul4._islist(object)) + { + switch (attrname) + { + case "append": + return ul4.expose(["*items"], function append(items){ return ul4._append(object, items); }); + case "insert": + return ul4.expose(["pos", "*items"], function insert(pos, items){ return ul4._insert(object, pos, items); }); + case "pop": + return ul4.expose(["pos=", -1], function pop(pos){ return ul4._pop(object, pos); }); + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); + default: + return undefined; + } + } + else if (ul4._isdate(object)) + { + switch (attrname) + { + case "weekday": + return ul4.expose([], function weekday(){ return ul4._weekday(object); }); + case "week": + return ul4.expose(["firstweekday=", null], function week(firstweekday){ return ul4._week(object, firstweekday); }); + case "day": + return ul4.expose([], function day(){ return object.getDate(); }); + case "month": + return ul4.expose([], function month(){ return object.getMonth()+1; }); + case "year": + return ul4.expose([], function year(){ return object.getFullYear(); }); + case "hour": + return ul4.expose([], function hour(){ return object.getHours(); }); + case "minute": + return ul4.expose([], function minute(){ return object.getMinutes(); }); + case "second": + return ul4.expose([], function second(){ return object.getSeconds(); }); + case "microsecond": + return ul4.expose([], function microsecond(){ return object.getMilliseconds() * 1000; }); + case "mimeformat": + return ul4.expose([], function mimeformat(){ return ul4._mimeformat(object); }); + case "isoformat": + return ul4.expose([], function isoformat(){ return ul4._isoformat(object); }); + case "yearday": + return ul4.expose([], function yearday(){ return ul4._yearday(object); }); + default: + return undefined; + } + } + else if (ul4._ismap(object)) + { + switch (attrname) + { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items(){ return ul4._items(object); }); + case "values": + return ul4.expose([], function values(){ return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + return object.get(attrname); + } + } + else if (ul4._isset(object)) + { + switch (attrname) + { + case "add": + return ul4.expose(["*items"], function add(items){ for (var i = 0; i < items.length; ++i) { object.add(items[i]); } } ); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + return undefined; + } + } + else if (Object.prototype.toString.call(object) === "[object Object]") + { + switch (attrname) + { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items(){ return ul4._items(object); }); + case "values": + return ul4.expose([], function values(){ return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + var result; + if (object && typeof(object.__getattr__) === "function") // test this before the generic object test + result = object.__getattr__(attrname); + else + result = object[attrname]; + if (typeof(result) !== "function") + return result; + var realresult = function() { + return result.apply(object, arguments); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + } + throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); + }, + _set: function _set(object, attrname, value) + { + if (typeof(object) === "object" && typeof(object.__setattr__) === "function") + object.__setattr__(attrname, value); + else if (ul4._ismap(object)) + object.set(attrname, value) + else if (ul4._isobject(object)) + object[attrname] = value; + else + throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); + }, + _modify: function _modify(operator, object, attrname, value) + { + var oldvalue = this._get(object, attrname); + var newvalue = operator._ido(oldvalue, value); + this._set(object, attrname, newvalue); + } + } + ); + + ul4.CallAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, args) + { + var call = ul4.CodeAST.create.call(this, tag, pos); + call.obj = obj; + call.args = args; + return call; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), + _repr: function _repr(out) + { + out.push(""); + }, + _makeargs: function _makeargs(context) + { + var args = [], kwargs = {}; + for (var i = 0; i < this.args.length; ++i) + this.args[i]._handle_eval_call(context, args, kwargs); + return {args: args, kwargs: kwargs}; + }, + _handle_eval: function _handle_eval(context) + { + try + { + return this._eval(context); + } + catch (exc) + { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var args = this._makeargs(context); + var result = ul4._call(context, obj, args.args, args.kwargs); + return result; + } + } + ); + + ul4.RenderAST = ul4._inherit( + ul4.CallAST, + { + create: function create(tag, pos, obj, args) + { + var render = ul4.CallAST.create.call(this, tag, pos, obj, args); + render.indent = null; + return render; + }, + _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("render "); + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + if (this.indent !== null) + { + out.push(" with indent "); + out.push(ul4._repr(this.indent._text())); + } + }, + _handle_eval: function _handle_eval(context) + { + var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); + var obj = this.obj._handle_eval(localcontext); + var args = this._makeargs(localcontext); + + try + { + var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + return result; + } + catch (exc) + { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } + ); + + // Slice object + ul4.slice = ul4._inherit( + ul4.Proto, + { + create: function create(start, stop) + { + var slice = ul4._clone(this); + slice.start = start; + slice.stop = stop; + return slice; + }, + __repr__: function __repr__() + { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + } + } + ); + + + // List/String slice + ul4.SliceAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, index1, index2) + { + var slice = ul4.CodeAST.create.call(this, tag, pos); + slice.index1 = index1; + slice.index2 = index2; + return slice; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return ul4.slice.create(index1, index2); + } + } + ); + + + ul4.SetVarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, lvalue, value) + { + var changevar = ul4.CodeAST.create.call(this, tag, pos); + changevar.lvalue = lvalue; + changevar.value = value; + return changevar; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" lvalue="); + out.push(ul4._repr(this.lvalue)); + out.push(" value="); + this.value._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) + { + var item = items[i]; + item[0]._handle_eval_set(context, item[1]); + } + } + } + ); + + ul4.ModifyVarAST = ul4._inherit( + ul4.SetVarAST, + { + _eval: function _eval(context) + { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) + { + var item = items[i]; + item[0]._handle_eval_modify(context, this._operator, item[1]); + } + } + } + ); + + ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + + ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + + ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + + ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + + ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + + ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + + ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + + ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + + ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + + ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + + ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + + ul4.BlockAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var block = ul4.CodeAST.create.call(this, tag, pos); + block.endtag = null; + block.content = []; + return block; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), + _eval: function _eval(context) + { + for (var i = 0; i < this.content.length; ++i) + this.content[i]._handle_eval(context); + }, + _str: function _str(out) + { + if (this.content.length) + { + for (var i = 0; i < this.content.length; ++i) + { + this.content[i]._str(out); + out.push(0); + } + } + else + { + out.push("pass"); + out.push(0); + } + } + } + ); + + ul4.ForBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, varname, container) + { + var for_ = ul4.BlockAST.create.call(this, tag, pos); + for_.varname = varname; + for_.container = container; + return for_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str_varname: function _str_varname(out, varname) + { + if (ul4._islist(varname)) + { + out.push("("); + for (var i = 0; i < varname.length; ++i) + { + if (i) + out.push(", "); + this._str_varname(out, varname[i]); + } + if (varname.length == 1) + out.push(","); + out.push(")"); + } + else + varname._str(out); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + for (var iter = ul4._iter(container);;) + { + var value = iter.next(); + if (value.done) + break; + var varitems = ul4._unpackvar(this.varname, value.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(context, varitems[i][1]); + try + { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) + { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) + { + out.push("for "); + this._str_varname(out, this.varname); + out.push(" in "); + this.container._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.WhileBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) + { + var while_ = ul4.BlockAST.create.call(this, tag, pos); + while_.condition = condition; + return while_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("while "), + this.container._repr(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _eval: function _eval(context) + { + while (true) + { + var cond = this.condition._handle_eval(context); + if (!ul4._bool(cond)) + break; + try + { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) + { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) + { + out.push("while "); + ul4.AST._str.call(this, out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.BreakAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) + { + throw ul4.BreakException; + }, + _str: function _str(out) + { + out.push("break"); + out.push(0); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.ContinueAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) + { + throw ul4.ContinueException; + }, + _str: function _str(out) + { + out.push("continue"); + out.push(0); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.CondBlockAST = ul4._inherit( + ul4.BlockAST, + { + _eval: function _eval(context) + { + for (var i = 0; i < this.content.length; ++i) + { + var block = this.content[i]; + var execute = block._execute(context); + if (execute) + { + block._handle_eval(context); + break; + } + } + } + } + ); + + ul4.ConditionalBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) + { + var block = ul4.BlockAST.create.call(this, tag, pos); + block.condition = condition; + return block; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" condition="); + this.condition._repr(out); + out.push(">"); + }, + _str: function _str(out) + { + out.push(this._strname); + out.push(" "); + this.condition._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) + { + var cond = this.condition._handle_eval(context); + var result = ul4._bool(cond); + return result; + } + } + ); + + ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); + + ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); + + ul4.ElseBlockAST = ul4._inherit( + ul4.BlockAST, + { + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("else:"), + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) + { + return true; + }, + _str: function _str(out) + { + out.push("else:"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.Template = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) + { + var template = ul4.BlockAST.create.call(this, tag, pos); + template.source = source; + template.name = name; + template.whitespace = whitespace; + template.startdelim = startdelim; + template.enddelim = enddelim; + template.docpos = null; + template.signature = signature; + template._jsfunction = null; + template._asts = null; + template._ul4_callsignature = signature; + template._ul4_rendersignature = signature; + template.parenttemplate = null; + return template; + }, + ul4ondump: function ul4ondump(encoder) + { + var signature; + encoder.dump(ul4.version); + encoder.dump(this.name); + encoder.dump(this.source); + encoder.dump(this.whitespace); + encoder.dump(this.startdelim); + encoder.dump(this.enddelim); + encoder.dump(this.docpos); + encoder.dump(this.parenttemplate); + if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + signature = this.signature; + else + { + signature = []; + for (var i = 0; i < this.signature.args.length; ++i) + { + var arg = this.signature.args[i]; + if (typeof(arg.defaultValue) === "undefined") + signature.push(arg.name); + else + signature.push(arg.name+"=", arg.defaultValue); + } + if (this.signature.remargs !== null) + signature.push("*" + this.signature.remargs); + if (this.signature.remkwargs !== null) + signature.push("**" + this.signature.remkwargs); + } + encoder.dump(signature); + ul4.BlockAST.ul4ondump.call(this, encoder); + }, + ul4onload: function ul4onload(decoder) + { + var version = decoder.load(); + var signature; + + if (version === null) + throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + + if (version !== ul4.version) + throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); + this.source = decoder.load(); + this.whitespace = decoder.load(); + this.startdelim = decoder.load(); + this.enddelim = decoder.load(); + this.docpos = decoder.load(); + this.parenttemplate = decoder.load(); + signature = decoder.load(); + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + this.signature = signature; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + ul4.BlockAST.ul4onload.call(this, decoder); + }, + loads: function loads(string) + { + return ul4on.loads(string); + }, + _eval: function _eval(context) + { + var signature = null; + if (this.signature !== null) + signature = this.signature._handle_eval(context); + var closure = ul4.TemplateClosure.create(this, signature, context.vars); + context.set(this.name, closure); + }, + _repr: function _repr(out) + { + out.push("") + { + out.push(" enddelim="); + out.push(ul4._repr(this.enddelim)); + } + out.push(">"); + }, + _str: function _str(out) + { + out.push("def "); + out.push(this.name ? this.name : "unnamed"); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + _renderbound: function _renderbound(context, vars) + { + var localcontext = context.clone(); + localcontext.vars = vars; + try + { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) + { + if (!ul4.ReturnException.isprotoof(exc)) + throw exc; + } + }, + __render__: function __render__(context, vars) + { + this._renderbound(context, vars); + }, + render: function render(context, vars) + { + this._renderbound(context, vars); + }, + _rendersbound: function _rendersbound(context, vars) + { + var localcontext = context.replaceoutput(); + this._renderbound(localcontext, vars); + return localcontext.getoutput(); + }, + renders: function renders(vars) + { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._rendersbound(context, vars); + }, + doc: function doc() + { + return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; + }, + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "tag": + return this.tag; + case "endtag": + return this.endtag; + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); + default: + return undefined; + } + }, + _callbound: function _callbound(context, vars) + { + var localcontext = context.clone(); + localcontext.vars = vars; + try + { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) + { + if (ul4.ReturnException.isprotoof(exc)) + return exc.result; + else + throw exc; + } + return null; + }, + call: function call(vars) + { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._callbound(context, vars); + }, + __call__: function __call__(context, vars) + { + return this._callbound(context, vars); + }, + __type__: "ul4.Template" // used by ``istemplate()`` + } + ); + + ul4.SignatureAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var signature = ul4.CodeAST.create.call(this, tag, pos); + signature.params = []; + return signature; + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.CodeAST.ul4ondump.call(this, encoder); + + var dump = []; + + for (var i = 0; i < this.params.length; ++i) + { + var param = this.params[i]; + if (param[1] === null) + dump.push(param[0]); + else + dump.push(param); + } + encoder.dump(dump); + }, + ul4onload: function ul4onload(decoder) + { + ul4.AST.ul4onload.call(this, decoder); + var dump = decoder.load(); + this.params = []; + for (var i = 0; i < dump.length; ++i) + { + var param = dump[i]; + if (typeof(param) === "string") + this.params.push([param, null]); + else + this.params.push(param); + } + }, + _eval: function _eval(context) + { + var args = []; + for (var i = 0; i < this.params.length; ++i) + { + var param = this.params[i]; + if (param[1] === null) + args.push(param[0]); + else + { + args.push(param[0] + "="); + args.push(param[1]._handle_eval(context)); + } + } + return ul4.Signature.create.apply(ul4.Signature, args); + }, + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" params="); + this.params._repr(out); + out.push(">"); + } + } + ); + + ul4.TemplateClosure = ul4._inherit( + ul4.Proto, + { + create: function create(template, signature, vars) + { + var closure = ul4._clone(this); + closure.template = template; + closure.signature = signature; + closure.vars = vars; + closure._ul4_callsignature = signature; + closure._ul4_rendersignature = signature; + // Copy over the required attribute from the template + closure.name = template.name; + closure.tag = template.tag; + closure.endtag = template.endtag; + closure.source = template.source; + closure.startdelim = template.startdelim; + closure.enddelim = template.enddelim; + closure.docpos = template.docpos; + closure.content = template.content; + return closure; + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + __render__: function __render__(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + render: function render(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __call__: function __call__(context, vars) + { + return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _renderbound: function _renderbound(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _rendersbound: function _rendersbound(context, vars) + { + return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "render": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); + case "signature": + return this.signature; + default: + return this.template.__getattr__(attrname); + } + }, + __type__: "ul4.TemplateClosure" // used by ``istemplate()`` + } + ); + + // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` + ul4._rgb = function _rgb(r, g, b, a) + { + return this.Color.create(255*r, 255*g, 255*b, 255*a); + }; + + // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference + ul4._xmlescape = function _xmlescape(obj) + { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; + }; + + // Convert ``obj`` to a string suitable for output into a CSV file + ul4._csv = function _csv(obj) + { + if (obj === null) + return ""; + else if (typeof(obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; + }; + + // Return a string containing one character with the codepoint ``i`` + ul4._chr = function _chr(i) + { + if (typeof(i) != "number") + throw ul4.TypeError.create("chr()", "chr() requires an int"); + return String.fromCharCode(i); + }; + + // Return the codepoint for the one and only character in the string ``c`` + ul4._ord = function _ord(c) + { + if (typeof(c) != "string" || c.length != 1) + throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); + return c.charCodeAt(0); + }; + + // Convert an integer to a hexadecimal string + ul4._hex = function _hex(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("hex()", "hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); + }; + + // Convert an integer to a octal string + ul4._oct = function _oct(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("oct()", "oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); + }; + + // Convert an integer to a binary string + ul4._bin = function _bin(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("bin()", "bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); + }; + + // Return the minimum value + ul4._min = function _min(obj) + { + if (obj.length == 0) + throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) + { + var item = iter.next(); + if (item.done) + { + if (first) + throw ul4.ValueError.create("min() argument is an empty sequence!"); + return result; + } + if (first || (item.value < result)) + result = item.value; + first = false; + } + }; + + // Return the maximum value + ul4._max = function _max(obj) + { + if (obj.length == 0) + throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) + { + var item = iter.next(); + if (item.done) + { + if (first) + throw ul4.ValueError.create("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } + }; + + // Return the of the values from the iterable starting with ``start`` (default ``0``) + ul4._sum = function _sum(iterable, start) + { + if (typeof(start) === "undefined") + start = 0; + + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; + }; + + // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._first = function _first(iterable, defaultValue) + { + if (typeof(defaultValue) === "undefined") + defaultValue = null; + + var item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; + }; + + // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._last = function _last(iterable, defaultValue) + { + if (typeof(defaultValue) === "undefined") + defaultValue = null; + + var value = defaultValue; + + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + value = item.value; + } + return value; + }; + + // Return a sorted version of ``iterable`` + ul4._sorted = function _sorted(context, iterable, key, reverse) + { + var cmp; + if (key === null) + { + // FIXME: stability + if (reverse) + { + cmp = function cmp(a, b) + { + return -ul4._cmp("<=>", a, b); + } + } + else + { + cmp = function cmp(a, b) + { + return ul4._cmp("<=>", a, b); + } + } + var result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else + { + var sort = []; + + for (var i = 0, iter = ul4._iter(iterable);;++i) + { + var item = iter.next(); + if (item.done) + break; + var keyvalue = ul4._call(context, key, [item.value], {}); + sort.push([keyvalue, i, item.value]); + } + cmp = function cmp(s1, s2) + { + var res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp(s1[1], s2[1]); + return reverse ? -res : res; + } + + sort.sort(cmp); + + var result = []; + for (var i = 0; i < sort.length; ++i) + { + result.push(sort[i][2]); + } + return result; + } + }; + + // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` + ul4._range = function _range(args) + { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required range() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var lower, higher; + if (step === 0) + throw ul4.ValueError.create("range() requires a step argument != 0"); + else if (step > 0) + { + lower = start; + heigher = stop; + } + else + { + lower = stop; + heigher = start; + } + var length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; + + return { + index: 0, + next: function() + { + if (this.index >= length) + return {done: true}; + return {value: start + (this.index++) * step, done: false}; + } + }; + }; + + // Return a iterable object returning a slice from the argument + ul4._slice = function _slice(args) + { + var iterable, start, stop, step; + if (args.length < 2) + throw ul4.ArgumentError.create("required slice() argument missing"); + else if (args.length > 4) + throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) + { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw ul4.ValueError.create("slice() requires a start argument >= 0"); + if (stop < 0) + throw ul4.ValueError.create("slice() requires a stop argument >= 0"); + if (step <= 0) + throw ul4.ValueError.create("slice() requires a step argument > 0"); + + var next = start, count = 0; + var iter = ul4._iter(iterable); + return { + next: function() { + var result; + while (count < next) + { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return {done: true}; + result = iter.next(); + if (result.done) + return result; + ++count; + next += step; + if (stop !== null && next > stop) + next = stop; + return result; + } + }; + }; + + // ``%`` escape unsafe characters in the string ``string`` + ul4._urlquote = function _urlquote(string) + { + return encodeURIComponent(string); + }; + + // The inverse function of ``urlquote`` + ul4._urlunquote = function _urlunquote(string) + { + return decodeURIComponent(string); + }; + + // Return a reverse iterator over ``sequence`` + ul4._reversed = function _reversed(sequence) + { + if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length-1, + next: function() { + return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; + } + }; + }; + + // Returns a random number in the interval ``[0;1[`` + ul4._random = function _random() + { + return Math.random(); + }; + + // Return a randomly select item from ``range(start, stop, step)`` + ul4._randrange = function _randrange(args) + { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required randrange() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var width = stop-start; + + var value = Math.random(); + + var n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw ul4.ValueError.create("randrange() requires a step argument != 0"); + return start + step*Math.floor(value * n); + }; + + // Return a random item/char from the list/string ``sequence`` + ul4._randchoice = function _randchoice(sequence) + { + var iscolor = ul4._iscolor(sequence); + if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw ul4.TypeError.create("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; + }; + + // Round a number ``x`` to ``digits`` decimal places (may be negative) + ul4._round = function _round(x, digits) + { + if (typeof(digits) === "undefined") + digits = 0; + if (digits) + { + var threshhold = Math.pow(10, digits); + return Math.round(x*threshhold)/threshhold; + } + else + return Math.round(x); + }; + + // Return a hex-encode MD5 hash of the argument + // This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 + ul4._md5 = function _md5(string) + { + return md5(string); + }; + + // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) + ul4._enumerate = function _enumerate(iterable, start) + { + if (typeof(start) === "undefined") + start = 0; + + return { + iter: ul4._iter(iterable), + index: start, + next: function() { + var item = this.iter.next(); + return item.done ? item : {value: [this.index++, item.value], done: false}; + } + }; + }; + + // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) + ul4._isfirst = function _isfirst(iterable) + { + var iter = ul4._iter(iterable); + var isfirst = true; + return { + next: function() { + var item = iter.next(); + var result = item.done ? item : {value: [isfirst, item.value], done: false}; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) + ul4._islast = function _islast(iterable) + { + var iter = ul4._iter(iterable); + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [item.done, lastitem.value], done: false}; + lastitem = item; + return result; + } + }; + }; + + // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._isfirstlast = function _isfirstlast(iterable) + { + var iter = ul4._iter(iterable); + var isfirst = true; + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._enumfl = function _enumfl(iterable, start) + { + var iter = ul4._iter(iterable); + var i = start; + var isfirst = true; + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) + ul4._zip = function _zip(iterables) + { + var result; + if (iterables.length) + { + var iters = []; + for (var i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); + + return { + next: function() { + var items = []; + for (var i = 0; i < iters.length; ++i) + { + var item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return {value: items, done: false}; + } + }; + } + else + { + return { + next: function() { + return {done: true}; + } + }; + } + }; + + // Return the absolute value for the number ``number`` + ul4._abs = function _abs(number) + { + if (number !== null && typeof(number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); + }; + + // Return a ``Date`` object from the arguments passed in + ul4._date = function _date(year, month, day, hour, minute, second, microsecond) + { + if (typeof(hour) === "undefined") + hour = 0; + + if (typeof(minute) === "undefined") + minute = 0; + + if (typeof(second) === "undefined") + second = 0; + + if (typeof(microsecond) === "undefined") + microsecond = 0; + + return new Date(year, month-1, day, hour, minute, second, microsecond/1000); + }; + + // Return a ``TimeDelta`` object from the arguments passed in + ul4._timedelta = function _timedelta(days, seconds, microseconds) + { + return this.TimeDelta.create(days, seconds, microseconds); + }; + + // Return a ``MonthDelta`` object from the arguments passed in + ul4._monthdelta = function _monthdelta(months) + { + return this.MonthDelta.create(months); + }; + + // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) + ul4._hls = function _hls(h, l, s, a) + { + var _v = function(m1, m2, hue) + { + hue = hue % 1.0; + if (hue < 1/6) + return m1 + (m2-m1)*hue*6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2/3) + return m1 + (m2-m1)*(2/3-hue)*6.0; + return m1; + }; + + var m1, m2; + if (typeof(a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0+s); + else + m2 = l+s-(l*s); + m1 = 2.0*l - m2; + return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); + }; + + // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) + ul4._hsv = function _hsv(h, s, v, a) + { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + var i = Math.floor(h*6.0); + var f = (h*6.0) - i; + var p = v*(1.0 - s); + var q = v*(1.0 - s*f); + var t = v*(1.0 - s*(1.0-f)); + switch (i%6) + { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } + }; + + // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` + ul4._get = function _get(container, key, defaultvalue) + { + if (ul4._ismap(container)) + { + if (container.has(key)) + return container.get(key); + return defaultvalue; + } + else if (ul4._isobject(container)) + { + var result = container[key]; + if (typeof(result) === "undefined") + return defaultvalue; + return result; + } + throw ul4.TypeError.create("get()", "get() requires a dict"); + }; + + // Return a ``Date`` object for the current time + ul4.now = function now() + { + return new Date(); + }; + + // Return a ``Date`` object for the current time in UTC + ul4.utcnow = function utcnow() + { + var now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + }; + + ul4.functions = { + repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), + ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), + str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), + int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), + float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), + list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), + set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), + bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), + len: ul4.expose(["sequence"], {name: "len"}, ul4._len), + type: ul4.expose(["obj"], {name: "type"}, ul4._type), + format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), + any: ul4.expose(["iterable"], {name: "any"}, ul4._any), + all: ul4.expose(["iterable"], {name: "all"}, ul4._all), + zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), + isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), + isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), + isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), + isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), + isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), + isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), + isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), + isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), + iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), + istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), + ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), + istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), + isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), + islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), + isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), + isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), + isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), + asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), + fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), + asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), + fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), + now: ul4.expose([], ul4.now), + utcnow: ul4.expose([], ul4.utcnow), + enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), + isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), + islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), + isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), + enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), + abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), + date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), + timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), + monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), + rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), + hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), + hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), + xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), + csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), + chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), + ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), + hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), + oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), + bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), + min: ul4.expose(["*obj"], {name: "min"}, ul4._min), + max: ul4.expose(["*obj"], {name: "max"}, ul4._max), + sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), + first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), + last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), + sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), + range: ul4.expose(["*args"], {name: "range"}, ul4._range), + slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), + urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), + urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), + reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), + random: ul4.expose([], {name: "random"}, ul4._random), + randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), + randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), + round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), + md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) + }; + + // Functions implementing UL4 methods + ul4._replace = function _replace(string, old, new_, count) + { + if (count === null) + count = string.length; + + var result = []; + while (string.length) + { + var pos = string.indexOf(old); + if (pos === -1 || !count--) + { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + result.push(new_); + string = string.substr(pos + old.length); + } + return result.join(""); + }; + + ul4._strip = function _strip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("strip()", "strip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + while (string && chars.indexOf(string[string.length-1]) >= 0) + string = string.substr(0, string.length-1); + return string; + }; + + ul4._lstrip = function _lstrip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + return string; + }; + + ul4._rstrip = function _rstrip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); + + while (string && chars.indexOf(string[string.length-1]) >= 0) + string = string.substr(0, string.length-1); + return string; + }; + + ul4._split = function _split(string, sep, count) + { + if (sep !== null && typeof(sep) !== "string") + throw ul4.TypeError.create("split()", "split() requires a string"); + + if (count === null) + { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + var result = []; + while (string.length) + { + var pos = string.indexOf(sep); + if (pos === -1 || !count--) + { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + string = string.substr(pos + sep.length); + } + return result; + } + else + { + var result = []; + while (string.length) + { + string = ul4._lstrip(string, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + part = string.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + string = string.substr(part.length); + } + return result; + } + } + }; + + ul4._rsplit = function _rsplit(string, sep, count) + { + if (sep !== null && typeof(sep) !== "string") + throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + + if (count === null) + { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + var result = []; + while (string.length) + { + var pos = string.lastIndexOf(sep); + if (pos === -1 || !count--) + { + result.unshift(string); + break; + } + result.unshift(string.substr(pos+sep.length)); + string = string.substr(0, pos); + } + return result; + } + else + { + var result = []; + while (string.length) + { + string = ul4._rstrip(string, null, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + { + part = string.split(/[ \n\r\t]+/); + part = part[part.length-1]; + } + if (part.length) + result.unshift(part); + string = string.substr(0, string.length-part.length); + } + return result; + } + } + }; + + ul4._splitlines = function _splitlines(string, keepends) + { + var lookingAtLineEnd = function lookingAtLineEnd() + { + var c = string[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') + { + if (pos == length-1) + return 1; + if (string[pos+1] === '\n') + return 2; + return 1; + } + return 0; + }; + + var result = [], length = string.length; + + for (var pos = 0, startpos = 0;;) + { + if (pos >= length) + { + if (startpos != pos) + result.push(string.substring(startpos)); + return result; + } + var lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else + { + var endpos = pos + (keepends ? lineendlen : 0); + result.push(string.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } + }; + + ul4._count = function _count(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + var isstr = ul4._isstr(obj); + + if (isstr && !sub.length) + { + if (end < 0 || start > obj.length || start > end) + return 0; + var result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } + + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + var count = 0; + if (ul4._islist(obj)) + { + for (var i = start; i < end; ++i) + { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + var lastIndex = start; + + for (;;) + { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; + ++count; + lastIndex += sub.length; + } + return count; + } + }; + + ul4._find = function _find(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.indexOf(sub); + if (result !== -1) + result += start; + return result; + }; + + ul4._rfind = function _rfind(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; + return result; + }; + + ul4._capitalize = function _capitalize(obj) + { + if (typeof(obj) != "string") + throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); + + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; + }; + + ul4._items = function _items(obj) + { + if (ul4._ismap(obj)) + { + var result = []; + obj.forEach(function(value, key){ + result.push([key, value]); + }); + return result; + } + else if (ul4._isobject(obj)) + { + var result = []; + for (var key in obj) + result.push([key, obj[key]]); + return result; + } + throw ul4.TypeError.create("items()", "items() requires a dict"); + }; + + ul4._values = function _values(obj) + { + if (ul4._ismap(obj)) + { + var result = []; + obj.forEach(function(value, key){ + result.push(value); + }); + return result; + } + else if (ul4._isobject(obj)) + { + var result = []; + for (var key in obj) + result.push(obj[key]); + return result; + } + throw ul4.TypeError.create("values()", "values() requires a dict"); + }; + + ul4._join = function _join(sep, iterable) + { + var resultlist = []; + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(sep); + }; + + ul4._startswith = function _startswith(string, prefix) + { + if (typeof(prefix) !== "string") + throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); + + return string.substr(0, prefix.length) === prefix; + }; + + ul4._endswith = function _endswith(string, suffix) + { + if (typeof(suffix) !== "string") + throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); + + return string.substr(string.length-suffix.length) === suffix; + }; + + ul4._isoformat = function _isoformat(obj) + { + if (!ul4._isdate(obj)) + throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); + + var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + if (hour || minute || second || ms) + { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; + }; + + ul4._mimeformat = function _mimeformat(obj) + { + var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; + }; + + ul4._weekday = function _weekday(obj) + { + var d = obj.getDay(); + return d ? d-1 : 6; + }; + + ul4._week = function _week(obj, firstweekday) + { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; + + var yearday = ul4._yearday(obj)+6; + var jan1 = new Date(obj.getFullYear(), 0, 1); + var jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; + + while (jan1weekday != firstweekday) + { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; + } + return Math.floor(yearday/7); + }; + + ul4._isleap = function _isleap(obj) + { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; + }; + + ul4._yearday = function _yearday(obj) + { + var leap = ul4._isleap(obj) ? 1 : 0; + var day = obj.getDate(); + switch (obj.getMonth()) + { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; + } + }; + + ul4._append = function _append(obj, items) + { + for (var i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; + }; + + ul4._insert = function _insert(obj, pos, items) + { + if (pos < 0) + pos += obj.length; + + for (var i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; + }; + + ul4._pop = function _pop(obj, pos) + { + if (pos < 0) + pos += obj.length; + + var result = obj[pos]; + obj.splice(pos, 1); + return result; + }; + + ul4._update = function _update(obj, others, kwargs) + { + if (!ul4._isdict(obj)) + throw ul4.TypeError.create("update()", "update() requires a dict"); + for (var i = 0; i < others.length; ++i) + { + var other = others[i]; + if (ul4._ismap(other)) + { + other.forEach(function(value, key){ + ul4on._setmap(obj, key, value); + }); + } + else if (ul4._isobject(other)) + { + for (var key in other) + ul4on._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) + { + for (var j = 0; j < other.length; ++j) + { + if (!ul4._islist(other[j]) || (other[j].length != 2)) + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + ul4on._setmap(obj, other[j][0], other[j][1]); + } + } + else + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + } + for (var key in kwargs) + ul4on._setmap(obj, key, kwargs[key]); + return null; + }; + + ul4._clear = function _clear(obj) + { + if (ul4._ismap(obj)) + obj.clear(); + else if (ul4._isset(obj)) + obj.clear(); + else if (ul4._isobject(obj)) + { + for (var key in obj) + delete obj[key]; + } + else + throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); + return null; + }; + + ul4.Color = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Color", + + create: function create(r, g, b, a) + { + var c = ul4._clone(this); + c._r = typeof(r) !== "undefined" ? r : 0; + c._g = typeof(g) !== "undefined" ? g : 0; + c._b = typeof(b) !== "undefined" ? b : 0; + c._a = typeof(a) !== "undefined" ? a : 255; + return c; + }, + + __repr__: function __repr__() + { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) + { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) + return "#" + r[0] + g[0] + b[0] + a[0]; + else + return "#" + r + g + b + a; + } + else + { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __str__: function __str__() + { + if (this._a !== 0xff) + { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; + } + else + { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __iter__: function __iter__() + { + return { + obj: this, + index: 0, + next: function() { + if (this.index == 0) + { + ++this.index; + return {value: this.obj._r, done: false}; + } + else if (this.index == 1) + { + ++this.index; + return {value: this.obj._g, done: false}; + } + else if (this.index == 2) + { + ++this.index; + return {value: this.obj._b, done: false}; + } + else if (this.index == 3) + { + ++this.index; + return {value: this.obj._a, done: false}; + } + else + return {done: true}; + } + }; + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "r": + return ul4.expose([], function r(){ return self._r; }); + case "g": + return ul4.expose([], function g(){ return self._g; }); + case "b": + return ul4.expose([], function b(){ return self._b; }); + case "a": + return ul4.expose([], function a(){ return self._a; }); + case "lum": + return ul4.expose([], function lum(){ return self.lum(); }); + case "hls": + return ul4.expose([], function hls(){ return self.hls(); }); + case "hlsa": + return ul4.expose([], function hlsa(){ return self.hlsa(); }); + case "hsv": + return ul4.expose([], function hsv(){ return self.hsv(); }); + case "hsva": + return ul4.expose([], function hsva(){ return self.hsva(); }); + case "witha": + return ul4.expose(["a"], function witha(a){ return self.witha(a); }); + case "withlum": + return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); + case "abslum": + return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); + case "rellum": + return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); + default: + return undefined; + } + }, + + __getitem__: function __getitem__(key) + { + var orgkey = key; + if (key < 0) + key += 4; + switch (key) + { + case 0: + return this._r; + case 1: + return this._g; + case 2: + return this._b; + case 3: + return this._a; + default: + return undefined; + } + }, + + __eq__: function __eq__(other) + { + if (ul4._iscolor(other)) + return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; + return false; + }, + + r: ul4.expose([], function r() { return this._r; }), + + g: ul4.expose([], function g() { return this._g; }), + + b: ul4.expose([], function b() { return this._b; }), + + a: ul4.expose([], function a() { return this._a; }), + + lum: ul4.expose([], function lum() {return this.hls()[1]; }), + + hls: ul4.expose([], + function hls() + { + var r = this._r/255.0; + var g = this._g/255.0; + var b = this._b/255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var h, l, s; + var rc, gc, bc; + + l = (minc+maxc)/2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc-minc) / (maxc+minc); + else + s = (maxc-minc) / (2.0-maxc-minc); + rc = (maxc-r) / (maxc-minc); + gc = (maxc-g) / (maxc-minc); + bc = (maxc-b) / (maxc-minc); + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, l, s]; + } + ), + + hlsa: ul4.expose([], + function hlsa() + { + var hls = this.hls(); + return hls.concat(this._a/255.0); + } + ), + + hsv: ul4.expose([], + function hsv() + { + var r = this._r/255.0; + var g = this._g/255.0; + var b = this._b/255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + var s = (maxc-minc) / maxc; + var rc = (maxc-r) / (maxc-minc); + var gc = (maxc-g) / (maxc-minc); + var bc = (maxc-b) / (maxc-minc); + var h; + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, s, v]; + } + ), + + hsva: ul4.expose([], + function hsva() + { + var hsv = this.hsv(); + return hsv.concat(this._a/255.0); + } + ), + + witha: ul4.expose(["a"], + function witha(a) + { + if (typeof(a) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + return ul4.Color.create(this._r, this._g, this._b, a); + } + ), + + withlum: ul4.expose(["lum"], + function withlum(lum) + { + if (typeof(lum) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + var hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + ) + } + ); + + ul4.TimeDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.TimeDelta", + + create: function create(days, seconds, microseconds) + { + var td = ul4._clone(this); + if (typeof(days) === "undefined") + days = 0; + if (typeof(seconds) === "undefined") + seconds = 0; + if (typeof(microseconds) === "undefined") + microseconds = 0; + + var total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); + + microseconds = ul4.ModAST._do(total_microseconds, 1000000); + var total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST._do(total_seconds, 86400); + days = Math.floor(total_seconds / 86400); + if (seconds < 0) + { + seconds += 86400; + --days; + } + + td._microseconds = microseconds; + td._seconds = seconds; + td._days = days; + + return td; + }, + + __repr__: function __repr__() + { + if (!this._microseconds) + { + if (!this._seconds) + { + if (!this._days) + return "timedelta()"; + return "timedelta(" + this._days + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; + }, + + __str__: function __str__() + { + var v = []; + if (this._days) + { + v.push(this._days + " day"); + if (this._days !== -1 && this._days !== 1) + v.push("s"); + v.push(", "); + } + var seconds = this._seconds % 60; + var minutes = Math.floor(this._seconds / 60); + var hours = Math.floor(minutes / 60); + minutes = minutes % 60; + + v.push("" + hours); + v.push(":"); + v.push(ul4._lpad(minutes.toString(), "0", 2)); + v.push(":"); + v.push(ul4._lpad(seconds.toString(), "0", 2)); + if (this._microseconds) + { + v.push("."); + v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); + } + return v.join(""); + }, + + __bool__: function __bool__() + { + return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; + }, + + __abs__: function __abs__() + { + return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; + }, + + __eq__: function __eq__(other) + { + if (ul4._istimedelta(other)) + return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); + return false; + }, + + __lt__: function __lt__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds < other._microseconds; + } + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds <= other._microseconds; + } + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds > other._microseconds; + } + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds >= other._microseconds; + } + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() + { + return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); + }, + + _add: function _add(date, days, seconds, microseconds) + { + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate() + days; + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds() + seconds; + var millisecond = date.getMilliseconds() + microseconds/1000; + return new Date(year, month, day, hour, minute, second, millisecond); + }, + + __add__: function __add__(other) + { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + else if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __radd__: function __radd__(other) + { + if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __sub__: function __sub__(other) + { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __rsub__: function __rsub__(other) + { + if (ul4._isdate(other)) + return this._add(other, -this._days, -this._seconds, -this._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __mul__: function __mul__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __rmul__: function __rmul__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __truediv__: function __truediv__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (ul4._istimedelta(other)) + { + var myValue = this._days; + var otherValue = other._days; + var hasSeconds = this._seconds || other._seconds; + var hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) + { + myValue = myValue*86400+this._seconds; + otherValue = otherValue*86400 + other._seconds; + if (hasMicroseconds) + { + myValue = myValue * 1000000 + this._microseconds; + otherValue = otherValue * 1000000 + other._microseconds; + } + } + return myValue/otherValue; + } + throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "days": + return ul4.expose([], function days(){ return self._days; }); + case "seconds": + return ul4.expose([], function seconds(){ return self._seconds; }); + case "microseconds": + return ul4.expose([], function microseconds(){ return self._microseconds; }); + default: + return undefined; + } + }, + + days: function days() + { + return this._days; + }, + + seconds: function seconds() + { + return this._seconds; + }, + + microseconds: function microseconds() + { + return this._microseconds; + } + } + ); + + ul4.MonthDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.MonthDelta", + + create: function create(months) + { + var md = ul4._clone(this); + md._months = typeof(months) !== "undefined" ? months : 0; + return md; + }, + + __repr__: function __repr__() + { + if (!this._months) + return "monthdelta()"; + return "monthdelta(" + this._months + ")"; + }, + + __str__: function __str__() + { + if (this._months) + { + if (this._months !== -1 && this._months !== 1) + return this._months + " months"; + return this._months + " month"; + } + return "0 months"; + }, + + __bool__: function __bool__() + { + return this._months !== 0; + }, + + __abs__: function __abs__() + { + return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; + }, + + __eq__: function __eq__(other) + { + if (ul4._ismonthdelta(other)) + return this._months === other._months; + return false; + }, + + __lt__: function __lt__(other) + { + if (ul4._ismonthdelta(other)) + return this._months < other._months; + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) + { + if (ul4._ismonthdelta(other)) + return this._months <= other._months; + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) + { + if (ul4._ismonthdelta(other)) + return this._months > other._months; + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) + { + if (ul4._ismonthdelta(other)) + return this._months >= other._months; + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() + { + return ul4.MonthDelta.create(-this._months); + }, + + _add: function _add(date, months) + { + var year = date.getFullYear(); + var month = date.getMonth() + months; + var day = date.getDate(); + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds(); + var millisecond = date.getMilliseconds(); + + while (true) + { + // As the month might be out of bounds, we have to find out, what the real target month is + var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + var result = new Date(year, month, day, hour, minute, second, millisecond); + if (result.getMonth() === targetmonth) + return result; + --day; + } + }, + + __add__: function __add__(other) + { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months + other._months); + else if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __radd__: function __radd__(other) + { + if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __sub__: function __sub__(other) + { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months - other._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __rsub__: function __rsub__(other) + { + if (ul4._isdate(other)) + return this._add(other, -this._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __mul__: function __mul__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __rmul__: function __rmul__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __floordiv__: function __floordiv__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(Math.floor(this._months / other)); + else if (ul4._ismonthdelta(other)) + return Math.floor(this._months / other._months); + throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; + }, + + __truediv__: function __truediv__(other) + { + if (ul4._ismonthdelta(other)) + return this._months / other._months; + throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "months": + return ul4.expose([], function months(){ return self._months; }); + default: + return undefined; + } + }, + + months: function months() + { + return this._months; + } + } + ); + + // When we don't have a real ``Set`` type, emulate one that supports strings + ul4._Set = ul4._inherit( + ul4.Proto, + { + __type__: "ul4._Set", + + create: function create() + { + var set = ul4._clone(this); + set.items = {}; + set.add.apply(set, arguments); + return set; + }, + + add: function add() + { + for (var i = 0; i < arguments.length; ++i) + { + this.items[arguments[i]] = true; + } + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "add": + return ul4.expose(["*items"], function add(items){ self.add.apply(self, items); }); + default: + return undefined; + } + }, + + __contains__: function __contains__(item) + { + return this.items[item] || false; + }, + + __bool__: function __bool__() + { + for (var item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + }, + + __repr__: function __repr__() + { + var v = []; + v.push("{"); + var i = 0; + for (var item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + }, + + __eq__: function(other) + { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Substract the number of items that ``other`` has + for (var item in other.items) + --count; + return count == 0; + } + else + return false; + }, + + __le__: function(other) + { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + }, + + __ge__: function(other) + { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) + { + var result = true; + other.forEach(function(value) { + if (!this.items[value]) + result = false; + }); + return result; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in other.items) + { + if (!this.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + } + ); + + var classes = [ + "TextAST", + "IndentAST", + "LineEndAST", + "Tag", + "ConstAST", + "SeqItemAST", + "UnpackSeqItemAST", + "DictItemAST", + "UnpackDictItemAST", + "PosArgAST", + "KeywordArgAST", + "UnpackListArgAST", + "UnpackDictArgAST", + "ListAST", + "ListCompAST", + "DictAST", + "DictCompAST", + "SetAST", + "SetCompAST", + "GenExprAST", + "VarAST", + "NotAST", + "NegAST", + "BitNotAST", + "IfAST", + "ReturnAST", + "PrintAST", + "PrintXAST", + "ItemAST", + "IsAST", + "IsNotAST", + "EQAST", + "NEAST", + "LTAST", + "LEAST", + "GTAST", + "GEAST", + "NotContainsAST", + "ContainsAST", + "AddAST", + "SubAST", + "MulAST", + "FloorDivAST", + "TrueDivAST", + "ModAST", + "ShiftLeftAST", + "ShiftRightAST", + "BitAndAST", + "BitXOrAST", + "BitOrAST", + "AndAST", + "OrAST", + "SliceAST", + "AttrAST", + "CallAST", + "RenderAST", + "SetVarAST", + "AddVarAST", + "SubVarAST", + "MulVarAST", + "TrueDivVarAST", + "FloorDivVarAST", + "ModVarAST", + "ShiftLeftVarAST", + "ShiftRightVarAST", + "BitAndVarAST", + "BitXOrVarAST", + "BitOrVarAST", + "ForBlockAST", + "WhileBlockAST", + "BreakAST", + "ContinueAST", + "CondBlockAST", + "IfBlockAST", + "ElIfBlockAST", + "ElseBlockAST", + "SignatureAST", + "Template" + ]; + + for (var i = 0; i < classes.length; ++i) + { + var name = classes[i]; + var ul4onname = name; + if (ul4onname.substr(ul4onname.length-3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length-3); + ul4onname = ul4onname.toLowerCase(); + var object = ul4[name]; + object.typename = name; + object.type = ul4onname; + ul4on.register("de.livinglogic.ul4." + ul4onname, object); + } + + })(); \ No newline at end of file diff --git a/dist/pages/home/home.js b/dist/pages/home/home.js deleted file mode 100644 index 7c7feee..0000000 --- a/dist/pages/home/home.js +++ /dev/null @@ -1,43 +0,0 @@ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -import { Component } from '@angular/core'; -let HomePage = class HomePage { - constructor(navCtrl, laProv) { - this.navCtrl = navCtrl; - this.laProv = laProv; - this.coffee = "Mocha"; - this.number = 1; - this.consumer = "Der Herr des Kaffees"; - } - changeNumber(diffrence) { - if ((this.number <= 1 && diffrence < 0) || (this.number >= 5 && diffrence > 0)) { - return; - } - this.number += diffrence; - } - add() { - console.log("add entry" + JSON.stringify({ - kaffeesorte: this.coffee, - runde: this.number, - mitarbeiter: this.consumer - })); - this.laProv.addCoffee({ - kaffeesorte: this.coffee, - runde: this.number.toString(), - mitarbeiter: this.consumer - }).then((res) => { - alert("erfolgreich einen Datensatz hinzugefügt"); - }); - } -}; -HomePage = __decorate([ - Component({ - selector: 'page-home', - templateUrl: 'home.html' - }) -], HomePage); -export { HomePage }; diff --git a/dist/providers/la/la.js b/dist/providers/la/la.js deleted file mode 100644 index eb935c2..0000000 --- a/dist/providers/la/la.js +++ /dev/null @@ -1,28 +0,0 @@ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -import { Injectable } from '@angular/core'; -let LaProvider = class LaProvider { - constructor() { - this.window = window; - } - addCoffee(input) { - return new Promise((resolve, reject) => { - let lsdk = new this.window.livingSDK({}, this.window.username, this.window.password); - lsdk.get("appid of your Livingapp").then((LAAPI) => { - let app = LAAPI.get('datasources').get('coffee').app; - app.insert(input).then((res) => { - console.log(res); - resolve(res); - }); - }); - }); - } -}; -LaProvider = __decorate([ - Injectable() -], LaProvider); -export { LaProvider }; diff --git a/package-lock.json b/package-lock.json index 0828a25..7a352b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,25 @@ { - "name": "livingapi", - "version": "1.0.0", + "name": "livingsdk", + "version": "0.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, "@types/estree": { "version": "0.0.38", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", @@ -26,18 +42,120 @@ "negotiator": "0.6.1" } }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "any-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -47,699 +165,5465 @@ "is-buffer": "1.1.6" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "blueimp-md5": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", - "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "ms": "2.0.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "type-detect": "4.0.8" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "dev": true }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", "dev": true }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", "dev": true }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.5", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.5", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", + "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "dev": true + }, + "blueimp-md5": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", + "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.3.tgz", + "integrity": "sha512-qTfM2pNFeMZcLvf/RbrVAzDEVttZjFhaApfx9dplNjvHSX88Ui66zBRb/4YGob/xUWxDceirgoC1lT676asfCQ==", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "1.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "envinfo": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", + "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "0.2.1", + "xtend": "4.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "fast-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", + "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.1", + "micromatch": "3.1.10" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "flow-parser": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.71.0.tgz", + "integrity": "sha512-rXSvqSBLf8aRI6T3P99jMcUYvZoO1KZcKDkzGJmXvYdNAgRKu7sfGNtxEsn3cX4TgungBuJpX+K8aHRC9/B5MA==", + "dev": true + }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "7.1.0", + "is-plain-obj": "1.1.0" + }, + "dependencies": { + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + } + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "6.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "dev": true, + "requires": { + "glob": "7.1.1", + "yargs": "1.2.6" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + }, + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", + "dev": true, + "requires": { + "minimist": "0.1.0" + } + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "into-stream": "3.1.0", + "is-retry-allowed": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "mimic-response": "1.0.0", + "p-cancelable": "0.4.1", + "p-timeout": "2.0.1", + "pify": "3.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "1.4.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "5.5.10", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "2.3.0", + "p-is-promise": "1.1.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "0.2.4" + }, + "dependencies": { + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2.1.1", + "editions": "1.3.4", + "textextensions": "2.2.0" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jscodeshift": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", + "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "7.0.0-beta.46", + "colors": "1.2.3", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "neo-async": "2.5.1", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.14.7", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-observable": "0.2.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.4.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.10", + "stream-to-observable": "0.2.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.29.0", + "figures": "1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.4.1" + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" + } + }, + "mem-fs-editor": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.1.tgz", + "integrity": "sha512-54fptqhSZX1sSYsVVInG2qzUWPPrEv/6qYxHAwXJZQfzDcviJcL+7p/wmupg8SdAOi42m/vilMBemx3D6Sz22g==", + "dev": true, + "requires": { + "commondir": "1.0.1", + "deep-extend": "0.5.1", + "ejs": "2.5.9", + "glob": "7.1.1", + "globby": "8.0.1", + "isbinaryfile": "3.0.2", + "mkdirp": "0.5.1", + "multimatch": "2.1.0", + "rimraf": "2.6.2", + "through2": "2.0.3", + "vinyl": "2.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.1", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge2": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", + "dev": true + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "underscore": "1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "2.0.0", + "query-string": "5.1.1", + "sort-keys": "2.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "prettier": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", + "dev": true, + "requires": { + "pify": "3.0.0", + "safe-buffer": "5.1.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "recast": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", + "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "dev": true, + "requires": { + "ast-types": "0.11.3", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.7.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "1.0.1" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "glob": "7.1.1" } }, - "follow-redirects": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "rollup": { + "version": "0.58.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", + "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", + "dev": true, "requires": { - "debug": "3.1.0" + "@types/estree": "0.0.38", + "@types/node": "10.0.3" + } + }, + "rollup-plugin-node-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", + "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", + "dev": true, + "requires": { + "builtin-modules": "2.0.0", + "is-module": "1.0.0", + "resolve": "1.7.1" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true } } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "symbol-observable": "1.0.1" } }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } }, - "has-flag": { + "scoped-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", "statuses": "1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "shelljs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "glob": "7.1.1", + "interpret": "1.1.0", + "rechoir": "0.6.2" } }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "is-plain-obj": "1.1.0" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "mime-db": "1.33.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "minimist": "0.0.8" + "extend-shallow": "3.0.2" } }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "ms": "2.0.0" + "is-descriptor": "0.1.6" } } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "0.2.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "ee-first": "1.1.1" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "wrappy": "1.0.2" + "safe-buffer": "5.1.1" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", "dev": true }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", "dev": true, "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", "dev": true }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "readable-stream": "2.3.6", + "xtend": "4.0.1" } }, - "rollup": { - "version": "0.58.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", - "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "@types/estree": "0.0.38", - "@types/node": "10.0.3" + "os-tmpdir": "1.0.2" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "has-flag": "1.0.0" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -762,29 +5646,653 @@ "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", "dev": true }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "v8-compile-cache": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", + "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "dev": true, + "requires": { + "jscodeshift": "0.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "dev": true, + "requires": { + "async": "1.5.2", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "6.18.0", + "colors": "1.2.3", + "flow-parser": "0.71.0", + "lodash": "4.17.10", + "micromatch": "2.3.11", + "node-dir": "0.1.8", + "nomnom": "1.8.1", + "recast": "0.12.9", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "core-js": "2.5.5", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.2.tgz", + "integrity": "sha512-2C6bs9gORlzCSgkNZTnj8hnXMxe3g2v+yqiUdB+1l/I3sI36ND4zZStV00yq0eGjE5CNu0eqOQr7YYe+42H2Yw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "diff": "3.5.0", + "enhanced-resolve": "4.0.0", + "envinfo": "4.4.2", + "glob-all": "3.1.0", + "global-modules": "1.0.0", + "got": "8.3.1", + "import-local": "1.0.0", + "inquirer": "5.2.0", + "interpret": "1.1.0", + "jscodeshift": "0.5.0", + "listr": "0.13.0", + "loader-utils": "1.1.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mkdirp": "0.5.1", + "p-each-series": "1.0.0", + "p-lazy": "1.0.0", + "prettier": "1.12.1", + "supports-color": "5.4.0", + "v8-compile-cache": "1.1.2", + "webpack-addons": "1.1.5", + "yargs": "11.1.0", + "yeoman-environment": "2.0.6", + "yeoman-generator": "2.0.5" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + }, + "yeoman-environment": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", + "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "globby": "6.1.0", + "grouped-queue": "0.3.3", + "inquirer": "3.3.0", + "is-scoped": "1.0.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mem-fs": "1.1.3", + "text-table": "0.2.0", + "untildify": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "2.6.0", + "chalk": "2.4.1", + "cli-table": "0.3.1", + "cross-spawn": "6.0.5", + "dargs": "5.1.0", + "dateformat": "3.0.3", + "debug": "3.1.0", + "detect-conflict": "1.0.1", + "error": "7.0.2", + "find-up": "2.1.0", + "github-username": "4.1.0", + "istextorbinary": "2.2.1", + "lodash": "4.17.10", + "make-dir": "1.2.0", + "mem-fs-editor": "4.0.1", + "minimist": "1.2.0", + "pretty-bytes": "4.0.2", + "read-chunk": "2.1.0", + "read-pkg-up": "3.0.0", + "rimraf": "2.6.2", + "run-async": "2.3.0", + "shelljs": "0.8.1", + "text-table": "0.2.0", + "through2": "2.0.3", + "yeoman-environment": "2.0.6" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } } } } diff --git a/package.json b/package.json index a2e2251..658f17b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "livingapi", - "version": "1.0.0", + "name": "livingsdk", + "version": "0.3.0", "description": "livingapps api for javascript (nodjs and browser) written in typescript", "main": "dist/livingSDK.js", "repository": { @@ -8,20 +8,23 @@ "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "mocha", + "test": "tsc -p ./tsconfig.cjs.json && mocha", "build": "sh shellscripts/build.sh" }, - "author": "", + "author": "Living Logic AG", "license": "ISC", "dependencies": { "axios": "^0.18.0", "blueimp-md5": "^2.10.0" }, "devDependencies": { + "@types/node": "^10.0.3", "chai": "^4.1.2", "express": "^4.15.4", "mocha": "^3.5.2", "rollup": "^0.58.2", - "typescript": "^2.8.3" + "rollup-plugin-node-resolve": "^3.3.0", + "typescript": "^2.8.3", + "webpack-cli": "^2.1.2" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..c19dc52 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,9 @@ +export default { + + input: 'dist/livingsdk.js', + output: { + file: 'dist/bundle.js', + format: 'iife', + name: 'LivingSDK' + } +} \ No newline at end of file diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 0f62881..38f916e 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,2 +1,4 @@ echo build LivingApps.Javascript.LivingAPI -tsc -p ./tsconfig.json \ No newline at end of file +tsc -p ./tsconfig.json +echo bundle it +rollup -c rollup.config.js \ No newline at end of file diff --git a/src/livingSDK.ts b/src/livingSDK.ts deleted file mode 100644 index ec711f6..0000000 --- a/src/livingSDK.ts +++ /dev/null @@ -1,388 +0,0 @@ -import axios from 'axios'; - -export interface LivingAPIOptions { - url: string; - loginRequired: boolean; -} - -export default class livingSDK { - private _password: string; - private _userName: string; - private _options: LivingAPIOptions - private hostName: string; - private session: Promise; - constructor(options: any = {}, username: string, password: string) { - /** @type {String} */ - this._password = password; - /** @type {String} */ - this._userName = username; - /** @type {Object} */ - this._options = { - /** @type {String} */ - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', - /** @type {Boolean} */ - loginRequired: options.loginRequired !== undefined ? options.loginRequired : true - }; - this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; - this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); - if (this._options.loginRequired && !this._userName) { - throw new Error('[livingSDK] You want to login without a username') - } - this.session = this.login(); - } - - /** - * get token for Session - * @return {Promise.} - */ - login(): Promise { - if (!this._options.loginRequired) { - return Promise.resolve(undefined); - } - return new Promise((resolve, reject) => { - - - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": "/gateway/login", - "headers": { - "Content-Type": "application/json" - } - }; - let req = http.request(options, (res) => { - let chunks = [];; - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - res.on('data', (chunk) => { - chunks.push(chunk); - }); - - res.on('end', () => { - let body = Buffer.concat(chunks); - resolve(JSON.parse(body.toString()).auth_token); - }); - }); - req.write(JSON.stringify({ - username: this._userName, - password: this._password - })); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/login`, { - dataType: 'json', - data: JSON.stringify({ - 'username': this._userName, - 'password': this._password - }), - method: 'POST', - error: function (error: Error) { - reject(error); - }, - success: function (body: any) { - resolve(body.auth_token); - } - }); - } - }); - } - - get(appID, templateName) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "GET", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : '' }`, - "headers": { - 'Accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - let chunks = []; - res.on('data', function (chunk) { - chunks.push(chunk); - }); - - res.on('end', () => { - if (res.statusCode === 200) { - let body = Buffer.concat(chunks).toString(); - let dump; - try{ - dump = ul4on.loads(body.toString()); - } - catch(err) { - reject(err); - return; - } - dump.get('globals').Login = this; - - resolve(dump); - } else if (res.statusCode === 403) { - this.session = this.login(); - console.log('token is not valid'); - resolve(this.get(appID, templateName)); - } else { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - }); - }); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/apps/${appID}${templateName !== undefined ? '/' + templateName : ''}`, { - headers: { - 'Accept': 'application/la-ul4on', - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'GET', - error: (error) => { - if (error.status === 403) { - this.session = this.login(); - console.log('token is not valid'); - resolve(this.get(appID, templateName)); - } - reject(error); - }, - success: (body) => { - let dump = ul4on.loads(body); - dump.get('globals').Login = this; - resolve(dump); - } - }) - } - }); - }); - } - - _insert(app, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`insert() got an unexpected keyword argument ${ident}`); - } - - fields[ident] = app.controls.get(ident).asjson(values[ident]); - } - let data = {}; { - - } - data.id = app.id; - data.data = [{ 'fields': fields }]; - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - "Content-Type": "application/json", - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - - res.on('end', () => { - if (res.statusCode !== 200) { - reject(res.statusCode); - return; - } - let body = Buffer.concat(chunks).toString(); - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: livingApi.Record.create({ - id: JSON.parse(body).id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({ 'appdd': data })); - req.end(); - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - method: 'post', - data: { 'appdd': JSON.stringify(data) }, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - success: (body) => { - let returnObj = { - recordid: body.id, - Record: livingApi.Record.create({ - id: body.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - resolve(returnObj); - }, - error: (error) => { - reject(error); - } - }); - } - }) - }); - } - - _update(record, values) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - reject(`update() got an unexpected keyword argument ${ident}`); - } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{ 'id': record.id, 'fields': fields }]; - if (commonjs) { - let options = { - "ecdhCurve": 'auto', - "method": "POST", - "hostname": this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length-1), - "port": 443, - "path": `/gateway/v1/appdd/${app.id}.json`, - "headers": { - "Content-Type": "application/json", - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - - res.on('end', () => { - let body = Buffer.concat(chunks).toString(); - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.statusCode, - recordid: JSON.parse(body).id, - Record: record - }; - resolve(returnObj); - }); - }); - req.write(JSON.stringify({ 'appdd': data })); - req.end(); - - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}.json`, { - data: { 'appdd': JSON.stringify(data) }, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - method: 'post', - success: (body) => { - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: 200, - recordid: body.id, - Record: record - }; - resolve(returnObj); - }, - error: (error) => { - reject(error); - } - }) - } - }); - }); - } - - _delete(record) { - return new Promise((resolve, reject) => { - this.session.then((auth_token) => { - let app = record.app; - let recordId = record.id; - if (commonjs) { - let options = { - 'ecdhCurve': 'auto', - 'method': 'DELETE', - 'hostname': this.hostName, - 'port': 443, - 'path': `/gateway/v1/appdd/${app.id}/${recordId}.json`, - 'headers': { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - } - }; - let req = http.request(options, (res) => { - if (res.statusCode !== 200) { - reject(new Error('Http Statuscode ' + res.statusCode)); - } - let chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - - res.on('end', () => { - if (res.statusCode === 200) - resolve(200); - }); - }); - req.end(); - - } else { - $.ajax(`${this._options.url}gateway/v1/appdd/${app.id}/${recordId}.json`, { - method: 'delete', - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '' - }, - success: () => { - resolve(200); - }, - error: () => { - reject(error); - } - }); - } - }) - }) - } - } - - if (commonjs) { - module.exports = livingSDK; - } else { - root.livingSDK = livingSDK; - } - - -})(this); diff --git a/src/livingsdk.ts b/src/livingsdk.ts new file mode 100644 index 0000000..f5e31c2 --- /dev/null +++ b/src/livingsdk.ts @@ -0,0 +1,200 @@ +/// + +import * as https from 'https'; +import { AxiosStatic, AxiosResponse } from 'axios'; + +declare let module: any; +declare let require: any; +declare let window: any; +export type Auth_Token = string; + +export type LivingApi = any; +export type LAPIRecord = any; + +let commonjs = (typeof module === 'object' && module.exports); +let nodejs: any = {}; +let axios: any = undefined; +let ul4on: any; +let livingApi: any; +if (commonjs) { + livingApi = require('./modules/livingapi'); + nodejs.https = require('https') + axios = require('axios'); + ul4on = require('./modules/ul4').ul4on; +} else { + axios = window.axios; + ul4on = window.ul4on; + livingApi = window.livingapi; +} +export interface LivingAPIOptions { + url: string; + loginRequired: boolean; +} + +export default class LivingSDK { + private _password: string; + private _userName: string; + private _options: LivingAPIOptions + private hostName: string; + private session: Promise; + constructor(options: any = {}, username: string, password: string) { + /** @type {String} */ + this._password = password; + /** @type {String} */ + this._userName = username; + /** @type {Object} */ + this._options = { + /** @type {String} */ + url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + /** @type {Boolean} */ + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[LivingSDK] You want to login without a username') + } + this.session = this.login(); + } + + /** + * get token for Session + * @return {Promise.} + */ + login(): Promise { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); + } + let url = `https://${this.hostName}/gateway/login`; + return axios.post(url, { + username: this._userName, + password: this._password + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + "Content-Type": "application/json" + } + }) + .then((a: any) => a.data.auth_token); + } + + get(appId: string, templateName: string): Promise { + return this.session.then((auth_token: Auth_Token | undefined) => { + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, + { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + Accept: 'application/la-ul4on' + } + }) + .then((res: AxiosResponse) => { + let dump: any; + dump = ul4on.loads(res.data); + dump.get('globals').Login = this; + return dump; + }) + }) + } + + _insert(app: any, values: any): Promise { + return this.session.then((auth_token) => { + + let fields: any = {}; + + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`insert() got an unexpected keyword argument ${ident}`); + } + + fields[ident] = app.controls.get(ident).asjson(values[ident]); + } + let data: any = {}; { + } + data.id = app.id; + data.data = [{ 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }) + .then((res: AxiosResponse) => { + return { + HTTPstatusCode: res.status, + recordid: res.data.id, + Record: livingApi.Record.create({ + id: res.data.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + }) + }) + + } + + _update(record: LAPIRecord, values: any) { + return this.session.then((auth_token: Auth_Token | undefined) => { + let fields: any = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; + } + let data: any = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + 'Content-Type': 'application/json' + } + }) + .then((res: AxiosResponse) => { + let body = res.data; + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.status, + recordid: body.id, + Record: record + }; + return returnObj; + }) + }) + } + + _delete(record: LAPIRecord) { + let app = record.app; + return this.session.then((auth_token: Auth_Token | undefined) => { + return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + + }) + }) + } +}; + \ No newline at end of file diff --git a/src/modules/ul4.js b/src/modules/ul4.js index f2ac8e2..cad6ec8 100644 --- a/src/modules/ul4.js +++ b/src/modules/ul4.js @@ -47,7 +47,6 @@ } else { ul4 = root.ul4; ul4on = root.ul4on; - root.livingapi = la; } ul4.version = "41"; diff --git a/test/node_test.js b/test/node_test.js index 85d9733..34d35a7 100644 --- a/test/node_test.js +++ b/test/node_test.js @@ -1,28 +1,28 @@ -let livingSDK; + let config; let defaultSettings = { } if (typeof module === 'object' && module.exports){ - livingSDK = require('../src/livingSDK'); - config = require('./config'); + test(require('../dist/livingsdk').default, require('./config')); } else { - config = this.configs; - livingSDK = this.livingSDK; + test(window.LivingSDK, window.configs); } + +function test (LivingSDK, config) { describe ('login', () => { it ('login', () => { - let lsdk = new livingSDK(defaultSettings, config.username, config.password); + let lsdk = new LivingSDK(defaultSettings, config.username, config.password); return lsdk.login().then((res) => console.log(res)); }); it ('login and get function', () => { - let lsdk = new livingSDK(defaultSettings, config.username, config.password); + let lsdk = new LivingSDK(defaultSettings, config.username, config.password); lsdk.session = (function() {return new Promise ((resolve, reject) => {resolve(123)})})(); return lsdk.get(config.appId).then((LAAPI) => { return LAAPI }); }); it ('insert a entry', () => { - let lsdk = new livingSDK(defaultSettings, config.username, config.password); + let lsdk = new LivingSDK(defaultSettings, config.username, config.password); return lsdk.get(config.appId).then((LAAPI) => { let app = LAAPI.get('datasources').get('default').app; return app.insert({ @@ -32,7 +32,7 @@ describe ('login', () => { }) }); it ('update first entry', () => { - let lsdk = new livingSDK(defaultSettings, config.username, config.password); + let lsdk = new LivingSDK(defaultSettings, config.username, config.password); return lsdk.get(config.appId).then((LAAPI) => { let app = LAAPI.get('datasources').get('default').app; let records = app.records.values(); @@ -48,7 +48,7 @@ describe ('login', () => { }) }); it ('delete a entry', () => { - let lsdk = new livingSDK(defaultSettings, config.username, config.password); + let lsdk = new LivingSDK(defaultSettings, config.username, config.password); return lsdk.get(config.appId).then((LAAPI) => { let app = LAAPI.get('datasources').get('default').app; let records = app.records.values(); @@ -59,4 +59,13 @@ describe ('login', () => { return last.delete(); }) }) -}); \ No newline at end of file +}) + describe('without login', () => { + it ('get function', () => { + let lsdk = new LivingSDK({loginRequired: false}); + return lsdk.get(config.appId).then((LAAPI) => { + return LAAPI + }); + }); + }); +} \ No newline at end of file diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 0000000..a8678b2 --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,53 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "commonjs", + //"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 10e03e0..bf3e910 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,8 @@ "compilerOptions": { /* Basic Options */ "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + //"module": "commonjs", + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ @@ -34,7 +35,7 @@ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ From 0758b67a0182af0f0fe1068f885ed3ac7299b331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 4 May 2018 17:01:53 +0200 Subject: [PATCH 04/43] build --- dist/cjs/livingsdk.js | 162 ++++++++++++++++++++++++++++++++++++++++++ dist/livingsdk.d.ts | 21 ++++++ dist/livingsdk.js | 5 +- shellscripts/build.sh | 3 +- tsconfig.cjs.json | 2 +- tsconfig.json | 2 +- 6 files changed, 188 insertions(+), 7 deletions(-) create mode 100644 dist/cjs/livingsdk.js create mode 100644 dist/livingsdk.d.ts diff --git a/dist/cjs/livingsdk.js b/dist/cjs/livingsdk.js new file mode 100644 index 0000000..986aa1d --- /dev/null +++ b/dist/cjs/livingsdk.js @@ -0,0 +1,162 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +let commonjs = (typeof module === 'object' && module.exports); +let nodejs = {}; +let axios = undefined; +let ul4on; +let livingApi; +if (commonjs) { + livingApi = require('./modules/livingapi'); + nodejs.https = require('https'); + axios = require('axios'); + ul4on = require('./modules/ul4').ul4on; +} +else { + axios = window.axios; + ul4on = window.ul4on; + livingApi = window.livingapi; +} +class LivingSDK { + constructor(options = {}, username, password) { + this._password = password; + this._userName = username; + this._options = { + url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[LivingSDK] You want to login without a username'); + } + this.session = this.login(); + } + login() { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); + } + let url = `https://${this.hostName}/gateway/login`; + return axios.post(url, { + username: this._userName, + password: this._password + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + "Content-Type": "application/json" + } + }) + .then((a) => a.data.auth_token); + } + get(appId, templateName) { + return this.session.then((auth_token) => { + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + Accept: 'application/la-ul4on' + } + }) + .then((res) => { + let dump; + dump = ul4on.loads(res.data); + dump.get('globals').Login = this; + return dump; + }); + }); + } + _insert(app, values) { + return this.session.then((auth_token) => { + let fields = {}; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`insert() got an unexpected keyword argument ${ident}`); + } + fields[ident] = app.controls.get(ident).asjson(values[ident]); + } + let data = {}; + { + } + data.id = app.id; + data.data = [{ 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }) + .then((res) => { + return { + HTTPstatusCode: res.status, + recordid: res.data.id, + Record: livingApi.Record.create({ + id: res.data.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + }); + }); + } + _update(record, values) { + return this.session.then((auth_token) => { + let fields = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; + } + let data = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + 'Content-Type': 'application/json' + } + }) + .then((res) => { + let body = res.data; + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.status, + recordid: body.id, + Record: record + }; + return returnObj; + }); + }); + } + _delete(record) { + let app = record.app; + return this.session.then((auth_token) => { + return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }); + }); + } +} +exports.default = LivingSDK; +; diff --git a/dist/livingsdk.d.ts b/dist/livingsdk.d.ts new file mode 100644 index 0000000..f0e8fcb --- /dev/null +++ b/dist/livingsdk.d.ts @@ -0,0 +1,21 @@ +/// +export declare type Auth_Token = string; +export declare type LivingApi = any; +export declare type LAPIRecord = any; +export interface LivingAPIOptions { + url: string; + loginRequired: boolean; +} +export default class LivingSDK { + private _password; + private _userName; + private _options; + private hostName; + private session; + constructor(options: any, username: string, password: string); + login(): Promise; + get(appId: string, templateName: string): Promise; + _insert(app: any, values: any): Promise; + _update(record: LAPIRecord, values: any): Promise; + _delete(record: LAPIRecord): Promise; +} diff --git a/dist/livingsdk.js b/dist/livingsdk.js index 986aa1d..051acb5 100644 --- a/dist/livingsdk.js +++ b/dist/livingsdk.js @@ -1,5 +1,3 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); let commonjs = (typeof module === 'object' && module.exports); let nodejs = {}; let axios = undefined; @@ -16,7 +14,7 @@ else { ul4on = window.ul4on; livingApi = window.livingapi; } -class LivingSDK { +export default class LivingSDK { constructor(options = {}, username, password) { this._password = password; this._userName = username; @@ -158,5 +156,4 @@ class LivingSDK { }); } } -exports.default = LivingSDK; ; diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 38f916e..03e0dac 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,4 +1,5 @@ echo build LivingApps.Javascript.LivingAPI -tsc -p ./tsconfig.json +tsc -p ./tsconfig.json & +tsc -p ./tsconfig.cjs.json echo bundle it rollup -c rollup.config.js \ No newline at end of file diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json index a8678b2..716b530 100644 --- a/tsconfig.cjs.json +++ b/tsconfig.cjs.json @@ -11,7 +11,7 @@ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ + "outDir": "./dist/cjs", /* Redirect output structure to the directory. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ diff --git a/tsconfig.json b/tsconfig.json index bf3e910..764d60c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist", /* Redirect output structure to the directory. */ From cb7326f7db5652bf9ff0a2871960ddba74e99f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 9 May 2018 13:33:23 +0200 Subject: [PATCH 05/43] remove axios relative path --- dist/livingsdk.d.ts | 1 - package.json | 3 ++- src/livingsdk.ts | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dist/livingsdk.d.ts b/dist/livingsdk.d.ts index f0e8fcb..98ac88a 100644 --- a/dist/livingsdk.d.ts +++ b/dist/livingsdk.d.ts @@ -1,4 +1,3 @@ -/// export declare type Auth_Token = string; export declare type LivingApi = any; export declare type LAPIRecord = any; diff --git a/package.json b/package.json index 658f17b..1a0da67 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "name": "livingsdk", "version": "0.3.0", "description": "livingapps api for javascript (nodjs and browser) written in typescript", - "main": "dist/livingSDK.js", + "main": "dist/livingsdk.js", + "types": "dist/livingsdk.d.ts", "repository": { "type": "git", "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" diff --git a/src/livingsdk.ts b/src/livingsdk.ts index f5e31c2..fca5e3c 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -1,5 +1,3 @@ -/// - import * as https from 'https'; import { AxiosStatic, AxiosResponse } from 'axios'; From 0b3f3024192c35eba9dac47175382d9b25fc48c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 9 May 2018 14:00:21 +0200 Subject: [PATCH 06/43] added livingsdk.d.ts for cjs export --- dist/cjs/livingsdk.d.ts | 20 ++++++++++++++++++++ package.json | 2 +- tsconfig.cjs.json | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 dist/cjs/livingsdk.d.ts diff --git a/dist/cjs/livingsdk.d.ts b/dist/cjs/livingsdk.d.ts new file mode 100644 index 0000000..98ac88a --- /dev/null +++ b/dist/cjs/livingsdk.d.ts @@ -0,0 +1,20 @@ +export declare type Auth_Token = string; +export declare type LivingApi = any; +export declare type LAPIRecord = any; +export interface LivingAPIOptions { + url: string; + loginRequired: boolean; +} +export default class LivingSDK { + private _password; + private _userName; + private _options; + private hostName; + private session; + constructor(options: any, username: string, password: string); + login(): Promise; + get(appId: string, templateName: string): Promise; + _insert(app: any, values: any): Promise; + _update(record: LAPIRecord, values: any): Promise; + _delete(record: LAPIRecord): Promise; +} diff --git a/package.json b/package.json index 1a0da67..68d1d61 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.3.0", "description": "livingapps api for javascript (nodjs and browser) written in typescript", "main": "dist/livingsdk.js", - "types": "dist/livingsdk.d.ts", + "t ypes": "dist/livingsdk.d.ts", "repository": { "type": "git", "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json index 716b530..33173cb 100644 --- a/tsconfig.cjs.json +++ b/tsconfig.cjs.json @@ -8,7 +8,7 @@ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist/cjs", /* Redirect output structure to the directory. */ From d537e86621e3d0a69b58071d34ea3aca1137ba5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 11 May 2018 11:41:01 +0200 Subject: [PATCH 07/43] new dist structure - output now in umd and es2015 modules - removed rollup - removed existing files --- dist/bundle.js | 163 - dist/{cjs => es2015}/livingsdk.d.ts | 0 dist/{ => es2015}/livingsdk.js | 0 dist/es2015/modules/livingapi.d.ts | 36 + dist/{ => es2015}/modules/livingapi.js | 0 dist/{ => es2015}/modules/ul4.js | 0 dist/{ => umd}/livingsdk.d.ts | 0 dist/{cjs => umd}/livingsdk.js | 0 dist/umd/modules/livingapi.d.ts | 36 + dist/umd/modules/livingapi.js | 1060 +++ dist/umd/modules/ul4.js | 8804 ++++++++++++++++++++++++ package-lock.json | 41 - package.json | 6 +- rollup.config.js | 9 - shellscripts/build.sh | 7 +- src/modules/livingapi.d.ts | 36 + test/node_test.js | 2 +- tsconfig.cjs.json | 53 - tsconfig.json | 2 +- tsconfig.umd.json | 13 + 20 files changed, 9993 insertions(+), 275 deletions(-) delete mode 100644 dist/bundle.js rename dist/{cjs => es2015}/livingsdk.d.ts (100%) rename dist/{ => es2015}/livingsdk.js (100%) create mode 100644 dist/es2015/modules/livingapi.d.ts rename dist/{ => es2015}/modules/livingapi.js (100%) rename dist/{ => es2015}/modules/ul4.js (100%) rename dist/{ => umd}/livingsdk.d.ts (100%) rename dist/{cjs => umd}/livingsdk.js (100%) create mode 100644 dist/umd/modules/livingapi.d.ts create mode 100644 dist/umd/modules/livingapi.js create mode 100644 dist/umd/modules/ul4.js delete mode 100644 rollup.config.js create mode 100644 src/modules/livingapi.d.ts delete mode 100644 tsconfig.cjs.json create mode 100644 tsconfig.umd.json diff --git a/dist/bundle.js b/dist/bundle.js deleted file mode 100644 index 79a197f..0000000 --- a/dist/bundle.js +++ /dev/null @@ -1,163 +0,0 @@ -var LivingSDK = (function () { - 'use strict'; - - let commonjs = (typeof module === 'object' && module.exports); - let nodejs = {}; - let axios = undefined; - let ul4on; - let livingApi; - if (commonjs) { - livingApi = require('./modules/livingapi'); - nodejs.https = require('https'); - axios = require('axios'); - ul4on = require('./modules/ul4').ul4on; - } - else { - axios = window.axios; - ul4on = window.ul4on; - livingApi = window.livingapi; - } - class LivingSDK { - constructor(options = {}, username, password) { - this._password = password; - this._userName = username; - this._options = { - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', - loginRequired: options.loginRequired !== undefined ? options.loginRequired : true - }; - this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; - this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); - if (this._options.loginRequired && !this._userName) { - throw new Error('[LivingSDK] You want to login without a username'); - } - this.session = this.login(); - } - login() { - if (!this._options.loginRequired) { - return Promise.resolve(undefined); - } - let url = `https://${this.hostName}/gateway/login`; - return axios.post(url, { - username: this._userName, - password: this._password - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - "Content-Type": "application/json" - } - }) - .then((a) => a.data.auth_token); - } - get(appId, templateName) { - return this.session.then((auth_token) => { - return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - Accept: 'application/la-ul4on' - } - }) - .then((res) => { - let dump; - dump = ul4on.loads(res.data); - dump.get('globals').Login = this; - return dump; - }); - }); - } - _insert(app, values) { - return this.session.then((auth_token) => { - let fields = {}; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`insert() got an unexpected keyword argument ${ident}`); - } - fields[ident] = app.controls.get(ident).asjson(values[ident]); - } - let data = {}; - data.id = app.id; - data.data = [{ 'fields': fields }]; - return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - } - }) - .then((res) => { - return { - HTTPstatusCode: res.status, - recordid: res.data.id, - Record: livingApi.Record.create({ - id: res.data.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - }); - }); - } - _update(record, values) { - return this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`update() got an unexpected keyword argument ${ident}`); - } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{ 'id': record.id, 'fields': fields }]; - return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - 'Content-Type': 'application/json' - } - }) - .then((res) => { - let body = res.data; - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.status, - recordid: body.id, - Record: record - }; - return returnObj; - }); - }); - } - _delete(record) { - let app = record.app; - return this.session.then((auth_token) => { - return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - } - }); - }); - } - } - - return LivingSDK; - -}()); diff --git a/dist/cjs/livingsdk.d.ts b/dist/es2015/livingsdk.d.ts similarity index 100% rename from dist/cjs/livingsdk.d.ts rename to dist/es2015/livingsdk.d.ts diff --git a/dist/livingsdk.js b/dist/es2015/livingsdk.js similarity index 100% rename from dist/livingsdk.js rename to dist/es2015/livingsdk.js diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts new file mode 100644 index 0000000..7f00b6a --- /dev/null +++ b/dist/es2015/modules/livingapi.d.ts @@ -0,0 +1,36 @@ +import { LOADIPHLPAPI } from "dns"; + +export interface Base { + create: (...args: any[]) => any; + ul4ondump: (encoder: any) => any; + ul4onload: (decoder: any) => any; +} + +export interface Globals extends Base { + /** distance between two geo coordinates */ + geodist: (geo1: any, geo2: any) => any; +} + +export interface FlashMessage extends Base { + +} + +export interface App extends Base { + insert: (values: any) => Record; +} + +export interface View extends Base { + +} + +export interface DataSource extends Base { + +} + +export interface Record extends Base { + +} + +export interface Control extends Base { + asjons:(...gitany: any[]) => any; +} \ No newline at end of file diff --git a/dist/modules/livingapi.js b/dist/es2015/modules/livingapi.js similarity index 100% rename from dist/modules/livingapi.js rename to dist/es2015/modules/livingapi.js diff --git a/dist/modules/ul4.js b/dist/es2015/modules/ul4.js similarity index 100% rename from dist/modules/ul4.js rename to dist/es2015/modules/ul4.js diff --git a/dist/livingsdk.d.ts b/dist/umd/livingsdk.d.ts similarity index 100% rename from dist/livingsdk.d.ts rename to dist/umd/livingsdk.d.ts diff --git a/dist/cjs/livingsdk.js b/dist/umd/livingsdk.js similarity index 100% rename from dist/cjs/livingsdk.js rename to dist/umd/livingsdk.js diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts new file mode 100644 index 0000000..7f00b6a --- /dev/null +++ b/dist/umd/modules/livingapi.d.ts @@ -0,0 +1,36 @@ +import { LOADIPHLPAPI } from "dns"; + +export interface Base { + create: (...args: any[]) => any; + ul4ondump: (encoder: any) => any; + ul4onload: (decoder: any) => any; +} + +export interface Globals extends Base { + /** distance between two geo coordinates */ + geodist: (geo1: any, geo2: any) => any; +} + +export interface FlashMessage extends Base { + +} + +export interface App extends Base { + insert: (values: any) => Record; +} + +export interface View extends Base { + +} + +export interface DataSource extends Base { + +} + +export interface Record extends Base { + +} + +export interface Control extends Base { + asjons:(...gitany: any[]) => any; +} \ No newline at end of file diff --git a/dist/umd/modules/livingapi.js b/dist/umd/modules/livingapi.js new file mode 100644 index 0000000..a5d6faa --- /dev/null +++ b/dist/umd/modules/livingapi.js @@ -0,0 +1,1060 @@ +(function(root){ + + + let amd = (typeof define === 'function' && define.amd); + let commonjs = (typeof module === 'object' && module.exports); + + let la = {}; + + let ul4, ul4on; + + if (commonjs) { + ul4 = require('./ul4.js').ul4; + ul4on = require('./ul4').ul4on; + module.exports = la; + } else { + ul4 = root.ul4; + ul4on = root.ul4on; + root.livingapi = la; + } + la.Base = ul4._inherit( + ul4.Proto, + { + create: function() + { + return ul4._clone(this); + }, + + ul4ondump: function ul4ondump(encoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + return this[name]; + }, + + ul4onload: function ul4onload(decoder) + { + for (var i = 0, iter = decoder.loadcontent();; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); + } + for (; i < this._ul4onattrs.length; ++i) + { + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); + } + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + this[name] = value; + }, + + _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) + { + this[name] = null; + } + } + ); + + la.Globals = ul4._inherit( + la.Base, + { + _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], + + __repr__: function repr() + { + return ""; + }, + + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + geodist: function geodist(geo1, geo2) + { + var sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; + var sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; + var deg2rad = Math.PI/180; // Conversion factor degree -> radians + var radius = 6378.137; // Equatorial radius of earth in km + var flat = 1/298.257223563; // Earth flattening + + var lat1 = geo1.lat * deg2rad; + var long1 = geo1.long * deg2rad; + var lat2 = geo2.lat * deg2rad; + var long2 = geo2.long * deg2rad; + var F = (lat1 + lat2)/2; + var G = (lat1 - lat2)/2; + var l = (long1 - long2)/2; + var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + var w = Math.atan(Math.sqrt(S/C)); + var D = 2 * w * radius; + var T = Math.sqrt(S*C)/w; + var H1 = (3*T-1)/(2*C); + var H2 = (3*T+1)/(2*S); + var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; + } + } + ); + + la.FlashMessage = ul4._inherit( + la.Base, + { + _ul4onattrs: ["timestamp", "type", "title", "message"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.App = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], + + insert: function (values) + { + return this.globals.Login._insert(this, values); + }, + + __repr__: function repr() + { + return ""; + } + } + ); + + la.View = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.DataSource = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "app", "apps"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Record = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + + delete: function () + { + return this.app.globals.Login._delete(this); + }, + + update: function (values) + { + return this.app.globals.Login._update(this, values); + }, + + __repr__: function repr() + { + return ""; + }, + + search: function search(search) + { + for (var identifier in search) + { + var fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) + { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; + } + } + return true; + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + if (name === "values") + return this._sparsevalues; + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + if (name === "values") + { + this._sparsevalues = value; + this._values = null; + this._fields = null; + } + else + this[name] = value; + } + } + ); + + Object.defineProperty(la.Record, "values", { + get: function() + { + if (this._values === null) + { + this._values = ul4on._havemap ? new Map() : {}; + var self = this; + this.app.controls.forEach(function(control, id){ + var fieldvalue = self._sparsevalues.get(control.identifier); + if (typeof(fieldvalue) === "undefined") + fieldvalue = null; + self._values.set(id, fieldvalue); + }); + } + return this._values; + } + }); + + Object.defineProperty(la.Record, "fields", { + get: function() + { + if (this._fields === null) + { + this._fields = ul4on._havemap ? new Map() : {}; + var self = this; + this.values.forEach(function(value, id){ + var field = la.Field.create(self.app.controls.get(id), self.app, value); + self._fields.set(id, field); + }); + } + return this._fields; + } + }); + + la.Control = ul4._inherit( + la.Base, + { + type: null, + subtype: null, + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app" && this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + __repr__: function repr() + { + return ""; + }, + + asjson: function(value) + { + return value; + }, + + _logsearch: function _logsearch(value, search) + { + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); + }, + + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search: function search(value, search) + { + return false; + } + } + ); + + la.BoolControl = ul4._inherit( + la.Control, + { + type: "bool", + __type__: "BoolControl", + + // ``search`` must by ``null``, ``false`` or ``true`` + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } + } + ); + + la.IntControl = ul4._inherit( + la.Control, + { + type: "int", + __type__: "IntControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } + } + ); + + la.NumberControl = ul4._inherit( + la.Control, + { + type: "number", + __type__: "NumberControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") + { + if (value === null) + return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); + } + else + return false; + } + } + ); + + la.StringControl = ul4._inherit( + la.Control, + { + type: "string", + + asjson: function (value) + { + return value; + }, + + search: function search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") + { + if (search.value === null || value === null) + return search.value === value; + else + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; + } + } + } + ); + + la.TextControl = ul4._inherit( + la.StringControl, + { + subtype: "text", + __type__: "TextControl" + } + ); + + la.EmailControl = ul4._inherit( + la.StringControl, + { + subtype: "email", + __type__: "EmailControl" + } + ); + + la.URLControl = ul4._inherit( + la.StringControl, + { + subtype: "url", + __type__: "URLControl" + } + ); + + la.TelControl = ul4._inherit( + la.StringControl, + { + subtype: "tel" + } + ); + + la.PasswordControl = ul4._inherit( + la.StringControl, + { + subtype: "password" + } + ); + + la.TextAreaControl = ul4._inherit( + la.StringControl, + { + subtype: "textarea", + __type__: "TextAreaControl" + } + ); + + la.DateControl = ul4._inherit( + la.Control, + { + type: "date", + subtype: "date", + __type__: "DateControl", + + asjson: function (value) + { + if (value instanceof Date){ + value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; + } + return value; + }, + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; + }, + + // searchvalue must be ``null``, a ``Date`` object or a string + search: function search(value, search) + { + this._logsearch(value, search); + + var searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") + { + if (searchvalue === null || value === null) + return searchvalue === value; + else + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; + } + else + return false; + } + } + ); + + la.DatetimeMinuteControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimeminute", + __type__: "DatetimeMinuteControl", + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; + } + } + ); + + la.DatetimeSecondControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimesecond", + __type__: "DatetimeMinuteSecond", + + formatstring: function formatstring(language) + { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; + } + } + ); + + la.LookupControl = ul4._inherit( + la.Control, + { + type: "lookup", + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app") + { + if (this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + ul4onattrs.push("lookupdata"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + // ``search.value`` must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (this.lookupapp === null) + { + if (search.operator === "equals") + { + if (value === null) + return search.value === null; + else + return value.key === search.value; + } + else + return false; + } + else + { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } + } + ); + + la.LookupSelectControl = ul4._inherit( + la.LookupControl, + { + subtype: "select", + __type__: "LookupSelectControl" + } + ); + + la.LookupRadioControl = ul4._inherit( + la.LookupControl, + { + subtype: "radio", + __type__: "LookupRadioControl" + } + ); + + la.LookupChoiceControl = ul4._inherit( + la.LookupControl, + { + subtype: "choice", + __type__: "LookupChoiceControl" + } + ); + + la.AppLookupControl = ul4._inherit( + la.Control, + { + type: "applookup", + + ul4onload: function ul4onload(decoder) + { + ul4onattrs = this._ul4onattrs.slice(); + for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) + { + var iteritem = iter.next(); + if (iteritem.done) + break; + this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); + if (ul4onattrs[i] === "app") + { + if (this.app.globals.version != "6") + { + ul4onattrs.push("ininsertprocedure"); + ul4onattrs.push("inupdateprocedure"); + } + ul4onattrs.push("lookupapp"); + ul4onattrs.push("lookupcontrols"); + } + } + for (; i < ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(ul4onattrs[i]); + }, + + ul4onattrs: function ul4onattrs() + { + var ul4onattrs = la.Control.ul4onattrs.call(this); + return ul4onattrs; + }, + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } + ); + + la.AppLookupSelectControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "select", + __type__: "AppLookupSelectControl" + } + ); + + la.AppLookupRadioControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "radio", + __type__: "AppLookupRadioControl" + } + ); + + la.AppLookupChoiceControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "choice", + __type__: "AppLookupChoiceControl" + } + ); + + la.MultipleLookupControl = ul4._inherit( + la.LookupControl, + { + type: "multiplelookup", + + // search.value must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (search.operator === "equals") + { + if (this.lookupapp === null) + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].key === search.value) + return true; + } + return false; + } + else + { + if (search.value === null) + return value.length === 0; + else + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].search(search.value)) + return true; + } + return false; + } + } + } + else + return false; + } + } + ); + + la.MultipleLookupSelectControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "select", + __type__: "MultipleLookupSelectControl" + } + ); + + la.MultipleLookupCheckboxControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "checkbox", + __type__: "MultipleLookupCheckboxControl" + } + ); + + la.MultipleAppLookupControl = ul4._inherit( + la.AppLookupControl, + { + type: "multipleapplookup", + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) + { + if (search.operator === "equals") + { + if (search.value === null) + return value.length === 0; + else + { + for (var i = 0; i < value.length; ++i) + { + if (value[i].search(search.value)) + return true; + } + return false; + } + } + else + return false; + } + } + ); + + la.MultipleAppLookupSelectControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "select", + __type__: "MultipleAppLookupSelectControl" + } + ); + + la.MultipleAppLookupCheckboxControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "checkbox", + __type__: "MultipleAppLookupCheckboxControl" + } + ); + + la.GeoControl = ul4._inherit( + la.Control, + { + type: "geo", + + + asjson: function(value) + { + if (la.Geo.isprotoof(value)) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + }, + + __type__: "GeoControl" + } + ); + + la.FileControl = ul4._inherit( + la.Control, + { + type: "file", + __type__: "FileControl" + } + ); + + la.ButtonControl = ul4._inherit( + la.Control, + { + type: "button", + __type__: "ButtonControl" + } + ); + + la.Field = ul4._inherit( + la.Base, + { + create: function create(control, record, value) + { + var field = la.Base.create.call(this); + field.control = control; + field.record = record; + field.value = value; + return field; + }, + + search: function search(searchvalue) + { + return this.control.search(this.value, searchvalue); + }, + + __repr__: function repr() + { + return ""; + } + } + ); + + la.LookupItem = ul4._inherit( + la.Base, + { + _ul4onattrs: ["key", "label"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.User = ul4._inherit( + la.Base, + { + _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.File = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Geo = ul4._inherit( + la.Base, + { + _ul4onattrs: ["lat", "long", "info"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Attachment = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "record", "label", "active"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.NoteAttachment = ul4._inherit( + la.Attachment, + { + type: "noteattachment", + __type__: "NoteAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.URLAttachment = ul4._inherit( + la.Attachment, + { + type: "urlattachment", + __type__: "URLAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.FileAttachment = ul4._inherit( + la.Attachment, + { + type: "fileattachment", + __type__: "FileAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } + ); + + la.ImageAttachment = ul4._inherit( + la.Attachment, + { + type: "imageattachment", + __type__: "ImageAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + } + ); + + la.JSONAttachment = ul4._inherit( + la.Attachment, + { + type: "jsonattachment", + __type__: "JSONAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) + { + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) + { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value + } + } + ); + + la.Installation = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.Category = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + + __repr__: function repr() + { + var v = []; + var category = this; + while (category !== null) + { + v.splice(0, 0, category.identifier); + category = category.parent; + } + return ""; + } + } + ); + + la.KeyView = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "key", "user"], + + __repr__: function repr() + { + return ""; + } + } + ); + + la.AppParameter = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "identifier", "description", "value"], + + __repr__: function repr() + { + return ""; + } + } + ); + + var classes = [ + "Globals", + "App", + "View", + "DataSource", + "Record", + "BoolControl", + "IntControl", + "NumberControl", + "TextControl", + "EmailControl", + "URLControl", + "TelControl", + "PasswordControl", + "TextAreaControl", + "DateControl", + "DatetimeMinuteControl", + "DatetimeSecondControl", + "LookupControl", + "LookupSelectControl", + "LookupRadioControl", + "LookupChoiceControl", + "AppLookupControl", + "AppLookupSelectControl", + "AppLookupRadioControl", + "AppLookupChoiceControl", + "MultipleLookupControl", + "MultipleLookupSelectControl", + "MultipleLookupCheckboxControl", + "MultipleAppLookupControl", + "MultipleAppLookupSelectControl", + "MultipleAppLookupCheckboxControl", + "GeoControl", + "FileControl", + "ButtonControl", + "Field", + "LookupItem", + "User", + "File", + "Geo", + "NoteAttachment", + "URLAttachment", + "FileAttachment", + "ImageAttachment", + "JSONAttachment", + "Installation", + "Category", + "KeyView", + "AppParameter" + ]; + + for (var i = 0; i < classes.length; ++i) + { + var name = classes[i]; + var object = la[name]; + ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); + } + + })(this); \ No newline at end of file diff --git a/dist/umd/modules/ul4.js b/dist/umd/modules/ul4.js new file mode 100644 index 0000000..cad6ec8 --- /dev/null +++ b/dist/umd/modules/ul4.js @@ -0,0 +1,8804 @@ +/*! + * UL4/UL4ON JavaScript Library + * http://www.livinglogic.de/Python/ul4c/ + * http://www.livinglogic.de/Python/ul4on/ + * + * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany + * Copyright 2011-2017 by Walter Dörwald + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/*jslint vars: true */ + +(function(undefined){ + + let amd = (typeof define === 'function' && define.amd); + let commonjs = (typeof module === 'object' && module.exports); + + var root = this, ul4 = {}, ul4on = {}; + + root.ul4 = ul4; + + root.ul4on = ul4on; + + + if (commonjs) { + module.exports.ul4 = ul4; + module.exports.ul4on = ul4on; + } else { + ul4 = root.ul4; + ul4on = root.ul4on; + } + + ul4.version = "41"; + + // + // UL4ON + // + + ul4on._registry = {}; + + ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); + + ul4on._havemapconstructor = false; + + if (ul4on._havemap) + { + try + { + if (new Map([[1, 2]]).size == 1) + ul4on._havemapconstructor = true; + } + catch (error) + { + } + } + + ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); + + ul4on._havesetconstructor = false; + + if (ul4on._haveset) + { + try + { + if (new Set([1, 2]).size == 2) + ul4on._havesetconstructor = true; + } + catch (error) + { + } + } + + // Function used for making maps, when the Map constructor doesn't work + ul4on._makemap = function _makemap() + { + var map = new Map(); + + for (var i = 0; i < arguments.length; ++i) + { + var argument = arguments[i]; + map.set(argument[0], argument[1]); + } + return map; + }; + + // Function that creates en empty Map (if supported) or an empty object + ul4on._emptymap = function _emptymap() + { + return ul4on._havemap ? new Map() : {}; + }; + + // Function that adds a (key, value) item to an object (or map) + if (ul4on._havemap) + { + ul4on._setmap = function _setmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; + } + else + { + ul4on._setmap = function _setmap(map, key, value) + { + map[key] = value; + }; + } + + // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) + if (ul4on._haveset) + { + ul4on._makeset = function _makeset() + { + var set = this._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; + } + else + { + ul4on._makeset = function _makeset() + { + var set = ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; + } + + // Register the object ``obj`` under the name ``name`` with the UL4ON machinery + ul4on.register = function register(name, obj) + { + obj.ul4onname = name; + ul4on._registry[name] = function(){return obj.create();}; + }, + + // Return a string that contains the object ``obj`` in the UL4ON serialization format + ul4on.dumps = function dumps(obj, indent) + { + var encoder = ul4on.Encoder.create(indent); + encoder.dump(obj); + return encoder.finish(); + }, + + // Load an object from the string ``data``. + // ``data`` must contain the object in the UL4ON serialization format + // ``registry`` may be null or a dictionary mapping type names to objects with a create method + ul4on.loads = function loads(data, registry) + { + var decoder = ul4on.Decoder.create(data, registry); + return decoder.load(); + }, + + // Helper "class" for encoding + ul4on.Encoder = { + // Create a new Encoder object + create: function create(indent) + { + var encoder = ul4._clone(this); + encoder.indent = indent || null; + encoder.data = []; + encoder._level = 0; + encoder._strings2index = {}; + encoder._ids2index = {}; + encoder._backrefs = 0; + return encoder; + }, + + _line: function _line(line) + { + var i, oldindent; + + if (this.indent !== null) + { + for (i = 0; i < this._level; ++i) + this.data.push(this.indent); + } + else + { + if (this.data.length) + this.data.push(" "); + } + this.data.push(line); + + if (arguments.length > 1) + { + oldindent = this.indent; + this.indent = null; + for (i = 1; i < arguments.length; ++i) + this.dump(arguments[i]); + this.indent = oldindent; + } + + if (this.indent !== null) + this.data.push("\n"); + }, + + // Return the complete string written to the buffer + finish: function finish() + { + return this.data.join(""); + }, + + dump: function dump(obj) + { + if (obj === null) + this._line("n"); + else if (typeof(obj) == "boolean") + this._line(obj ? "bT" : "bF"); + else if (typeof(obj) == "number") + { + var type = (Math.round(obj) == obj) ? "i" : "f"; + this._line(type + obj); + } + else if (typeof(obj) == "string") + { + var index = this._strings2index[obj]; + if (typeof(index) !== "undefined") + { + this._line("^" + index); + } + else + { + this._strings2index[obj] = this._backrefs++; + this._line("S" + ul4._str_repr(obj)); + } + } + else if (ul4._iscolor(obj)) + this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); + else if (ul4._isdate(obj)) + this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + else if (ul4._istimedelta(obj)) + this._line("t", obj.days(), obj.seconds(), obj.microseconds()); + else if (ul4._ismonthdelta(obj)) + this._line("m", obj.months()); + else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) + this._line("r", obj.start, obj.stop); + else if (obj.ul4onname && obj.ul4ondump) + { + if (obj.__id__) + { + var index = this._ids2index[obj.__id__]; + if (typeof(index) != "undefined") + { + this._line("^" + index); + return; + } + } + if (obj.__id__) + this._ids2index[obj.__id__] = this._backrefs++; + this._line("O", obj.ul4onname); + ++this._level; + obj.ul4ondump(this); + --this._level; + this._line(")"); + } + else if (ul4._islist(obj)) + { + this._line("l"); + ++this._level; + for (var i in obj) + this.dump(obj[i]); + --this._level; + this._line("]"); + } + else if (ul4._ismap(obj)) + { + this._line("e"); + ++this._level; + obj.forEach(function(value, key) { + this.dump(key); + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else if (ul4._isdict(obj)) + { + this._line("d"); + ++this._level; + for (var key in obj) + { + this.dump(key); + this.dump(obj[key]); + } + --this._level; + this._line("}"); + } + else if (ul4._isset(obj)) + { + this._line("y"); + ++this._level; + obj.forEach(function(value) { + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else + throw "can't handle object"; + } + }; + + // Helper "class" for decoding + ul4on.Decoder = { + // Creates a new decoder for reading from the string ``data`` + create: function create(data, registry) + { + var decoder = ul4._clone(this); + decoder.data = data; + decoder.pos = 0; + decoder.backrefs = []; + decoder.registry = typeof(registry) === "undefined" ? null : registry; + return decoder; + }, + + // Read a character from the buffer + readchar: function readchar() + { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + return this.data.charAt(this.pos++); + }, + + // Read a character from the buffer (return null on eof) + readcharoreof: function readcharoreof() + { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + }, + + // Read next not-whitespace character from the buffer + readblackchar: function readblackchar() + { + var re_white = /\s/; + + for (;;) + { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + var c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } + }, + + // Read ``size`` characters from the buffer + read: function read(size) + { + if (this.pos+size > this.length) + size = this.length-this.pos; + var result = this.data.substring(this.pos, this.pos+size); + this.pos += size; + return result; + }, + + // "unread" one character + backup: function backup() + { + --this.pos; + }, + + // Read a number from the buffer + readnumber: function readnumber() + { + var re_digits = /[-+0123456789.eE]/, value = ""; + for (;;) + { + var c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else + { + var result = parseFloat(value); + if (result == NaN) + throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; + return result; + } + } + }, + + _beginfakeloading: function _beginfakeloading() + { + var oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + }, + + _endfakeloading: function _endfakeloading(oldpos, value) + { + this.backrefs[oldpos] = value; + }, + + _readescape: function _readescape(escapechar, length) + { + var chars = this.read(length); + if (chars.length != length) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + var codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + return String.fromCharCode(codepoint); + }, + + // Load the next object from the buffer + load: function load() + { + var typecode = this.readblackchar(); + var result; + switch (typecode) + { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + var delimiter = this.readblackchar(); + for (;;) + { + var c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") + { + var c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } + else + result.push(c); + } + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = ul4.Color.create(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load()/1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = ul4.TimeDelta.create(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = ul4.slice.create(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = ul4.MonthDelta.create(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "]") + return result; + this.backup(); + result.push(this.load()); + } + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4on._havemap && (typecode == "e" || typecode == "E")) + throw "ordered dictionaries are not supported!"; + result = ul4on._emptymap(); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + var key = this.load(); + var value = this.load(); + ul4on._setmap(result, key, value); + } + return result; + case "y": + case "Y": + result = ul4on._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + result.add(this.load()); + } + return result; + case "o": + case "O": + var oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + var name = this.load(); + var proto; + if (this.registry !== null) + { + proto = this.registry[name]; + if (typeof(proto) === "undefined") + proto = ul4on._registry[name]; + } + else + proto = ul4on._registry[name]; + if (typeof(proto) === "undefined") + throw "can't load object of type " + ul4._repr(name); + result = proto(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); + typecode = this.readblackchar(); + if (typecode !== ")") + throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; + return result; + default: + throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + } + }, + + // Return an iterator for loading the content of a object + loadcontent: function load(loadcontent) + { + let self = this; + return { + next: function() + { + let typecode = self.readblackchar(); + self.backup(); + if (typecode == ")") + return {done: true}; + else + return {done: false, value: self.load()}; + } + }; + } + }; + + + // + // UL4 + // + + // REs for parsing JSON + ul4._rvalidchars = /^[\],:{}\s]*$/; + ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; + + /// Helper functions + + // Crockford style object creation + ul4._simpleclone = function _simpleclone(obj) + { + function F(){}; + F.prototype = obj; + var result = new F(); + return result; + }; + + // Crockford style object creation + prototype chain + object ids + ul4._clone = function _clone(obj) + { + var result = ul4._simpleclone(obj); + result.__prototype__ = obj; + result.__id__ = ul4.Proto._nextid++; + return result; + }; + + // Adds attributes from on object to another and returns it + ul4._extend = function _extend(obj, attrs) + { + for (var name in attrs) + obj[name] = attrs[name]; + return obj; + }; + + // Clone an object via ``_simpleclone`` and extend it + ul4._simpleinherit = function _simpleinherit(baseobj, attrs) + { + return ul4._extend(ul4._simpleclone(baseobj), attrs); + }; + + // Clone an object via ``_clone`` and extend it + ul4._inherit = function _inherit(baseobj, attrs) + { + return ul4._extend(ul4._clone(baseobj), attrs); + }; + + // Convert a map to an object + ul4._map2object = function _map2object(obj) + { + if (ul4._ismap(obj)) + { + var newobj = {}; + obj.forEach(function(value, key){ + if (typeof(key) !== "string") + throw ul4.TypeError.create("keys must be strings"); + newobj[key] = value; + }); + return newobj; + } + return obj; + }; + + // Clip a number to the range [0;max) + ul4._bound = function _bound(value, upper) + { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; + }; + + // Create a pretty stacktrace from an exception + ul4._stacktrace = function _stacktrace(exc) + { + var output = ul4._type(exc); + var s = exc.toString(); + if (s) + output += ": " + s; + if (exc.cause) + output += "\n\n" + ul4._stacktrace(exc.cause); + return output; + }; + + // Call a function ``f`` with UL4 argument handling + ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) + { + var finalargs; + if (needsobject) + { + if (signature === null) + { + if (args.length) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; + } + else + finalargs = [signature.bindObject(name, args, kwargs)]; + } + else + { + if (signature === null) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); + }; + + ul4._callfunction = function _callfunction(context, f, args, kwargs) + { + var name = f._ul4_name || f.name; + if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") + throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); + } + + ul4._callobject = function _callobject(context, obj, args, kwargs) + { + if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") + throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); + } + + ul4._callrender = function _callrender(context, obj, args, kwargs) + { + if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") + throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); + } + + ul4._call = function _call(context, f, args, kwargs) + { + if (typeof(f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof(f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); + else + throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); + } + + ul4._unpackvar = function _unpackvar(lvalue, value) + { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else + { + var newvalue = []; + var iter = ul4._iter(value); + + for (var i = 0;;++i) + { + var item = iter.next(); + + if (item.done) + { + if (i === lvalue.length) + break; + else + throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); + } + else + { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); + } + } + return newvalue; + } + }; + + ul4._formatsource = function _formatsource(out) + { + var finalout = []; + var level = 0, needlf = false; + for (var i = 0; i < out.length; ++i) + { + if (typeof(out[i]) === "number") + { + level += out[i]; + needlf = true; + } + else + { + if (needlf) + { + finalout.push("\n"); + for (var j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; + } + finalout.push(out[i]); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); + }; + + // Compare ``obj1`` and ``obj2`` if they have the same value + ul4._eq = function _eq(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof(obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 == obj2 + else + return false; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 == obj2; + else + return false; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; + } + else + return false; + } + else if (ul4._isobject(obj1)) + { + if (ul4._isobject(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) + { + if (obj2.hasOwnProperty(key)) + { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) + { + if (!obj1.hasOwnProperty(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) + { + if (obj2.has(key)) + { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + var result = true; + obj2.forEach(function(value, key){ + if (!obj1.hasOwnProperty(key)) + result = false; + }); + return result; + } + else + return false; + } + else if (ul4._ismap(obj1)) + { + if (ul4._isobject(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function(value, key){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.hasOwnProperty(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + result = false; + } + }); + if (!result) + return false; + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) + { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function(value, key){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2.get(key))) + result = false; + } + }); + return result; + } + else + return false; + } + else if (ul4._isset(obj1)) + { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + var result = true; + obj1.forEach(function(value){ + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(value)) + result = false; + } + }); + return result; + } + else + return false; + } + else + return obj1 === obj2; + }; + + // Compare ``obj1`` and ``obj2`` if they don't have the same value + ul4._ne = function _ne(obj1, obj2) + { + if (obj1 && typeof(obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof(obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); + } + + ul4._unorderable = function _unorderable(operator, obj1, obj2) + { + throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); + }; + + // Return: + // -1 when ``obj1 < obj2``, + // 0 when ``obj1 == obj2``, + // 1 when ``obj1 > obj2``, + // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) + // raise TypeError if objects are uncomparable + // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= + // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + + ul4._cmp = function _cmp(operator, obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + { + var v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); + } + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return 0; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return 1; + var res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; + } + return obj2.length > obj1.length ? -1 : 0; + } + } + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + else + ul4._unorderable(operator, obj1, obj2); + } + + // Return whether ``obj1 < obj2`` + ul4._lt = function _lt(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 < obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1)) + { + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<", obj1, obj2); + }; + + // Return whether ``obj1 <= obj2`` + ul4._le = function _le(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length <= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<=", obj1, obj2); + }; + + // Return whether ``obj1 > obj2`` + ul4._gt = function _gt(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 > obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length > obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">", obj1, obj2); + }; + + // Return whether ``obj1 >= obj2`` + ul4._ge = function _ge(obj1, obj2) + { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdate(obj1)) + { + if (ul4._isdate(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length >= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value){ + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value){ + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } + } + obj2.forEach(function(value){ + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + for (var value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (var value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">=", obj1, obj2); + }; + + // Return an iterator for ``obj`` + ul4._iter = function _iter(obj) + { + if (typeof(obj) === "string" || ul4._islist(obj)) + { + return { + index: 0, + next: function() + { + if (this.index < obj.length) + return {value: obj[this.index++], done: false}; + else + return {done: true}; + } + }; + } + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof(obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) + { + var keys = []; + obj.forEach(function(value, key){ + keys.push(key); + }); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + else if (ul4._isset(obj)) + { + var values = []; + obj.forEach(function(value, key){ + values.push(value); + }); + return { + index: 0, + next: function() + { + if (this.index >= values.length) + return {done: true}; + return {value: values[this.index++], done: false}; + } + }; + } + else if (ul4._isul4set(obj)) + { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) + { + var keys = []; + for (var key in obj) + keys.push(key); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); + }; + + ul4._str_repr = function _str_repr(str, ascii) + { + var result = ""; + var squote = false, dquote = false; + + for (var i = 0; i "; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (typeof(obj) === "undefined") + return ""; + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; + }; + + // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` + ul4._repr = function _repr(obj) + { + return ul4._repr_internal(obj, false); + } + + ul4._ascii = function _ascii(obj) + { + return ul4._repr_internal(obj, true); + } + + ul4._date_str = function _date_str(obj) + { + var year = obj.getFullYear(); + var month = obj.getMonth()+1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + + var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; + }; + + ul4._str = function _str(obj) + { + if (typeof(obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return obj; + else if (typeof(obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") + return obj.__str__(); + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; + }; + + // Convert ``obj`` to bool, according to its "truth value" + ul4._bool = function _bool(obj) + { + if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else + { + if (typeof(obj) === "object", typeof(obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) + { + for (var key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } + }; + + // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) + ul4._int = function _int(obj, base) + { + var result; + if (base !== null) + { + if (typeof(obj) !== "string" || !ul4._isint(base)) + throw ul4.TypeError.create("int()", "int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else + { + if (typeof(obj) == "string") + { + result = parseInt(obj); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else if (typeof(obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); + } + }; + + // Convert ``obj`` to a float + ul4._float = function _float(obj) + { + if (typeof(obj) === "string") + return parseFloat(obj); + else if (typeof(obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); + }; + + // Convert ``obj`` to a list + ul4._list = function _list(obj) + { + var iter = ul4._iter(obj); + + var result = []; + for (;;) + { + var value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } + }; + + // Convert ``obj`` to a set + ul4._set = function _set(obj) + { + var iter = ul4._iter(obj); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (;;) + { + var value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } + }; + + // Return the length of ``sequence`` + ul4._len = function _len(sequence) + { + if (typeof(sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) + { + var i = 0; + for (var key in sequence) + ++i; + return i; + } + throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); + }; + + ul4._type = function _type(obj) + { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (typeof(obj) === "string") + return "str"; + else if (typeof(obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (ul4._islist(obj)) + return "list"; + else if (ul4._isset(obj)) + return "set"; + else if (ul4._isdate(obj)) + return "date"; + else if (typeof(obj.__type__) !== "undefined") + return obj.__type__; + else if (ul4._istimedelta(obj)) + return "timedelta"; + else if (ul4._isdict(obj)) + return "dict"; + else if (ul4._istemplate(obj)) + return "template"; + else if (ul4._isfunction(obj)) + return "function"; + return null; + }; + + + // Return whether any of the items in ``iterable`` are true + ul4._any = function _any(iterable) + { + if (typeof(iterable) == "string") + { + for (var i = 0; i < iterable.length; ++i) + { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else + { + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } + }; + + // Return whether all of the items in ``iterable`` are true + ul4._all = function _all(iterable) + { + if (typeof(iterable) == "string") + { + for (var i = 0; i < iterable.length; ++i) + { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else + { + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } + }; + + // Check if ``obj`` is undefined + ul4._isundefined = function _isundefined(obj) + { + return typeof(obj) === "undefined"; + }; + + + // Check if ``obj`` is *not* undefined + ul4._isdefined = function _isdefined(obj) + { + return typeof(obj) !== "undefined"; + }; + + // Check if ``obj`` is ``None`` + ul4._isnone = function _isnone(obj) + { + return obj === null; + }; + + // Check if ``obj`` is a boolean + ul4._isbool = function _isbool(obj) + { + return typeof(obj) == "boolean"; + }; + + // Check if ``obj`` is a int + ul4._isint = function _isint(obj) + { + return (typeof(obj) == "number") && Math.round(obj) == obj; + }; + + // Check if ``obj`` is a float + ul4._isfloat = function _isfloat(obj) + { + return (typeof(obj) == "number") && Math.round(obj) != obj; + }; + + // Check if ``obj`` is a string + ul4._isstr = function _isstr(obj) + { + return typeof(obj) == "string"; + }; + + // Check if ``obj`` is a date + ul4._isdate = function _isdate(obj) + { + return Object.prototype.toString.call(obj) == "[object Date]"; + }; + + // Check if ``obj`` is a color + ul4._iscolor = function _iscolor(obj) + { + return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); + }; + + // Check if ``obj`` is a timedelta object + ul4._istimedelta = function _istimedelta(obj) + { + return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); + }; + + // Check if ``obj`` is a monthdelta object + ul4._ismonthdelta = function _ismonthdelta(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); + }; + + // Check if ``obj`` is a template + ul4._istemplate = function _istemplate(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); + }; + + // Check if ``obj`` is a function + ul4._isfunction = function _isfunction(obj) + { + return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); + }; + + // Check if ``obj`` is a list + ul4._islist = function _islist(obj) + { + return Object.prototype.toString.call(obj) == "[object Array]"; + }; + + // Check if ``obj`` is a set + ul4._isset = function _isset(obj) + { + return Object.prototype.toString.call(obj) == "[object Set]"; + }; + + // Check if ``obj`` is an exception (at least a UL4 exception) + ul4._isexception = function _isexception(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); + }; + + ul4._isul4set = function _isul4set(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); + }; + + // Check if ``obj`` is an iterator + ul4._isiter = function _isiter(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; + }; + + // Check if ``obj`` is a JS object + ul4._isobject = function _isobject(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; + }; + + // Check if ``obj`` is a map + ul4._ismap = function _ismap(obj) + { + if (ul4on._havemap) + return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + return false; + }; + + // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj) || ul4._ismap(obj); + }; + + + // Repeat string ``str`` ``rep`` times + ul4._str_repeat = function _str_repeat(str, rep) + { + var result = ""; + for (; rep>0; --rep) + result += str; + return result; + }; + + ul4._list_repeat = function _list_repeat(list, rep) + { + var result = []; + for (; rep>0; --rep) + for (var i = 0; i < list.length; ++i) + result.push(list[i]); + return result; + }; + + ul4._str_json = function _str_json(str) + { + var result = ""; + for (var i = 0; i < str.length; ++i) + { + var c = str[i]; + switch (c) + { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + default: + var code = str.charCodeAt(i); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; + }; + + // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) + ul4._asjson = function _asjson(obj) + { + if (obj === null) + return "null"; + else if (typeof(obj) === "undefined") + return "{}.undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof(obj) === "string") + return ul4._str_json(obj); + else if (typeof(obj) === "number") + { + return "" + obj; + } + else if (ul4._islist(obj)) + { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) + { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) + { + var v = []; + v.push("{"); + var i = 0; + obj.forEach(function(value, key){ + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) + { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) + { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) + { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) + { + return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) + { + return "ul4.MonthDelta.create(" + obj.months + ")"; + } + else if (ul4._iscolor(obj)) + { + return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) + { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); + }; + + // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object + ul4._fromjson = function _fromjson(string) + { + // The following is from jQuery's parseJSON function + string = ul4._strip(string, null); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw ul4.TypeError.create("fromjson()", "invalid JSON"); + }; + + // Encodes ``obj`` in the UL4 Object Notation format + ul4._asul4on = function _asul4on(obj) + { + return ul4on.dumps(obj); + }; + + // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object + ul4._fromul4on = function _fromul4on(string) + { + return ul4on.loads(string); + }; + + ul4._format_date = function _format_date(obj, fmt, lang) + { + var translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p " + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + var translation = translations[lang]; + + var firstday; + + var result = []; + var inspec = false; + for (var i = 0; i < fmt.length; ++i) + { + var c = fmt[i]; + if (inspec) + { + switch (c) + { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4._yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth()+1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else + { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); + }; + + ul4._format_int = function _format_int(obj, fmt, lang) + { + var work = fmt; + + // Defaults + var fill = ' '; + var align = '>'; // '<', '>', '=' or '^' + var sign = '-'; // '+', '-' or ' ' + var alternate = false; + var minimumwidth = 0; + var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) + { + type = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract minimum width + if (/\d+$/.test(work)) + { + var minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) + { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) + { + alternate = true; + work = work.substring(0, work.length-1); + } + + // Determine sign + if (/[+ -]$/.test(work)) + { + if (type == 'c') + throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract fill and align char + if (work.length >= 3) + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) + { + if (/[<>=^]$/.test(work)) + { + align = work[1]; + fill = work[0]; + } + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) + { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + var neg = obj < 0; + + if (neg) + obj = -obj; + + var output; + switch (type) + { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw ul4.ValueError.create("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') + { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else + { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) + { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth-output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + else // if (align == '^') + { + var pad = minimumwidth - output.length; + var padBefore = Math.floor(pad/2); + var padAfter = pad-padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; + }; + + // Format ``obj`` using the format string ``fmt`` in the language ``lang`` + ul4._format = function _format(obj, fmt, lang) + { + if (typeof(lang) === "undefined" || lang === null) + lang = "en"; + else + { + var translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; + lang = lang.toLowerCase(); + if (typeof(translations[lang]) === "undefined") + { + lang = lang.split(/_/)[0]; + if (typeof(translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_date(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); + }; + + ul4._lpad = function _lpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; + }; + + ul4._rpad = function _rpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; + }; + + ul4.Proto = { + __prototype__: null, + __id__: 0, + _nextid: 1, + isa: function isa(type) + { + if (this === type) + return true; + if (this.__prototype__ === null) + return false; + return this.__prototype__.isa(type); + }, + + isprotoof: function isprotoof(obj) + { + while (true) + { + if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") + return false; + if (obj === this) + return true; + obj = obj.__prototype__; + } + }, + + // equality comparison of objects defaults to identity comparison + __eq__: function __eq__(other) + { + return this === other; + }, + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__: function __ne__(other) + { + return !this.__eq__(other); + }, + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__: function __bool__() + { + return true; + } + }; + + ul4.Signature = ul4._inherit( + ul4.Proto, + { + create: function create() + { + var signature = ul4._clone(this); + signature.args = []; + signature.argNames = {}; + signature.remargs = null; + signature.remkwargs = null; + + var nextDefault = false; + var lastArgname = null; + for (var i = 0; i < arguments.length; ++i) + { + var argName = arguments[i]; + if (nextDefault) + { + signature.args.push({name: lastArgname, defaultValue: argName}); + signature.argNames[lastArgname] = true; + nextDefault = false; + } + else + { + if (argName.substr(argName.length-1) === "=") + { + lastArgname = argName.substr(0, argName.length-1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + signature.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + signature.remargs = argName.substr(1); + else + { + signature.args.push({name: argName}); + signature.argNames[argName] = true; + } + } + } + return signature; + }, + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray: function bindArray(name, args, kwargs) + { + var finalargs = []; + var decname = name !== null ? name + "() " : ""; + + for (var i = 0; i < this.args.length; ++i) + { + var arg = this.args[i]; + if (i < args.length) + { + if (kwargs.hasOwnProperty(arg.name)) + throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else + { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else + { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) + { + // No, but we have them -> complain + if (args.length > this.args.length) + { + var prefix = name === null ? "expected" : name + "() expects"; + throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else + { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) + { + // No => complain about unknown ones + for (var key in kwargs) + { + if (!this.argNames[key]) + { + if (name === null) + throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else + { + // Yes => Put the unknown ones into an object and add that to the arguments array + var remkwargs = {}; + for (var key in kwargs) + { + if (!this.argNames[key]) + remkwargs[key] = kwargs[key]; + } + finalargs.push(remkwargs); + } + + return finalargs; + }, + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject: function bindObject(name, args, kwargs) + { + args = this.bindArray(name, args, kwargs); + var argObject = {}; + var i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + }, + + __repr__: function __repr__() + { + return ""; + }, + + __str__: function __str__() + { + return this.toString(); + }, + + toString: function toString() + { + var v = []; + for (var i = 0; i < this.args.length; ++i) + { + var arg = this.args[i]; + + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + } + ); + + // Adds name and signature to a function/method and makes the method callable in templates + ul4.expose = function expose(signature, options, f) + { + if (typeof(f) === "undefined") + { + f = options; + options = {}; + } + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + + return f; + }; + + ul4.Context = ul4._inherit( + ul4.Proto, + { + create: function create(vars) + { + if (vars === null || typeof(vars) === "undefined") + vars = {}; + var context = ul4._clone(this); + context.vars = vars; + context.indents = []; + context._output = []; + return context; + }, + + /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. + * This is used by the various comprehensions to avoid leaking loop variables. + */ + inheritvars: function inheritvars() + { + var context = ul4._clone(this); + context.vars = ul4._simpleclone(this.vars); + return context; + }, + + /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ + withindent: function withindent(indent) + { + var context = ul4._clone(this); + if (indent !== null) + { + context.indents = this.indents.slice(); + context.indents.push(indent); + } + return context; + }, + + /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ + replaceoutput: function replaceoutput() + { + var context = ul4._clone(this); + context._output = []; + return context; + }, + + clone: function clone(vars) + { + return ul4._clone(this); + }, + + output: function output(value) + { + this._output.push(value); + }, + + getoutput: function getoutput() + { + return this._output.join(""); + }, + + get: function get(name) + { + return this.vars[name]; + }, + + set: function set(name, value) + { + this.vars[name] = value; + } + } + ); + + /// Exceptions + + ul4.Exception = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Exception", + "cause": null, + + __getattr__: function __getattr__(attrname) + { + switch (attrname) + { + case "cause": + return this.cause; + default: + return undefined; + } + } + } + ); + + // Exceptions used internally by UL4 for flow control + ul4.InternalException = ul4._inherit(ul4.Exception, {}); + + // Control flow exceptions + ul4.ReturnException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ReturnException", + + create: function create(result) + { + var exception = ul4._clone(this); + exception.result = result; + return exception; + } + } + ); + + ul4.BreakException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.BreakException" + } + ); + + ul4.ContinueException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ContinueException" + } + ); + + // Real exceptions raised by various parts of UL4 + ul4.SyntaxError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.SyntaxError" + } + ); + + ul4.LValueRequiredError = ul4._inherit( + ul4.SyntaxError, + { + __type__: "ul4.LValueRequiredError", + + toString: function toString() + { + return "lvalue required!"; + } + } + ); + + ul4.TypeError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.TypeError", + + create: function create(operation, message) + { + var exception = ul4._clone(this); + exception.operation = operation; + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + ul4.ValueError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ValueError", + + create: function create(message) + { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + ul4.ArgumentError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ArgumentError", + + create: function create(message) + { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() + { + return this.message; + } + } + ); + + /// Exception that wraps other exceptions while they bubble up the stack + ul4.LocationError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.LocationError", + + create: function create(location, cause) + { + var exception = ul4._clone(this); + exception.location = location; + exception.cause = cause; + return exception; + }, + + _templateprefix: function(template) + { + var out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + var first = true; + while (template != null) + { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + }, + + _template: function _template() + { + if (ul4.Tag.isprotoof(this.location)) + return this.location.template; + else + return this.location.tag.template; + }, + + _outerpos: function _outerpos() + { + if (ul4.Tag.isprotoof(this.location)) + return this.location.pos; + else + { + var tag = this.location.tag; + if (tag === null) // A top level template as no tag + return this.location.pos; + else + return tag.pos; + } + }, + + _innerpos: function _innerpos() + { + return this.location.pos; + }, + + toString: function toString() + { + var template = this._template(); + var templateprefix = this._templateprefix(template); + var outerpos = this._outerpos(); + var innerpos = this._innerpos(); + + var prefix = template.source.substring(outerpos.start, innerpos.start); + var code = template.source.substring(innerpos.start, innerpos.stop); + var suffix = template.source.substring(innerpos.stop, outerpos.stop); + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + var text = prefix + code + suffix; + var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + // find line numbers + var lineno = 1, colno = 1; + for (var i = 0; i < innerpos.start; ++i) + { + if (template.source[i] === "\n") + { + ++lineno; + colno = 1; + } + else + ++colno; + } + + pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; + + return templateprefix + ": " + pos + "\n" + text + "\n" + underline; + }, + + __getattr__: function __getattr__(attrname) + { + switch (attrname) + { + case "cause": + return this.cause; + case "location": + return this.location; + case "template": + return this._template; + case "outerpos": + return this._outerpos; + case "innerpos": + return this._innerpos; + default: + return undefined; + } + } + } + ); + + + /// Classes for the syntax tree + ul4.AST = ul4._inherit( + ul4.Proto, + { + create: function create(pos) + { + var ast = ul4._clone(this); + ast.pos = pos; + return ast; + }, + __str__: function __str__() + { + var out = []; + this._str(out); + return ul4._formatsource(out); + }, + __repr__: function __repr__() + { + var out = []; + this._repr(out); + return ul4._formatsource(out); + }, + _handle_eval: function _handle_eval(context) + { + try + { + return this._eval(context); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, value) + { + try + { + return this._eval_set(context, value); + } + catch (exc) + { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_set: function _eval_set(context, value) + { + throw ul4.LValueRequiredError; + }, + _handle_eval_modify: function _handle_eval_modify(context, operator, value) + { + try + { + return this._eval_modify(context, operator, value); + } + catch (exc) + { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_modify: function _eval_modify(context, operator, value) + { + throw ul4.LValueRequiredError; + }, + _repr: function _repr(out) + { + }, + _str: function _str(out) + { + }, + ul4ondump: function ul4ondump(encoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this[this._ul4onattrs[i]]); + }, + ul4onload: function ul4onload(decoder) + { + for (var i = 0; i < this._ul4onattrs.length; ++i) + this[this._ul4onattrs[i]] = decoder.load(); + }, + __setitem__: function __setitem__(attrname, value) + { + throw ul4.TypeError.create("mutate", "object is immutable"); + }, + // used in ul4ondump/ul4ondump to automatically dump these attributes + _ul4onattrs: ["pos"] + } + ); + + ul4.TextAST = ul4._inherit( + ul4.AST, + { + create: function create(template, pos) + { + var text = ul4.AST.create.call(this, pos); + text.template = template; + return text; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), + _text: function _text() + { + return this.template.source.substring(this.pos.start, this.pos.stop); + }, + _eval: function _eval(context) + { + context.output(this._text()); + }, + _str: function _str(out) + { + out.push("text "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.IndentAST = ul4._inherit( + ul4.TextAST, + { + create: function create(template, pos, text) + { + var indent = ul4.TextAST.create.call(this, template, pos); + indent._maketext(text); + return indent; + }, + _maketext: function _maketext(text) + { + if (typeof(this.template) !== "undefined") + { + if (text === null) + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + else + this.text = text; + } + else + this.text = null; + }, + _text: function _text() + { + if (this.text === null) + return this.template.source.substring(this.pos.start, this.pos.stop); + else + return this.text; + }, + _eval: function _eval(context) + { + for (var i = 0; i < context.indents.length; ++i) + context.output(context.indents[i]); + context.output(this._text()); + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.TextAST.ul4ondump.call(this, encoder); + + if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + encoder.dump(null); + else + encoder.dump(this.text); + }, + ul4onload: function ul4onload(decoder) + { + ul4.TextAST.ul4onload.call(this, decoder); + // Recreate ``text`` attribute + this._maketext(decoder.load()); + }, + _str: function _str(out) + { + out.push("indent "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.LineEndAST = ul4._inherit( + ul4.TextAST, + { + _str: function _str(out) + { + out.push("lineend "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.Tag = ul4._inherit( + ul4.AST, + { + create: function create(template, tag, tagpos, codepos) + { + var tago = ul4.AST.create.call(this, tagpos); + tago.template = template; + tago.tag = tag; + tago.codepos = codepos; + tago._maketext(); + return tago; + }, + _maketext: function _maketext() + { + if (typeof(this.template) !== "undefined") + { + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); + } + else + { + this.text = null; + this.code = null; + } + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.AST.ul4ondump.call(this, encoder); + encoder.dump(this.template); + encoder.dump(this.tag); + encoder.dump(this.codepos); + }, + ul4onload: function ul4onload(decoder) + { + ul4.TextAST.ul4onload.call(this, decoder); + this.template = decoder.load(); + this.tag = decoder.load(); + this.codepos = decoder.load(); + // Recreate ``text`` attribute + this._maketext(); + } + } + ); + + ul4.CodeAST = ul4._inherit( + ul4.AST, + { + create: function create(tag, pos) + { + var code = ul4.AST.create.call(this, pos); + code.tag = tag; + return code; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), + _str: function _str(out) + { + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + } + } + ); + + ul4.ConstAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, value) + { + var constant = ul4.CodeAST.create.call(this, tag, pos); + constant.value = value; + return constant; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + return this.value; + } + } + ); + + ul4.ItemArgBase = ul4._inherit( + ul4.CodeAST, + { + _handle_eval_list: function _handle_eval_list(context, result) + { + try + { + return this._eval_list(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, result) + { + try + { + return this._eval_set(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_dict: function _handle_eval_dict(context, result) + { + try + { + return this._eval_dict(context, result); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_call: function _handle_eval_call(context, args, kwargs) + { + try + { + return this._eval_call(context, args, kwargs); + } + catch (exc) + { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } + ); + + ul4.SeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); + seqitem.value = value; + return seqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_list: function _eval_list(context, result) + { + var value = this.value._handle_eval(context); + result.push(value); + }, + _eval_set: function _eval_set(context, result) + { + var value = this.value._handle_eval(context); + result.add(value); + } + } + ); + + + ul4.UnpackSeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackseqitem.value = value; + return unpackseqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_list: function _eval_list(context, result) + { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + result.push(item.value); + } + }, + _eval_set: function _eval_set(context, result) + { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + result.add(item.value); + } + } + } + ); + + ul4.DictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, key, value) + { + var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); + dictitem.key = key; + dictitem.value = value; + return dictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) + { + var key = this.key._handle_eval(context); + var value = this.value._handle_eval(context); + ul4on._setmap(result, key, value); + } + } + ); + + ul4.UnpackDictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackdictitem.item = item; + return unpackdictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) + { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (var i = 0; i < item.length; ++i) + { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + ul4on._setmap(result, key, value); + } + } + else if (ul4._ismap(item)) + { + item.forEach(function(value, key){ + ul4on._setmap(result, key, value); + }); + } + else if (ul4._isobject(item)) + { + for (var key in item) + ul4on._setmap(result, key, item[key]); + } + } + } + ); + + ul4.PosArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var value = this.value._handle_eval(context); + args.push(value); + } + } + ); + + ul4.KeywordArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, name, value) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.name = name; + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + if (kwargs.hasOwnProperty(this.name)) + throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); + var value = this.value._handle_eval(context); + kwargs[this.name] = value; + } + } + ); + + ul4.UnpackListArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var item = this.item._handle_eval(context); + args.push.apply(args, item); + } + } + ); + + ul4.UnpackDictArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) + { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) + { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (var i = 0; i < item.length; ++i) + { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + } + } + else if (ul4._ismap(item)) + { + item.forEach(function(value, key){ + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + }); + } + else if (ul4._isobject(item)) + { + for (var key in item) + { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = item[key]; + } + } + } + } + ); + + ul4.ListAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var list = ul4.CodeAST.create.call(this, tag, pos); + list.items = []; + return list; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = []; + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_list(context, result); + return result; + } + } + ); + + ul4.ListCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.item = item; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = []; + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.push(this.item._handle_eval(localcontext)); + } + return result; + } + } + ); + + ul4.DictAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var dict = ul4.CodeAST.create.call(this, tag, pos); + dict.items = []; + return dict; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = ul4on._emptymap(); + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_dict(context, result); + return result; + } + } + ); + + ul4.DictCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, key, value, varname, container, condition) + { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.key = key; + listcomp.value = value; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._emptymap(); + + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + { + var key = this.key._handle_eval(localcontext); + var value = this.value._handle_eval(localcontext); + ul4on._setmap(result, key, value); + } + } + + return result; + } + } + ); + + ul4.SetAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var set = ul4.CodeAST.create.call(this, tag, pos); + set.items = []; + return set; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_set(context, result); + + return result; + } + } + ); + + ul4.SetCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var setcomp = ul4.CodeAST.create.call(this, tag, pos); + setcomp.item = item; + setcomp.container = container; + setcomp.condition = condition; + return setcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (var iter = ul4._iter(container);;) + { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); + } + + return result; + } + } + ); + + ul4.GenExprAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) + { + var genexp = ul4.CodeAST.create.call(this, tag, pos); + genexp.item = item; + genexp.varname = varname; + genexp.container = container; + genexp.condition = condition; + return genexp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + var iter = ul4._iter(container); + + var localcontext = context.inheritvars(); + + var self = this; + + var result = { + next: function(){ + while (true) + { + var item = iter.next(); + if (item.done) + return item; + var varitems = ul4._unpackvar(self.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) + { + var value = self.item._handle_eval(localcontext); + return {value: value, done: false}; + } + } + } + }; + + return result; + } + } + ); + + ul4.VarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, name) + { + var variable = ul4.CodeAST.create.call(this, tag, pos); + variable.name = name; + return variable; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + return this._get(context, this.name); + }, + _eval_set: function _eval_set(context, value) + { + this._set(context, this.name, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + this._modify(context, operator, this.name, value); + }, + _get: function _get(context, name) + { + var result = context.get(name); + if (typeof(result) === "undefined") + result = ul4.functions[name]; + return result; + }, + _set: function _set(context, name, value) + { + context.set(name, value); + }, + _modify: function _modify(context, operator, name, value) + { + var newvalue = operator._ido(context.get(name), value) + context.set(name, newvalue); + } + } + ); + + ul4.UnaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj) + { + var unary = ul4.CodeAST.create.call(this, tag, pos); + unary.obj = obj; + return unary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" obj="); + this.obj._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + return this._do(obj); + } + } + ); + + // Negation + ul4.NegAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + if (obj !== null && typeof(obj.__neg__) === "function") + return obj.__neg__(); + return -obj; + } + } + ); + + // Bitwise not + ul4.BitNotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + return -obj-1; + } + } + ); + + // Not + ul4.NotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) + { + return !ul4._bool(obj); + } + } + ); + + // If expression + ul4.IfAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, objif, objcond, objelse) + { + var ifexpr = ul4.CodeAST.create.call(this, tag, pos); + ifexpr.objif = objif; + ifexpr.objcond = objcond; + ifexpr.objelse = objelse; + return ifexpr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(+1); + out.push("objif="); + this.objif._repr(out); + out.push(0); + out.push("objcond="); + this.objcond._repr(out); + out.push(0); + out.push("objelse="); + this.objelse._repr(out); + out.push(-1); + out.push(">"); + }, + _eval: function _eval(context) + { + var result; + var condvalue = this.objcond._handle_eval(context); + if (ul4._bool(condvalue)) + result = this.objif._handle_eval(context); + else + result = this.objelse._handle_eval(context); + return result; + } + } + ); + + ul4.ReturnAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var result = this.obj._handle_eval(context); + throw ul4.ReturnException.create(result); + }, + _str: function _str(out) + { + out.push("return "); + this.obj._str(out); + } + } + ); + + ul4.PrintAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var output = ul4._str(obj); + context.output(output); + }, + _str: function _str(out) + { + out.push("print "); + this.obj._str(out); + } + } + ); + + ul4.PrintXAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var output = ul4._xmlescape(obj); + context.output(output); + }, + _str: function _str(out) + { + out.push("printx "); + this.obj._str(out); + } + } + ); + + ul4.BinaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj1, obj2) + { + var binary = ul4.CodeAST.create.call(this, tag, pos); + binary.obj1 = obj1; + binary.obj2 = obj2; + return binary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.type); + out.push(" obj1="); + this.obj1._repr(out); + out.push(" obj2="); + this.obj2._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + return this._do(obj1, obj2); + } + } + ); + + // Item access and assignment: dict[key], list[index], string[index], color[index] + ul4.ItemAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + var result = this._get(obj1, obj2); + return result; + }, + _eval_set: function _eval_set(context, value) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._set(obj1, obj2, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._modify(operator, obj1, obj2, value); + }, + _get: function _get(container, key) + { + if (typeof(container) === "string" || ul4._islist(container)) + { + if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) + { + var start = key.start, stop = key.stop; + if (typeof(start) === "undefined" || start === null) + start = 0; + if (typeof(stop) === "undefined" || stop === null) + stop = container.length; + return container.slice(start, stop); + } + else + { + var orgkey = key; + if (key < 0) + key += container.length; + return container[key]; + } + } + else if (container && typeof(container.__getitem__) === "function") // test this before the generic object test + return container.__getitem__(key); + else if (ul4._ismap(container)) + return container.get(key); + else if (Object.prototype.toString.call(container) === "[object Object]") + return container[key]; + else + throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); + }, + _set: function _set(container, key, value) + { + if (ul4._islist(container)) + { + if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) + { + var start = key.start, stop = key.stop; + if (start === null) + start = 0; + else if (start < 0) + start += container.length; + if (start < 0) + start = 0; + else if (start > container.length) + start = container.length; + if (stop === null) + stop = container.length; + else if (stop < 0) + stop += container.length; + if (stop < 0) + stop = 0; + else if (stop > container.length) + stop = container.length; + if (stop < start) + stop = start; + container.splice(start, stop-start); // Remove old element + for (var iter = ul4._iter(value);;) + { + var item = iter.next(); + if (item.done) + break; + container.splice(start++, 0, item.value); + } + } + else + { + var orgkey = key; + if (key < 0) + key += container.length; + container[key] = value; + } + } + else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test + container.__setitem__(key, value); + else if (ul4._ismap(container)) + container.set(key, value); + else if (Object.prototype.toString.call(container) === "[object Object]") + container[key] = value; + else + throw ul4.NotSubscriptableError.create(container); + }, + _modify: function _modify(operator, container, key, value) + { + this._set(container, key, operator._ido(this._get(container, key), value)); + } + } + ); + + // Identifty test operator ``is`` + ul4.IsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return obj1 === obj2; + } + } + ); + + // Inverted tdentifty test operator ``is not`` + ul4.IsNotAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return obj1 !== obj2; + } + } + ); + + // Comparison operator == + ul4.EQAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._eq(obj1, obj2); + } + } + ); + + // Comparison operator != + ul4.NEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._ne(obj1, obj2); + } + } + ); + + // Comparison operator < + ul4.LTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._lt(obj1, obj2); + } + } + ); + + // Comparison operator <= + ul4.LEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._le(obj1, obj2); + } + } + ); + + // Comparison operator > + ul4.GTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._gt(obj1, obj2); + } + } + ); + + // Comparison operator >= + ul4.GEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + return ul4._ge(obj1, obj2); + } + } + ); + + // Containment test: string in string, obj in list, key in dict, value in rgb + ul4.ContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) + { + if (typeof(obj) === "string" && typeof(container) === "string") + { + return container.indexOf(obj) !== -1; + } + else if (ul4._islist(container)) + { + return container.indexOf(obj) !== -1; + } + else if (container && typeof(container.__contains__) === "function") // test this before the generic object test + return container.__contains__(obj); + else if (ul4._ismap(container) || ul4._isset(container)) + return container.has(obj); + else if (ul4._isobject(container)) + { + for (var key in container) + { + if (key === obj) + return true; + } + return false; + } + else if (ul4._iscolor(container)) + { + return container._r === obj || container._g === obj || container._b === obj || container._a === obj; + } + throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + } + } + ); + + // Inverted containment test + ul4.NotContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) + { + return !ul4.ContainsAST._do(obj, container); + } + } + ); + + // Addition: num + num, string + string + ul4.AddAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__add__) === "function") + return obj1.__add__(obj2); + else if (obj2 && typeof(obj2.__radd__) === "function") + return obj2.__radd__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + var result = []; + ul4._append(result, obj1); + ul4._append(result, obj2); + return result; + } + else + return obj1 + obj2; + }, + _ido: function _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + ul4._append(obj1, obj2); + return obj1; + } + else + return this._do(obj1, obj2); + } + } + ); + + // Substraction: num - num + ul4.SubAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__sub__) === "function") + return obj1.__sub__(obj2); + else if (obj2 && typeof(obj2.__rsub__) === "function") + return obj2.__rsub__(obj1); + else if (ul4._isdate(obj1) && ul4._isdate(obj2)) + return this._date_sub(obj1, obj2); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + return obj1 - obj2; + }, + _date_sub: function _date_sub(obj1, obj2) + { + var swap = (obj2 > obj1); + + if (swap) + { + var t = obj1; + obj1 = obj2; + obj2 = t; + } + // From now on obj1 is > than obj2 + + var year1 = obj1.getFullYear(); + var yearday1 = ul4._yearday(obj1); + var year2 = obj2.getFullYear(); + var yearday2 = ul4._yearday(obj2); + + var diffdays = 0; + + while (year1 > year2) + { + diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + ++year2; + } + diffdays += yearday1 - yearday2; + + var hours1 = obj1.getHours(); + var minutes1 = obj1.getMinutes(); + var seconds1 = obj1.getSeconds(); + var hours2 = obj2.getHours(); + var minutes2 = obj2.getMinutes(); + var seconds2 = obj2.getSeconds(); + + var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + + var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + + if (swap) + { + diffdays = -diffdays; + diffseconds = -diffseconds; + diffmilliseconds = -diffmilliseconds; + } + return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Multiplication: num * num, int * str, str * int, int * list, list * int + ul4.MulAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__mul__) === "function") + return obj1.__mul__(obj2); + else if (obj2 && typeof(obj2.__rmul__) === "function") + return obj2.__rmul__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) + { + if (typeof(obj2) === "string") + { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj2, obj1); + } + else if (ul4._islist(obj2)) + { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj2, obj1); + } + } + else if (ul4._isint(obj2) || ul4._isbool(obj2)) + { + if (typeof(obj1) === "string") + { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj1, obj2); + } + else if (ul4._islist(obj1)) + { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj1, obj2); + } + } + return obj1 * obj2; + }, + _ido: function _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._isint(obj2)) + { + if (obj2 > 0) + { + var i = 0; + var targetsize = obj1.length * obj2; + while (obj1.length < targetsize) + obj1.push(obj1[i++]) + } + else + obj1.splice(0, obj1.length); + return obj1; + } + else + return this._do(obj1, obj2); + } + } + ); + + // Truncating division + ul4.FloorDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__floordiv__) === "function") + return obj1.__floordiv__(obj2); + else if (obj2 && typeof(obj2.__rfloordiv__) === "function") + return obj2.__rfloordiv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + return Math.floor(obj1 / obj2); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // "Real" division + ul4.TrueDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__truediv__) === "function") + return obj1.__truediv__(obj2); + else if (obj2 && typeof(obj2.__rtruediv__) === "function") + return obj2.__rtruediv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + return obj1 / obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Modulo + ul4.ModAST = ul4._inherit( + ul4.BinaryAST, + { + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + _do: function _do(obj1, obj2) + { + var div = Math.floor(obj1 / obj2); + var mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) + { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise left shift + ul4.ShiftLeftAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftRightAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 *= 2; + return obj1; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise right shift + ul4.ShiftRightAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftLeftAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 /= 2; + return Math.floor(obj1); + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise and + ul4.BitAndAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 & obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise exclusive or + ul4.BitXOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 ^ obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + // Bitwise or + ul4.BitOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) + { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 | obj2; + }, + _ido: function _ido(obj1, obj2) + { + return this._do(obj1, obj2); + } + } + ); + + ul4.AndAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + if (!ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } + ); + + ul4.OrAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) + { + var obj1 = this.obj1._handle_eval(context); + if (ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } + ); + + ul4.AttrAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, attrname) + { + var attr = ul4.CodeAST.create.call(this, tag, pos); + attr.obj = obj; + attr.attrname = attrname; + return attr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var result = this._get(obj, this.attrname); + return result; + }, + _eval_set: function _eval_set(context, value) + { + var obj = this.obj._handle_eval(context); + this._set(obj, this.attrname, value); + }, + _eval_modify: function _eval_modify(context, operator, value) + { + var obj = this.obj._handle_eval(context); + this._modify(operator, obj, this.attrname, value); + }, + _get: function _get(object, attrname) + { + if (typeof(object) === "string") + { + switch (attrname) + { + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); + case "replace": + return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count){ return ul4._replace(object, old, new_, count); }); + case "strip": + return ul4.expose(["chars=", null], function strip(chars){ return ul4._strip(object, chars); }); + case "lstrip": + return ul4.expose(["chars=", null], function lstrip(chars){ return ul4._lstrip(object, chars); }); + case "rstrip": + return ul4.expose(["chars=", null], function rstrip(chars){ return ul4._rstrip(object, chars); }); + case "split": + return ul4.expose(["sep=", null, "count=", null], function split(sep, count){ return ul4._split(object, sep, count); }); + case "rsplit": + return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count){ return ul4._rsplit(object, sep, count); }); + case "splitlines": + return ul4.expose(["keepends=", false], function splitlines(keepends){ return ul4._splitlines(object, keepends); }); + case "lower": + return ul4.expose([], function lower(){ return object.toLowerCase(); }); + case "upper": + return ul4.expose([], function upper(){ return object.toUpperCase(); }); + case "capitalize": + return ul4.expose([], function capitalize(){ return ul4._capitalize(object); }); + case "join": + return ul4.expose(["iterable"], function join(iterable){ return ul4._join(object, iterable); }); + case "startswith": + return ul4.expose(["prefix"], function startswith(prefix){ return ul4._startswith(object, prefix); }); + case "endswith": + return ul4.expose(["suffix"], function endswith(suffix){ return ul4._endswith(object, suffix); }); + default: + return undefined; + } + } + else if (ul4._islist(object)) + { + switch (attrname) + { + case "append": + return ul4.expose(["*items"], function append(items){ return ul4._append(object, items); }); + case "insert": + return ul4.expose(["pos", "*items"], function insert(pos, items){ return ul4._insert(object, pos, items); }); + case "pop": + return ul4.expose(["pos=", -1], function pop(pos){ return ul4._pop(object, pos); }); + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); + default: + return undefined; + } + } + else if (ul4._isdate(object)) + { + switch (attrname) + { + case "weekday": + return ul4.expose([], function weekday(){ return ul4._weekday(object); }); + case "week": + return ul4.expose(["firstweekday=", null], function week(firstweekday){ return ul4._week(object, firstweekday); }); + case "day": + return ul4.expose([], function day(){ return object.getDate(); }); + case "month": + return ul4.expose([], function month(){ return object.getMonth()+1; }); + case "year": + return ul4.expose([], function year(){ return object.getFullYear(); }); + case "hour": + return ul4.expose([], function hour(){ return object.getHours(); }); + case "minute": + return ul4.expose([], function minute(){ return object.getMinutes(); }); + case "second": + return ul4.expose([], function second(){ return object.getSeconds(); }); + case "microsecond": + return ul4.expose([], function microsecond(){ return object.getMilliseconds() * 1000; }); + case "mimeformat": + return ul4.expose([], function mimeformat(){ return ul4._mimeformat(object); }); + case "isoformat": + return ul4.expose([], function isoformat(){ return ul4._isoformat(object); }); + case "yearday": + return ul4.expose([], function yearday(){ return ul4._yearday(object); }); + default: + return undefined; + } + } + else if (ul4._ismap(object)) + { + switch (attrname) + { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items(){ return ul4._items(object); }); + case "values": + return ul4.expose([], function values(){ return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + return object.get(attrname); + } + } + else if (ul4._isset(object)) + { + switch (attrname) + { + case "add": + return ul4.expose(["*items"], function add(items){ for (var i = 0; i < items.length; ++i) { object.add(items[i]); } } ); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + return undefined; + } + } + else if (Object.prototype.toString.call(object) === "[object Object]") + { + switch (attrname) + { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items(){ return ul4._items(object); }); + case "values": + return ul4.expose([], function values(){ return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear(){ return ul4._clear(object); }); + default: + var result; + if (object && typeof(object.__getattr__) === "function") // test this before the generic object test + result = object.__getattr__(attrname); + else + result = object[attrname]; + if (typeof(result) !== "function") + return result; + var realresult = function() { + return result.apply(object, arguments); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + } + throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); + }, + _set: function _set(object, attrname, value) + { + if (typeof(object) === "object" && typeof(object.__setattr__) === "function") + object.__setattr__(attrname, value); + else if (ul4._ismap(object)) + object.set(attrname, value) + else if (ul4._isobject(object)) + object[attrname] = value; + else + throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); + }, + _modify: function _modify(operator, object, attrname, value) + { + var oldvalue = this._get(object, attrname); + var newvalue = operator._ido(oldvalue, value); + this._set(object, attrname, newvalue); + } + } + ); + + ul4.CallAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, args) + { + var call = ul4.CodeAST.create.call(this, tag, pos); + call.obj = obj; + call.args = args; + return call; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), + _repr: function _repr(out) + { + out.push(""); + }, + _makeargs: function _makeargs(context) + { + var args = [], kwargs = {}; + for (var i = 0; i < this.args.length; ++i) + this.args[i]._handle_eval_call(context, args, kwargs); + return {args: args, kwargs: kwargs}; + }, + _handle_eval: function _handle_eval(context) + { + try + { + return this._eval(context); + } + catch (exc) + { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval: function _eval(context) + { + var obj = this.obj._handle_eval(context); + var args = this._makeargs(context); + var result = ul4._call(context, obj, args.args, args.kwargs); + return result; + } + } + ); + + ul4.RenderAST = ul4._inherit( + ul4.CallAST, + { + create: function create(tag, pos, obj, args) + { + var render = ul4.CallAST.create.call(this, tag, pos, obj, args); + render.indent = null; + return render; + }, + _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("render "); + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + if (this.indent !== null) + { + out.push(" with indent "); + out.push(ul4._repr(this.indent._text())); + } + }, + _handle_eval: function _handle_eval(context) + { + var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); + var obj = this.obj._handle_eval(localcontext); + var args = this._makeargs(localcontext); + + try + { + var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + return result; + } + catch (exc) + { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } + ); + + // Slice object + ul4.slice = ul4._inherit( + ul4.Proto, + { + create: function create(start, stop) + { + var slice = ul4._clone(this); + slice.start = start; + slice.stop = stop; + return slice; + }, + __repr__: function __repr__() + { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + } + } + ); + + + // List/String slice + ul4.SliceAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, index1, index2) + { + var slice = ul4.CodeAST.create.call(this, tag, pos); + slice.index1 = index1; + slice.index2 = index2; + return slice; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), + _repr: function _repr(out) + { + out.push(""); + }, + _eval: function _eval(context) + { + var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return ul4.slice.create(index1, index2); + } + } + ); + + + ul4.SetVarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, lvalue, value) + { + var changevar = ul4.CodeAST.create.call(this, tag, pos); + changevar.lvalue = lvalue; + changevar.value = value; + return changevar; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" lvalue="); + out.push(ul4._repr(this.lvalue)); + out.push(" value="); + this.value._repr(out); + out.push(">"); + }, + _eval: function _eval(context) + { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) + { + var item = items[i]; + item[0]._handle_eval_set(context, item[1]); + } + } + } + ); + + ul4.ModifyVarAST = ul4._inherit( + ul4.SetVarAST, + { + _eval: function _eval(context) + { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) + { + var item = items[i]; + item[0]._handle_eval_modify(context, this._operator, item[1]); + } + } + } + ); + + ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + + ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + + ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + + ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + + ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + + ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + + ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + + ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + + ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + + ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + + ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + + ul4.BlockAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var block = ul4.CodeAST.create.call(this, tag, pos); + block.endtag = null; + block.content = []; + return block; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), + _eval: function _eval(context) + { + for (var i = 0; i < this.content.length; ++i) + this.content[i]._handle_eval(context); + }, + _str: function _str(out) + { + if (this.content.length) + { + for (var i = 0; i < this.content.length; ++i) + { + this.content[i]._str(out); + out.push(0); + } + } + else + { + out.push("pass"); + out.push(0); + } + } + } + ); + + ul4.ForBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, varname, container) + { + var for_ = ul4.BlockAST.create.call(this, tag, pos); + for_.varname = varname; + for_.container = container; + return for_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str_varname: function _str_varname(out, varname) + { + if (ul4._islist(varname)) + { + out.push("("); + for (var i = 0; i < varname.length; ++i) + { + if (i) + out.push(", "); + this._str_varname(out, varname[i]); + } + if (varname.length == 1) + out.push(","); + out.push(")"); + } + else + varname._str(out); + }, + _eval: function _eval(context) + { + var container = this.container._handle_eval(context); + + for (var iter = ul4._iter(container);;) + { + var value = iter.next(); + if (value.done) + break; + var varitems = ul4._unpackvar(this.varname, value.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(context, varitems[i][1]); + try + { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) + { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) + { + out.push("for "); + this._str_varname(out, this.varname); + out.push(" in "); + this.container._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.WhileBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) + { + var while_ = ul4.BlockAST.create.call(this, tag, pos); + while_.condition = condition; + return while_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("while "), + this.container._repr(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _eval: function _eval(context) + { + while (true) + { + var cond = this.condition._handle_eval(context); + if (!ul4._bool(cond)) + break; + try + { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) + { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) + { + out.push("while "); + ul4.AST._str.call(this, out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.BreakAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) + { + throw ul4.BreakException; + }, + _str: function _str(out) + { + out.push("break"); + out.push(0); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.ContinueAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) + { + throw ul4.ContinueException; + }, + _str: function _str(out) + { + out.push("continue"); + out.push(0); + }, + _repr: function _repr(out) + { + out.push(""); + } + } + ); + + ul4.CondBlockAST = ul4._inherit( + ul4.BlockAST, + { + _eval: function _eval(context) + { + for (var i = 0; i < this.content.length; ++i) + { + var block = this.content[i]; + var execute = block._execute(context); + if (execute) + { + block._handle_eval(context); + break; + } + } + } + } + ); + + ul4.ConditionalBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) + { + var block = ul4.BlockAST.create.call(this, tag, pos); + block.condition = condition; + return block; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" condition="); + this.condition._repr(out); + out.push(">"); + }, + _str: function _str(out) + { + out.push(this._strname); + out.push(" "); + this.condition._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) + { + var cond = this.condition._handle_eval(context); + var result = ul4._bool(cond); + return result; + } + } + ); + + ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); + + ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); + + ul4.ElseBlockAST = ul4._inherit( + ul4.BlockAST, + { + _repr: function _repr(out) + { + out.push(""); + }, + _str: function _str(out) + { + out.push("else:"), + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) + { + return true; + }, + _str: function _str(out) + { + out.push("else:"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } + ); + + ul4.Template = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) + { + var template = ul4.BlockAST.create.call(this, tag, pos); + template.source = source; + template.name = name; + template.whitespace = whitespace; + template.startdelim = startdelim; + template.enddelim = enddelim; + template.docpos = null; + template.signature = signature; + template._jsfunction = null; + template._asts = null; + template._ul4_callsignature = signature; + template._ul4_rendersignature = signature; + template.parenttemplate = null; + return template; + }, + ul4ondump: function ul4ondump(encoder) + { + var signature; + encoder.dump(ul4.version); + encoder.dump(this.name); + encoder.dump(this.source); + encoder.dump(this.whitespace); + encoder.dump(this.startdelim); + encoder.dump(this.enddelim); + encoder.dump(this.docpos); + encoder.dump(this.parenttemplate); + if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + signature = this.signature; + else + { + signature = []; + for (var i = 0; i < this.signature.args.length; ++i) + { + var arg = this.signature.args[i]; + if (typeof(arg.defaultValue) === "undefined") + signature.push(arg.name); + else + signature.push(arg.name+"=", arg.defaultValue); + } + if (this.signature.remargs !== null) + signature.push("*" + this.signature.remargs); + if (this.signature.remkwargs !== null) + signature.push("**" + this.signature.remkwargs); + } + encoder.dump(signature); + ul4.BlockAST.ul4ondump.call(this, encoder); + }, + ul4onload: function ul4onload(decoder) + { + var version = decoder.load(); + var signature; + + if (version === null) + throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + + if (version !== ul4.version) + throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); + this.source = decoder.load(); + this.whitespace = decoder.load(); + this.startdelim = decoder.load(); + this.enddelim = decoder.load(); + this.docpos = decoder.load(); + this.parenttemplate = decoder.load(); + signature = decoder.load(); + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + this.signature = signature; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + ul4.BlockAST.ul4onload.call(this, decoder); + }, + loads: function loads(string) + { + return ul4on.loads(string); + }, + _eval: function _eval(context) + { + var signature = null; + if (this.signature !== null) + signature = this.signature._handle_eval(context); + var closure = ul4.TemplateClosure.create(this, signature, context.vars); + context.set(this.name, closure); + }, + _repr: function _repr(out) + { + out.push("") + { + out.push(" enddelim="); + out.push(ul4._repr(this.enddelim)); + } + out.push(">"); + }, + _str: function _str(out) + { + out.push("def "); + out.push(this.name ? this.name : "unnamed"); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + _renderbound: function _renderbound(context, vars) + { + var localcontext = context.clone(); + localcontext.vars = vars; + try + { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) + { + if (!ul4.ReturnException.isprotoof(exc)) + throw exc; + } + }, + __render__: function __render__(context, vars) + { + this._renderbound(context, vars); + }, + render: function render(context, vars) + { + this._renderbound(context, vars); + }, + _rendersbound: function _rendersbound(context, vars) + { + var localcontext = context.replaceoutput(); + this._renderbound(localcontext, vars); + return localcontext.getoutput(); + }, + renders: function renders(vars) + { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._rendersbound(context, vars); + }, + doc: function doc() + { + return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; + }, + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "tag": + return this.tag; + case "endtag": + return this.endtag; + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); + default: + return undefined; + } + }, + _callbound: function _callbound(context, vars) + { + var localcontext = context.clone(); + localcontext.vars = vars; + try + { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) + { + if (ul4.ReturnException.isprotoof(exc)) + return exc.result; + else + throw exc; + } + return null; + }, + call: function call(vars) + { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._callbound(context, vars); + }, + __call__: function __call__(context, vars) + { + return this._callbound(context, vars); + }, + __type__: "ul4.Template" // used by ``istemplate()`` + } + ); + + ul4.SignatureAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) + { + var signature = ul4.CodeAST.create.call(this, tag, pos); + signature.params = []; + return signature; + }, + ul4ondump: function ul4ondump(encoder) + { + ul4.CodeAST.ul4ondump.call(this, encoder); + + var dump = []; + + for (var i = 0; i < this.params.length; ++i) + { + var param = this.params[i]; + if (param[1] === null) + dump.push(param[0]); + else + dump.push(param); + } + encoder.dump(dump); + }, + ul4onload: function ul4onload(decoder) + { + ul4.AST.ul4onload.call(this, decoder); + var dump = decoder.load(); + this.params = []; + for (var i = 0; i < dump.length; ++i) + { + var param = dump[i]; + if (typeof(param) === "string") + this.params.push([param, null]); + else + this.params.push(param); + } + }, + _eval: function _eval(context) + { + var args = []; + for (var i = 0; i < this.params.length; ++i) + { + var param = this.params[i]; + if (param[1] === null) + args.push(param[0]); + else + { + args.push(param[0] + "="); + args.push(param[1]._handle_eval(context)); + } + } + return ul4.Signature.create.apply(ul4.Signature, args); + }, + _repr: function _repr(out) + { + out.push("<"); + out.push(this.typename); + out.push(" params="); + this.params._repr(out); + out.push(">"); + } + } + ); + + ul4.TemplateClosure = ul4._inherit( + ul4.Proto, + { + create: function create(template, signature, vars) + { + var closure = ul4._clone(this); + closure.template = template; + closure.signature = signature; + closure.vars = vars; + closure._ul4_callsignature = signature; + closure._ul4_rendersignature = signature; + // Copy over the required attribute from the template + closure.name = template.name; + closure.tag = template.tag; + closure.endtag = template.endtag; + closure.source = template.source; + closure.startdelim = template.startdelim; + closure.enddelim = template.enddelim; + closure.docpos = template.docpos; + closure.content = template.content; + return closure; + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + __render__: function __render__(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + render: function render(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __call__: function __call__(context, vars) + { + return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _renderbound: function _renderbound(context, vars) + { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _rendersbound: function _rendersbound(context, vars) + { + return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "render": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); + case "signature": + return this.signature; + default: + return this.template.__getattr__(attrname); + } + }, + __type__: "ul4.TemplateClosure" // used by ``istemplate()`` + } + ); + + // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` + ul4._rgb = function _rgb(r, g, b, a) + { + return this.Color.create(255*r, 255*g, 255*b, 255*a); + }; + + // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference + ul4._xmlescape = function _xmlescape(obj) + { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; + }; + + // Convert ``obj`` to a string suitable for output into a CSV file + ul4._csv = function _csv(obj) + { + if (obj === null) + return ""; + else if (typeof(obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; + }; + + // Return a string containing one character with the codepoint ``i`` + ul4._chr = function _chr(i) + { + if (typeof(i) != "number") + throw ul4.TypeError.create("chr()", "chr() requires an int"); + return String.fromCharCode(i); + }; + + // Return the codepoint for the one and only character in the string ``c`` + ul4._ord = function _ord(c) + { + if (typeof(c) != "string" || c.length != 1) + throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); + return c.charCodeAt(0); + }; + + // Convert an integer to a hexadecimal string + ul4._hex = function _hex(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("hex()", "hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); + }; + + // Convert an integer to a octal string + ul4._oct = function _oct(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("oct()", "oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); + }; + + // Convert an integer to a binary string + ul4._bin = function _bin(number) + { + if (typeof(number) != "number") + throw ul4.TypeError.create("bin()", "bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); + }; + + // Return the minimum value + ul4._min = function _min(obj) + { + if (obj.length == 0) + throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) + { + var item = iter.next(); + if (item.done) + { + if (first) + throw ul4.ValueError.create("min() argument is an empty sequence!"); + return result; + } + if (first || (item.value < result)) + result = item.value; + first = false; + } + }; + + // Return the maximum value + ul4._max = function _max(obj) + { + if (obj.length == 0) + throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) + { + var item = iter.next(); + if (item.done) + { + if (first) + throw ul4.ValueError.create("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } + }; + + // Return the of the values from the iterable starting with ``start`` (default ``0``) + ul4._sum = function _sum(iterable, start) + { + if (typeof(start) === "undefined") + start = 0; + + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; + }; + + // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._first = function _first(iterable, defaultValue) + { + if (typeof(defaultValue) === "undefined") + defaultValue = null; + + var item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; + }; + + // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._last = function _last(iterable, defaultValue) + { + if (typeof(defaultValue) === "undefined") + defaultValue = null; + + var value = defaultValue; + + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + value = item.value; + } + return value; + }; + + // Return a sorted version of ``iterable`` + ul4._sorted = function _sorted(context, iterable, key, reverse) + { + var cmp; + if (key === null) + { + // FIXME: stability + if (reverse) + { + cmp = function cmp(a, b) + { + return -ul4._cmp("<=>", a, b); + } + } + else + { + cmp = function cmp(a, b) + { + return ul4._cmp("<=>", a, b); + } + } + var result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else + { + var sort = []; + + for (var i = 0, iter = ul4._iter(iterable);;++i) + { + var item = iter.next(); + if (item.done) + break; + var keyvalue = ul4._call(context, key, [item.value], {}); + sort.push([keyvalue, i, item.value]); + } + cmp = function cmp(s1, s2) + { + var res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp(s1[1], s2[1]); + return reverse ? -res : res; + } + + sort.sort(cmp); + + var result = []; + for (var i = 0; i < sort.length; ++i) + { + result.push(sort[i][2]); + } + return result; + } + }; + + // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` + ul4._range = function _range(args) + { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required range() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var lower, higher; + if (step === 0) + throw ul4.ValueError.create("range() requires a step argument != 0"); + else if (step > 0) + { + lower = start; + heigher = stop; + } + else + { + lower = stop; + heigher = start; + } + var length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; + + return { + index: 0, + next: function() + { + if (this.index >= length) + return {done: true}; + return {value: start + (this.index++) * step, done: false}; + } + }; + }; + + // Return a iterable object returning a slice from the argument + ul4._slice = function _slice(args) + { + var iterable, start, stop, step; + if (args.length < 2) + throw ul4.ArgumentError.create("required slice() argument missing"); + else if (args.length > 4) + throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) + { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw ul4.ValueError.create("slice() requires a start argument >= 0"); + if (stop < 0) + throw ul4.ValueError.create("slice() requires a stop argument >= 0"); + if (step <= 0) + throw ul4.ValueError.create("slice() requires a step argument > 0"); + + var next = start, count = 0; + var iter = ul4._iter(iterable); + return { + next: function() { + var result; + while (count < next) + { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return {done: true}; + result = iter.next(); + if (result.done) + return result; + ++count; + next += step; + if (stop !== null && next > stop) + next = stop; + return result; + } + }; + }; + + // ``%`` escape unsafe characters in the string ``string`` + ul4._urlquote = function _urlquote(string) + { + return encodeURIComponent(string); + }; + + // The inverse function of ``urlquote`` + ul4._urlunquote = function _urlunquote(string) + { + return decodeURIComponent(string); + }; + + // Return a reverse iterator over ``sequence`` + ul4._reversed = function _reversed(sequence) + { + if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length-1, + next: function() { + return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; + } + }; + }; + + // Returns a random number in the interval ``[0;1[`` + ul4._random = function _random() + { + return Math.random(); + }; + + // Return a randomly select item from ``range(start, stop, step)`` + ul4._randrange = function _randrange(args) + { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required randrange() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var width = stop-start; + + var value = Math.random(); + + var n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw ul4.ValueError.create("randrange() requires a step argument != 0"); + return start + step*Math.floor(value * n); + }; + + // Return a random item/char from the list/string ``sequence`` + ul4._randchoice = function _randchoice(sequence) + { + var iscolor = ul4._iscolor(sequence); + if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw ul4.TypeError.create("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; + }; + + // Round a number ``x`` to ``digits`` decimal places (may be negative) + ul4._round = function _round(x, digits) + { + if (typeof(digits) === "undefined") + digits = 0; + if (digits) + { + var threshhold = Math.pow(10, digits); + return Math.round(x*threshhold)/threshhold; + } + else + return Math.round(x); + }; + + // Return a hex-encode MD5 hash of the argument + // This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 + ul4._md5 = function _md5(string) + { + return md5(string); + }; + + // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) + ul4._enumerate = function _enumerate(iterable, start) + { + if (typeof(start) === "undefined") + start = 0; + + return { + iter: ul4._iter(iterable), + index: start, + next: function() { + var item = this.iter.next(); + return item.done ? item : {value: [this.index++, item.value], done: false}; + } + }; + }; + + // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) + ul4._isfirst = function _isfirst(iterable) + { + var iter = ul4._iter(iterable); + var isfirst = true; + return { + next: function() { + var item = iter.next(); + var result = item.done ? item : {value: [isfirst, item.value], done: false}; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) + ul4._islast = function _islast(iterable) + { + var iter = ul4._iter(iterable); + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [item.done, lastitem.value], done: false}; + lastitem = item; + return result; + } + }; + }; + + // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._isfirstlast = function _isfirstlast(iterable) + { + var iter = ul4._iter(iterable); + var isfirst = true; + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._enumfl = function _enumfl(iterable, start) + { + var iter = ul4._iter(iterable); + var i = start; + var isfirst = true; + var lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; + + // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) + ul4._zip = function _zip(iterables) + { + var result; + if (iterables.length) + { + var iters = []; + for (var i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); + + return { + next: function() { + var items = []; + for (var i = 0; i < iters.length; ++i) + { + var item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return {value: items, done: false}; + } + }; + } + else + { + return { + next: function() { + return {done: true}; + } + }; + } + }; + + // Return the absolute value for the number ``number`` + ul4._abs = function _abs(number) + { + if (number !== null && typeof(number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); + }; + + // Return a ``Date`` object from the arguments passed in + ul4._date = function _date(year, month, day, hour, minute, second, microsecond) + { + if (typeof(hour) === "undefined") + hour = 0; + + if (typeof(minute) === "undefined") + minute = 0; + + if (typeof(second) === "undefined") + second = 0; + + if (typeof(microsecond) === "undefined") + microsecond = 0; + + return new Date(year, month-1, day, hour, minute, second, microsecond/1000); + }; + + // Return a ``TimeDelta`` object from the arguments passed in + ul4._timedelta = function _timedelta(days, seconds, microseconds) + { + return this.TimeDelta.create(days, seconds, microseconds); + }; + + // Return a ``MonthDelta`` object from the arguments passed in + ul4._monthdelta = function _monthdelta(months) + { + return this.MonthDelta.create(months); + }; + + // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) + ul4._hls = function _hls(h, l, s, a) + { + var _v = function(m1, m2, hue) + { + hue = hue % 1.0; + if (hue < 1/6) + return m1 + (m2-m1)*hue*6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2/3) + return m1 + (m2-m1)*(2/3-hue)*6.0; + return m1; + }; + + var m1, m2; + if (typeof(a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0+s); + else + m2 = l+s-(l*s); + m1 = 2.0*l - m2; + return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); + }; + + // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) + ul4._hsv = function _hsv(h, s, v, a) + { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + var i = Math.floor(h*6.0); + var f = (h*6.0) - i; + var p = v*(1.0 - s); + var q = v*(1.0 - s*f); + var t = v*(1.0 - s*(1.0-f)); + switch (i%6) + { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } + }; + + // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` + ul4._get = function _get(container, key, defaultvalue) + { + if (ul4._ismap(container)) + { + if (container.has(key)) + return container.get(key); + return defaultvalue; + } + else if (ul4._isobject(container)) + { + var result = container[key]; + if (typeof(result) === "undefined") + return defaultvalue; + return result; + } + throw ul4.TypeError.create("get()", "get() requires a dict"); + }; + + // Return a ``Date`` object for the current time + ul4.now = function now() + { + return new Date(); + }; + + // Return a ``Date`` object for the current time in UTC + ul4.utcnow = function utcnow() + { + var now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + }; + + ul4.functions = { + repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), + ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), + str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), + int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), + float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), + list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), + set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), + bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), + len: ul4.expose(["sequence"], {name: "len"}, ul4._len), + type: ul4.expose(["obj"], {name: "type"}, ul4._type), + format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), + any: ul4.expose(["iterable"], {name: "any"}, ul4._any), + all: ul4.expose(["iterable"], {name: "all"}, ul4._all), + zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), + isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), + isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), + isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), + isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), + isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), + isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), + isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), + isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), + iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), + istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), + ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), + istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), + isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), + islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), + isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), + isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), + isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), + asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), + fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), + asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), + fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), + now: ul4.expose([], ul4.now), + utcnow: ul4.expose([], ul4.utcnow), + enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), + isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), + islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), + isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), + enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), + abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), + date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), + timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), + monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), + rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), + hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), + hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), + xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), + csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), + chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), + ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), + hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), + oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), + bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), + min: ul4.expose(["*obj"], {name: "min"}, ul4._min), + max: ul4.expose(["*obj"], {name: "max"}, ul4._max), + sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), + first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), + last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), + sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), + range: ul4.expose(["*args"], {name: "range"}, ul4._range), + slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), + urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), + urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), + reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), + random: ul4.expose([], {name: "random"}, ul4._random), + randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), + randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), + round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), + md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) + }; + + // Functions implementing UL4 methods + ul4._replace = function _replace(string, old, new_, count) + { + if (count === null) + count = string.length; + + var result = []; + while (string.length) + { + var pos = string.indexOf(old); + if (pos === -1 || !count--) + { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + result.push(new_); + string = string.substr(pos + old.length); + } + return result.join(""); + }; + + ul4._strip = function _strip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("strip()", "strip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + while (string && chars.indexOf(string[string.length-1]) >= 0) + string = string.substr(0, string.length-1); + return string; + }; + + ul4._lstrip = function _lstrip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + return string; + }; + + ul4._rstrip = function _rstrip(string, chars) + { + if (chars === null) + chars = " \r\n\t"; + else if (typeof(chars) !== "string") + throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); + + while (string && chars.indexOf(string[string.length-1]) >= 0) + string = string.substr(0, string.length-1); + return string; + }; + + ul4._split = function _split(string, sep, count) + { + if (sep !== null && typeof(sep) !== "string") + throw ul4.TypeError.create("split()", "split() requires a string"); + + if (count === null) + { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + var result = []; + while (string.length) + { + var pos = string.indexOf(sep); + if (pos === -1 || !count--) + { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + string = string.substr(pos + sep.length); + } + return result; + } + else + { + var result = []; + while (string.length) + { + string = ul4._lstrip(string, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + part = string.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + string = string.substr(part.length); + } + return result; + } + } + }; + + ul4._rsplit = function _rsplit(string, sep, count) + { + if (sep !== null && typeof(sep) !== "string") + throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + + if (count === null) + { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + var result = []; + while (string.length) + { + var pos = string.lastIndexOf(sep); + if (pos === -1 || !count--) + { + result.unshift(string); + break; + } + result.unshift(string.substr(pos+sep.length)); + string = string.substr(0, pos); + } + return result; + } + else + { + var result = []; + while (string.length) + { + string = ul4._rstrip(string, null, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + { + part = string.split(/[ \n\r\t]+/); + part = part[part.length-1]; + } + if (part.length) + result.unshift(part); + string = string.substr(0, string.length-part.length); + } + return result; + } + } + }; + + ul4._splitlines = function _splitlines(string, keepends) + { + var lookingAtLineEnd = function lookingAtLineEnd() + { + var c = string[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') + { + if (pos == length-1) + return 1; + if (string[pos+1] === '\n') + return 2; + return 1; + } + return 0; + }; + + var result = [], length = string.length; + + for (var pos = 0, startpos = 0;;) + { + if (pos >= length) + { + if (startpos != pos) + result.push(string.substring(startpos)); + return result; + } + var lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else + { + var endpos = pos + (keepends ? lineendlen : 0); + result.push(string.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } + }; + + ul4._count = function _count(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + var isstr = ul4._isstr(obj); + + if (isstr && !sub.length) + { + if (end < 0 || start > obj.length || start > end) + return 0; + var result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } + + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + var count = 0; + if (ul4._islist(obj)) + { + for (var i = start; i < end; ++i) + { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + var lastIndex = start; + + for (;;) + { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; + ++count; + lastIndex += sub.length; + } + return count; + } + }; + + ul4._find = function _find(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.indexOf(sub); + if (result !== -1) + result += start; + return result; + }; + + ul4._rfind = function _rfind(obj, sub, start, end) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; + return result; + }; + + ul4._capitalize = function _capitalize(obj) + { + if (typeof(obj) != "string") + throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); + + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; + }; + + ul4._items = function _items(obj) + { + if (ul4._ismap(obj)) + { + var result = []; + obj.forEach(function(value, key){ + result.push([key, value]); + }); + return result; + } + else if (ul4._isobject(obj)) + { + var result = []; + for (var key in obj) + result.push([key, obj[key]]); + return result; + } + throw ul4.TypeError.create("items()", "items() requires a dict"); + }; + + ul4._values = function _values(obj) + { + if (ul4._ismap(obj)) + { + var result = []; + obj.forEach(function(value, key){ + result.push(value); + }); + return result; + } + else if (ul4._isobject(obj)) + { + var result = []; + for (var key in obj) + result.push(obj[key]); + return result; + } + throw ul4.TypeError.create("values()", "values() requires a dict"); + }; + + ul4._join = function _join(sep, iterable) + { + var resultlist = []; + for (var iter = ul4._iter(iterable);;) + { + var item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(sep); + }; + + ul4._startswith = function _startswith(string, prefix) + { + if (typeof(prefix) !== "string") + throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); + + return string.substr(0, prefix.length) === prefix; + }; + + ul4._endswith = function _endswith(string, suffix) + { + if (typeof(suffix) !== "string") + throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); + + return string.substr(string.length-suffix.length) === suffix; + }; + + ul4._isoformat = function _isoformat(obj) + { + if (!ul4._isdate(obj)) + throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); + + var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + if (hour || minute || second || ms) + { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; + }; + + ul4._mimeformat = function _mimeformat(obj) + { + var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; + }; + + ul4._weekday = function _weekday(obj) + { + var d = obj.getDay(); + return d ? d-1 : 6; + }; + + ul4._week = function _week(obj, firstweekday) + { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; + + var yearday = ul4._yearday(obj)+6; + var jan1 = new Date(obj.getFullYear(), 0, 1); + var jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; + + while (jan1weekday != firstweekday) + { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; + } + return Math.floor(yearday/7); + }; + + ul4._isleap = function _isleap(obj) + { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; + }; + + ul4._yearday = function _yearday(obj) + { + var leap = ul4._isleap(obj) ? 1 : 0; + var day = obj.getDate(); + switch (obj.getMonth()) + { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; + } + }; + + ul4._append = function _append(obj, items) + { + for (var i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; + }; + + ul4._insert = function _insert(obj, pos, items) + { + if (pos < 0) + pos += obj.length; + + for (var i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; + }; + + ul4._pop = function _pop(obj, pos) + { + if (pos < 0) + pos += obj.length; + + var result = obj[pos]; + obj.splice(pos, 1); + return result; + }; + + ul4._update = function _update(obj, others, kwargs) + { + if (!ul4._isdict(obj)) + throw ul4.TypeError.create("update()", "update() requires a dict"); + for (var i = 0; i < others.length; ++i) + { + var other = others[i]; + if (ul4._ismap(other)) + { + other.forEach(function(value, key){ + ul4on._setmap(obj, key, value); + }); + } + else if (ul4._isobject(other)) + { + for (var key in other) + ul4on._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) + { + for (var j = 0; j < other.length; ++j) + { + if (!ul4._islist(other[j]) || (other[j].length != 2)) + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + ul4on._setmap(obj, other[j][0], other[j][1]); + } + } + else + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + } + for (var key in kwargs) + ul4on._setmap(obj, key, kwargs[key]); + return null; + }; + + ul4._clear = function _clear(obj) + { + if (ul4._ismap(obj)) + obj.clear(); + else if (ul4._isset(obj)) + obj.clear(); + else if (ul4._isobject(obj)) + { + for (var key in obj) + delete obj[key]; + } + else + throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); + return null; + }; + + ul4.Color = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Color", + + create: function create(r, g, b, a) + { + var c = ul4._clone(this); + c._r = typeof(r) !== "undefined" ? r : 0; + c._g = typeof(g) !== "undefined" ? g : 0; + c._b = typeof(b) !== "undefined" ? b : 0; + c._a = typeof(a) !== "undefined" ? a : 255; + return c; + }, + + __repr__: function __repr__() + { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) + { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) + return "#" + r[0] + g[0] + b[0] + a[0]; + else + return "#" + r + g + b + a; + } + else + { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __str__: function __str__() + { + if (this._a !== 0xff) + { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; + } + else + { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __iter__: function __iter__() + { + return { + obj: this, + index: 0, + next: function() { + if (this.index == 0) + { + ++this.index; + return {value: this.obj._r, done: false}; + } + else if (this.index == 1) + { + ++this.index; + return {value: this.obj._g, done: false}; + } + else if (this.index == 2) + { + ++this.index; + return {value: this.obj._b, done: false}; + } + else if (this.index == 3) + { + ++this.index; + return {value: this.obj._a, done: false}; + } + else + return {done: true}; + } + }; + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "r": + return ul4.expose([], function r(){ return self._r; }); + case "g": + return ul4.expose([], function g(){ return self._g; }); + case "b": + return ul4.expose([], function b(){ return self._b; }); + case "a": + return ul4.expose([], function a(){ return self._a; }); + case "lum": + return ul4.expose([], function lum(){ return self.lum(); }); + case "hls": + return ul4.expose([], function hls(){ return self.hls(); }); + case "hlsa": + return ul4.expose([], function hlsa(){ return self.hlsa(); }); + case "hsv": + return ul4.expose([], function hsv(){ return self.hsv(); }); + case "hsva": + return ul4.expose([], function hsva(){ return self.hsva(); }); + case "witha": + return ul4.expose(["a"], function witha(a){ return self.witha(a); }); + case "withlum": + return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); + case "abslum": + return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); + case "rellum": + return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); + default: + return undefined; + } + }, + + __getitem__: function __getitem__(key) + { + var orgkey = key; + if (key < 0) + key += 4; + switch (key) + { + case 0: + return this._r; + case 1: + return this._g; + case 2: + return this._b; + case 3: + return this._a; + default: + return undefined; + } + }, + + __eq__: function __eq__(other) + { + if (ul4._iscolor(other)) + return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; + return false; + }, + + r: ul4.expose([], function r() { return this._r; }), + + g: ul4.expose([], function g() { return this._g; }), + + b: ul4.expose([], function b() { return this._b; }), + + a: ul4.expose([], function a() { return this._a; }), + + lum: ul4.expose([], function lum() {return this.hls()[1]; }), + + hls: ul4.expose([], + function hls() + { + var r = this._r/255.0; + var g = this._g/255.0; + var b = this._b/255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var h, l, s; + var rc, gc, bc; + + l = (minc+maxc)/2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc-minc) / (maxc+minc); + else + s = (maxc-minc) / (2.0-maxc-minc); + rc = (maxc-r) / (maxc-minc); + gc = (maxc-g) / (maxc-minc); + bc = (maxc-b) / (maxc-minc); + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, l, s]; + } + ), + + hlsa: ul4.expose([], + function hlsa() + { + var hls = this.hls(); + return hls.concat(this._a/255.0); + } + ), + + hsv: ul4.expose([], + function hsv() + { + var r = this._r/255.0; + var g = this._g/255.0; + var b = this._b/255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + var s = (maxc-minc) / maxc; + var rc = (maxc-r) / (maxc-minc); + var gc = (maxc-g) / (maxc-minc); + var bc = (maxc-b) / (maxc-minc); + var h; + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, s, v]; + } + ), + + hsva: ul4.expose([], + function hsva() + { + var hsv = this.hsv(); + return hsv.concat(this._a/255.0); + } + ), + + witha: ul4.expose(["a"], + function witha(a) + { + if (typeof(a) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + return ul4.Color.create(this._r, this._g, this._b, a); + } + ), + + withlum: ul4.expose(["lum"], + function withlum(lum) + { + if (typeof(lum) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + var hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + ) + } + ); + + ul4.TimeDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.TimeDelta", + + create: function create(days, seconds, microseconds) + { + var td = ul4._clone(this); + if (typeof(days) === "undefined") + days = 0; + if (typeof(seconds) === "undefined") + seconds = 0; + if (typeof(microseconds) === "undefined") + microseconds = 0; + + var total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); + + microseconds = ul4.ModAST._do(total_microseconds, 1000000); + var total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST._do(total_seconds, 86400); + days = Math.floor(total_seconds / 86400); + if (seconds < 0) + { + seconds += 86400; + --days; + } + + td._microseconds = microseconds; + td._seconds = seconds; + td._days = days; + + return td; + }, + + __repr__: function __repr__() + { + if (!this._microseconds) + { + if (!this._seconds) + { + if (!this._days) + return "timedelta()"; + return "timedelta(" + this._days + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; + }, + + __str__: function __str__() + { + var v = []; + if (this._days) + { + v.push(this._days + " day"); + if (this._days !== -1 && this._days !== 1) + v.push("s"); + v.push(", "); + } + var seconds = this._seconds % 60; + var minutes = Math.floor(this._seconds / 60); + var hours = Math.floor(minutes / 60); + minutes = minutes % 60; + + v.push("" + hours); + v.push(":"); + v.push(ul4._lpad(minutes.toString(), "0", 2)); + v.push(":"); + v.push(ul4._lpad(seconds.toString(), "0", 2)); + if (this._microseconds) + { + v.push("."); + v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); + } + return v.join(""); + }, + + __bool__: function __bool__() + { + return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; + }, + + __abs__: function __abs__() + { + return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; + }, + + __eq__: function __eq__(other) + { + if (ul4._istimedelta(other)) + return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); + return false; + }, + + __lt__: function __lt__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds < other._microseconds; + } + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds <= other._microseconds; + } + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds > other._microseconds; + } + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) + { + if (ul4._istimedelta(other)) + { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds >= other._microseconds; + } + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() + { + return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); + }, + + _add: function _add(date, days, seconds, microseconds) + { + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate() + days; + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds() + seconds; + var millisecond = date.getMilliseconds() + microseconds/1000; + return new Date(year, month, day, hour, minute, second, millisecond); + }, + + __add__: function __add__(other) + { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + else if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __radd__: function __radd__(other) + { + if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __sub__: function __sub__(other) + { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __rsub__: function __rsub__(other) + { + if (ul4._isdate(other)) + return this._add(other, -this._days, -this._seconds, -this._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __mul__: function __mul__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __rmul__: function __rmul__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __truediv__: function __truediv__(other) + { + if (typeof(other) === "number") + { + return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (ul4._istimedelta(other)) + { + var myValue = this._days; + var otherValue = other._days; + var hasSeconds = this._seconds || other._seconds; + var hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) + { + myValue = myValue*86400+this._seconds; + otherValue = otherValue*86400 + other._seconds; + if (hasMicroseconds) + { + myValue = myValue * 1000000 + this._microseconds; + otherValue = otherValue * 1000000 + other._microseconds; + } + } + return myValue/otherValue; + } + throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "days": + return ul4.expose([], function days(){ return self._days; }); + case "seconds": + return ul4.expose([], function seconds(){ return self._seconds; }); + case "microseconds": + return ul4.expose([], function microseconds(){ return self._microseconds; }); + default: + return undefined; + } + }, + + days: function days() + { + return this._days; + }, + + seconds: function seconds() + { + return this._seconds; + }, + + microseconds: function microseconds() + { + return this._microseconds; + } + } + ); + + ul4.MonthDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.MonthDelta", + + create: function create(months) + { + var md = ul4._clone(this); + md._months = typeof(months) !== "undefined" ? months : 0; + return md; + }, + + __repr__: function __repr__() + { + if (!this._months) + return "monthdelta()"; + return "monthdelta(" + this._months + ")"; + }, + + __str__: function __str__() + { + if (this._months) + { + if (this._months !== -1 && this._months !== 1) + return this._months + " months"; + return this._months + " month"; + } + return "0 months"; + }, + + __bool__: function __bool__() + { + return this._months !== 0; + }, + + __abs__: function __abs__() + { + return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; + }, + + __eq__: function __eq__(other) + { + if (ul4._ismonthdelta(other)) + return this._months === other._months; + return false; + }, + + __lt__: function __lt__(other) + { + if (ul4._ismonthdelta(other)) + return this._months < other._months; + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) + { + if (ul4._ismonthdelta(other)) + return this._months <= other._months; + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) + { + if (ul4._ismonthdelta(other)) + return this._months > other._months; + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) + { + if (ul4._ismonthdelta(other)) + return this._months >= other._months; + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() + { + return ul4.MonthDelta.create(-this._months); + }, + + _add: function _add(date, months) + { + var year = date.getFullYear(); + var month = date.getMonth() + months; + var day = date.getDate(); + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds(); + var millisecond = date.getMilliseconds(); + + while (true) + { + // As the month might be out of bounds, we have to find out, what the real target month is + var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + var result = new Date(year, month, day, hour, minute, second, millisecond); + if (result.getMonth() === targetmonth) + return result; + --day; + } + }, + + __add__: function __add__(other) + { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months + other._months); + else if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __radd__: function __radd__(other) + { + if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __sub__: function __sub__(other) + { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months - other._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __rsub__: function __rsub__(other) + { + if (ul4._isdate(other)) + return this._add(other, -this._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __mul__: function __mul__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __rmul__: function __rmul__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __floordiv__: function __floordiv__(other) + { + if (typeof(other) === "number") + return ul4.MonthDelta.create(Math.floor(this._months / other)); + else if (ul4._ismonthdelta(other)) + return Math.floor(this._months / other._months); + throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; + }, + + __truediv__: function __truediv__(other) + { + if (ul4._ismonthdelta(other)) + return this._months / other._months; + throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "months": + return ul4.expose([], function months(){ return self._months; }); + default: + return undefined; + } + }, + + months: function months() + { + return this._months; + } + } + ); + + // When we don't have a real ``Set`` type, emulate one that supports strings + ul4._Set = ul4._inherit( + ul4.Proto, + { + __type__: "ul4._Set", + + create: function create() + { + var set = ul4._clone(this); + set.items = {}; + set.add.apply(set, arguments); + return set; + }, + + add: function add() + { + for (var i = 0; i < arguments.length; ++i) + { + this.items[arguments[i]] = true; + } + }, + + __getattr__: function __getattr__(attrname) + { + var self = this; + switch (attrname) + { + case "add": + return ul4.expose(["*items"], function add(items){ self.add.apply(self, items); }); + default: + return undefined; + } + }, + + __contains__: function __contains__(item) + { + return this.items[item] || false; + }, + + __bool__: function __bool__() + { + for (var item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + }, + + __repr__: function __repr__() + { + var v = []; + v.push("{"); + var i = 0; + for (var item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + }, + + __eq__: function(other) + { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Substract the number of items that ``other`` has + for (var item in other.items) + --count; + return count == 0; + } + else + return false; + }, + + __le__: function(other) + { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in this.items) + { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + }, + + __ge__: function(other) + { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) + { + var result = true; + other.forEach(function(value) { + if (!this.items[value]) + result = false; + }); + return result; + } + else if (ul4._isul4set(other)) + { + var count = 0; + for (var item in other.items) + { + if (!this.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + } + ); + + var classes = [ + "TextAST", + "IndentAST", + "LineEndAST", + "Tag", + "ConstAST", + "SeqItemAST", + "UnpackSeqItemAST", + "DictItemAST", + "UnpackDictItemAST", + "PosArgAST", + "KeywordArgAST", + "UnpackListArgAST", + "UnpackDictArgAST", + "ListAST", + "ListCompAST", + "DictAST", + "DictCompAST", + "SetAST", + "SetCompAST", + "GenExprAST", + "VarAST", + "NotAST", + "NegAST", + "BitNotAST", + "IfAST", + "ReturnAST", + "PrintAST", + "PrintXAST", + "ItemAST", + "IsAST", + "IsNotAST", + "EQAST", + "NEAST", + "LTAST", + "LEAST", + "GTAST", + "GEAST", + "NotContainsAST", + "ContainsAST", + "AddAST", + "SubAST", + "MulAST", + "FloorDivAST", + "TrueDivAST", + "ModAST", + "ShiftLeftAST", + "ShiftRightAST", + "BitAndAST", + "BitXOrAST", + "BitOrAST", + "AndAST", + "OrAST", + "SliceAST", + "AttrAST", + "CallAST", + "RenderAST", + "SetVarAST", + "AddVarAST", + "SubVarAST", + "MulVarAST", + "TrueDivVarAST", + "FloorDivVarAST", + "ModVarAST", + "ShiftLeftVarAST", + "ShiftRightVarAST", + "BitAndVarAST", + "BitXOrVarAST", + "BitOrVarAST", + "ForBlockAST", + "WhileBlockAST", + "BreakAST", + "ContinueAST", + "CondBlockAST", + "IfBlockAST", + "ElIfBlockAST", + "ElseBlockAST", + "SignatureAST", + "Template" + ]; + + for (var i = 0; i < classes.length; ++i) + { + var name = classes[i]; + var ul4onname = name; + if (ul4onname.substr(ul4onname.length-3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length-3); + ul4onname = ul4onname.toLowerCase(); + var object = ul4[name]; + object.typename = name; + object.type = ul4onname; + ul4on.register("de.livinglogic.ul4." + ul4onname, object); + } + + })(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7a352b8..9bdbc63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,12 +20,6 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, - "@types/estree": { - "version": "0.0.38", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", - "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==", - "dev": true - }, "@types/node": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.3.tgz", @@ -2949,12 +2943,6 @@ "is-extglob": "2.1.1" } }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4989,35 +4977,6 @@ "glob": "7.1.1" } }, - "rollup": { - "version": "0.58.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", - "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", - "dev": true, - "requires": { - "@types/estree": "0.0.38", - "@types/node": "10.0.3" - } - }, - "rollup-plugin-node-resolve": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", - "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", - "dev": true, - "requires": { - "builtin-modules": "2.0.0", - "is-module": "1.0.0", - "resolve": "1.7.1" - }, - "dependencies": { - "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - } - } - }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", diff --git a/package.json b/package.json index 68d1d61..9462cd9 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,13 @@ "version": "0.3.0", "description": "livingapps api for javascript (nodjs and browser) written in typescript", "main": "dist/livingsdk.js", - "t ypes": "dist/livingsdk.d.ts", + "types": "dist/livingsdk.d.ts", "repository": { "type": "git", "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "tsc -p ./tsconfig.cjs.json && mocha", + "test": "npm run build && mocha", "build": "sh shellscripts/build.sh" }, "author": "Living Logic AG", @@ -23,8 +23,6 @@ "chai": "^4.1.2", "express": "^4.15.4", "mocha": "^3.5.2", - "rollup": "^0.58.2", - "rollup-plugin-node-resolve": "^3.3.0", "typescript": "^2.8.3", "webpack-cli": "^2.1.2" } diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index c19dc52..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,9 +0,0 @@ -export default { - - input: 'dist/livingsdk.js', - output: { - file: 'dist/bundle.js', - format: 'iife', - name: 'LivingSDK' - } -} \ No newline at end of file diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 03e0dac..21c548f 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,5 +1,6 @@ echo build LivingApps.Javascript.LivingAPI tsc -p ./tsconfig.json & -tsc -p ./tsconfig.cjs.json -echo bundle it -rollup -c rollup.config.js \ No newline at end of file +tsc -p ./tsconfig.umd.json +echo copy modules +cp -R ./src/modules ./dist/es2015/ +cp -R ./src/modules ./dist/umd/ \ No newline at end of file diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts new file mode 100644 index 0000000..7f00b6a --- /dev/null +++ b/src/modules/livingapi.d.ts @@ -0,0 +1,36 @@ +import { LOADIPHLPAPI } from "dns"; + +export interface Base { + create: (...args: any[]) => any; + ul4ondump: (encoder: any) => any; + ul4onload: (decoder: any) => any; +} + +export interface Globals extends Base { + /** distance between two geo coordinates */ + geodist: (geo1: any, geo2: any) => any; +} + +export interface FlashMessage extends Base { + +} + +export interface App extends Base { + insert: (values: any) => Record; +} + +export interface View extends Base { + +} + +export interface DataSource extends Base { + +} + +export interface Record extends Base { + +} + +export interface Control extends Base { + asjons:(...gitany: any[]) => any; +} \ No newline at end of file diff --git a/test/node_test.js b/test/node_test.js index 34d35a7..7c8f13b 100644 --- a/test/node_test.js +++ b/test/node_test.js @@ -3,7 +3,7 @@ let config; let defaultSettings = { } if (typeof module === 'object' && module.exports){ - test(require('../dist/livingsdk').default, require('./config')); + test(require('../dist/umd/livingsdk').default, require('./config')); } else { test(window.LivingSDK, window.configs); } diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json deleted file mode 100644 index 33173cb..0000000 --- a/tsconfig.cjs.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", - //"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist/cjs", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 764d60c..17f6d16 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "declaration": true, /* Generates corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ + "outDir": "./dist/es2015", /* Redirect output structure to the directory. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ diff --git a/tsconfig.umd.json b/tsconfig.umd.json new file mode 100644 index 0000000..c38a65d --- /dev/null +++ b/tsconfig.umd.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + + "target": "es6", + "module": "commonjs", + "declaration": true, + "outDir": "./dist/umd", + "rootDir": "./src", + "removeComments": true, + "moduleResolution": "node", + "esModuleInterop": true + } +} \ No newline at end of file From cbe631ba8622eac0b455d78e9656d36872f31864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 11 May 2018 11:42:13 +0200 Subject: [PATCH 08/43] fix main files - es2015 as standard --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9462cd9..891b034 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "livingsdk", "version": "0.3.0", "description": "livingapps api for javascript (nodjs and browser) written in typescript", - "main": "dist/livingsdk.js", - "types": "dist/livingsdk.d.ts", + "main": "dist/es2015/livingsdk.js", + "types": "dist/es2015/livingsdk.d.ts", "repository": { "type": "git", "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" From bb303fc2e704c039d6ee19ce964b5b0055c159d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 11 May 2018 13:20:13 +0200 Subject: [PATCH 09/43] get() - allow one parameter --- src/livingsdk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index fca5e3c..c741140 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -78,7 +78,7 @@ export default class LivingSDK { .then((a: any) => a.data.auth_token); } - get(appId: string, templateName: string): Promise { + get(appId: string, templateName?: string): Promise { return this.session.then((auth_token: Auth_Token | undefined) => { return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { From d2134ae01a1de61a739fa1158edd3eeeee7092ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 11 May 2018 13:23:28 +0200 Subject: [PATCH 10/43] hotfix --- dist/es2015/livingsdk.d.ts | 2 +- dist/umd/livingsdk.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/es2015/livingsdk.d.ts b/dist/es2015/livingsdk.d.ts index 98ac88a..cda6ef5 100644 --- a/dist/es2015/livingsdk.d.ts +++ b/dist/es2015/livingsdk.d.ts @@ -13,7 +13,7 @@ export default class LivingSDK { private session; constructor(options: any, username: string, password: string); login(): Promise; - get(appId: string, templateName: string): Promise; + get(appId: string, templateName?: string): Promise; _insert(app: any, values: any): Promise; _update(record: LAPIRecord, values: any): Promise; _delete(record: LAPIRecord): Promise; diff --git a/dist/umd/livingsdk.d.ts b/dist/umd/livingsdk.d.ts index 98ac88a..cda6ef5 100644 --- a/dist/umd/livingsdk.d.ts +++ b/dist/umd/livingsdk.d.ts @@ -13,7 +13,7 @@ export default class LivingSDK { private session; constructor(options: any, username: string, password: string); login(): Promise; - get(appId: string, templateName: string): Promise; + get(appId: string, templateName?: string): Promise; _insert(app: any, values: any): Promise; _update(record: LAPIRecord, values: any): Promise; _delete(record: LAPIRecord): Promise; From d1ea05aa16e8ab18038289c04a853df09c822f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 30 May 2018 13:50:50 +0200 Subject: [PATCH 11/43] start testing env - added ts-node for compiling - added chai - added mocha - ts: set umd modules as default - livingapps.d.ts -- begin - changed internal name to livingSDK --- .gitignore | 4 +- config/tsconfig.es2015.json | 18 +++++++++ package-lock.json | 70 ++++++++++++++++++++++++++++++++ package.json | 5 ++- shellscripts/build.sh | 9 +++-- src/livingsdk.ts | 26 ++++++------ src/modules/livingapi.d.ts | 81 +++++++++++++++++++++++++++++++++++-- tsconfig.json | 66 ++++++------------------------ tsconfig.umd.json | 13 ------ 9 files changed, 203 insertions(+), 89 deletions(-) create mode 100644 config/tsconfig.es2015.json delete mode 100644 tsconfig.umd.json diff --git a/.gitignore b/.gitignore index 802f3ce..0218529 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ node_modules test/config.js Archiv.zip node.js -**/old_* \ No newline at end of file +**/old_* +.vscode +**/config.ts \ No newline at end of file diff --git a/config/tsconfig.es2015.json b/config/tsconfig.es2015.json new file mode 100644 index 0000000..f9d28ef --- /dev/null +++ b/config/tsconfig.es2015.json @@ -0,0 +1,18 @@ +{ + "exclude": [ + "**/*.test.ts" + ], + "include": [ + "../src/**/*.ts" + ], + "compilerOptions": { + + "target": "es2015", + "module": "es2015", + "declaration": true, + "outDir": "../dist/es2015", + "removeComments": true, + "moduleResolution": "node", + "esModuleInterop": true + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9bdbc63..47974e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,18 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@types/chai": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz", + "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==", + "dev": true + }, + "@types/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-YeDiSEzznwZwwp766SJ6QlrTyBYUGPSIwmREHVTmktUYiT/WADdWtpt9iH0KuUSf8lZLdI4lP0X6PBzPo5//JQ==", + "dev": true + }, "@types/node": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.3.tgz", @@ -1165,6 +1177,12 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -3753,6 +3771,12 @@ "pify": "3.0.0" } }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5583,6 +5607,46 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "ts-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.0.3.tgz", + "integrity": "sha512-ARaOMNFEPKg2ZuC1qJddFvHxHNFVckR0g9xLxMIoMqSSIkDc8iS4/LoV53EdDWWNq2FGwqcEf0bVVGJIWpsznw==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.4.1", + "diff": "3.2.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.6", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "source-map": "0.6.1" + } + } + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -6252,6 +6316,12 @@ "dev": true } } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/package.json b/package.json index 891b034..99371da 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "npm run build && mocha", + "test": "mocha -r ts-node/register src/**/*.test.ts", "build": "sh shellscripts/build.sh" }, "author": "Living Logic AG", @@ -19,10 +19,13 @@ "blueimp-md5": "^2.10.0" }, "devDependencies": { + "@types/chai": "^4.1.3", + "@types/mocha": "^5.2.0", "@types/node": "^10.0.3", "chai": "^4.1.2", "express": "^4.15.4", "mocha": "^3.5.2", + "ts-node": "^6.0.3", "typescript": "^2.8.3", "webpack-cli": "^2.1.2" } diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 21c548f..6f7186d 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,6 +1,9 @@ +rm -Rf ./dist echo build LivingApps.Javascript.LivingAPI -tsc -p ./tsconfig.json & -tsc -p ./tsconfig.umd.json +tsc -p ./config/tsconfig.es2015.json & +tsc -p ./config/tsconfig.umd.json +wait echo copy modules cp -R ./src/modules ./dist/es2015/ -cp -R ./src/modules ./dist/umd/ \ No newline at end of file +cp -R ./src/modules ./dist/umd/ +echo finished copying \ No newline at end of file diff --git a/src/livingsdk.ts b/src/livingsdk.ts index c741140..0ab3de4 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -1,5 +1,5 @@ import * as https from 'https'; -import { AxiosStatic, AxiosResponse } from 'axios'; +import axios, { AxiosStatic, AxiosResponse } from 'axios'; declare let module: any; declare let require: any; @@ -11,39 +11,36 @@ export type LAPIRecord = any; let commonjs = (typeof module === 'object' && module.exports); let nodejs: any = {}; -let axios: any = undefined; let ul4on: any; let livingApi: any; if (commonjs) { livingApi = require('./modules/livingapi'); nodejs.https = require('https') - axios = require('axios'); ul4on = require('./modules/ul4').ul4on; } else { - axios = window.axios; ul4on = window.ul4on; livingApi = window.livingapi; } -export interface LivingAPIOptions { - url: string; - loginRequired: boolean; +export interface LivingSDKOptions { + url?: string; + loginRequired?: boolean; } -export default class LivingSDK { +export class LivingSDK { private _password: string; private _userName: string; - private _options: LivingAPIOptions + private _options: LivingSDKOptions private hostName: string; private session: Promise; - constructor(options: any = {}, username: string, password: string) { + constructor(options: LivingSDKOptions = {}, username?: string, password?: string) { /** @type {String} */ - this._password = password; + this._password = password || ''; /** @type {String} */ - this._userName = username; + this._userName = username || ''; /** @type {Object} */ this._options = { /** @type {String} */ - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + url: options.url || 'https://my.living-apps.de', /** @type {Boolean} */ loginRequired: options.loginRequired !== undefined ? options.loginRequired : true }; @@ -195,4 +192,5 @@ export default class LivingSDK { }) } }; - \ No newline at end of file + +export default LivingSDK; \ No newline at end of file diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts index 7f00b6a..df3642e 100644 --- a/src/modules/livingapi.d.ts +++ b/src/modules/livingapi.d.ts @@ -1,4 +1,4 @@ -import { LOADIPHLPAPI } from "dns"; +import { AxiosResponse } from "axios"; export interface Base { create: (...args: any[]) => any; @@ -28,9 +28,84 @@ export interface DataSource extends Base { } export interface Record extends Base { - + update: (values: any) => Record; + delete: () => AxiosResponse; } export interface Control extends Base { - asjons:(...gitany: any[]) => any; + asjson:(...any: any[]) => any; + ul4onload: (...any: any[]) => any; + +} + +export interface BoolControl extends Control { + search: (value: any, search: null | boolean) => boolean; +} + +export interface IntControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface NumberControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface StringControl extends Control { + asjson:(...any: any[]) => any; + search: (value: any, search: null | string) => boolean; +} + +export interface TextControl extends StringControl { + +} + +export interface EmailControl extends StringControl { + +} + +export interface TelControl extends StringControl { + +} + +export interface PasswordControl extends StringControl { + +} + +export interface TextAreaControl extends StringControl { + +} + +export interface DateControl extends Control { + asjson: (...any: any[]) => any; + formatString: (language: string) => string; + search: (value: any, search: null | Date | string) => boolean; +} + +export interface DatetimeMinuteControl extends DateControl { + formatString: (language: string) => string; +} + +export interface DatetimeSecondControl extends DateControl { + formatString: (language: string) => string; +} + +export interface LookupControl extends Control { + ul4onload: (decoder: any) => any; + search: (value: any, search: any) => boolean; +} + +export interface LookupSelectControl extends LookupControl { + +} + +export interface LookupRadioControl extends LookupControl { + +} + +export interface LookupChoiceControl extends LookupControl { + +} + +export interface AppLookupControl extends Control { + } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 17f6d16..d1ee373 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,58 +1,16 @@ { + "include": [ + "./src/**/*.ts" + ], "compilerOptions": { - /* Basic Options */ - "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - //"module": "commonjs", - "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist/es2015", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + "target": "es2015", + "module": "umd", + "declaration": true, - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - } + "outDir": "./dist/umd", + "removeComments": true, + "moduleResolution": "node", + "esModuleInterop": true + } } \ No newline at end of file diff --git a/tsconfig.umd.json b/tsconfig.umd.json deleted file mode 100644 index c38a65d..0000000 --- a/tsconfig.umd.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - - "target": "es6", - "module": "commonjs", - "declaration": true, - "outDir": "./dist/umd", - "rootDir": "./src", - "removeComments": true, - "moduleResolution": "node", - "esModuleInterop": true - } -} \ No newline at end of file From ac3161d2679d9c22716d07bf307903fa017b8dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 30 May 2018 13:53:14 +0200 Subject: [PATCH 12/43] set config/tsconfig.umd.json as default tsconfig.json --- shellscripts/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 6f7186d..476c35e 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,7 +1,7 @@ rm -Rf ./dist echo build LivingApps.Javascript.LivingAPI tsc -p ./config/tsconfig.es2015.json & -tsc -p ./config/tsconfig.umd.json +tsc -p ./tsconfig.json wait echo copy modules cp -R ./src/modules ./dist/es2015/ From 699d8f12a1a719f7c11050c755805e285ec52f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 30 May 2018 13:53:21 +0200 Subject: [PATCH 13/43] build --- dist/es2015/livingsdk.d.ts | 20 +- dist/es2015/livingsdk.js | 13 +- dist/es2015/livingsdk.test.d.ts | 1 + dist/es2015/livingsdk.test.js | 13 ++ dist/es2015/modules/livingapi.d.ts | 81 +++++++- dist/umd/livingsdk.d.ts | 20 +- dist/umd/livingsdk.js | 298 +++++++++++++++-------------- dist/umd/livingsdk.test.d.ts | 1 + dist/umd/livingsdk.test.js | 25 +++ dist/umd/modules/livingapi.d.ts | 81 +++++++- src/livingsdk.test.ts | 18 ++ 11 files changed, 401 insertions(+), 170 deletions(-) create mode 100644 dist/es2015/livingsdk.test.d.ts create mode 100644 dist/es2015/livingsdk.test.js create mode 100644 dist/umd/livingsdk.test.d.ts create mode 100644 dist/umd/livingsdk.test.js create mode 100644 src/livingsdk.test.ts diff --git a/dist/es2015/livingsdk.d.ts b/dist/es2015/livingsdk.d.ts index cda6ef5..aa527ac 100644 --- a/dist/es2015/livingsdk.d.ts +++ b/dist/es2015/livingsdk.d.ts @@ -1,20 +1,26 @@ +import { AxiosResponse } from 'axios'; export declare type Auth_Token = string; export declare type LivingApi = any; export declare type LAPIRecord = any; -export interface LivingAPIOptions { - url: string; - loginRequired: boolean; +export interface LivingSDKOptions { + url?: string; + loginRequired?: boolean; } -export default class LivingSDK { +export declare class LivingSDK { private _password; private _userName; private _options; private hostName; private session; - constructor(options: any, username: string, password: string); + constructor(options?: LivingSDKOptions, username?: string, password?: string); login(): Promise; get(appId: string, templateName?: string): Promise; _insert(app: any, values: any): Promise; - _update(record: LAPIRecord, values: any): Promise; - _delete(record: LAPIRecord): Promise; + _update(record: LAPIRecord, values: any): Promise<{ + HTTPstatusCode: number; + recordid: any; + Record: any; + }>; + _delete(record: LAPIRecord): Promise>; } +export default LivingSDK; diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index 051acb5..dbd03e6 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -1,25 +1,23 @@ +import axios from 'axios'; let commonjs = (typeof module === 'object' && module.exports); let nodejs = {}; -let axios = undefined; let ul4on; let livingApi; if (commonjs) { livingApi = require('./modules/livingapi'); nodejs.https = require('https'); - axios = require('axios'); ul4on = require('./modules/ul4').ul4on; } else { - axios = window.axios; ul4on = window.ul4on; livingApi = window.livingapi; } -export default class LivingSDK { +export class LivingSDK { constructor(options = {}, username, password) { - this._password = password; - this._userName = username; + this._password = password || ''; + this._userName = username || ''; this._options = { - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', + url: options.url || 'https://my.living-apps.de', loginRequired: options.loginRequired !== undefined ? options.loginRequired : true }; this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; @@ -157,3 +155,4 @@ export default class LivingSDK { } } ; +export default LivingSDK; diff --git a/dist/es2015/livingsdk.test.d.ts b/dist/es2015/livingsdk.test.d.ts new file mode 100644 index 0000000..53eb506 --- /dev/null +++ b/dist/es2015/livingsdk.test.d.ts @@ -0,0 +1 @@ +import 'mocha'; diff --git a/dist/es2015/livingsdk.test.js b/dist/es2015/livingsdk.test.js new file mode 100644 index 0000000..e67b40b --- /dev/null +++ b/dist/es2015/livingsdk.test.js @@ -0,0 +1,13 @@ +import { LivingSDK } from './livingsdk'; +import { expect } from 'chai'; +import 'mocha'; +describe('LivingSDK: ', () => { + describe('login', () => { + it('successfull login', () => { + let lsdk = new LivingSDK({ loginRequired: false }); + return lsdk.login().then((auth_token) => { + expect(typeof auth_token).to.equal('undefined'); + }); + }); + }); +}); diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts index 7f00b6a..df3642e 100644 --- a/dist/es2015/modules/livingapi.d.ts +++ b/dist/es2015/modules/livingapi.d.ts @@ -1,4 +1,4 @@ -import { LOADIPHLPAPI } from "dns"; +import { AxiosResponse } from "axios"; export interface Base { create: (...args: any[]) => any; @@ -28,9 +28,84 @@ export interface DataSource extends Base { } export interface Record extends Base { - + update: (values: any) => Record; + delete: () => AxiosResponse; } export interface Control extends Base { - asjons:(...gitany: any[]) => any; + asjson:(...any: any[]) => any; + ul4onload: (...any: any[]) => any; + +} + +export interface BoolControl extends Control { + search: (value: any, search: null | boolean) => boolean; +} + +export interface IntControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface NumberControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface StringControl extends Control { + asjson:(...any: any[]) => any; + search: (value: any, search: null | string) => boolean; +} + +export interface TextControl extends StringControl { + +} + +export interface EmailControl extends StringControl { + +} + +export interface TelControl extends StringControl { + +} + +export interface PasswordControl extends StringControl { + +} + +export interface TextAreaControl extends StringControl { + +} + +export interface DateControl extends Control { + asjson: (...any: any[]) => any; + formatString: (language: string) => string; + search: (value: any, search: null | Date | string) => boolean; +} + +export interface DatetimeMinuteControl extends DateControl { + formatString: (language: string) => string; +} + +export interface DatetimeSecondControl extends DateControl { + formatString: (language: string) => string; +} + +export interface LookupControl extends Control { + ul4onload: (decoder: any) => any; + search: (value: any, search: any) => boolean; +} + +export interface LookupSelectControl extends LookupControl { + +} + +export interface LookupRadioControl extends LookupControl { + +} + +export interface LookupChoiceControl extends LookupControl { + +} + +export interface AppLookupControl extends Control { + } \ No newline at end of file diff --git a/dist/umd/livingsdk.d.ts b/dist/umd/livingsdk.d.ts index cda6ef5..aa527ac 100644 --- a/dist/umd/livingsdk.d.ts +++ b/dist/umd/livingsdk.d.ts @@ -1,20 +1,26 @@ +import { AxiosResponse } from 'axios'; export declare type Auth_Token = string; export declare type LivingApi = any; export declare type LAPIRecord = any; -export interface LivingAPIOptions { - url: string; - loginRequired: boolean; +export interface LivingSDKOptions { + url?: string; + loginRequired?: boolean; } -export default class LivingSDK { +export declare class LivingSDK { private _password; private _userName; private _options; private hostName; private session; - constructor(options: any, username: string, password: string); + constructor(options?: LivingSDKOptions, username?: string, password?: string); login(): Promise; get(appId: string, templateName?: string): Promise; _insert(app: any, values: any): Promise; - _update(record: LAPIRecord, values: any): Promise; - _delete(record: LAPIRecord): Promise; + _update(record: LAPIRecord, values: any): Promise<{ + HTTPstatusCode: number; + recordid: any; + Record: any; + }>; + _delete(record: LAPIRecord): Promise>; } +export default LivingSDK; diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index 986aa1d..d965fd4 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -1,162 +1,174 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -let commonjs = (typeof module === 'object' && module.exports); -let nodejs = {}; -let axios = undefined; -let ul4on; -let livingApi; -if (commonjs) { - livingApi = require('./modules/livingapi'); - nodejs.https = require('https'); - axios = require('axios'); - ul4on = require('./modules/ul4').ul4on; -} -else { - axios = window.axios; - ul4on = window.ul4on; - livingApi = window.livingapi; -} -class LivingSDK { - constructor(options = {}, username, password) { - this._password = password; - this._userName = username; - this._options = { - url: options.url !== undefined ? options.url : 'https://my.living-apps.de', - loginRequired: options.loginRequired !== undefined ? options.loginRequired : true - }; - this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; - this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); - if (this._options.loginRequired && !this._userName) { - throw new Error('[LivingSDK] You want to login without a username'); - } - this.session = this.login(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; } - login() { - if (!this._options.loginRequired) { - return Promise.resolve(undefined); - } - let url = `https://${this.hostName}/gateway/login`; - return axios.post(url, { - username: this._userName, - password: this._password - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - "Content-Type": "application/json" - } - }) - .then((a) => a.data.auth_token); + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "axios"], factory); } - get(appId, templateName) { - return this.session.then((auth_token) => { - return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - Accept: 'application/la-ul4on' - } - }) - .then((res) => { - let dump; - dump = ul4on.loads(res.data); - dump.get('globals').Login = this; - return dump; - }); - }); +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + const axios_1 = __importDefault(require("axios")); + let commonjs = (typeof module === 'object' && module.exports); + let nodejs = {}; + let ul4on; + let livingApi; + if (commonjs) { + livingApi = require('./modules/livingapi'); + nodejs.https = require('https'); + ul4on = require('./modules/ul4').ul4on; } - _insert(app, values) { - return this.session.then((auth_token) => { - let fields = {}; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`insert() got an unexpected keyword argument ${ident}`); - } - fields[ident] = app.controls.get(ident).asjson(values[ident]); + else { + ul4on = window.ul4on; + livingApi = window.livingapi; + } + class LivingSDK { + constructor(options = {}, username, password) { + this._password = password || ''; + this._userName = username || ''; + this._options = { + url: options.url || 'https://my.living-apps.de', + loginRequired: options.loginRequired !== undefined ? options.loginRequired : true + }; + this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; + this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); + if (this._options.loginRequired && !this._userName) { + throw new Error('[LivingSDK] You want to login without a username'); } - let data = {}; - { + this.session = this.login(); + } + login() { + if (!this._options.loginRequired) { + return Promise.resolve(undefined); } - data.id = app.id; - data.data = [{ 'fields': fields }]; - return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data + let url = `https://${this.hostName}/gateway/login`; + return axios_1.default.post(url, { + username: this._userName, + password: this._password }, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + "Content-Type": "application/json" } }) - .then((res) => { - return { - HTTPstatusCode: res.status, - recordid: res.data.id, - Record: livingApi.Record.create({ - id: res.data.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; + .then((a) => a.data.auth_token); + } + get(appId, templateName) { + return this.session.then((auth_token) => { + return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + Accept: 'application/la-ul4on' + } + }) + .then((res) => { + let dump; + dump = ul4on.loads(res.data); + dump.get('globals').Login = this; + return dump; + }); }); - }); - } - _update(record, values) { - return this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + _insert(app, values) { + return this.session.then((auth_token) => { + let fields = {}; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`insert() got an unexpected keyword argument ${ident}`); + } + fields[ident] = app.controls.get(ident).asjson(values[ident]); } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{ 'id': record.id, 'fields': fields }]; - return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - 'Content-Type': 'application/json' + let data = {}; + { } - }) - .then((res) => { - let body = res.data; - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.status, - recordid: body.id, - Record: record - }; - return returnObj; + data.id = app.id; + data.data = [{ 'fields': fields }]; + return axios_1.default.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }) + .then((res) => { + return { + HTTPstatusCode: res.status, + recordid: res.data.id, + Record: livingApi.Record.create({ + id: res.data.id, + createdat: new Date(Date.now()), + updatedat: null, + updatedby: null, + updatecount: 0 + }) + }; + }); }); - }); - } - _delete(record) { - let app = record.app; - return this.session.then((auth_token) => { - return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + _update(record, values) { + return this.session.then((auth_token) => { + let fields = {}; + let app = record.app; + for (let ident in values) { + if (!app.controls.has(ident)) { + throw new Error(`update() got an unexpected keyword argument ${ident}`); + } + fields[ident] = values[ident]; } + let data = {}; + data.id = app.id; + data.data = [{ 'id': record.id, 'fields': fields }]; + return axios_1.default.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { + appdd: data + }, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + 'Content-Type': 'application/json' + } + }) + .then((res) => { + let body = res.data; + for (let ident in values) + record.fields.get(ident).value = values[ident]; + let returnObj = { + HTTPstatusCode: res.status, + recordid: body.id, + Record: record + }; + return returnObj; + }); }); - }); + } + _delete(record) { + let app = record.app; + return this.session.then((auth_token) => { + return axios_1.default.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { + httpsAgent: commonjs ? new nodejs.https.Agent({ + ecdhCurve: 'auto' + }) : undefined, + headers: { + 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', + } + }); + }); + } } -} -exports.default = LivingSDK; -; + exports.LivingSDK = LivingSDK; + ; + exports.default = LivingSDK; +}); diff --git a/dist/umd/livingsdk.test.d.ts b/dist/umd/livingsdk.test.d.ts new file mode 100644 index 0000000..53eb506 --- /dev/null +++ b/dist/umd/livingsdk.test.d.ts @@ -0,0 +1 @@ +import 'mocha'; diff --git a/dist/umd/livingsdk.test.js b/dist/umd/livingsdk.test.js new file mode 100644 index 0000000..22d682a --- /dev/null +++ b/dist/umd/livingsdk.test.js @@ -0,0 +1,25 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "./livingsdk", "chai", "mocha"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + const livingsdk_1 = require("./livingsdk"); + const chai_1 = require("chai"); + require("mocha"); + describe('LivingSDK: ', () => { + describe('login', () => { + it('successfull login', () => { + let lsdk = new livingsdk_1.LivingSDK({ loginRequired: false }); + return lsdk.login().then((auth_token) => { + chai_1.expect(typeof auth_token).to.equal('undefined'); + }); + }); + }); + }); +}); diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts index 7f00b6a..df3642e 100644 --- a/dist/umd/modules/livingapi.d.ts +++ b/dist/umd/modules/livingapi.d.ts @@ -1,4 +1,4 @@ -import { LOADIPHLPAPI } from "dns"; +import { AxiosResponse } from "axios"; export interface Base { create: (...args: any[]) => any; @@ -28,9 +28,84 @@ export interface DataSource extends Base { } export interface Record extends Base { - + update: (values: any) => Record; + delete: () => AxiosResponse; } export interface Control extends Base { - asjons:(...gitany: any[]) => any; + asjson:(...any: any[]) => any; + ul4onload: (...any: any[]) => any; + +} + +export interface BoolControl extends Control { + search: (value: any, search: null | boolean) => boolean; +} + +export interface IntControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface NumberControl extends Control { + search: (value: any, search: null | number) => boolean; +} + +export interface StringControl extends Control { + asjson:(...any: any[]) => any; + search: (value: any, search: null | string) => boolean; +} + +export interface TextControl extends StringControl { + +} + +export interface EmailControl extends StringControl { + +} + +export interface TelControl extends StringControl { + +} + +export interface PasswordControl extends StringControl { + +} + +export interface TextAreaControl extends StringControl { + +} + +export interface DateControl extends Control { + asjson: (...any: any[]) => any; + formatString: (language: string) => string; + search: (value: any, search: null | Date | string) => boolean; +} + +export interface DatetimeMinuteControl extends DateControl { + formatString: (language: string) => string; +} + +export interface DatetimeSecondControl extends DateControl { + formatString: (language: string) => string; +} + +export interface LookupControl extends Control { + ul4onload: (decoder: any) => any; + search: (value: any, search: any) => boolean; +} + +export interface LookupSelectControl extends LookupControl { + +} + +export interface LookupRadioControl extends LookupControl { + +} + +export interface LookupChoiceControl extends LookupControl { + +} + +export interface AppLookupControl extends Control { + } \ No newline at end of file diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts new file mode 100644 index 0000000..5879969 --- /dev/null +++ b/src/livingsdk.test.ts @@ -0,0 +1,18 @@ +import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; +import { expect } from 'chai'; +import 'mocha' + +describe('LivingSDK: ', () => { + /* + * test login + * - getAuthToken + */ + describe('login', () => { + it('successfull login', () => { + let lsdk = new LivingSDK({loginRequired: false}); + return lsdk.login().then((auth_token: Auth_Token) => { + expect(typeof auth_token).to.equal('undefined'); + }) + }) + }) +}); \ No newline at end of file From d0920f28112f21ad74bbfae34e6253b2a56a126c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 30 May 2018 14:00:43 +0200 Subject: [PATCH 14/43] ts: remove test outputs --- dist/es2015/livingsdk.test.d.ts | 1 - dist/es2015/livingsdk.test.js | 13 ------------- dist/umd/livingsdk.test.d.ts | 1 - dist/umd/livingsdk.test.js | 25 ------------------------- 4 files changed, 40 deletions(-) delete mode 100644 dist/es2015/livingsdk.test.d.ts delete mode 100644 dist/es2015/livingsdk.test.js delete mode 100644 dist/umd/livingsdk.test.d.ts delete mode 100644 dist/umd/livingsdk.test.js diff --git a/dist/es2015/livingsdk.test.d.ts b/dist/es2015/livingsdk.test.d.ts deleted file mode 100644 index 53eb506..0000000 --- a/dist/es2015/livingsdk.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -import 'mocha'; diff --git a/dist/es2015/livingsdk.test.js b/dist/es2015/livingsdk.test.js deleted file mode 100644 index e67b40b..0000000 --- a/dist/es2015/livingsdk.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import { LivingSDK } from './livingsdk'; -import { expect } from 'chai'; -import 'mocha'; -describe('LivingSDK: ', () => { - describe('login', () => { - it('successfull login', () => { - let lsdk = new LivingSDK({ loginRequired: false }); - return lsdk.login().then((auth_token) => { - expect(typeof auth_token).to.equal('undefined'); - }); - }); - }); -}); diff --git a/dist/umd/livingsdk.test.d.ts b/dist/umd/livingsdk.test.d.ts deleted file mode 100644 index 53eb506..0000000 --- a/dist/umd/livingsdk.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -import 'mocha'; diff --git a/dist/umd/livingsdk.test.js b/dist/umd/livingsdk.test.js deleted file mode 100644 index 22d682a..0000000 --- a/dist/umd/livingsdk.test.js +++ /dev/null @@ -1,25 +0,0 @@ -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "./livingsdk", "chai", "mocha"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const livingsdk_1 = require("./livingsdk"); - const chai_1 = require("chai"); - require("mocha"); - describe('LivingSDK: ', () => { - describe('login', () => { - it('successfull login', () => { - let lsdk = new livingsdk_1.LivingSDK({ loginRequired: false }); - return lsdk.login().then((auth_token) => { - chai_1.expect(typeof auth_token).to.equal('undefined'); - }); - }); - }); - }); -}); From a35a9acc87ca9197d01ce2d6a9b612d7471f44ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 11:12:46 +0200 Subject: [PATCH 15/43] hotfix templates as get parameters - -''- --- .gitignore | 4 +++- src/livingsdk.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0218529..773aa1d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ Archiv.zip node.js **/old_* .vscode -**/config.ts \ No newline at end of file +**/config.ts +**/*.test.js +**/*.test.d.ts \ No newline at end of file diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 0ab3de4..9328532 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -77,7 +77,7 @@ export class LivingSDK { get(appId: string, templateName?: string): Promise { return this.session.then((auth_token: Auth_Token | undefined) => { - return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' From e7ac71beb132e913690717bc912a9a62f0547973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 11:23:48 +0200 Subject: [PATCH 16/43] removed dependecies - webpack --- .gitignore | 5 +- package-lock.json | 6524 ++++----------------------------------------- package.json | 9 +- 3 files changed, 531 insertions(+), 6007 deletions(-) diff --git a/.gitignore b/.gitignore index 773aa1d..3ffbe6d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ node.js .vscode **/config.ts **/*.test.js -**/*.test.d.ts \ No newline at end of file +**/*.test.d.ts +**/config.ts +**/config.js +**/config.d.ts \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 47974e7..8432a6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,22 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" - } - }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", - "dev": true - }, "@types/chai": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz", @@ -27,15 +11,15 @@ "dev": true }, "@types/mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-YeDiSEzznwZwwp766SJ6QlrTyBYUGPSIwmREHVTmktUYiT/WADdWtpt9iH0KuUSf8lZLdI4lP0X6PBzPo5//JQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.1.tgz", + "integrity": "sha512-dOrgprHnkDaj1pmrwdcMAf0QRNQzqTB5rxJph+iIQshSmIvtgRqJ0nim8u1vvXU8iOXZrH96+M46JDFTPLingA==", "dev": true }, "@types/node": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.3.tgz", - "integrity": "sha512-J7nx6JzxmtT4zyvfLipYL7jNaxvlCWpyG7JhhCQ4fQyG+AGfovAHoYR55TFx+X8akfkUJYpt5JG6GPeFMjZaCQ==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.2.tgz", + "integrity": "sha512-9NfEUDp3tgRhmoxzTpTo+lq+KIVFxZahuRX0LHF/9IzKHaWuoWsIrrJ61zw5cnnlGINX8lqJzXYfQTOICS5Q+A==", "dev": true }, "accepts": { @@ -48,84 +32,12 @@ "negotiator": "0.6.1" } }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -138,30 +50,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -171,5450 +59,724 @@ "is-buffer": "1.1.6" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "blueimp-md5": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", + "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "graceful-readlink": "1.0.1" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "ms": "2.0.0" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "type-detect": "4.0.8" } }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz", - "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binaryextensions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", - "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", - "dev": true - }, - "blueimp-md5": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", - "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "dev": true, - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "1.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "1.0.0" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.3.tgz", - "integrity": "sha512-qTfM2pNFeMZcLvf/RbrVAzDEVttZjFhaApfx9dplNjvHSX88Ui66zBRb/4YGob/xUWxDceirgoC1lT676asfCQ==", - "dev": true - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "1.0.0" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-conflict": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", - "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", - "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "enhanced-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", - "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" - } - }, - "envinfo": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", - "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } - }, - "fast-glob": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", - "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.1", - "micromatch": "3.1.10" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "flow-parser": { - "version": "0.71.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.71.0.tgz", - "integrity": "sha512-rXSvqSBLf8aRI6T3P99jMcUYvZoO1KZcKDkzGJmXvYdNAgRKu7sfGNtxEsn3cX4TgungBuJpX+K8aHRC9/B5MA==", - "dev": true - }, - "follow-redirects": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", - "requires": { - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "gh-got": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", - "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", - "dev": true, - "requires": { - "got": "7.1.0", - "is-plain-obj": "1.1.0" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - } - } - }, - "github-username": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", - "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", - "dev": true, - "requires": { - "gh-got": "6.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-all": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", - "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "dev": true, - "requires": { - "glob": "7.1.1", - "yargs": "1.2.6" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - }, - "yargs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", - "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "dev": true, - "requires": { - "minimist": "0.1.0" - } - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "got": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", - "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "mimic-response": "1.0.0", - "p-cancelable": "0.4.1", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "grouped-queue": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", - "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "1.4.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.10", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, - "requires": { - "symbol-observable": "0.2.4" - }, - "dependencies": { - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - } - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-scoped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", - "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", - "dev": true, - "requires": { - "scoped-regex": "1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istextorbinary": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", - "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", - "dev": true, - "requires": { - "binaryextensions": "2.1.1", - "editions": "1.3.4", - "textextensions": "2.2.0" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jscodeshift": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", - "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "7.0.0-beta.46", - "colors": "1.2.3", - "flow-parser": "0.71.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", - "neo-async": "2.5.1", - "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.14.7", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.10", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", - "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "2.4.1" - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "mem-fs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", - "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", - "dev": true, - "requires": { - "through2": "2.0.3", - "vinyl": "1.2.0", - "vinyl-file": "2.0.0" - } - }, - "mem-fs-editor": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.1.tgz", - "integrity": "sha512-54fptqhSZX1sSYsVVInG2qzUWPPrEv/6qYxHAwXJZQfzDcviJcL+7p/wmupg8SdAOi42m/vilMBemx3D6Sz22g==", - "dev": true, - "requires": { - "commondir": "1.0.1", - "deep-extend": "0.5.1", - "ejs": "2.5.9", - "glob": "7.1.1", - "globby": "8.0.1", - "isbinaryfile": "3.0.2", - "mkdirp": "0.5.1", - "multimatch": "2.1.0", - "rimraf": "2.6.2", - "through2": "2.0.3", - "vinyl": "2.1.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.1", - "glob": "7.1.2", - "ignore": "3.3.8", - "pify": "3.0.0", - "slash": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge2": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", - "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true - }, - "node-dir": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", - "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", - "dev": true - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-lazy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", - "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", - "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", - "dev": true - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "read-chunk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", - "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", - "dev": true, - "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "recast": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", - "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", - "dev": true, - "requires": { - "ast-types": "0.11.3", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.7.1" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "1.0.1" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { - "glob": "7.1.1" + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "is-promise": "2.1.0" + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true }, - "rxjs": { - "version": "5.5.10", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", - "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "dev": true, "requires": { - "ret": "0.1.15" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "scoped-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", - "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" - } + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true } } }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "once": "1.4.0", + "wrappy": "1.0.2" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, - "shelljs": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", - "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "glob": "7.1.1", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - } - } + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "mime-db": "1.33.0" } }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "brace-expansion": "1.1.11" } }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "minimist": "0.0.8" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "ms": "2.0.0" } } } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", - "dev": true, - "requires": { - "any-observable": "0.2.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "ee-first": "1.1.1" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "wrappy": "1.0.2" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "dev": true, - "requires": { - "first-chunk-stream": "2.0.0", - "strip-bom": "2.0.0" - } + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", - "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" } }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" } }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "buffer-from": "1.1.0", + "source-map": "0.6.1" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "has-flag": "1.0.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "ts-node": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.0.3.tgz", - "integrity": "sha512-ARaOMNFEPKg2ZuC1qJddFvHxHNFVckR0g9xLxMIoMqSSIkDc8iS4/LoV53EdDWWNq2FGwqcEf0bVVGJIWpsznw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.1.0.tgz", + "integrity": "sha512-mw11Bq08RZgrU/bzcVw/Ti9wNyefpOanXgWsHg008wyVHjvFhWxNatVVrciOAu8BcWSECoNOSunRzUokKH8Mmw==", "dev": true, "requires": { "arrify": "1.0.1", - "chalk": "2.4.1", "diff": "3.2.0", "make-error": "1.3.4", "minimist": "1.2.0", @@ -5628,22 +790,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" - } } } }, @@ -5664,659 +810,35 @@ } }, "typescript": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", - "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", - "dev": true - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", + "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", "dev": true }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0", - "strip-bom-stream": "2.0.0", - "vinyl": "1.2.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "webpack-addons": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", - "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", - "dev": true, - "requires": { - "jscodeshift": "0.4.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "ast-types": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", - "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", - "dev": true - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "jscodeshift": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", - "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", - "dev": true, - "requires": { - "async": "1.5.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "6.18.0", - "colors": "1.2.3", - "flow-parser": "0.71.0", - "lodash": "4.17.10", - "micromatch": "2.3.11", - "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.12.9", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "recast": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", - "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", - "dev": true, - "requires": { - "ast-types": "0.10.1", - "core-js": "2.5.5", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.2.tgz", - "integrity": "sha512-2C6bs9gORlzCSgkNZTnj8hnXMxe3g2v+yqiUdB+1l/I3sI36ND4zZStV00yq0eGjE5CNu0eqOQr7YYe+42H2Yw==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "diff": "3.5.0", - "enhanced-resolve": "4.0.0", - "envinfo": "4.4.2", - "glob-all": "3.1.0", - "global-modules": "1.0.0", - "got": "8.3.1", - "import-local": "1.0.0", - "inquirer": "5.2.0", - "interpret": "1.1.0", - "jscodeshift": "0.5.0", - "listr": "0.13.0", - "loader-utils": "1.1.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mkdirp": "0.5.1", - "p-each-series": "1.0.0", - "p-lazy": "1.0.0", - "prettier": "1.12.1", - "supports-color": "5.4.0", - "v8-compile-cache": "1.1.2", - "webpack-addons": "1.1.5", - "yargs": "11.1.0", - "yeoman-environment": "2.0.6", - "yeoman-generator": "2.0.5" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - }, - "yeoman-environment": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", - "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "globby": "6.1.0", - "grouped-queue": "0.3.3", - "inquirer": "3.3.0", - "is-scoped": "1.0.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "mem-fs": "1.1.3", - "text-table": "0.2.0", - "untildify": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - } - } - }, - "yeoman-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", - "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", - "dev": true, - "requires": { - "async": "2.6.0", - "chalk": "2.4.1", - "cli-table": "0.3.1", - "cross-spawn": "6.0.5", - "dargs": "5.1.0", - "dateformat": "3.0.3", - "debug": "3.1.0", - "detect-conflict": "1.0.1", - "error": "7.0.2", - "find-up": "2.1.0", - "github-username": "4.1.0", - "istextorbinary": "2.2.1", - "lodash": "4.17.10", - "make-dir": "1.2.0", - "mem-fs-editor": "4.0.1", - "minimist": "1.2.0", - "pretty-bytes": "4.0.2", - "read-chunk": "2.1.0", - "read-pkg-up": "3.0.0", - "rimraf": "2.6.2", - "run-async": "2.3.0", - "shelljs": "0.8.1", - "text-table": "0.2.0", - "through2": "2.0.3", - "yeoman-environment": "2.0.6" - }, - "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", diff --git a/package.json b/package.json index 99371da..7b67a5a 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,12 @@ }, "devDependencies": { "@types/chai": "^4.1.3", - "@types/mocha": "^5.2.0", - "@types/node": "^10.0.3", + "@types/mocha": "^5.2.1", + "@types/node": "^10.3.2", "chai": "^4.1.2", "express": "^4.15.4", "mocha": "^3.5.2", - "ts-node": "^6.0.3", - "typescript": "^2.8.3", - "webpack-cli": "^2.1.2" + "ts-node": "^6.1.0", + "typescript": "^2.9.1" } } From 71154439446e4886dba643885e218bb9145598b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 11:24:16 +0200 Subject: [PATCH 17/43] changed tsconfig and rebuild --- config/tsconfig.es2015.json | 9 +++++---- dist/es2015/livingsdk.js | 2 +- dist/umd/livingsdk.js | 2 +- tsconfig.json | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/config/tsconfig.es2015.json b/config/tsconfig.es2015.json index f9d28ef..cd3464e 100644 --- a/config/tsconfig.es2015.json +++ b/config/tsconfig.es2015.json @@ -1,12 +1,13 @@ { - "exclude": [ - "**/*.test.ts" - ], "include": [ "../src/**/*.ts" ], + "exclude": [ + "**/*.test.ts", + "**/config.ts" + ], "compilerOptions": { - + "rootDir": "../src", "target": "es2015", "module": "es2015", "declaration": true, diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index dbd03e6..0e2fc60 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -47,7 +47,7 @@ export class LivingSDK { } get(appId, templateName) { return this.session.then((auth_token) => { - return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' }) : undefined, diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index d965fd4..c8ed152 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -61,7 +61,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } get(appId, templateName) { return this.session.then((auth_token) => { - return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '/' + templateName : ''}`, { + return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' }) : undefined, diff --git a/tsconfig.json b/tsconfig.json index d1ee373..4ca4478 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "target": "es2015", "module": "umd", "declaration": true, - + "rootDir": "./src", "outDir": "./dist/umd", "removeComments": true, "moduleResolution": "node", From 12f209477a3124be9b605a4ab9c61db58cd64636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 11:33:09 +0200 Subject: [PATCH 18/43] [test] wrong login data --- src/livingsdk.test.ts | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index 5879969..a093026 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -1,6 +1,7 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; -import 'mocha' +import 'mocha'; +import {livingappsData as lsd } from './config' describe('LivingSDK: ', () => { /* @@ -8,10 +9,38 @@ describe('LivingSDK: ', () => { * - getAuthToken */ describe('login', () => { - it('successfull login', () => { + it('no login', () => { let lsdk = new LivingSDK({loginRequired: false}); return lsdk.login().then((auth_token: Auth_Token) => { expect(typeof auth_token).to.equal('undefined'); + }); + }); + it('login with correct username and password', () => { + let lsdk = new LivingSDK({}, lsd.username, lsd.password); + return lsdk.login().then((auth_token: Auth_Token) => { + expect(typeof auth_token).to.equal('string'); + }); + }); + it('change auth_token', () => { + let lsdk = new LivingSDK({}, lsd.username, lsd.password); + return lsdk.login().then(() => { + // session is private -> cast lsdk to any + (lsdk).session = Promise.resolve("10"); + return (lsdk).session; + }).then(() => { + return lsdk.get(lsd.appId, 'closed'); + }) + .then(() => { + throw new Error("user still logged in"); + }).catch((err: any) => { + expect(err.message).to.equal("Request failed with status code 403"); + }); + }); + it('login with wrong data', () => { + let lsdk = new LivingSDK({}, "foo", "bar"); + return lsdk.login().then((auth_token: Auth_Token) => { + // teste ob ergebnis leer ist + expect(auth_token).to.equal(undefined); }) }) }) From 02cfc0e2e57eb79ad8173367d03b2ca14ea07b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 12:05:46 +0200 Subject: [PATCH 19/43] .get() - testsuite added - created 5 templates, saved names in lsdktemplates enum - .get() testsuite description --- src/livingsdk.test.ts | 96 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index a093026..c9f2097 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -3,12 +3,20 @@ import { expect } from 'chai'; import 'mocha'; import {livingappsData as lsd } from './config' +enum lsdktemplates { + default= 'default', + loggedIn = 'loggedInUsers', + admin = 'withAdminPriveleges', + permissions = 'withPermissions', + workpriv = 'withWorkingPriveleges' +} + describe('LivingSDK: ', () => { /* * test login * - getAuthToken */ - describe('login', () => { + describe('.login()', () => { it('no login', () => { let lsdk = new LivingSDK({loginRequired: false}); return lsdk.login().then((auth_token: Auth_Token) => { @@ -28,7 +36,7 @@ describe('LivingSDK: ', () => { (lsdk).session = Promise.resolve("10"); return (lsdk).session; }).then(() => { - return lsdk.get(lsd.appId, 'closed'); + return lsdk.get(lsd.appId, lsdktemplates.loggedIn); }) .then(() => { throw new Error("user still logged in"); @@ -41,7 +49,89 @@ describe('LivingSDK: ', () => { return lsdk.login().then((auth_token: Auth_Token) => { // teste ob ergebnis leer ist expect(auth_token).to.equal(undefined); + }); + }); + }); + + + describe('.get()', () => { + // not logged in user + function createMinLSDK () { + return new LivingSDK({loginRequired: false}); + } + // logged in user + function createMaxLSDK () { + return new LivingSDK({}, lsd.username, lsd.password); + } + describe('permissions without login', () => { + it('request default', () => { + return createMinLSDK().get(lsd.appId); + }); + it('request loggedInUsers', () => { + return createMinLSDK().get(lsd.appId, lsdktemplates.loggedIn) + .then(() => { + throw new Error('should not reach this part of code'); + }) + .catch((err: any) => { + expect(err.message).to.equal('Request failed with status code 403'); + }) + }) + it('request withPermissionsForApp', () => { + return createMinLSDK().get(lsd.appId, lsdktemplates.permissions) + .then(() => { + throw new Error('should not reach this part of code'); + }) + .catch((err: any) => { + expect(err.message).to.equal('Request failed with status code 403'); + }) + }) + it('request withWorkingPrivelegesApp', () => { + return createMinLSDK().get(lsd.appId, lsdktemplates.workpriv) + .then(() => { + throw new Error('should not reach this part of code'); + }) + .catch((err: any) => { + expect(err.message).to.equal('Request failed with status code 403'); + }) + }) + it('request withAdminPriveleges', () => { + return createMinLSDK().get(lsd.appId, lsdktemplates.admin) + .then(() => { + throw new Error('should not reach this part of code'); + }) + .catch((err: any) => { + expect(err.message).to.equal('Request failed with status code 403'); + }) + }) + }); + + describe('permissions with admin login', () => { + it('request default', () => { + return createMaxLSDK().get(lsd.appId); + }); + it('request loggedInUsers', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.loggedIn); + }) + it('request withPermissionsForApp', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.permissions); + }) + it('request withWorkingPrivelegesApp', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.workpriv); }) - }) + it('request withAdminPriveleges', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin); + }) + }); + + it('request not existing app', () => { + return createMaxLSDK().get('afsdadstasda') + .then(() => { + throw new Error('should not reach this part of code'); + }) + .catch((err: any) => { + expect(err.message).to.equal('Request failed with status code 404'); + }) + }); }) + }); \ No newline at end of file From b7b075b3fcc7d09e285f31f2b64657ed5f0426f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 12:12:54 +0200 Subject: [PATCH 20/43] added missing semicolons --- src/livingsdk.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 9328532..3cc1115 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -92,8 +92,8 @@ export class LivingSDK { dump = ul4on.loads(res.data); dump.get('globals').Login = this; return dump; - }) - }) + }); + }); } _insert(app: any, values: any): Promise { @@ -173,8 +173,8 @@ export class LivingSDK { Record: record }; return returnObj; - }) - }) + }); + }); } _delete(record: LAPIRecord) { @@ -191,6 +191,6 @@ export class LivingSDK { }) }) } -}; +} export default LivingSDK; \ No newline at end of file From 154ba23aca319938ba08ba26b3439419ef75ff12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 13:51:55 +0200 Subject: [PATCH 21/43] [test] ._insert() --- src/livingsdk.test.ts | 66 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index c9f2097..21666a2 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -11,6 +11,17 @@ enum lsdktemplates { workpriv = 'withWorkingPriveleges' } +type LAAPI = any; + +// not logged in user +function createMinLSDK () { + return new LivingSDK({loginRequired: false}); +} +// logged in user +function createMaxLSDK () { + return new LivingSDK({}, lsd.username, lsd.password); +} + describe('LivingSDK: ', () => { /* * test login @@ -55,14 +66,6 @@ describe('LivingSDK: ', () => { describe('.get()', () => { - // not logged in user - function createMinLSDK () { - return new LivingSDK({loginRequired: false}); - } - // logged in user - function createMaxLSDK () { - return new LivingSDK({}, lsd.username, lsd.password); - } describe('permissions without login', () => { it('request default', () => { return createMinLSDK().get(lsd.appId); @@ -131,7 +134,50 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 404'); }) - }); - }) + }); + }); + describe('._insert()', () => { + it('insert in unknown Datasource', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('unknown'); + }) + .then((storage: any) => { + expect(storage).to.equal(undefined); + }); + }); + it('insert an ID to StorageApp', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('storage'); + }) + .then((storage: any) => { + return storage.app.insert({id: `[JS]${(new Date()).toDateString()}`}); + }); + }); + it('insert to self', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('self'); + }) + .then((storage: any) => { + // ignore file upload + return storage.app.insert({ + text: '[JS] this is a text', + number: 42, + phone: '+49 0000 0000000000', + url: 'https://milleniumfrog.de', + mail: 'web@example.com', + date: new Date(), + textarea: '[JS] this is even more text', + selection: 'option_1', + options: '_1', + multiple_options: ['_1'], + checkmark: true, + geodata: '0.0,0.0,' + }); + }); + }); + }); }); \ No newline at end of file From 98beb8f7e146db8507964513e312181125cc8fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 14:16:07 +0200 Subject: [PATCH 22/43] [test] insert after changing session --- src/livingsdk.test.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index 21666a2..df716e1 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -2,6 +2,7 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; import 'mocha'; import {livingappsData as lsd } from './config' +import { AxiosError } from 'axios'; enum lsdktemplates { default= 'default', @@ -179,5 +180,31 @@ describe('LivingSDK: ', () => { }); }); }); + it('auto login', () => { + let lsdk = createMaxLSDK(); + return lsdk.get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + (lsdk).session = Promise.resolve('undefined'); + return LAAPI.get('datasources').get('storage'); + }) + .then((storage: any) => { + return storage.app.insert({id: '[JS] before relogged'}) + .then(() => { + return storage; + }) + .catch((err: AxiosError) => { + if (err.response.status === 403) { + (lsdk).session = lsdk.login(); + return storage; + } else { + return storage; + } + }) + }) + .then((storage) => { + return storage.app.insert({id: '[JS] relogged'}) + }) + + }) }); }); \ No newline at end of file From 19d73efeb18171a099d580e2529a07f9079ec09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 15:17:13 +0200 Subject: [PATCH 23/43] [test] ._update(), ._delete() --- src/livingsdk.test.ts | 154 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 144 insertions(+), 10 deletions(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index df716e1..ff796f0 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -1,7 +1,7 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; import 'mocha'; -import {livingappsData as lsd } from './config' +import {livingappsData as lsd, removeData } from './config' import { AxiosError } from 'axios'; enum lsdktemplates { @@ -29,18 +29,21 @@ describe('LivingSDK: ', () => { * - getAuthToken */ describe('.login()', () => { + it('no login', () => { let lsdk = new LivingSDK({loginRequired: false}); return lsdk.login().then((auth_token: Auth_Token) => { expect(typeof auth_token).to.equal('undefined'); }); }); + it('login with correct username and password', () => { let lsdk = new LivingSDK({}, lsd.username, lsd.password); return lsdk.login().then((auth_token: Auth_Token) => { expect(typeof auth_token).to.equal('string'); }); }); + it('change auth_token', () => { let lsdk = new LivingSDK({}, lsd.username, lsd.password); return lsdk.login().then(() => { @@ -56,6 +59,7 @@ describe('LivingSDK: ', () => { expect(err.message).to.equal("Request failed with status code 403"); }); }); + it('login with wrong data', () => { let lsdk = new LivingSDK({}, "foo", "bar"); return lsdk.login().then((auth_token: Auth_Token) => { @@ -67,10 +71,13 @@ describe('LivingSDK: ', () => { describe('.get()', () => { + describe('permissions without login', () => { + it('request default', () => { return createMinLSDK().get(lsd.appId); }); + it('request loggedInUsers', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.loggedIn) .then(() => { @@ -79,7 +86,8 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }) + }); + it('request withPermissionsForApp', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.permissions) .then(() => { @@ -88,7 +96,8 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }) + }); + it('request withWorkingPrivelegesApp', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.workpriv) .then(() => { @@ -97,7 +106,8 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }) + }); + it('request withAdminPriveleges', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.admin) .then(() => { @@ -107,24 +117,31 @@ describe('LivingSDK: ', () => { expect(err.message).to.equal('Request failed with status code 403'); }) }) + }); describe('permissions with admin login', () => { + it('request default', () => { return createMaxLSDK().get(lsd.appId); }); + it('request loggedInUsers', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.loggedIn); - }) + }); + it('request withPermissionsForApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.permissions); - }) + }); + it('request withWorkingPrivelegesApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.workpriv); - }) + }); + it('request withAdminPriveleges', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin); - }) + }); + }); it('request not existing app', () => { @@ -136,9 +153,11 @@ describe('LivingSDK: ', () => { expect(err.message).to.equal('Request failed with status code 404'); }) }); + }); describe('._insert()', () => { + it('insert in unknown Datasource', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { @@ -148,6 +167,7 @@ describe('LivingSDK: ', () => { expect(storage).to.equal(undefined); }); }); + it('insert an ID to StorageApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { @@ -157,6 +177,7 @@ describe('LivingSDK: ', () => { return storage.app.insert({id: `[JS]${(new Date()).toDateString()}`}); }); }); + it('insert to self', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { @@ -180,7 +201,8 @@ describe('LivingSDK: ', () => { }); }); }); - it('auto login', () => { + + it('auto relog login', () => { let lsdk = createMaxLSDK(); return lsdk.get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { @@ -203,8 +225,120 @@ describe('LivingSDK: ', () => { }) .then((storage) => { return storage.app.insert({id: '[JS] relogged'}) + }); + }); + + }); + + describe('._update()', () => { + + it('update in storage', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('storage').app; }) - + .then((storage: any) => { + return storage.records.values(); + }) + .then((records: any) => { + for (let i of records) { + return i.update({id: '[JS] updated'}); + } + }); + }).timeout(5000); + + it('update in self', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('self').app; + }) + .then((storage: any) => { + return storage.records.values(); + }) + .then((records: any) => { + for (let i of records) { + return i.update({ + text: '[JS] this is a updated text', + number: 84, + phone: '+49 0000 0000000001', + url: 'https://dev.milleniumfrog.de', + mail: 'update@example.com', + date: new Date(), + textarea: '[JS] this is an even more updated text', + selection: 'option_2', + options: '_3', + multiple_options: ['_2'], + checkmark: true, + geodata: '0.1,1.0,' + }); + } + }); }) + it('auto relog update', () => { + let lsdk = createMaxLSDK(); + return lsdk.get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('storage').app; + }) + .then((storage: any) => { + (lsdk).session = Promise.resolve('undefined'); + return storage.records.values(); + }) + .then((records: any) => { + for (let i of records) { + return i.update({id: '[JS] updated'}).catch((err: AxiosError) => { + if (err.response.status === 403) { + (lsdk).session = lsdk.login(); + return i; + } + throw err; + }); + } + }) + .then((record: any) => { + return record.update({id: '[JS] updated after relog'}); + }); + }).timeout(5000); + }); + + if (removeData) { + describe('._delete()', () => { + + it('remove all records from storage', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('storage').app; + }) + .then((storage: any) => { + return storage.records.values(); + }) + .then((records: any) => { + let arr: Array> = [] + for (let i of records) { + arr.push(i.delete()); + } + return Promise.all(arr); + }); + }).timeout(10000); + + it('remove all records from self', () => { + return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) + .then((LAAPI: LAAPI) => { + return LAAPI.get('datasources').get('self').app; + }) + .then((storage: any) => { + return storage.records.values(); + }) + .then((records: any) => { + let arr: Array> = [] + for (let i of records) { + arr.push(i.delete()); + } + return Promise.all(arr); + }); + }).timeout(10000); + + }); + } }); \ No newline at end of file From 026062e46ea375cc74aa4bf9c47f5733cc314d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 8 Jun 2018 15:54:19 +0200 Subject: [PATCH 24/43] rebuild --- client_testing/index.html | 26 -------------- dist/es2015/livingsdk.js | 1 - dist/umd/livingsdk.js | 1 - test/node_test.js | 71 --------------------------------------- 4 files changed, 99 deletions(-) delete mode 100644 client_testing/index.html delete mode 100644 test/node_test.js diff --git a/client_testing/index.html b/client_testing/index.html deleted file mode 100644 index db0bd63..0000000 --- a/client_testing/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - -

- - - - - - - - - - - - - \ No newline at end of file diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index 0e2fc60..cc10e81 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -154,5 +154,4 @@ export class LivingSDK { }); } } -; export default LivingSDK; diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index c8ed152..526ca2a 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -169,6 +169,5 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } } exports.LivingSDK = LivingSDK; - ; exports.default = LivingSDK; }); diff --git a/test/node_test.js b/test/node_test.js deleted file mode 100644 index 7c8f13b..0000000 --- a/test/node_test.js +++ /dev/null @@ -1,71 +0,0 @@ - -let config; -let defaultSettings = { -} -if (typeof module === 'object' && module.exports){ - test(require('../dist/umd/livingsdk').default, require('./config')); -} else { - test(window.LivingSDK, window.configs); -} - -function test (LivingSDK, config) { -describe ('login', () => { - it ('login', () => { - let lsdk = new LivingSDK(defaultSettings, config.username, config.password); - return lsdk.login().then((res) => console.log(res)); - }); - it ('login and get function', () => { - let lsdk = new LivingSDK(defaultSettings, config.username, config.password); - lsdk.session = (function() {return new Promise ((resolve, reject) => {resolve(123)})})(); - return lsdk.get(config.appId).then((LAAPI) => { - return LAAPI - }); - }); - it ('insert a entry', () => { - let lsdk = new LivingSDK(defaultSettings, config.username, config.password); - return lsdk.get(config.appId).then((LAAPI) => { - let app = LAAPI.get('datasources').get('default').app; - return app.insert({ - mitarbeiter: 'Einstein', - interessensgebiete: ['kaffee'] - }); - }) - }); - it ('update first entry', () => { - let lsdk = new LivingSDK(defaultSettings, config.username, config.password); - return lsdk.get(config.appId).then((LAAPI) => { - let app = LAAPI.get('datasources').get('default').app; - let records = app.records.values(); - let last; - for (let d of records) { - last = d; - break; - } - return last.update({ - mitarbeiter: 'Time: ' + Date.now(), - interessensgebiete: ['kaffee'] - }) - }) - }); - it ('delete a entry', () => { - let lsdk = new LivingSDK(defaultSettings, config.username, config.password); - return lsdk.get(config.appId).then((LAAPI) => { - let app = LAAPI.get('datasources').get('default').app; - let records = app.records.values(); - let last; - for (let d of records) { - last = d; - } - return last.delete(); - }) - }) -}) - describe('without login', () => { - it ('get function', () => { - let lsdk = new LivingSDK({loginRequired: false}); - return lsdk.get(config.appId).then((LAAPI) => { - return LAAPI - }); - }); - }); -} \ No newline at end of file From 2a586d5d2026567fc6db1617092f589ea94e3f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 20 Jun 2018 08:46:57 +0200 Subject: [PATCH 25/43] test - type update - test: added global variable SERVER - built the LAAPI --- dist/es2015/modules/livingapi.d.ts | 179 ++++++++++++++++++++++++++++- dist/umd/modules/livingapi.d.ts | 179 ++++++++++++++++++++++++++++- src/livingsdk.test.ts | 16 ++- src/modules/livingapi.d.ts | 179 ++++++++++++++++++++++++++++- 4 files changed, 535 insertions(+), 18 deletions(-) diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts index df3642e..5259dd1 100644 --- a/dist/es2015/modules/livingapi.d.ts +++ b/dist/es2015/modules/livingapi.d.ts @@ -4,35 +4,96 @@ export interface Base { create: (...args: any[]) => any; ul4ondump: (encoder: any) => any; ul4onload: (decoder: any) => any; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; + _setDefaultUL4ONAttr: (name: string) => void; } export interface Globals extends Base { + version: string; + platform: string; + user: User; + maxdbaction: number; + maxtemplateruntime: number; + flashmessages: FlashMessage[]; /** distance between two geo coordinates */ geodist: (geo1: any, geo2: any) => any; + __repr__: () => string; } export interface FlashMessage extends Base { - + timestamp: Date; + type: string; + title: string; + message: string | null; + __repr__: () => string; } export interface App extends Base { + id: string; + globals: Globals; + name: string; + description: string; + language: string; + startlink: string; + iconlarge: File; + iconsmall: File; + owner: User; + controls: Map; + records: Map; + recordcount: number; + installation: Installation; + categories: Category[]; + params: Map; + views: Map; + datamanagement_identifier: string; insert: (values: any) => Record; + __repr__: () => string; } export interface View extends Base { - + id: string; + name: string; + app: App; + order: number; + width: number; + height: number; + start: Date; + end: Date; + __repr__: () => string; } export interface DataSource extends Base { - + id: string; + identifier: string; + app: App; + apps: Map; + __repr__: () => string; + search: (search: any) => boolean; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; } export interface Record extends Base { + id: string; + app: App; + createdat: Date; + createdby: User; + updatedat: Date; + updateby: User; + updatecount: number; + values: Map; + attachments: Map; + children: Map> update: (values: any) => Record; delete: () => AxiosResponse; + __repr__: () => string; + } export interface Control extends Base { + id: string; + ident asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; @@ -108,4 +169,114 @@ export interface LookupChoiceControl extends LookupControl { export interface AppLookupControl extends Control { -} \ No newline at end of file +} + +export interface AppLookupSelectControl extends AppLookupControl { + +} + +export interface AppLookupRadioControl extends AppLookupControl { + +} + +export interface AppLookupChoiceControl extends AppLookupControl { + +} + +export interface MultipleLookupControl extends LookupControl { + +} + +export interface MultipleLookupSelectControl extends MultipleLookupControl { + +} + +export interface MultipleLookupCheckboxControl extends MultipleLookupControl { + +} + +export interface MultipleAppLookupControl extends AppLookupControl { + +} + +export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { + +} + +export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ + +} + +export interface GeoControl extends Control { + +} + +export interface FileControl extends Control { + +} + +export interface ButtonControl extends Control { + +} + +export interface Field extends Base { + create: (control, record, value) => Field; + search: (searchvalue) => boolean; +} + +export interface LookupItem extends Base { + +} + +export interface User extends Base { + +} + +export interface File extends Base { + +} + +export interface Geo extends Base { + +} + +export interface Attachment extends Base { + +} + +export interface NoteAttachment extends Attachment { + +} + +export interface URLAttachment extends Attachment { + +} + +export interface FileAttachment extends Attachment { + +} + +export interface ImageAttachment extends Attachment { + +} + +export interface JSONAttachment extends Attachment { + +} + +export interface Installation extends Base { + +} + +export interface Category extends Base { + +} + +export interface KeyView extends Base { + +} + +export interface AppParameter extends Base { + +} + diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts index df3642e..5259dd1 100644 --- a/dist/umd/modules/livingapi.d.ts +++ b/dist/umd/modules/livingapi.d.ts @@ -4,35 +4,96 @@ export interface Base { create: (...args: any[]) => any; ul4ondump: (encoder: any) => any; ul4onload: (decoder: any) => any; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; + _setDefaultUL4ONAttr: (name: string) => void; } export interface Globals extends Base { + version: string; + platform: string; + user: User; + maxdbaction: number; + maxtemplateruntime: number; + flashmessages: FlashMessage[]; /** distance between two geo coordinates */ geodist: (geo1: any, geo2: any) => any; + __repr__: () => string; } export interface FlashMessage extends Base { - + timestamp: Date; + type: string; + title: string; + message: string | null; + __repr__: () => string; } export interface App extends Base { + id: string; + globals: Globals; + name: string; + description: string; + language: string; + startlink: string; + iconlarge: File; + iconsmall: File; + owner: User; + controls: Map; + records: Map; + recordcount: number; + installation: Installation; + categories: Category[]; + params: Map; + views: Map; + datamanagement_identifier: string; insert: (values: any) => Record; + __repr__: () => string; } export interface View extends Base { - + id: string; + name: string; + app: App; + order: number; + width: number; + height: number; + start: Date; + end: Date; + __repr__: () => string; } export interface DataSource extends Base { - + id: string; + identifier: string; + app: App; + apps: Map; + __repr__: () => string; + search: (search: any) => boolean; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; } export interface Record extends Base { + id: string; + app: App; + createdat: Date; + createdby: User; + updatedat: Date; + updateby: User; + updatecount: number; + values: Map; + attachments: Map; + children: Map> update: (values: any) => Record; delete: () => AxiosResponse; + __repr__: () => string; + } export interface Control extends Base { + id: string; + ident asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; @@ -108,4 +169,114 @@ export interface LookupChoiceControl extends LookupControl { export interface AppLookupControl extends Control { -} \ No newline at end of file +} + +export interface AppLookupSelectControl extends AppLookupControl { + +} + +export interface AppLookupRadioControl extends AppLookupControl { + +} + +export interface AppLookupChoiceControl extends AppLookupControl { + +} + +export interface MultipleLookupControl extends LookupControl { + +} + +export interface MultipleLookupSelectControl extends MultipleLookupControl { + +} + +export interface MultipleLookupCheckboxControl extends MultipleLookupControl { + +} + +export interface MultipleAppLookupControl extends AppLookupControl { + +} + +export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { + +} + +export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ + +} + +export interface GeoControl extends Control { + +} + +export interface FileControl extends Control { + +} + +export interface ButtonControl extends Control { + +} + +export interface Field extends Base { + create: (control, record, value) => Field; + search: (searchvalue) => boolean; +} + +export interface LookupItem extends Base { + +} + +export interface User extends Base { + +} + +export interface File extends Base { + +} + +export interface Geo extends Base { + +} + +export interface Attachment extends Base { + +} + +export interface NoteAttachment extends Attachment { + +} + +export interface URLAttachment extends Attachment { + +} + +export interface FileAttachment extends Attachment { + +} + +export interface ImageAttachment extends Attachment { + +} + +export interface JSONAttachment extends Attachment { + +} + +export interface Installation extends Base { + +} + +export interface Category extends Base { + +} + +export interface KeyView extends Base { + +} + +export interface AppParameter extends Base { + +} + diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index ff796f0..b46cfe6 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -4,6 +4,9 @@ import 'mocha'; import {livingappsData as lsd, removeData } from './config' import { AxiosError } from 'axios'; +const SERVER = 'https://my.living-apps.de' + + enum lsdktemplates { default= 'default', loggedIn = 'loggedInUsers', @@ -16,11 +19,11 @@ type LAAPI = any; // not logged in user function createMinLSDK () { - return new LivingSDK({loginRequired: false}); + return new LivingSDK({loginRequired: false, url: SERVER}); } // logged in user function createMaxLSDK () { - return new LivingSDK({}, lsd.username, lsd.password); + return new LivingSDK({url: SERVER}, lsd.username, lsd.password); } describe('LivingSDK: ', () => { @@ -31,21 +34,21 @@ describe('LivingSDK: ', () => { describe('.login()', () => { it('no login', () => { - let lsdk = new LivingSDK({loginRequired: false}); + let lsdk = new LivingSDK({loginRequired: false, url: SERVER}); return lsdk.login().then((auth_token: Auth_Token) => { expect(typeof auth_token).to.equal('undefined'); }); }); it('login with correct username and password', () => { - let lsdk = new LivingSDK({}, lsd.username, lsd.password); + let lsdk = new LivingSDK({ url: SERVER}, lsd.username, lsd.password); return lsdk.login().then((auth_token: Auth_Token) => { expect(typeof auth_token).to.equal('string'); }); }); it('change auth_token', () => { - let lsdk = new LivingSDK({}, lsd.username, lsd.password); + let lsdk = new LivingSDK({ url: SERVER}, lsd.username, lsd.password); return lsdk.login().then(() => { // session is private -> cast lsdk to any (lsdk).session = Promise.resolve("10"); @@ -61,7 +64,7 @@ describe('LivingSDK: ', () => { }); it('login with wrong data', () => { - let lsdk = new LivingSDK({}, "foo", "bar"); + let lsdk = new LivingSDK({ url: SERVER}, "foo", "bar"); return lsdk.login().then((auth_token: Auth_Token) => { // teste ob ergebnis leer ist expect(auth_token).to.equal(undefined); @@ -161,6 +164,7 @@ describe('LivingSDK: ', () => { it('insert in unknown Datasource', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { + console.log(LAAPI.globals); return LAAPI.get('datasources').get('unknown'); }) .then((storage: any) => { diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts index df3642e..5259dd1 100644 --- a/src/modules/livingapi.d.ts +++ b/src/modules/livingapi.d.ts @@ -4,35 +4,96 @@ export interface Base { create: (...args: any[]) => any; ul4ondump: (encoder: any) => any; ul4onload: (decoder: any) => any; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; + _setDefaultUL4ONAttr: (name: string) => void; } export interface Globals extends Base { + version: string; + platform: string; + user: User; + maxdbaction: number; + maxtemplateruntime: number; + flashmessages: FlashMessage[]; /** distance between two geo coordinates */ geodist: (geo1: any, geo2: any) => any; + __repr__: () => string; } export interface FlashMessage extends Base { - + timestamp: Date; + type: string; + title: string; + message: string | null; + __repr__: () => string; } export interface App extends Base { + id: string; + globals: Globals; + name: string; + description: string; + language: string; + startlink: string; + iconlarge: File; + iconsmall: File; + owner: User; + controls: Map; + records: Map; + recordcount: number; + installation: Installation; + categories: Category[]; + params: Map; + views: Map; + datamanagement_identifier: string; insert: (values: any) => Record; + __repr__: () => string; } export interface View extends Base { - + id: string; + name: string; + app: App; + order: number; + width: number; + height: number; + start: Date; + end: Date; + __repr__: () => string; } export interface DataSource extends Base { - + id: string; + identifier: string; + app: App; + apps: Map; + __repr__: () => string; + search: (search: any) => boolean; + _dumpUL4ONAttr: (name: string) => any; + _loadUL4ONAttr: (name: string, value: any) => void; } export interface Record extends Base { + id: string; + app: App; + createdat: Date; + createdby: User; + updatedat: Date; + updateby: User; + updatecount: number; + values: Map; + attachments: Map; + children: Map> update: (values: any) => Record; delete: () => AxiosResponse; + __repr__: () => string; + } export interface Control extends Base { + id: string; + ident asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; @@ -108,4 +169,114 @@ export interface LookupChoiceControl extends LookupControl { export interface AppLookupControl extends Control { -} \ No newline at end of file +} + +export interface AppLookupSelectControl extends AppLookupControl { + +} + +export interface AppLookupRadioControl extends AppLookupControl { + +} + +export interface AppLookupChoiceControl extends AppLookupControl { + +} + +export interface MultipleLookupControl extends LookupControl { + +} + +export interface MultipleLookupSelectControl extends MultipleLookupControl { + +} + +export interface MultipleLookupCheckboxControl extends MultipleLookupControl { + +} + +export interface MultipleAppLookupControl extends AppLookupControl { + +} + +export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { + +} + +export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ + +} + +export interface GeoControl extends Control { + +} + +export interface FileControl extends Control { + +} + +export interface ButtonControl extends Control { + +} + +export interface Field extends Base { + create: (control, record, value) => Field; + search: (searchvalue) => boolean; +} + +export interface LookupItem extends Base { + +} + +export interface User extends Base { + +} + +export interface File extends Base { + +} + +export interface Geo extends Base { + +} + +export interface Attachment extends Base { + +} + +export interface NoteAttachment extends Attachment { + +} + +export interface URLAttachment extends Attachment { + +} + +export interface FileAttachment extends Attachment { + +} + +export interface ImageAttachment extends Attachment { + +} + +export interface JSONAttachment extends Attachment { + +} + +export interface Installation extends Base { + +} + +export interface Category extends Base { + +} + +export interface KeyView extends Base { + +} + +export interface AppParameter extends Base { + +} + From 17ed1fbf5d63128330f183f508235ec69a5df132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Wed, 27 Jun 2018 15:14:38 +0200 Subject: [PATCH 26/43] - start to test on beta server --- src/livingsdk.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index b46cfe6..66cc13b 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -4,7 +4,8 @@ import 'mocha'; import {livingappsData as lsd, removeData } from './config' import { AxiosError } from 'axios'; -const SERVER = 'https://my.living-apps.de' +const SERVER = 'https://ci01.ci.xist4c.de' +// const SERVER = 'https://my.living-apps.de' enum lsdktemplates { From a3679dbca355ce2f899fd1f8e444a7b0109db19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Fri, 27 Jul 2018 12:39:34 +0200 Subject: [PATCH 27/43] change pc --- dist/es2015/livingsdk.js | 3 +++ dist/umd/livingsdk.js | 5 ++++- src/livingsdk.test.ts | 7 +++---- src/livingsdk.ts | 5 ++++- tsconfig.json | 3 ++- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index cc10e81..3cf23d7 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -47,6 +47,7 @@ export class LivingSDK { } get(appId, templateName) { return this.session.then((auth_token) => { + debugger; return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' @@ -57,6 +58,7 @@ export class LivingSDK { } }) .then((res) => { + debugger; let dump; dump = ul4on.loads(res.data); dump.get('globals').Login = this; @@ -116,6 +118,7 @@ export class LivingSDK { let data = {}; data.id = app.id; data.data = [{ 'id': record.id, 'fields': fields }]; + console.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`); return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index 526ca2a..00eb6d2 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -55,12 +55,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }) : undefined, headers: { "Content-Type": "application/json" - } + n } }) .then((a) => a.data.auth_token); } get(appId, templateName) { return this.session.then((auth_token) => { + debugger; return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' @@ -71,6 +72,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } }) .then((res) => { + debugger; let dump; dump = ul4on.loads(res.data); dump.get('globals').Login = this; @@ -130,6 +132,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { let data = {}; data.id = app.id; data.data = [{ 'id': record.id, 'fields': fields }]; + console.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`); return axios_1.default.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index 66cc13b..2110acb 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -1,11 +1,10 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; import 'mocha'; -import {livingappsData as lsd, removeData } from './config' +import {livingappsData as lsd, removeData, livingappsData } from './config' import { AxiosError } from 'axios'; -const SERVER = 'https://ci01.ci.xist4c.de' -// const SERVER = 'https://my.living-apps.de' +let SERVER = lsd.url; enum lsdktemplates { @@ -44,6 +43,7 @@ describe('LivingSDK: ', () => { it('login with correct username and password', () => { let lsdk = new LivingSDK({ url: SERVER}, lsd.username, lsd.password); return lsdk.login().then((auth_token: Auth_Token) => { + console.log(auth_token); expect(typeof auth_token).to.equal('string'); }); }); @@ -165,7 +165,6 @@ describe('LivingSDK: ', () => { it('insert in unknown Datasource', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) .then((LAAPI: LAAPI) => { - console.log(LAAPI.globals); return LAAPI.get('datasources').get('unknown'); }) .then((storage: any) => { diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 3cc1115..732b174 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -77,6 +77,7 @@ export class LivingSDK { get(appId: string, templateName?: string): Promise { return this.session.then((auth_token: Auth_Token | undefined) => { + debugger; return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ @@ -88,6 +89,7 @@ export class LivingSDK { } }) .then((res: AxiosResponse) => { + debugger; let dump: any; dump = ul4on.loads(res.data); dump.get('globals').Login = this; @@ -110,7 +112,7 @@ export class LivingSDK { } let data: any = {}; { } - data.id = app.id; + data.id = app.id; data.data = [{ 'fields': fields }]; return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data @@ -152,6 +154,7 @@ export class LivingSDK { let data: any = {}; data.id = app.id; data.data = [{ 'id': record.id, 'fields': fields }]; + console.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`); return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { diff --git a/tsconfig.json b/tsconfig.json index 4ca4478..2a066b3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,7 @@ "outDir": "./dist/umd", "removeComments": true, "moduleResolution": "node", - "esModuleInterop": true + "esModuleInterop": true, + } } \ No newline at end of file From 4416e91d3045e449de09e2e20933ef8c3d2c1e84 Mon Sep 17 00:00:00 2001 From: LivingLogic Date: Tue, 31 Jul 2018 14:16:50 +0200 Subject: [PATCH 28/43] test update --- package-lock.json | 164 +++++++++++++++++++++--------------------- src/livingsdk.test.ts | 2 +- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8432a6b..c49770b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -55,8 +55,8 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { - "follow-redirects": "1.4.1", - "is-buffer": "1.1.6" + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" } }, "balanced-match": { @@ -77,15 +77,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.2", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" } }, "brace-expansion": { @@ -94,7 +94,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -122,12 +122,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "check-error": { @@ -142,7 +142,7 @@ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "concat-map": { @@ -190,7 +190,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "depd": { @@ -247,36 +247,36 @@ "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" } }, "finalhandler": { @@ -286,12 +286,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "follow-redirects": { @@ -299,7 +299,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" }, "dependencies": { "debug": { @@ -342,12 +342,12 @@ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-readlink": { @@ -383,7 +383,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" }, "dependencies": { "depd": { @@ -412,8 +412,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -445,8 +445,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash._basecopy": { @@ -479,9 +479,9 @@ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" } }, "lodash.isarguments": { @@ -502,9 +502,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "make-error": { @@ -549,7 +549,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "minimatch": { @@ -558,7 +558,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -633,7 +633,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "parseurl": { @@ -666,7 +666,7 @@ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "dev": true, "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -707,18 +707,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } }, "serve-static": { @@ -727,9 +727,9 @@ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -751,8 +751,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "statuses": { @@ -767,7 +767,7 @@ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "ts-node": { @@ -776,13 +776,13 @@ "integrity": "sha512-mw11Bq08RZgrU/bzcVw/Ti9wNyefpOanXgWsHg008wyVHjvFhWxNatVVrciOAu8BcWSECoNOSunRzUokKH8Mmw==", "dev": true, "requires": { - "arrify": "1.0.1", - "diff": "3.2.0", - "make-error": "1.3.4", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.5.6", - "yn": "2.0.0" + "arrify": "^1.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" }, "dependencies": { "minimist": { @@ -806,7 +806,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "typescript": { diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index 2110acb..cf32ad0 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -1,7 +1,7 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; import 'mocha'; -import {livingappsData as lsd, removeData, livingappsData } from './config' +import {livingappsData as lsd, removeData } from './config' import { AxiosError } from 'axios'; let SERVER = lsd.url; From 7435ed112a5ab3571f1eddea32c9c3a8b37a51be Mon Sep 17 00:00:00 2001 From: LivingLogic Date: Wed, 1 Aug 2018 11:33:23 +0200 Subject: [PATCH 29/43] removed unused variables --- src/livingsdk.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 732b174..2b97862 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -1,5 +1,4 @@ -import * as https from 'https'; -import axios, { AxiosStatic, AxiosResponse } from 'axios'; +import axios, { AxiosResponse } from 'axios'; declare let module: any; declare let require: any; From c211d12327028ab6b94b6eeb080e7ff28d2fb126 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Thu, 2 Aug 2018 10:53:27 +0200 Subject: [PATCH 30/43] removed debugger --- src/livingsdk.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 2b97862..b2a3b73 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -76,7 +76,6 @@ export class LivingSDK { get(appId: string, templateName?: string): Promise { return this.session.then((auth_token: Auth_Token | undefined) => { - debugger; return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ @@ -88,7 +87,6 @@ export class LivingSDK { } }) .then((res: AxiosResponse) => { - debugger; let dump: any; dump = ul4on.loads(res.data); dump.get('globals').Login = this; From 7da5c43f2a571f66302d0c050d073454cc967162 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Thu, 2 Aug 2018 10:55:35 +0200 Subject: [PATCH 31/43] build --- dist/es2015/livingsdk.js | 2 -- dist/es2015/modules/livingapi.d.ts | 38 +++++++++++++++++++++++------- dist/umd/livingsdk.js | 2 -- dist/umd/modules/livingapi.d.ts | 38 +++++++++++++++++++++++------- src/modules/livingapi.d.ts | 38 +++++++++++++++++++++++------- 5 files changed, 87 insertions(+), 31 deletions(-) diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index 3cf23d7..09f6166 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -47,7 +47,6 @@ export class LivingSDK { } get(appId, templateName) { return this.session.then((auth_token) => { - debugger; return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' @@ -58,7 +57,6 @@ export class LivingSDK { } }) .then((res) => { - debugger; let dump; dump = ul4on.loads(res.data); dump.get('globals').Login = this; diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts index 5259dd1..7fa7d75 100644 --- a/dist/es2015/modules/livingapi.d.ts +++ b/dist/es2015/modules/livingapi.d.ts @@ -93,21 +93,33 @@ export interface Record extends Base { export interface Control extends Base { id: string; - ident + identifier: string; + type: string; + subtype: string; + field: Field; + default: any; + app: App; + label: string; + priority: boolean; + order: number; asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; - + __repr__: () => string; + search: (value: any, search: null | any) => boolean; } export interface BoolControl extends Control { + __type__: string; search: (value: any, search: null | boolean) => boolean; } export interface IntControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } export interface NumberControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } @@ -117,11 +129,15 @@ export interface StringControl extends Control { } export interface TextControl extends StringControl { - + __type__: string; } export interface EmailControl extends StringControl { + __type__: string; +} +export interface URLControl extends StringControl { + __type__: string; } export interface TelControl extends StringControl { @@ -133,10 +149,11 @@ export interface PasswordControl extends StringControl { } export interface TextAreaControl extends StringControl { - + __type__: string; } export interface DateControl extends Control { + __type__: string; asjson: (...any: any[]) => any; formatString: (language: string) => string; search: (value: any, search: null | Date | string) => boolean; @@ -156,19 +173,21 @@ export interface LookupControl extends Control { } export interface LookupSelectControl extends LookupControl { - + __type__:string; } export interface LookupRadioControl extends LookupControl { - + __type__:string; } export interface LookupChoiceControl extends LookupControl { - + __type__:string; } export interface AppLookupControl extends Control { - + ul4onload: (decoder: any) => void; + ul4onattr: () => string[]; + search: ( value: any, serach: any) => boolean; } export interface AppLookupSelectControl extends AppLookupControl { @@ -208,7 +227,7 @@ export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupContr } export interface GeoControl extends Control { - + asjson: ( value: any ) => any; } export interface FileControl extends Control { @@ -222,6 +241,7 @@ export interface ButtonControl extends Control { export interface Field extends Base { create: (control, record, value) => Field; search: (searchvalue) => boolean; + __repr__: () => string; } export interface LookupItem extends Base { diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index c1c0a57..e040384 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -61,7 +61,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } get(appId, templateName) { return this.session.then((auth_token) => { - debugger; return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { httpsAgent: commonjs ? new nodejs.https.Agent({ ecdhCurve: 'auto' @@ -72,7 +71,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } }) .then((res) => { - debugger; let dump; dump = ul4on.loads(res.data); dump.get('globals').Login = this; diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts index 5259dd1..7fa7d75 100644 --- a/dist/umd/modules/livingapi.d.ts +++ b/dist/umd/modules/livingapi.d.ts @@ -93,21 +93,33 @@ export interface Record extends Base { export interface Control extends Base { id: string; - ident + identifier: string; + type: string; + subtype: string; + field: Field; + default: any; + app: App; + label: string; + priority: boolean; + order: number; asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; - + __repr__: () => string; + search: (value: any, search: null | any) => boolean; } export interface BoolControl extends Control { + __type__: string; search: (value: any, search: null | boolean) => boolean; } export interface IntControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } export interface NumberControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } @@ -117,11 +129,15 @@ export interface StringControl extends Control { } export interface TextControl extends StringControl { - + __type__: string; } export interface EmailControl extends StringControl { + __type__: string; +} +export interface URLControl extends StringControl { + __type__: string; } export interface TelControl extends StringControl { @@ -133,10 +149,11 @@ export interface PasswordControl extends StringControl { } export interface TextAreaControl extends StringControl { - + __type__: string; } export interface DateControl extends Control { + __type__: string; asjson: (...any: any[]) => any; formatString: (language: string) => string; search: (value: any, search: null | Date | string) => boolean; @@ -156,19 +173,21 @@ export interface LookupControl extends Control { } export interface LookupSelectControl extends LookupControl { - + __type__:string; } export interface LookupRadioControl extends LookupControl { - + __type__:string; } export interface LookupChoiceControl extends LookupControl { - + __type__:string; } export interface AppLookupControl extends Control { - + ul4onload: (decoder: any) => void; + ul4onattr: () => string[]; + search: ( value: any, serach: any) => boolean; } export interface AppLookupSelectControl extends AppLookupControl { @@ -208,7 +227,7 @@ export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupContr } export interface GeoControl extends Control { - + asjson: ( value: any ) => any; } export interface FileControl extends Control { @@ -222,6 +241,7 @@ export interface ButtonControl extends Control { export interface Field extends Base { create: (control, record, value) => Field; search: (searchvalue) => boolean; + __repr__: () => string; } export interface LookupItem extends Base { diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts index 5259dd1..7fa7d75 100644 --- a/src/modules/livingapi.d.ts +++ b/src/modules/livingapi.d.ts @@ -93,21 +93,33 @@ export interface Record extends Base { export interface Control extends Base { id: string; - ident + identifier: string; + type: string; + subtype: string; + field: Field; + default: any; + app: App; + label: string; + priority: boolean; + order: number; asjson:(...any: any[]) => any; ul4onload: (...any: any[]) => any; - + __repr__: () => string; + search: (value: any, search: null | any) => boolean; } export interface BoolControl extends Control { + __type__: string; search: (value: any, search: null | boolean) => boolean; } export interface IntControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } export interface NumberControl extends Control { + __type__: string; search: (value: any, search: null | number) => boolean; } @@ -117,11 +129,15 @@ export interface StringControl extends Control { } export interface TextControl extends StringControl { - + __type__: string; } export interface EmailControl extends StringControl { + __type__: string; +} +export interface URLControl extends StringControl { + __type__: string; } export interface TelControl extends StringControl { @@ -133,10 +149,11 @@ export interface PasswordControl extends StringControl { } export interface TextAreaControl extends StringControl { - + __type__: string; } export interface DateControl extends Control { + __type__: string; asjson: (...any: any[]) => any; formatString: (language: string) => string; search: (value: any, search: null | Date | string) => boolean; @@ -156,19 +173,21 @@ export interface LookupControl extends Control { } export interface LookupSelectControl extends LookupControl { - + __type__:string; } export interface LookupRadioControl extends LookupControl { - + __type__:string; } export interface LookupChoiceControl extends LookupControl { - + __type__:string; } export interface AppLookupControl extends Control { - + ul4onload: (decoder: any) => void; + ul4onattr: () => string[]; + search: ( value: any, serach: any) => boolean; } export interface AppLookupSelectControl extends AppLookupControl { @@ -208,7 +227,7 @@ export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupContr } export interface GeoControl extends Control { - + asjson: ( value: any ) => any; } export interface FileControl extends Control { @@ -222,6 +241,7 @@ export interface ButtonControl extends Control { export interface Field extends Base { create: (control, record, value) => Field; search: (searchvalue) => boolean; + __repr__: () => string; } export interface LookupItem extends Base { From 7e85ad4b324faf3c179affd64c737e4123051b55 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Wed, 8 Aug 2018 11:47:39 +0200 Subject: [PATCH 32/43] backwardcompatability removed --- src/livingsdk.test.ts | 14 +++++++------- src/modules/livingapi.js | 31 +------------------------------ 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index cf32ad0..dc88a38 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -10,9 +10,9 @@ let SERVER = lsd.url; enum lsdktemplates { default= 'default', loggedIn = 'loggedInUsers', - admin = 'withAdminPriveleges', + admin = 'withAdminPrivileges', permissions = 'withPermissions', - workpriv = 'withWorkingPriveleges' + workpriv = 'withWorkingPrivileges' } type LAAPI = any; @@ -102,7 +102,7 @@ describe('LivingSDK: ', () => { }) }); - it('request withWorkingPrivelegesApp', () => { + it('request withWorkingPrivilegesApp', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.workpriv) .then(() => { throw new Error('should not reach this part of code'); @@ -112,7 +112,7 @@ describe('LivingSDK: ', () => { }) }); - it('request withAdminPriveleges', () => { + it('request withAdminPrivileges', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.admin) .then(() => { throw new Error('should not reach this part of code'); @@ -138,18 +138,18 @@ describe('LivingSDK: ', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.permissions); }); - it('request withWorkingPrivelegesApp', () => { + it('request withWorkingPrivilegesApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.workpriv); }); - it('request withAdminPriveleges', () => { + it('request withAdminPrivileges', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin); }); }); it('request not existing app', () => { - return createMaxLSDK().get('afsdadstasda') + return createMaxLSDK().get('template-unknown-test') .then(() => { throw new Error('should not reach this part of code'); }) diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index a5d6faa..0195ba3 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -600,36 +600,7 @@ la.Control, { type: "applookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupapp"); - ul4onattrs.push("lookupcontrols"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - - ul4onattrs: function ul4onattrs() - { - var ul4onattrs = la.Control.ul4onattrs.call(this); - return ul4onattrs; - }, + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), // ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) From bf29b497b12b34dd59bddd2bd5bcc3493cfb3ce5 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Wed, 8 Aug 2018 11:52:15 +0200 Subject: [PATCH 33/43] build --- dist/es2015/modules/livingapi.js | 31 +------------------------------ dist/umd/modules/livingapi.js | 31 +------------------------------ 2 files changed, 2 insertions(+), 60 deletions(-) diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index a5d6faa..0195ba3 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -600,36 +600,7 @@ la.Control, { type: "applookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupapp"); - ul4onattrs.push("lookupcontrols"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - - ul4onattrs: function ul4onattrs() - { - var ul4onattrs = la.Control.ul4onattrs.call(this); - return ul4onattrs; - }, + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), // ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) diff --git a/dist/umd/modules/livingapi.js b/dist/umd/modules/livingapi.js index a5d6faa..0195ba3 100644 --- a/dist/umd/modules/livingapi.js +++ b/dist/umd/modules/livingapi.js @@ -600,36 +600,7 @@ la.Control, { type: "applookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupapp"); - ul4onattrs.push("lookupcontrols"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - - ul4onattrs: function ul4onattrs() - { - var ul4onattrs = la.Control.ul4onattrs.call(this); - return ul4onattrs; - }, + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), // ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) From 5c00418ea06cce456e9fcab48783627a7d81ec71 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Wed, 8 Aug 2018 11:59:04 +0200 Subject: [PATCH 34/43] hotfix, removed ul4onloads and d.ts file content --- src/modules/livingapi.d.ts | 302 ------------------------------------- src/modules/livingapi.js | 47 +----- 2 files changed, 3 insertions(+), 346 deletions(-) diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts index 7fa7d75..e69de29 100644 --- a/src/modules/livingapi.d.ts +++ b/src/modules/livingapi.d.ts @@ -1,302 +0,0 @@ -import { AxiosResponse } from "axios"; - -export interface Base { - create: (...args: any[]) => any; - ul4ondump: (encoder: any) => any; - ul4onload: (decoder: any) => any; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; - _setDefaultUL4ONAttr: (name: string) => void; -} - -export interface Globals extends Base { - version: string; - platform: string; - user: User; - maxdbaction: number; - maxtemplateruntime: number; - flashmessages: FlashMessage[]; - /** distance between two geo coordinates */ - geodist: (geo1: any, geo2: any) => any; - __repr__: () => string; -} - -export interface FlashMessage extends Base { - timestamp: Date; - type: string; - title: string; - message: string | null; - __repr__: () => string; -} - -export interface App extends Base { - id: string; - globals: Globals; - name: string; - description: string; - language: string; - startlink: string; - iconlarge: File; - iconsmall: File; - owner: User; - controls: Map; - records: Map; - recordcount: number; - installation: Installation; - categories: Category[]; - params: Map; - views: Map; - datamanagement_identifier: string; - insert: (values: any) => Record; - __repr__: () => string; -} - -export interface View extends Base { - id: string; - name: string; - app: App; - order: number; - width: number; - height: number; - start: Date; - end: Date; - __repr__: () => string; -} - -export interface DataSource extends Base { - id: string; - identifier: string; - app: App; - apps: Map; - __repr__: () => string; - search: (search: any) => boolean; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; -} - -export interface Record extends Base { - id: string; - app: App; - createdat: Date; - createdby: User; - updatedat: Date; - updateby: User; - updatecount: number; - values: Map; - attachments: Map; - children: Map> - update: (values: any) => Record; - delete: () => AxiosResponse; - __repr__: () => string; - -} - -export interface Control extends Base { - id: string; - identifier: string; - type: string; - subtype: string; - field: Field; - default: any; - app: App; - label: string; - priority: boolean; - order: number; - asjson:(...any: any[]) => any; - ul4onload: (...any: any[]) => any; - __repr__: () => string; - search: (value: any, search: null | any) => boolean; -} - -export interface BoolControl extends Control { - __type__: string; - search: (value: any, search: null | boolean) => boolean; -} - -export interface IntControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface NumberControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface StringControl extends Control { - asjson:(...any: any[]) => any; - search: (value: any, search: null | string) => boolean; -} - -export interface TextControl extends StringControl { - __type__: string; -} - -export interface EmailControl extends StringControl { - __type__: string; -} - -export interface URLControl extends StringControl { - __type__: string; -} - -export interface TelControl extends StringControl { - -} - -export interface PasswordControl extends StringControl { - -} - -export interface TextAreaControl extends StringControl { - __type__: string; -} - -export interface DateControl extends Control { - __type__: string; - asjson: (...any: any[]) => any; - formatString: (language: string) => string; - search: (value: any, search: null | Date | string) => boolean; -} - -export interface DatetimeMinuteControl extends DateControl { - formatString: (language: string) => string; -} - -export interface DatetimeSecondControl extends DateControl { - formatString: (language: string) => string; -} - -export interface LookupControl extends Control { - ul4onload: (decoder: any) => any; - search: (value: any, search: any) => boolean; -} - -export interface LookupSelectControl extends LookupControl { - __type__:string; -} - -export interface LookupRadioControl extends LookupControl { - __type__:string; -} - -export interface LookupChoiceControl extends LookupControl { - __type__:string; -} - -export interface AppLookupControl extends Control { - ul4onload: (decoder: any) => void; - ul4onattr: () => string[]; - search: ( value: any, serach: any) => boolean; -} - -export interface AppLookupSelectControl extends AppLookupControl { - -} - -export interface AppLookupRadioControl extends AppLookupControl { - -} - -export interface AppLookupChoiceControl extends AppLookupControl { - -} - -export interface MultipleLookupControl extends LookupControl { - -} - -export interface MultipleLookupSelectControl extends MultipleLookupControl { - -} - -export interface MultipleLookupCheckboxControl extends MultipleLookupControl { - -} - -export interface MultipleAppLookupControl extends AppLookupControl { - -} - -export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { - -} - -export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ - -} - -export interface GeoControl extends Control { - asjson: ( value: any ) => any; -} - -export interface FileControl extends Control { - -} - -export interface ButtonControl extends Control { - -} - -export interface Field extends Base { - create: (control, record, value) => Field; - search: (searchvalue) => boolean; - __repr__: () => string; -} - -export interface LookupItem extends Base { - -} - -export interface User extends Base { - -} - -export interface File extends Base { - -} - -export interface Geo extends Base { - -} - -export interface Attachment extends Base { - -} - -export interface NoteAttachment extends Attachment { - -} - -export interface URLAttachment extends Attachment { - -} - -export interface FileAttachment extends Attachment { - -} - -export interface ImageAttachment extends Attachment { - -} - -export interface JSONAttachment extends Attachment { - -} - -export interface Installation extends Base { - -} - -export interface Category extends Base { - -} - -export interface KeyView extends Base { - -} - -export interface AppParameter extends Base { - -} - diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index 0195ba3..f4ae3ea 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -252,26 +252,7 @@ type: null, subtype: null, _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app" && this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + __repr__: function repr() { return ""; @@ -521,30 +502,8 @@ la.Control, { type: "lookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupdata"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), + // ``search.value`` must be ``null`` or a ``LookupItem`` key // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) From 63732889451f102fdc6a8dbeeddde7e708178eb7 Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Wed, 8 Aug 2018 12:00:25 +0200 Subject: [PATCH 35/43] build --- dist/es2015/modules/livingapi.d.ts | 302 ----------------------------- dist/es2015/modules/livingapi.js | 47 +---- dist/umd/modules/livingapi.d.ts | 302 ----------------------------- dist/umd/modules/livingapi.js | 47 +---- 4 files changed, 6 insertions(+), 692 deletions(-) diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts index 7fa7d75..e69de29 100644 --- a/dist/es2015/modules/livingapi.d.ts +++ b/dist/es2015/modules/livingapi.d.ts @@ -1,302 +0,0 @@ -import { AxiosResponse } from "axios"; - -export interface Base { - create: (...args: any[]) => any; - ul4ondump: (encoder: any) => any; - ul4onload: (decoder: any) => any; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; - _setDefaultUL4ONAttr: (name: string) => void; -} - -export interface Globals extends Base { - version: string; - platform: string; - user: User; - maxdbaction: number; - maxtemplateruntime: number; - flashmessages: FlashMessage[]; - /** distance between two geo coordinates */ - geodist: (geo1: any, geo2: any) => any; - __repr__: () => string; -} - -export interface FlashMessage extends Base { - timestamp: Date; - type: string; - title: string; - message: string | null; - __repr__: () => string; -} - -export interface App extends Base { - id: string; - globals: Globals; - name: string; - description: string; - language: string; - startlink: string; - iconlarge: File; - iconsmall: File; - owner: User; - controls: Map; - records: Map; - recordcount: number; - installation: Installation; - categories: Category[]; - params: Map; - views: Map; - datamanagement_identifier: string; - insert: (values: any) => Record; - __repr__: () => string; -} - -export interface View extends Base { - id: string; - name: string; - app: App; - order: number; - width: number; - height: number; - start: Date; - end: Date; - __repr__: () => string; -} - -export interface DataSource extends Base { - id: string; - identifier: string; - app: App; - apps: Map; - __repr__: () => string; - search: (search: any) => boolean; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; -} - -export interface Record extends Base { - id: string; - app: App; - createdat: Date; - createdby: User; - updatedat: Date; - updateby: User; - updatecount: number; - values: Map; - attachments: Map; - children: Map> - update: (values: any) => Record; - delete: () => AxiosResponse; - __repr__: () => string; - -} - -export interface Control extends Base { - id: string; - identifier: string; - type: string; - subtype: string; - field: Field; - default: any; - app: App; - label: string; - priority: boolean; - order: number; - asjson:(...any: any[]) => any; - ul4onload: (...any: any[]) => any; - __repr__: () => string; - search: (value: any, search: null | any) => boolean; -} - -export interface BoolControl extends Control { - __type__: string; - search: (value: any, search: null | boolean) => boolean; -} - -export interface IntControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface NumberControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface StringControl extends Control { - asjson:(...any: any[]) => any; - search: (value: any, search: null | string) => boolean; -} - -export interface TextControl extends StringControl { - __type__: string; -} - -export interface EmailControl extends StringControl { - __type__: string; -} - -export interface URLControl extends StringControl { - __type__: string; -} - -export interface TelControl extends StringControl { - -} - -export interface PasswordControl extends StringControl { - -} - -export interface TextAreaControl extends StringControl { - __type__: string; -} - -export interface DateControl extends Control { - __type__: string; - asjson: (...any: any[]) => any; - formatString: (language: string) => string; - search: (value: any, search: null | Date | string) => boolean; -} - -export interface DatetimeMinuteControl extends DateControl { - formatString: (language: string) => string; -} - -export interface DatetimeSecondControl extends DateControl { - formatString: (language: string) => string; -} - -export interface LookupControl extends Control { - ul4onload: (decoder: any) => any; - search: (value: any, search: any) => boolean; -} - -export interface LookupSelectControl extends LookupControl { - __type__:string; -} - -export interface LookupRadioControl extends LookupControl { - __type__:string; -} - -export interface LookupChoiceControl extends LookupControl { - __type__:string; -} - -export interface AppLookupControl extends Control { - ul4onload: (decoder: any) => void; - ul4onattr: () => string[]; - search: ( value: any, serach: any) => boolean; -} - -export interface AppLookupSelectControl extends AppLookupControl { - -} - -export interface AppLookupRadioControl extends AppLookupControl { - -} - -export interface AppLookupChoiceControl extends AppLookupControl { - -} - -export interface MultipleLookupControl extends LookupControl { - -} - -export interface MultipleLookupSelectControl extends MultipleLookupControl { - -} - -export interface MultipleLookupCheckboxControl extends MultipleLookupControl { - -} - -export interface MultipleAppLookupControl extends AppLookupControl { - -} - -export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { - -} - -export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ - -} - -export interface GeoControl extends Control { - asjson: ( value: any ) => any; -} - -export interface FileControl extends Control { - -} - -export interface ButtonControl extends Control { - -} - -export interface Field extends Base { - create: (control, record, value) => Field; - search: (searchvalue) => boolean; - __repr__: () => string; -} - -export interface LookupItem extends Base { - -} - -export interface User extends Base { - -} - -export interface File extends Base { - -} - -export interface Geo extends Base { - -} - -export interface Attachment extends Base { - -} - -export interface NoteAttachment extends Attachment { - -} - -export interface URLAttachment extends Attachment { - -} - -export interface FileAttachment extends Attachment { - -} - -export interface ImageAttachment extends Attachment { - -} - -export interface JSONAttachment extends Attachment { - -} - -export interface Installation extends Base { - -} - -export interface Category extends Base { - -} - -export interface KeyView extends Base { - -} - -export interface AppParameter extends Base { - -} - diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index 0195ba3..f4ae3ea 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -252,26 +252,7 @@ type: null, subtype: null, _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app" && this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + __repr__: function repr() { return ""; @@ -521,30 +502,8 @@ la.Control, { type: "lookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupdata"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), + // ``search.value`` must be ``null`` or a ``LookupItem`` key // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts index 7fa7d75..e69de29 100644 --- a/dist/umd/modules/livingapi.d.ts +++ b/dist/umd/modules/livingapi.d.ts @@ -1,302 +0,0 @@ -import { AxiosResponse } from "axios"; - -export interface Base { - create: (...args: any[]) => any; - ul4ondump: (encoder: any) => any; - ul4onload: (decoder: any) => any; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; - _setDefaultUL4ONAttr: (name: string) => void; -} - -export interface Globals extends Base { - version: string; - platform: string; - user: User; - maxdbaction: number; - maxtemplateruntime: number; - flashmessages: FlashMessage[]; - /** distance between two geo coordinates */ - geodist: (geo1: any, geo2: any) => any; - __repr__: () => string; -} - -export interface FlashMessage extends Base { - timestamp: Date; - type: string; - title: string; - message: string | null; - __repr__: () => string; -} - -export interface App extends Base { - id: string; - globals: Globals; - name: string; - description: string; - language: string; - startlink: string; - iconlarge: File; - iconsmall: File; - owner: User; - controls: Map; - records: Map; - recordcount: number; - installation: Installation; - categories: Category[]; - params: Map; - views: Map; - datamanagement_identifier: string; - insert: (values: any) => Record; - __repr__: () => string; -} - -export interface View extends Base { - id: string; - name: string; - app: App; - order: number; - width: number; - height: number; - start: Date; - end: Date; - __repr__: () => string; -} - -export interface DataSource extends Base { - id: string; - identifier: string; - app: App; - apps: Map; - __repr__: () => string; - search: (search: any) => boolean; - _dumpUL4ONAttr: (name: string) => any; - _loadUL4ONAttr: (name: string, value: any) => void; -} - -export interface Record extends Base { - id: string; - app: App; - createdat: Date; - createdby: User; - updatedat: Date; - updateby: User; - updatecount: number; - values: Map; - attachments: Map; - children: Map> - update: (values: any) => Record; - delete: () => AxiosResponse; - __repr__: () => string; - -} - -export interface Control extends Base { - id: string; - identifier: string; - type: string; - subtype: string; - field: Field; - default: any; - app: App; - label: string; - priority: boolean; - order: number; - asjson:(...any: any[]) => any; - ul4onload: (...any: any[]) => any; - __repr__: () => string; - search: (value: any, search: null | any) => boolean; -} - -export interface BoolControl extends Control { - __type__: string; - search: (value: any, search: null | boolean) => boolean; -} - -export interface IntControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface NumberControl extends Control { - __type__: string; - search: (value: any, search: null | number) => boolean; -} - -export interface StringControl extends Control { - asjson:(...any: any[]) => any; - search: (value: any, search: null | string) => boolean; -} - -export interface TextControl extends StringControl { - __type__: string; -} - -export interface EmailControl extends StringControl { - __type__: string; -} - -export interface URLControl extends StringControl { - __type__: string; -} - -export interface TelControl extends StringControl { - -} - -export interface PasswordControl extends StringControl { - -} - -export interface TextAreaControl extends StringControl { - __type__: string; -} - -export interface DateControl extends Control { - __type__: string; - asjson: (...any: any[]) => any; - formatString: (language: string) => string; - search: (value: any, search: null | Date | string) => boolean; -} - -export interface DatetimeMinuteControl extends DateControl { - formatString: (language: string) => string; -} - -export interface DatetimeSecondControl extends DateControl { - formatString: (language: string) => string; -} - -export interface LookupControl extends Control { - ul4onload: (decoder: any) => any; - search: (value: any, search: any) => boolean; -} - -export interface LookupSelectControl extends LookupControl { - __type__:string; -} - -export interface LookupRadioControl extends LookupControl { - __type__:string; -} - -export interface LookupChoiceControl extends LookupControl { - __type__:string; -} - -export interface AppLookupControl extends Control { - ul4onload: (decoder: any) => void; - ul4onattr: () => string[]; - search: ( value: any, serach: any) => boolean; -} - -export interface AppLookupSelectControl extends AppLookupControl { - -} - -export interface AppLookupRadioControl extends AppLookupControl { - -} - -export interface AppLookupChoiceControl extends AppLookupControl { - -} - -export interface MultipleLookupControl extends LookupControl { - -} - -export interface MultipleLookupSelectControl extends MultipleLookupControl { - -} - -export interface MultipleLookupCheckboxControl extends MultipleLookupControl { - -} - -export interface MultipleAppLookupControl extends AppLookupControl { - -} - -export interface MultipleAppLookupSelectControl extends MultipleAppLookupControl { - -} - -export interface MultipleAppLookupCheckboxControl extends MultipleAppLookupControl{ - -} - -export interface GeoControl extends Control { - asjson: ( value: any ) => any; -} - -export interface FileControl extends Control { - -} - -export interface ButtonControl extends Control { - -} - -export interface Field extends Base { - create: (control, record, value) => Field; - search: (searchvalue) => boolean; - __repr__: () => string; -} - -export interface LookupItem extends Base { - -} - -export interface User extends Base { - -} - -export interface File extends Base { - -} - -export interface Geo extends Base { - -} - -export interface Attachment extends Base { - -} - -export interface NoteAttachment extends Attachment { - -} - -export interface URLAttachment extends Attachment { - -} - -export interface FileAttachment extends Attachment { - -} - -export interface ImageAttachment extends Attachment { - -} - -export interface JSONAttachment extends Attachment { - -} - -export interface Installation extends Base { - -} - -export interface Category extends Base { - -} - -export interface KeyView extends Base { - -} - -export interface AppParameter extends Base { - -} - diff --git a/dist/umd/modules/livingapi.js b/dist/umd/modules/livingapi.js index 0195ba3..f4ae3ea 100644 --- a/dist/umd/modules/livingapi.js +++ b/dist/umd/modules/livingapi.js @@ -252,26 +252,7 @@ type: null, subtype: null, _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app" && this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + __repr__: function repr() { return ""; @@ -521,30 +502,8 @@ la.Control, { type: "lookup", - - ul4onload: function ul4onload(decoder) - { - ul4onattrs = this._ul4onattrs.slice(); - for (var i = 0, iter = decoder.loadcontent(); i < ul4onattrs.length; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - this._loadUL4ONAttr(ul4onattrs[i], iteritem.value); - if (ul4onattrs[i] === "app") - { - if (this.app.globals.version != "6") - { - ul4onattrs.push("ininsertprocedure"); - ul4onattrs.push("inupdateprocedure"); - } - ul4onattrs.push("lookupdata"); - } - } - for (; i < ul4onattrs.length; ++i) - this._setDefaultUL4ONAttr(ul4onattrs[i]); - }, - + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), + // ``search.value`` must be ``null`` or a ``LookupItem`` key // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record search: function search(value, search) From c51e4876b5b82e67b89a96a094821888fbe1ffed Mon Sep 17 00:00:00 2001 From: milleniumfrog Date: Wed, 8 Aug 2018 12:44:32 +0200 Subject: [PATCH 36/43] added control attributes --- dist/es2015/modules/livingapi.js | 2 +- dist/umd/modules/livingapi.js | 2 +- src/modules/livingapi.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index f4ae3ea..844e68a 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -251,7 +251,7 @@ { type: null, subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], __repr__: function repr() { diff --git a/dist/umd/modules/livingapi.js b/dist/umd/modules/livingapi.js index f4ae3ea..844e68a 100644 --- a/dist/umd/modules/livingapi.js +++ b/dist/umd/modules/livingapi.js @@ -251,7 +251,7 @@ { type: null, subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], __repr__: function repr() { diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index f4ae3ea..844e68a 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -251,7 +251,7 @@ { type: null, subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default"], + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], __repr__: function repr() { From e132d2689359e15a565ee7818d602d2caada6874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Schwarzinger?= Date: Wed, 5 Sep 2018 13:53:30 +0200 Subject: [PATCH 37/43] ts - es2015 build pipeline like ul4 ts build pipeline - added rollup - changed module type from ul4.js and livingapi.js to es2015 - added sourcemaps - extended build script - build livingsdk --- .gitignore | 5 +- config/tsconfig.es2015.json | 3 +- dist/es2015/livingsdk.js | 14 +- dist/es2015/livingsdk.js.map | 1 + dist/es2015/modules/livingapi.js | 1750 ++- dist/es2015/modules/ul4.js | 16501 ++++++++++++++--------------- dist/umd/livingsdk.js | 176 +- dist/umd/livingsdk.js.map | 1 + dist/umd/modules/livingapi.d.ts | 0 dist/umd/modules/livingapi.js | 990 -- dist/umd/modules/ul4.js | 8804 --------------- package-lock.json | 1519 +++ package.json | 6 + rollup.config.js | 29 + shellscripts/build.sh | 9 +- src/livingsdk.ts | 20 +- src/modules/livingapi.js | 1750 ++- src/modules/ul4.js | 16501 ++++++++++++++--------------- 18 files changed, 18692 insertions(+), 29387 deletions(-) create mode 100644 dist/es2015/livingsdk.js.map create mode 100644 dist/umd/livingsdk.js.map delete mode 100644 dist/umd/modules/livingapi.d.ts delete mode 100644 dist/umd/modules/livingapi.js delete mode 100644 dist/umd/modules/ul4.js create mode 100644 rollup.config.js diff --git a/.gitignore b/.gitignore index 3ffbe6d..936abe7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,9 @@ node.js **/old_* .vscode **/config.ts -**/*.test.js +**/*.test.js* **/*.test.d.ts **/config.ts **/config.js -**/config.d.ts \ No newline at end of file +**/config.d.ts +**/config.js.map \ No newline at end of file diff --git a/config/tsconfig.es2015.json b/config/tsconfig.es2015.json index cd3464e..2f6c378 100644 --- a/config/tsconfig.es2015.json +++ b/config/tsconfig.es2015.json @@ -14,6 +14,7 @@ "outDir": "../dist/es2015", "removeComments": true, "moduleResolution": "node", - "esModuleInterop": true + "esModuleInterop": true, + "sourceMap": true } } \ No newline at end of file diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index 09f6166..1dfa30c 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -1,17 +1,8 @@ import axios from 'axios'; +import livingApi from './modules/livingapi'; +import { ul4on } from './modules/ul4'; let commonjs = (typeof module === 'object' && module.exports); let nodejs = {}; -let ul4on; -let livingApi; -if (commonjs) { - livingApi = require('./modules/livingapi'); - nodejs.https = require('https'); - ul4on = require('./modules/ul4').ul4on; -} -else { - ul4on = window.ul4on; - livingApi = window.livingapi; -} export class LivingSDK { constructor(options = {}, username, password) { this._password = password || ''; @@ -156,3 +147,4 @@ export class LivingSDK { } } export default LivingSDK; +//# sourceMappingURL=livingsdk.js.map \ No newline at end of file diff --git a/dist/es2015/livingsdk.js.map b/dist/es2015/livingsdk.js.map new file mode 100644 index 0000000..25841d3 --- /dev/null +++ b/dist/es2015/livingsdk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index 844e68a..e52d445 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -1,990 +1,900 @@ -(function(root){ - - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - let la = {}; - - let ul4, ul4on; - - if (commonjs) { - ul4 = require('./ul4.js').ul4; - ul4on = require('./ul4').ul4on; - module.exports = la; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - root.livingapi = la; - } - la.Base = ul4._inherit( - ul4.Proto, - { - create: function() - { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - return this[name]; - }, - - ul4onload: function ul4onload(decoder) - { - for (var i = 0, iter = decoder.loadcontent();; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - if (i < this._ul4onattrs.length) - this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); - } - for (; i < this._ul4onattrs.length; ++i) - { - this._setDefaultUL4ONAttr(this._ul4onattrs[i]); - } - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - this[name] = value; - }, - - _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) - { - this[name] = null; +import { ul4, ul4on } from './ul4'; +let amd = (typeof define === 'function' && define.amd); +let commonjs = (typeof module === 'object' && module.exports); + +let la = {}; + + +la.Base = ul4._inherit( + ul4.Proto, + { + create: function () { + return ul4._clone(this); + }, + + ul4ondump: function ul4ondump(encoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + return this[name]; + }, + + ul4onload: function ul4onload(decoder) { + for (var i = 0, iter = decoder.loadcontent(); ; ++i) { + var iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); } - } - ); - - la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() - { - return ""; - }, - - // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) - geodist: function geodist(geo1, geo2) - { - var sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; - var sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; - var deg2rad = Math.PI/180; // Conversion factor degree -> radians - var radius = 6378.137; // Equatorial radius of earth in km - var flat = 1/298.257223563; // Earth flattening - - var lat1 = geo1.lat * deg2rad; - var long1 = geo1.long * deg2rad; - var lat2 = geo2.lat * deg2rad; - var long2 = geo2.long * deg2rad; - var F = (lat1 + lat2)/2; - var G = (lat1 - lat2)/2; - var l = (long1 - long2)/2; - var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); - var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); - var w = Math.atan(Math.sqrt(S/C)); - var D = 2 * w * radius; - var T = Math.sqrt(S*C)/w; - var H1 = (3*T-1)/(2*C); - var H2 = (3*T+1)/(2*S); - var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); - return s; + for (; i < this._ul4onattrs.length; ++i) { + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); } + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + this[name] = value; + }, + + _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) { + this[name] = null; } - ); - - la.FlashMessage = ul4._inherit( - la.Base, - { - _ul4onattrs: ["timestamp", "type", "title", "message"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.Globals = ul4._inherit( + la.Base, + { + _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], + + __repr__: function repr() { + return ""; + }, + + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + geodist: function geodist(geo1, geo2) { + var sqsin = function sqsin(x) { x = Math.sin(x); return x * x }; + var sqcos = function sqsos(x) { x = Math.cos(x); return x * x }; + var deg2rad = Math.PI / 180; // Conversion factor degree -> radians + var radius = 6378.137; // Equatorial radius of earth in km + var flat = 1 / 298.257223563; // Earth flattening + + var lat1 = geo1.lat * deg2rad; + var long1 = geo1.long * deg2rad; + var lat2 = geo2.lat * deg2rad; + var long2 = geo2.long * deg2rad; + var F = (lat1 + lat2) / 2; + var G = (lat1 - lat2) / 2; + var l = (long1 - long2) / 2; + var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + var w = Math.atan(Math.sqrt(S / C)); + var D = 2 * w * radius; + var T = Math.sqrt(S * C) / w; + var H1 = (3 * T - 1) / (2 * C); + var H2 = (3 * T + 1) / (2 * S); + var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; } - ); - - la.App = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], - - insert: function (values) - { - return this.globals.Login._insert(this, values); - }, - - __repr__: function repr() - { - return ""; - } + } +); + +la.FlashMessage = ul4._inherit( + la.Base, + { + _ul4onattrs: ["timestamp", "type", "title", "message"], + + __repr__: function repr() { + return ""; } - ); - - la.View = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.App = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], + + insert: function (values) { + return this.globals.Login._insert(this, values); + }, + + __repr__: function repr() { + return ""; } - ); - - la.DataSource = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "app", "apps"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.View = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + + __repr__: function repr() { + return ""; } - ); - - la.Record = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], - - delete: function () - { + } +); + +la.DataSource = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "app", "apps"], + + __repr__: function repr() { + return ""; + } + } +); + +la.Record = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + + delete: function () { return this.app.globals.Login._delete(this); }, - update: function (values) - { + update: function (values) { return this.app.globals.Login._update(this, values); }, - - __repr__: function repr() - { - return ""; - }, - - search: function search(search) - { - for (var identifier in search) - { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) - { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } - } - return true; - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "values") - return this._sparsevalues; - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "values") - { - this._sparsevalues = value; - this._values = null; - this._fields = null; + + __repr__: function repr() { + return ""; + }, + + search: function search(search) { + for (var identifier in search) { + var fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; } - else - this[name] = value; - } - } - ); - - Object.defineProperty(la.Record, "values", { - get: function() - { - if (this._values === null) - { - this._values = ul4on._havemap ? new Map() : {}; - var self = this; - this.app.controls.forEach(function(control, id){ - var fieldvalue = self._sparsevalues.get(control.identifier); - if (typeof(fieldvalue) === "undefined") - fieldvalue = null; - self._values.set(id, fieldvalue); - }); } - return this._values; - } - }); - - Object.defineProperty(la.Record, "fields", { - get: function() - { - if (this._fields === null) - { - this._fields = ul4on._havemap ? new Map() : {}; - var self = this; - this.values.forEach(function(value, id){ - var field = la.Field.create(self.app.controls.get(id), self.app, value); - self._fields.set(id, field); - }); + return true; + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + if (name === "values") + return this._sparsevalues; + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + if (name === "values") { + this._sparsevalues = value; + this._values = null; + this._fields = null; } - return this._fields; - } - }); - - la.Control = ul4._inherit( - la.Base, - { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], - - __repr__: function repr() - { - return ""; - }, - - asjson: function(value) - { - return value; - }, - - _logsearch: function _logsearch(value, search) - { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, - - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) - { + else + this[name] = value; + } + } +); + +Object.defineProperty(la.Record, "values", { + get: function () { + if (this._values === null) { + this._values = ul4on._havemap ? new Map() : {}; + var self = this; + this.app.controls.forEach(function (control, id) { + var fieldvalue = self._sparsevalues.get(control.identifier); + if (typeof (fieldvalue) === "undefined") + fieldvalue = null; + self._values.set(id, fieldvalue); + }); + } + return this._values; + } +}); + +Object.defineProperty(la.Record, "fields", { + get: function () { + if (this._fields === null) { + this._fields = ul4on._havemap ? new Map() : {}; + var self = this; + this.values.forEach(function (value, id) { + var field = la.Field.create(self.app.controls.get(id), self.app, value); + self._fields.set(id, field); + }); + } + return this._fields; + } +}); + +la.Control = ul4._inherit( + la.Base, + { + type: null, + subtype: null, + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], + + __repr__: function repr() { + return ""; + }, + + asjson: function (value) { + return value; + }, + + _logsearch: function _logsearch(value, search) { + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); + }, + + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search: function search(value, search) { + return false; + } + } +); + +la.BoolControl = ul4._inherit( + la.Control, + { + type: "bool", + __type__: "BoolControl", + + // ``search`` must by ``null``, ``false`` or ``true`` + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else return false; - } } - ); - - la.BoolControl = ul4._inherit( - la.Control, - { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } + } +); + +la.IntControl = ul4._inherit( + la.Control, + { + type: "int", + __type__: "IntControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; } - ); - - la.IntControl = ul4._inherit( - la.Control, - { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else + } +); + +la.NumberControl = ul4._inherit( + la.Control, + { + type: "number", + __type__: "NumberControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") { + if (value === null) return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); } + else + return false; } - ); - - la.NumberControl = ul4._inherit( - la.Control, - { - type: "number", - __type__: "NumberControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") + } +); + +la.StringControl = ul4._inherit( + la.Control, + { + type: "string", + + asjson: function (value) { + return value; + }, + + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") { + if (search.value === null || value === null) return search.value === value; - else if (search.operator === "range") - { - if (value === null) - return false; - return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); - } else - return false; + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; } } - ); - - la.StringControl = ul4._inherit( - la.Control, - { - type: "string", + } +); + +la.TextControl = ul4._inherit( + la.StringControl, + { + subtype: "text", + __type__: "TextControl" + } +); + +la.EmailControl = ul4._inherit( + la.StringControl, + { + subtype: "email", + __type__: "EmailControl" + } +); + +la.URLControl = ul4._inherit( + la.StringControl, + { + subtype: "url", + __type__: "URLControl" + } +); + +la.TelControl = ul4._inherit( + la.StringControl, + { + subtype: "tel" + } +); + +la.PasswordControl = ul4._inherit( + la.StringControl, + { + subtype: "password" + } +); + +la.TextAreaControl = ul4._inherit( + la.StringControl, + { + subtype: "textarea", + __type__: "TextAreaControl" + } +); - asjson: function (value) - { +la.DateControl = ul4._inherit( + la.Control, + { + type: "date", + subtype: "date", + __type__: "DateControl", + + asjson: function (value) { + if (value instanceof Date) { + value = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; + } return value; }, - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") - { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; - } - } - } - ); - - la.TextControl = ul4._inherit( - la.StringControl, - { - subtype: "text", - __type__: "TextControl" - } - ); - - la.EmailControl = ul4._inherit( - la.StringControl, - { - subtype: "email", - __type__: "EmailControl" - } - ); - - la.URLControl = ul4._inherit( - la.StringControl, - { - subtype: "url", - __type__: "URLControl" - } - ); - - la.TelControl = ul4._inherit( - la.StringControl, - { - subtype: "tel" - } - ); - - la.PasswordControl = ul4._inherit( - la.StringControl, - { - subtype: "password" - } - ); - - la.TextAreaControl = ul4._inherit( - la.StringControl, - { - subtype: "textarea", - __type__: "TextAreaControl" - } - ); - - la.DateControl = ul4._inherit( - la.Control, - { - type: "date", - subtype: "date", - __type__: "DateControl", - - asjson: function (value) - { - if (value instanceof Date){ - value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, - - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) - { - this._logsearch(value, search); - - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); - - if (search.operator === "equals") + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; + }, + + // searchvalue must be ``null``, a ``Date`` object or a string + search: function search(value, search) { + this._logsearch(value, search); + + var searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") { + if (searchvalue === null || value === null) return searchvalue === value; - else if (search.operator === "contains") - { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } else - return false; + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; } + else + return false; } - ); - - la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M"; - else - return "%m/%d/%Y %H:%M"; - } + } +); + +la.DatetimeMinuteControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimeminute", + __type__: "DatetimeMinuteControl", + + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; } - ); - - la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } + } +); + +la.DatetimeSecondControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimesecond", + __type__: "DatetimeMinuteSecond", + + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; } - ); - - la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), - - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (this.lookupapp === null) - { - if (search.operator === "equals") - { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } + } +); + +la.LookupControl = ul4._inherit( + la.Control, + { + type: "lookup", + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), + + // ``search.value`` must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (this.lookupapp === null) { + if (search.operator === "equals") { + if (value === null) + return search.value === null; else - return false; + return value.key === search.value; } else - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } + return false; } - } - ); - - la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } - ); - - la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } - ); - - la.LookupChoiceControl = ul4._inherit( - la.LookupControl, - { - subtype: "choice", - __type__: "LookupChoiceControl" - } - ); - - la.AppLookupControl = ul4._inherit( - la.Control, - { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { + else { if (value === null || search.value === null) return value === search.value; else return value.search(search); } } - ); - - la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } - ); - - la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "radio", - __type__: "AppLookupRadioControl" - } - ); - - la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "choice", - __type__: "AppLookupChoiceControl" - } - ); - - la.MultipleLookupControl = ul4._inherit( - la.LookupControl, - { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (this.lookupapp === null) - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].key === search.value) - return true; - } - return false; - } - else - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } + } +); + +la.LookupSelectControl = ul4._inherit( + la.LookupControl, + { + subtype: "select", + __type__: "LookupSelectControl" + } +); + +la.LookupRadioControl = ul4._inherit( + la.LookupControl, + { + subtype: "radio", + __type__: "LookupRadioControl" + } +); + +la.LookupChoiceControl = ul4._inherit( + la.LookupControl, + { + subtype: "choice", + __type__: "LookupChoiceControl" + } +); + +la.AppLookupControl = ul4._inherit( + la.Control, + { + type: "applookup", + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } +); + +la.AppLookupSelectControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "select", + __type__: "AppLookupSelectControl" + } +); + +la.AppLookupRadioControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "radio", + __type__: "AppLookupRadioControl" + } +); + +la.AppLookupChoiceControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "choice", + __type__: "AppLookupChoiceControl" + } +); + +la.MultipleLookupControl = ul4._inherit( + la.LookupControl, + { + type: "multiplelookup", + + // search.value must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (search.operator === "equals") { + if (this.lookupapp === null) { + for (var i = 0; i < value.length; ++i) { + if (value[i].key === search.value) + return true; } - } - else return false; - } - } - ); - - la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "select", - __type__: "MultipleLookupSelectControl" - } - ); - - la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" - } - ); - - la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, - { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { + } + else { if (search.value === null) return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { + else { + for (var i = 0; i < value.length; ++i) { if (value[i].search(search.value)) return true; } return false; } } - else - return false; } + else + return false; } - ); - - la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } - ); - - la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } - ); - - la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", - - - asjson: function(value) - { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - }, - - __type__: "GeoControl" - } - ); - - la.FileControl = ul4._inherit( - la.Control, - { - type: "file", - __type__: "FileControl" - } - ); - - la.ButtonControl = ul4._inherit( - la.Control, - { - type: "button", - __type__: "ButtonControl" - } - ); - - la.Field = ul4._inherit( - la.Base, - { - create: function create(control, record, value) - { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, - - search: function search(searchvalue) - { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() - { - return ""; + } +); + +la.MultipleLookupSelectControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "select", + __type__: "MultipleLookupSelectControl" + } +); + +la.MultipleLookupCheckboxControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "checkbox", + __type__: "MultipleLookupCheckboxControl" + } +); + +la.MultipleAppLookupControl = ul4._inherit( + la.AppLookupControl, + { + type: "multipleapplookup", + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (search.operator === "equals") { + if (search.value === null) + return value.length === 0; + else { + for (var i = 0; i < value.length; ++i) { + if (value[i].search(search.value)) + return true; + } + return false; + } } + else + return false; } - ); - - la.LookupItem = ul4._inherit( - la.Base, - { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.MultipleAppLookupSelectControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "select", + __type__: "MultipleAppLookupSelectControl" + } +); + +la.MultipleAppLookupCheckboxControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "checkbox", + __type__: "MultipleAppLookupCheckboxControl" + } +); + +la.GeoControl = ul4._inherit( + la.Control, + { + type: "geo", + + + asjson: function (value) { + if (la.Geo.isprotoof(value)) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + }, + + __type__: "GeoControl" + } +); + +la.FileControl = ul4._inherit( + la.Control, + { + type: "file", + __type__: "FileControl" + } +); + +la.ButtonControl = ul4._inherit( + la.Control, + { + type: "button", + __type__: "ButtonControl" + } +); + +la.Field = ul4._inherit( + la.Base, + { + create: function create(control, record, value) { + var field = la.Base.create.call(this); + field.control = control; + field.record = record; + field.value = value; + return field; + }, + + search: function search(searchvalue) { + return this.control.search(this.value, searchvalue); + }, + + __repr__: function repr() { + return ""; } - ); - - la.User = ul4._inherit( - la.Base, - { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.LookupItem = ul4._inherit( + la.Base, + { + _ul4onattrs: ["key", "label"], + + __repr__: function repr() { + return ""; } - ); - - la.File = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.User = ul4._inherit( + la.Base, + { + _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], + + __repr__: function repr() { + return ""; } - ); - - la.Geo = ul4._inherit( - la.Base, - { - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.File = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], + + __repr__: function repr() { + return ""; } - ); - - la.Attachment = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.Geo = ul4._inherit( + la.Base, + { + _ul4onattrs: ["lat", "long", "info"], + + __repr__: function repr() { + return ""; } - ); - - la.NoteAttachment = ul4._inherit( - la.Attachment, - { - type: "noteattachment", - __type__: "NoteAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.URLAttachment = ul4._inherit( - la.Attachment, - { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.FileAttachment = ul4._inherit( - la.Attachment, - { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.ImageAttachment = ul4._inherit( - la.Attachment, - { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) - } - ); - - la.JSONAttachment = ul4._inherit( - la.Attachment, - { - type: "jsonattachment", - __type__: "JSONAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "value") - return ul4._asjson(this.value); - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "value") - this.value = ul4._fromjson(value); - else - this[name] = value - } + } +); + +la.Attachment = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "record", "label", "active"], + + __repr__: function repr() { + return ""; } - ); - - la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.NoteAttachment = ul4._inherit( + la.Attachment, + { + type: "noteattachment", + __type__: "NoteAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.URLAttachment = ul4._inherit( + la.Attachment, + { + type: "urlattachment", + __type__: "URLAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.FileAttachment = ul4._inherit( + la.Attachment, + { + type: "fileattachment", + __type__: "FileAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.ImageAttachment = ul4._inherit( + la.Attachment, + { + type: "imageattachment", + __type__: "ImageAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + } +); + +la.JSONAttachment = ul4._inherit( + la.Attachment, + { + type: "jsonattachment", + __type__: "JSONAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value } - ); - - la.Category = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], - - __repr__: function repr() - { - var v = []; - var category = this; - while (category !== null) - { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } + } +); + +la.Installation = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name"], + + __repr__: function repr() { + return ""; } - ); - - la.KeyView = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], - - __repr__: function repr() - { - return ""; + } +); + +la.Category = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + + __repr__: function repr() { + var v = []; + var category = this; + while (category !== null) { + v.splice(0, 0, category.identifier); + category = category.parent; } + return ""; } - ); - - la.AppParameter = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.KeyView = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "key", "user"], + + __repr__: function repr() { + return ""; + } + } +); + +la.AppParameter = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "identifier", "description", "value"], + + __repr__: function repr() { + return ""; } - ); - - var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "AppLookupControl", - "AppLookupSelectControl", - "AppLookupRadioControl", - "AppLookupChoiceControl", - "MultipleLookupControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "MultipleAppLookupControl", - "MultipleAppLookupSelectControl", - "MultipleAppLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); - } - - })(this); \ No newline at end of file + } +); + +var classes = [ + "Globals", + "App", + "View", + "DataSource", + "Record", + "BoolControl", + "IntControl", + "NumberControl", + "TextControl", + "EmailControl", + "URLControl", + "TelControl", + "PasswordControl", + "TextAreaControl", + "DateControl", + "DatetimeMinuteControl", + "DatetimeSecondControl", + "LookupControl", + "LookupSelectControl", + "LookupRadioControl", + "LookupChoiceControl", + "AppLookupControl", + "AppLookupSelectControl", + "AppLookupRadioControl", + "AppLookupChoiceControl", + "MultipleLookupControl", + "MultipleLookupSelectControl", + "MultipleLookupCheckboxControl", + "MultipleAppLookupControl", + "MultipleAppLookupSelectControl", + "MultipleAppLookupCheckboxControl", + "GeoControl", + "FileControl", + "ButtonControl", + "Field", + "LookupItem", + "User", + "File", + "Geo", + "NoteAttachment", + "URLAttachment", + "FileAttachment", + "ImageAttachment", + "JSONAttachment", + "Installation", + "Category", + "KeyView", + "AppParameter" +]; + +for (var i = 0; i < classes.length; ++i) { + var name = classes[i]; + var object = la[name]; + ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); +} + +export default la; \ No newline at end of file diff --git a/dist/es2015/modules/ul4.js b/dist/es2015/modules/ul4.js index cad6ec8..5efbe33 100644 --- a/dist/es2015/modules/ul4.js +++ b/dist/es2015/modules/ul4.js @@ -29,8776 +29,7731 @@ /*jslint vars: true */ -(function(undefined){ - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - var root = this, ul4 = {}, ul4on = {}; - - root.ul4 = ul4; - - root.ul4on = ul4on; - - - if (commonjs) { - module.exports.ul4 = ul4; - module.exports.ul4on = ul4on; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - } - - ul4.version = "41"; - - // - // UL4ON - // - - ul4on._registry = {}; - - ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); - - ul4on._havemapconstructor = false; - - if (ul4on._havemap) - { - try - { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) - { - } - } - - ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); - - ul4on._havesetconstructor = false; - - if (ul4on._haveset) - { - try - { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) - { - } - } - - // Function used for making maps, when the Map constructor doesn't work - ul4on._makemap = function _makemap() - { - var map = new Map(); - - for (var i = 0; i < arguments.length; ++i) - { - var argument = arguments[i]; - map.set(argument[0], argument[1]); - } - return map; - }; - - // Function that creates en empty Map (if supported) or an empty object - ul4on._emptymap = function _emptymap() - { - return ul4on._havemap ? new Map() : {}; - }; - - // Function that adds a (key, value) item to an object (or map) - if (ul4on._havemap) - { - ul4on._setmap = function _setmap(map, key, value) - { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else - map[key] = value; - }; - } - else - { - ul4on._setmap = function _setmap(map, key, value) - { - map[key] = value; - }; - } - - // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) - if (ul4on._haveset) - { - ul4on._makeset = function _makeset() - { - var set = this._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - else - { - ul4on._makeset = function _makeset() - { - var set = ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - - // Register the object ``obj`` under the name ``name`` with the UL4ON machinery - ul4on.register = function register(name, obj) - { - obj.ul4onname = name; - ul4on._registry[name] = function(){return obj.create();}; - }, - - // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) - { - var encoder = ul4on.Encoder.create(indent); - encoder.dump(obj); - return encoder.finish(); - }, - - // Load an object from the string ``data``. - // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) - { - var decoder = ul4on.Decoder.create(data, registry); - return decoder.load(); - }, - - // Helper "class" for encoding - ul4on.Encoder = { - // Create a new Encoder object - create: function create(indent) - { - var encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line) - { - var i, oldindent; - - if (this.indent !== null) - { - for (i = 0; i < this._level; ++i) - this.data.push(this.indent); - } - else - { - if (this.data.length) - this.data.push(" "); - } - this.data.push(line); - - if (arguments.length > 1) - { - oldindent = this.indent; - this.indent = null; - for (i = 1; i < arguments.length; ++i) - this.dump(arguments[i]); - this.indent = oldindent; - } - - if (this.indent !== null) - this.data.push("\n"); - }, - - // Return the complete string written to the buffer - finish: function finish() - { - return this.data.join(""); - }, - - dump: function dump(obj) - { - if (obj === null) - this._line("n"); - else if (typeof(obj) == "boolean") - this._line(obj ? "bT" : "bF"); - else if (typeof(obj) == "number") - { - var type = (Math.round(obj) == obj) ? "i" : "f"; - this._line(type + obj); - } - else if (typeof(obj) == "string") - { - var index = this._strings2index[obj]; - if (typeof(index) !== "undefined") - { - this._line("^" + index); - } - else - { - this._strings2index[obj] = this._backrefs++; - this._line("S" + ul4._str_repr(obj)); - } - } - else if (ul4._iscolor(obj)) - this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); - else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); - else if (ul4._istimedelta(obj)) - this._line("t", obj.days(), obj.seconds(), obj.microseconds()); - else if (ul4._ismonthdelta(obj)) - this._line("m", obj.months()); - else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) - this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) - { - if (obj.__id__) - { - var index = this._ids2index[obj.__id__]; - if (typeof(index) != "undefined") - { - this._line("^" + index); - return; - } - } - if (obj.__id__) - this._ids2index[obj.__id__] = this._backrefs++; - this._line("O", obj.ul4onname); - ++this._level; - obj.ul4ondump(this); - --this._level; - this._line(")"); - } - else if (ul4._islist(obj)) - { - this._line("l"); - ++this._level; - for (var i in obj) - this.dump(obj[i]); - --this._level; - this._line("]"); - } - else if (ul4._ismap(obj)) - { - this._line("e"); - ++this._level; - obj.forEach(function(value, key) { - this.dump(key); - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else if (ul4._isdict(obj)) - { - this._line("d"); - ++this._level; - for (var key in obj) - { - this.dump(key); - this.dump(obj[key]); - } - --this._level; - this._line("}"); - } - else if (ul4._isset(obj)) - { - this._line("y"); - ++this._level; - obj.forEach(function(value) { - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else - throw "can't handle object"; - } - }; - - // Helper "class" for decoding - ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) - { - var decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof(registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, - - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() - { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, - - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() - { - var re_white = /\s/; - - for (;;) - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - var c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; - } - }, - - // Read ``size`` characters from the buffer - read: function read(size) - { - if (this.pos+size > this.length) - size = this.length-this.pos; - var result = this.data.substring(this.pos, this.pos+size); - this.pos += size; - return result; - }, - - // "unread" one character - backup: function backup() - { - --this.pos; - }, - - // Read a number from the buffer - readnumber: function readnumber() - { - var re_digits = /[-+0123456789.eE]/, value = ""; - for (;;) - { - var c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else - { - var result = parseFloat(value); - if (result == NaN) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; - } - } - }, - - _beginfakeloading: function _beginfakeloading() - { - var oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, - - _endfakeloading: function _endfakeloading(oldpos, value) - { - this.backrefs[oldpos] = value; - }, - - _readescape: function _readescape(escapechar, length) - { - var chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - var codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, - - // Load the next object from the buffer - load: function load() - { - var typecode = this.readblackchar(); - var result; - switch (typecode) - { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - var delimiter = this.readblackchar(); - for (;;) - { - var c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") - { - var c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); - else - result.push("\\" + c2); - } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load()/1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - var key = this.load(); - var value = this.load(); - ul4on._setmap(result, key, value); - } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - var oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - var name = this.load(); - var proto; - if (this.registry !== null) - { - proto = this.registry[name]; - if (typeof(proto) === "undefined") - proto = ul4on._registry[name]; - } - else - proto = ul4on._registry[name]; - if (typeof(proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; - } - }, - - // Return an iterator for loading the content of a object - loadcontent: function load(loadcontent) - { - let self = this; - return { - next: function() - { - let typecode = self.readblackchar(); - self.backup(); - if (typecode == ")") - return {done: true}; - else - return {done: false, value: self.load()}; - } - }; - } - }; - - - // - // UL4 - // - - // REs for parsing JSON - ul4._rvalidchars = /^[\],:{}\s]*$/; - ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - - /// Helper functions - - // Crockford style object creation - ul4._simpleclone = function _simpleclone(obj) - { - function F(){}; - F.prototype = obj; - var result = new F(); - return result; - }; - - // Crockford style object creation + prototype chain + object ids - ul4._clone = function _clone(obj) - { - var result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; - }; - - // Adds attributes from on object to another and returns it - ul4._extend = function _extend(obj, attrs) - { - for (var name in attrs) - obj[name] = attrs[name]; - return obj; - }; - - // Clone an object via ``_simpleclone`` and extend it - ul4._simpleinherit = function _simpleinherit(baseobj, attrs) - { - return ul4._extend(ul4._simpleclone(baseobj), attrs); - }; - - // Clone an object via ``_clone`` and extend it - ul4._inherit = function _inherit(baseobj, attrs) - { - return ul4._extend(ul4._clone(baseobj), attrs); - }; - - // Convert a map to an object - ul4._map2object = function _map2object(obj) - { - if (ul4._ismap(obj)) - { - var newobj = {}; - obj.forEach(function(value, key){ - if (typeof(key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; - }; - - // Clip a number to the range [0;max) - ul4._bound = function _bound(value, upper) - { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; - }; - - // Create a pretty stacktrace from an exception - ul4._stacktrace = function _stacktrace(exc) - { - var output = ul4._type(exc); - var s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; - }; - - // Call a function ``f`` with UL4 argument handling - ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) - { - var finalargs; - if (needsobject) - { - if (signature === null) - { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; - } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else - { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); - }; - - ul4._callfunction = function _callfunction(context, f, args, kwargs) - { - var name = f._ul4_name || f.name; - if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); - } - - ul4._callobject = function _callobject(context, obj, args, kwargs) - { - if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); - } - - ul4._callrender = function _callrender(context, obj, args, kwargs) - { - if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); - } - - ul4._call = function _call(context, f, args, kwargs) - { - if (typeof(f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof(f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); - } - - ul4._unpackvar = function _unpackvar(lvalue, value) - { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else - { - var newvalue = []; - var iter = ul4._iter(value); - - for (var i = 0;;++i) - { - var item = iter.next(); - - if (item.done) - { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else - { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } - }; - - ul4._formatsource = function _formatsource(out) - { - var finalout = []; - var level = 0, needlf = false; - for (var i = 0; i < out.length; ++i) - { - if (typeof(out[i]) === "number") - { - level += out[i]; - needlf = true; - } - else - { - if (needlf) - { - finalout.push("\n"); - for (var j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; - } - finalout.push(out[i]); - } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); - }; - - // Compare ``obj1`` and ``obj2`` if they have the same value - ul4._eq = function _eq(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof(obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 == obj2 - else - return false; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); - else - return false; - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } - else - return false; - } - else if (ul4._isobject(obj1)) - { - if (ul4._isobject(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.hasOwnProperty(key)) - { - if (!ul4._eq(obj1[key], obj2[key])) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.has(key)) - { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - var result = true; - obj2.forEach(function(value, key){ - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; - } - else - return false; - } - else if (ul4._ismap(obj1)) - { - if (ul4._isobject(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; - } - }); - if (!result) - return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.has(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2.get(key))) - result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) - { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - var result = true; - obj1.forEach(function(value){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(value)) - result = false; - } - }); - return result; - } - else - return false; - } - else - return obj1 === obj2; - }; - - // Compare ``obj1`` and ``obj2`` if they don't have the same value - ul4._ne = function _ne(obj1, obj2) - { - if (obj1 && typeof(obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof(obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); - } - - ul4._unorderable = function _unorderable(operator, obj1, obj2) - { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); - }; - - // Return: - // -1 when ``obj1 < obj2``, - // 0 when ``obj1 == obj2``, - // 1 when ``obj1 > obj2``, - // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) - // raise TypeError if objects are uncomparable - // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= - // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - - ul4._cmp = function _cmp(operator, obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - { - var v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); - } - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return 0; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return 1; - var res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; - } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); - } - - // Return whether ``obj1 < obj2`` - ul4._lt = function _lt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 < obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length < obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) - { - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); - }; - - // Return whether ``obj1 <= obj2`` - ul4._le = function _le(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length <= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); - }; - - // Return whether ``obj1 > obj2`` - ul4._gt = function _gt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 > obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length > obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); - }; - - // Return whether ``obj1 >= obj2`` - ul4._ge = function _ge(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length >= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); - }; - - // Return an iterator for ``obj`` - ul4._iter = function _iter(obj) - { - if (typeof(obj) === "string" || ul4._islist(obj)) - { - return { - index: 0, - next: function() - { - if (this.index < obj.length) - return {value: obj[this.index++], done: false}; - else - return {done: true}; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof(obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) - { - var keys = []; - obj.forEach(function(value, key){ - keys.push(key); - }); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - else if (ul4._isset(obj)) - { - var values = []; - obj.forEach(function(value, key){ - values.push(value); - }); - return { - index: 0, - next: function() - { - if (this.index >= values.length) - return {done: true}; - return {value: values[this.index++], done: false}; - } - }; - } - else if (ul4._isul4set(obj)) - { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) - { - var keys = []; - for (var key in obj) - keys.push(key); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); - }; - - ul4._str_repr = function _str_repr(str, ascii) - { - var result = ""; - var squote = false, dquote = false; - - for (var i = 0; i "; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof(obj) === "undefined") - return ""; - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; - }; - - // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` - ul4._repr = function _repr(obj) - { - return ul4._repr_internal(obj, false); - } - - ul4._ascii = function _ascii(obj) - { - return ul4._repr_internal(obj, true); - } - - ul4._date_str = function _date_str(obj) - { - var year = obj.getFullYear(); - var month = obj.getMonth()+1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - - var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; - }; - - ul4._str = function _str(obj) - { - if (typeof(obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof(obj) === "string") - return obj; - else if (typeof(obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") - return obj.__str__(); - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; - }; - - // Convert ``obj`` to bool, according to its "truth value" - ul4._bool = function _bool(obj) - { - if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else - { - if (typeof(obj) === "object", typeof(obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) - { - for (var key in obj) - { - if (!obj.hasOwnProperty(key)) - continue; - return true; - } - return false; - } - return true; - } - }; - - // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) - ul4._int = function _int(obj, base) - { - var result; - if (base !== null) - { - if (typeof(obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else - { - if (typeof(obj) == "string") - { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else if (typeof(obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } - }; - - // Convert ``obj`` to a float - ul4._float = function _float(obj) - { - if (typeof(obj) === "string") - return parseFloat(obj); - else if (typeof(obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); - }; - - // Convert ``obj`` to a list - ul4._list = function _list(obj) - { - var iter = ul4._iter(obj); - - var result = []; - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } - }; - - // Convert ``obj`` to a set - ul4._set = function _set(obj) - { - var iter = ul4._iter(obj); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } - }; - - // Return the length of ``sequence`` - ul4._len = function _len(sequence) - { - if (typeof(sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) - { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); - }; - - ul4._type = function _type(obj) - { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof(obj) === "undefined") - return "undefined"; - else if (typeof(obj) === "string") - return "str"; - else if (typeof(obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof(obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; - }; - - - // Return whether any of the items in ``iterable`` are true - ul4._any = function _any(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } - }; - - // Return whether all of the items in ``iterable`` are true - ul4._all = function _all(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } - }; - - // Check if ``obj`` is undefined - ul4._isundefined = function _isundefined(obj) - { - return typeof(obj) === "undefined"; - }; - - - // Check if ``obj`` is *not* undefined - ul4._isdefined = function _isdefined(obj) - { - return typeof(obj) !== "undefined"; - }; - - // Check if ``obj`` is ``None`` - ul4._isnone = function _isnone(obj) - { - return obj === null; - }; - - // Check if ``obj`` is a boolean - ul4._isbool = function _isbool(obj) - { - return typeof(obj) == "boolean"; - }; - - // Check if ``obj`` is a int - ul4._isint = function _isint(obj) - { - return (typeof(obj) == "number") && Math.round(obj) == obj; - }; - - // Check if ``obj`` is a float - ul4._isfloat = function _isfloat(obj) - { - return (typeof(obj) == "number") && Math.round(obj) != obj; - }; - - // Check if ``obj`` is a string - ul4._isstr = function _isstr(obj) - { - return typeof(obj) == "string"; - }; - - // Check if ``obj`` is a date - ul4._isdate = function _isdate(obj) - { - return Object.prototype.toString.call(obj) == "[object Date]"; - }; - - // Check if ``obj`` is a color - ul4._iscolor = function _iscolor(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); - }; - - // Check if ``obj`` is a timedelta object - ul4._istimedelta = function _istimedelta(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); - }; - - // Check if ``obj`` is a monthdelta object - ul4._ismonthdelta = function _ismonthdelta(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); - }; - - // Check if ``obj`` is a template - ul4._istemplate = function _istemplate(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); - }; - - // Check if ``obj`` is a function - ul4._isfunction = function _isfunction(obj) - { - return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); - }; - - // Check if ``obj`` is a list - ul4._islist = function _islist(obj) - { - return Object.prototype.toString.call(obj) == "[object Array]"; - }; - - // Check if ``obj`` is a set - ul4._isset = function _isset(obj) - { - return Object.prototype.toString.call(obj) == "[object Set]"; - }; - - // Check if ``obj`` is an exception (at least a UL4 exception) - ul4._isexception = function _isexception(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); - }; - - ul4._isul4set = function _isul4set(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); - }; - - // Check if ``obj`` is an iterator - ul4._isiter = function _isiter(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; - }; - - // Check if ``obj`` is a JS object - ul4._isobject = function _isobject(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; - }; - - // Check if ``obj`` is a map - ul4._ismap = function _ismap(obj) - { - if (ul4on._havemap) - return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - return false; - }; - - // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) - ul4._isdict = function _isdict(obj) - { - return ul4._isobject(obj) || ul4._ismap(obj); - }; - - - // Repeat string ``str`` ``rep`` times - ul4._str_repeat = function _str_repeat(str, rep) - { - var result = ""; - for (; rep>0; --rep) - result += str; - return result; - }; - - ul4._list_repeat = function _list_repeat(list, rep) - { - var result = []; - for (; rep>0; --rep) - for (var i = 0; i < list.length; ++i) - result.push(list[i]); - return result; - }; - - ul4._str_json = function _str_json(str) - { - var result = ""; - for (var i = 0; i < str.length; ++i) - { - var c = str[i]; - switch (c) - { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - default: - var code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; - }; - - // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) - ul4._asjson = function _asjson(obj) - { - if (obj === null) - return "null"; - else if (typeof(obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof(obj) === "string") - return ul4._str_json(obj); - else if (typeof(obj) === "number") - { - return "" + obj; - } - else if (ul4._islist(obj)) - { - var v = []; - v.push("["); - for (var i = 0; i < obj.length; ++i) - { - if (i != 0) - v.push(", "); - v.push(ul4._asjson(obj[i])); - } - v.push("]"); - return v.join(""); - } - else if (ul4._ismap(obj)) - { - var v = []; - v.push("{"); - var i = 0; - obj.forEach(function(value, key){ - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); - v.push("}"); - return v.join(""); - } - else if (ul4._isobject(obj)) - { - var v = []; - v.push("{"); - var i = 0; - for (var key in obj) - { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(obj[key])); - } - v.push("}"); - return v.join(""); - } - else if (ul4._isdate(obj)) - { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) - { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) - { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) - { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) - { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); - }; - - // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object - ul4._fromjson = function _fromjson(string) - { - // The following is from jQuery's parseJSON function - string = ul4._strip(string, null); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); - }; - - // Encodes ``obj`` in the UL4 Object Notation format - ul4._asul4on = function _asul4on(obj) - { - return ul4on.dumps(obj); - }; - - // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object - ul4._fromul4on = function _fromul4on(string) - { - return ul4on.loads(string); - }; - - ul4._format_date = function _format_date(obj, fmt, lang) - { - var translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - var translation = translations[lang]; - - var firstday; - - var result = []; - var inspec = false; - for (var i = 0; i < fmt.length; ++i) - { - var c = fmt[i]; - if (inspec) - { - switch (c) - { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth()+1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; - } - result.push(c); - inspec = false; - } - else - { - if (c == "%") - inspec = true; - else - result.push(c); - } - } - return result.join(""); - }; - - ul4._format_int = function _format_int(obj, fmt, lang) - { - var work = fmt; - - // Defaults - var fill = ' '; - var align = '>'; // '<', '>', '=' or '^' - var sign = '-'; // '+', '-' or ' ' - var alternate = false; - var minimumwidth = 0; - var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) - { - type = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract minimum width - if (/\d+$/.test(work)) - { - var minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) - { - align = '='; - fill = '0'; - } - minimumwidth = parseInt(minimumwidthStr); - } - - // Alternate form? - if (/#$/.test(work)) - { - alternate = true; - work = work.substring(0, work.length-1); - } - - // Determine sign - if (/[+ -]$/.test(work)) - { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) - { - if (/[<>=^]$/.test(work)) - { - align = work[1]; - fill = work[0]; - } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) - { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - - // Basic number formatting - var neg = obj < 0; - - if (neg) - obj = -obj; - - var output; - switch (type) - { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } - - // The rest of the formatting - if (align === '=') - { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; - - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; - - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else - { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) - { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth-output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - else // if (align == '^') - { - var pad = minimumwidth - output.length; - var padBefore = Math.floor(pad/2); - var padAfter = pad-padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } - } - } - return output; - }; - - // Format ``obj`` using the format string ``fmt`` in the language ``lang`` - ul4._format = function _format(obj, fmt, lang) - { - if (typeof(lang) === "undefined" || lang === null) - lang = "en"; - else - { - var translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; - lang = lang.toLowerCase(); - if (typeof(translations[lang]) === "undefined") - { - lang = lang.split(/_/)[0]; - if (typeof(translations[lang]) === "undefined") - lang = "en"; - } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); - }; - - ul4._lpad = function _lpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; - }; - - ul4._rpad = function _rpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; - }; - - ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) - { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - - isprotoof: function isprotoof(obj) - { - while (true) - { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; - } - }, - - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) - { - return this === other; - }, - - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) - { - return !this.__eq__(other); - }, - - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` - - __bool__: function __bool__() - { - return true; - } - }; - - ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create() - { - var signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - var nextDefault = false; - var lastArgname = null; - for (var i = 0; i < arguments.length; ++i) - { - var argName = arguments[i]; - if (nextDefault) - { - signature.args.push({name: lastArgname, defaultValue: argName}); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else - { - if (argName.substr(argName.length-1) === "=") - { - lastArgname = argName.substr(0, argName.length-1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else - { - signature.args.push({name: argName}); - signature.argNames[argName] = true; - } - } - } - return signature; - }, - - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) - { - var finalargs = []; - var decname = name !== null ? name + "() " : ""; - - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - if (i < args.length) - { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else - { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else - { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } - } - } - - // Do we accept additional positional arguments? - if (this.remargs === null) - { - // No, but we have them -> complain - if (args.length > this.args.length) - { - var prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else - { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } - - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) - { - // No => complain about unknown ones - for (var key in kwargs) - { - if (!this.argNames[key]) - { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else - { - // Yes => Put the unknown ones into an object and add that to the arguments array - var remkwargs = {}; - for (var key in kwargs) - { - if (!this.argNames[key]) - remkwargs[key] = kwargs[key]; - } - finalargs.push(remkwargs); - } - - return finalargs; - }, - - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) - { - args = this.bindArray(name, args, kwargs); - var argObject = {}; - var i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, - - __repr__: function __repr__() - { - return ""; - }, - - __str__: function __str__() - { - return this.toString(); - }, - - toString: function toString() - { - var v = []; - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); - } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; - } - } - ); - - // Adds name and signature to a function/method and makes the method callable in templates - ul4.expose = function expose(signature, options, f) - { - if (typeof(f) === "undefined") - { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; - }; - - ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) - { - if (vars === null || typeof(vars) === "undefined") - vars = {}; - var context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, - - /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. - * This is used by the various comprehensions to avoid leaking loop variables. - */ - inheritvars: function inheritvars() - { - var context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); - return context; - }, - - /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) - { - var context = ul4._clone(this); - if (indent !== null) - { - context.indents = this.indents.slice(); - context.indents.push(indent); - } - return context; - }, - - /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() - { - var context = ul4._clone(this); - context._output = []; - return context; - }, - - clone: function clone(vars) - { - return ul4._clone(this); - }, - - output: function output(value) - { - this._output.push(value); - }, - - getoutput: function getoutput() - { - return this._output.join(""); - }, - - get: function get(name) - { - return this.vars[name]; - }, - - set: function set(name, value) - { - this.vars[name] = value; - } - } - ); - - /// Exceptions - - ul4.Exception = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Exception", - "cause": null, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - default: - return undefined; - } - } - } - ); - - // Exceptions used internally by UL4 for flow control - ul4.InternalException = ul4._inherit(ul4.Exception, {}); - - // Control flow exceptions - ul4.ReturnException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ReturnException", - - create: function create(result) - { - var exception = ul4._clone(this); - exception.result = result; - return exception; - } - } - ); - - ul4.BreakException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.BreakException" - } - ); - - ul4.ContinueException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ContinueException" - } - ); - - // Real exceptions raised by various parts of UL4 - ul4.SyntaxError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.SyntaxError" - } - ); - - ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, - { - __type__: "ul4.LValueRequiredError", - - toString: function toString() - { - return "lvalue required!"; - } - } - ); - - ul4.TypeError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.TypeError", - - create: function create(operation, message) - { - var exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ValueError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ValueError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ArgumentError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ArgumentError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - /// Exception that wraps other exceptions while they bubble up the stack - ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", - - create: function create(location, cause) - { - var exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, - - _templateprefix: function(template) - { - var out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - var first = true; - while (template != null) - { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; - } - return out.join(""); - }, - - _template: function _template() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else - { - var tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; - } - }, - - _innerpos: function _innerpos() - { - return this.location.pos; - }, - - toString: function toString() - { - var template = this._template(); - var templateprefix = this._templateprefix(template); - var outerpos = this._outerpos(); - var innerpos = this._innerpos(); - - var prefix = template.source.substring(outerpos.start, innerpos.start); - var code = template.source.substring(innerpos.start, innerpos.stop); - var suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - var text = prefix + code + suffix; - var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - var lineno = 1, colno = 1; - for (var i = 0; i < innerpos.start; ++i) - { - if (template.source[i] === "\n") - { - ++lineno; - colno = 1; - } - else - ++colno; - } - - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - return templateprefix + ": " + pos + "\n" + text + "\n" + underline; - }, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - return undefined; - } - } - } - ); - - - /// Classes for the syntax tree - ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) - { - var ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() - { - var out = []; - this._str(out); - return ul4._formatsource(out); - }, - __repr__: function __repr__() - { - var out = []; - this._repr(out); - return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, value) - { - try - { - return this._eval_set(context, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_set: function _eval_set(context, value) - { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) - { - try - { - return this._eval_modify(context, operator, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_modify: function _eval_modify(context, operator, value) - { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) - { - }, - _str: function _str(out) - { - }, - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) - { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } - ); - - ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) - { - var text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() - { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) - { - context.output(this._text()); - }, - _str: function _str(out) - { - out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) - { - var indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) - { - if (typeof(this.template) !== "undefined") - { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() - { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); - else - return this.text; - }, - _eval: function _eval(context) - { - for (var i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) - encoder.dump(null); - else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) - { - out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.LineEndAST = ul4._inherit( - ul4.TextAST, - { - _str: function _str(out) - { - out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) - { - var tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() - { - if (typeof(this.template) !== "undefined") - { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else - { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } - ); - - ul4.CodeAST = ul4._inherit( - ul4.AST, - { - create: function create(tag, pos) - { - var code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) - { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - } - } - ); - - ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) - { - var constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this.value; - } - } - ); - - ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, - { - _handle_eval_list: function _handle_eval_list(context, result) - { - try - { - return this._eval_list(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, result) - { - try - { - return this._eval_set(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) - { - try - { - return this._eval_dict(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) - { - try - { - return this._eval_call(context, args, kwargs); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - result.push(value); - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - result.add(value); - } - } - ); - - - ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.push(item.value); - } - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.add(item.value); - } - } - } - ); - - ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) - { - var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var key = this.key._handle_eval(context); - var value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); - } - } - ); - - ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - ul4on._setmap(result, key, value); - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - ul4on._setmap(result, key, item[key]); - } - } - } - ); - - ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var value = this.value._handle_eval(context); - args.push(value); - } - } - ); - - ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - var value = this.value._handle_eval(context); - kwargs[this.name] = value; - } - } - ); - - ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - args.push.apply(args, item); - } - } - ); - - ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - { - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = item[key]; - } - } - } - } - ); - - ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = []; - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); - return result; - } - } - ); - - ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = []; - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.push(this.item._handle_eval(localcontext)); - } - return result; - } - } - ); - - ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._emptymap(); - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); - return result; - } - } - ); - - ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._emptymap(); - - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - { - var key = this.key._handle_eval(localcontext); - var value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); - } - } - - return result; - } - } - ); - - ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); - - return result; - } - } - ); - - ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); - } - - return result; - } - } - ); - - ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - var iter = ul4._iter(container); - - var localcontext = context.inheritvars(); - - var self = this; - - var result = { - next: function(){ - while (true) - { - var item = iter.next(); - if (item.done) - return item; - var varitems = ul4._unpackvar(self.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) - { - var value = self.item._handle_eval(localcontext); - return {value: value, done: false}; - } - } - } - }; - - return result; - } - } - ); - - ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) - { - var variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) - { - this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) - { - var result = context.get(name); - if (typeof(result) === "undefined") - result = ul4.functions[name]; - return result; - }, - _set: function _set(context, name, value) - { - context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) - { - var newvalue = operator._ido(context.get(name), value) - context.set(name, newvalue); - } - } - ); - - ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) - { - var unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" obj="); - this.obj._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - return this._do(obj); - } - } - ); - - // Negation - ul4.NegAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - if (obj !== null && typeof(obj.__neg__) === "function") - return obj.__neg__(); - return -obj; - } - } - ); - - // Bitwise not - ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return -obj-1; - } - } - ); - - // Not - ul4.NotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return !ul4._bool(obj); - } - } - ); - - // If expression - ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) - { - var ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(+1); - out.push("objif="); - this.objif._repr(out); - out.push(0); - out.push("objcond="); - this.objcond._repr(out); - out.push(0); - out.push("objelse="); - this.objelse._repr(out); - out.push(-1); - out.push(">"); - }, - _eval: function _eval(context) - { - var result; - var condvalue = this.objcond._handle_eval(context); - if (ul4._bool(condvalue)) - result = this.objif._handle_eval(context); - else - result = this.objelse._handle_eval(context); - return result; - } - } - ); - - ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) - { - out.push("return "); - this.obj._str(out); - } - } - ); - - ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._str(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("print "); - this.obj._str(out); - } - } - ); - - ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._xmlescape(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("printx "); - this.obj._str(out); - } - } - ); - - ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) - { - var binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.type); - out.push(" obj1="); - this.obj1._repr(out); - out.push(" obj2="); - this.obj2._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - return this._do(obj1, obj2); - } - } - ); - - // Item access and assignment: dict[key], list[index], string[index], color[index] - ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - var result = this._get(obj1, obj2); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) - { - if (typeof(container) === "string" || ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (typeof(start) === "undefined" || start === null) - start = 0; - if (typeof(stop) === "undefined" || stop === null) - stop = container.length; - return container.slice(start, stop); - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - return container[key]; - } - } - else if (container && typeof(container.__getitem__) === "function") // test this before the generic object test - return container.__getitem__(key); - else if (ul4._ismap(container)) - return container.get(key); - else if (Object.prototype.toString.call(container) === "[object Object]") - return container[key]; - else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) - { - if (ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (start === null) - start = 0; - else if (start < 0) - start += container.length; - if (start < 0) - start = 0; - else if (start > container.length) - start = container.length; - if (stop === null) - stop = container.length; - else if (stop < 0) - stop += container.length; - if (stop < 0) - stop = 0; - else if (stop > container.length) - stop = container.length; - if (stop < start) - stop = start; - container.splice(start, stop-start); // Remove old element - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - container.splice(start++, 0, item.value); - } - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - container[key] = value; - } - } - else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test - container.__setitem__(key, value); - else if (ul4._ismap(container)) - container.set(key, value); - else if (Object.prototype.toString.call(container) === "[object Object]") - container[key] = value; - else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) - { - this._set(container, key, operator._ido(this._get(container, key), value)); - } - } - ); - - // Identifty test operator ``is`` - ul4.IsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 === obj2; - } - } - ); - - // Inverted tdentifty test operator ``is not`` - ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 !== obj2; - } - } - ); - - // Comparison operator == - ul4.EQAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._eq(obj1, obj2); - } - } - ); - - // Comparison operator != - ul4.NEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ne(obj1, obj2); - } - } - ); - - // Comparison operator < - ul4.LTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._lt(obj1, obj2); - } - } - ); - - // Comparison operator <= - ul4.LEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._le(obj1, obj2); - } - } - ); - - // Comparison operator > - ul4.GTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._gt(obj1, obj2); - } - } - ); - - // Comparison operator >= - ul4.GEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ge(obj1, obj2); - } - } - ); - - // Containment test: string in string, obj in list, key in dict, value in rgb - ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - if (typeof(obj) === "string" && typeof(container) === "string") - { - return container.indexOf(obj) !== -1; - } - else if (ul4._islist(container)) - { - return container.indexOf(obj) !== -1; - } - else if (container && typeof(container.__contains__) === "function") // test this before the generic object test - return container.__contains__(obj); - else if (ul4._ismap(container) || ul4._isset(container)) - return container.has(obj); - else if (ul4._isobject(container)) - { - for (var key in container) - { - if (key === obj) - return true; - } - return false; - } - else if (ul4._iscolor(container)) - { - return container._r === obj || container._g === obj || container._b === obj || container._a === obj; - } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); - } - } - ); - - // Inverted containment test - ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - return !ul4.ContainsAST._do(obj, container); - } - } - ); - - // Addition: num + num, string + string - ul4.AddAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__add__) === "function") - return obj1.__add__(obj2); - else if (obj2 && typeof(obj2.__radd__) === "function") - return obj2.__radd__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - var result = []; - ul4._append(result, obj1); - ul4._append(result, obj2); - return result; - } - else - return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - ul4._append(obj1, obj2); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Substraction: num - num - ul4.SubAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__sub__) === "function") - return obj1.__sub__(obj2); - else if (obj2 && typeof(obj2.__rsub__) === "function") - return obj2.__rsub__(obj1); - else if (ul4._isdate(obj1) && ul4._isdate(obj2)) - return this._date_sub(obj1, obj2); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); - return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) - { - var swap = (obj2 > obj1); - - if (swap) - { - var t = obj1; - obj1 = obj2; - obj2 = t; - } - // From now on obj1 is > than obj2 - - var year1 = obj1.getFullYear(); - var yearday1 = ul4._yearday(obj1); - var year2 = obj2.getFullYear(); - var yearday2 = ul4._yearday(obj2); - - var diffdays = 0; - - while (year1 > year2) - { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); - ++year2; - } - diffdays += yearday1 - yearday2; - - var hours1 = obj1.getHours(); - var minutes1 = obj1.getMinutes(); - var seconds1 = obj1.getSeconds(); - var hours2 = obj2.getHours(); - var minutes2 = obj2.getMinutes(); - var seconds2 = obj2.getSeconds(); - - var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - - var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - - if (swap) - { - diffdays = -diffdays; - diffseconds = -diffseconds; - diffmilliseconds = -diffmilliseconds; - } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Multiplication: num * num, int * str, str * int, int * list, list * int - ul4.MulAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__mul__) === "function") - return obj1.__mul__(obj2); - else if (obj2 && typeof(obj2.__rmul__) === "function") - return obj2.__rmul__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) - { - if (typeof(obj2) === "string") - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj2, obj1); - } - else if (ul4._islist(obj2)) - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj2, obj1); - } - } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) - { - if (typeof(obj1) === "string") - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj1, obj2); - } - else if (ul4._islist(obj1)) - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj1, obj2); - } - } - return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._isint(obj2)) - { - if (obj2 > 0) - { - var i = 0; - var targetsize = obj1.length * obj2; - while (obj1.length < targetsize) - obj1.push(obj1[i++]) - } - else - obj1.splice(0, obj1.length); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Truncating division - ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__floordiv__) === "function") - return obj1.__floordiv__(obj2); - else if (obj2 && typeof(obj2.__rfloordiv__) === "function") - return obj2.__rfloordiv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); - return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // "Real" division - ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__truediv__) === "function") - return obj1.__truediv__(obj2); - else if (obj2 && typeof(obj2.__rtruediv__) === "function") - return obj2.__rtruediv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); - return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Modulo - ul4.ModAST = ul4._inherit( - ul4.BinaryAST, - { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) - { - var div = Math.floor(obj1 / obj2); - var mod = obj1 - div * obj2; - - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) - { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise left shift - ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 *= 2; - return obj1; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise right shift - ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 /= 2; - return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise and - ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise exclusive or - ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise or - ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - ul4.AndAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (!ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.OrAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) - { - var attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var result = this._get(obj, this.attrname); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj = this.obj._handle_eval(context); - this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj = this.obj._handle_eval(context); - this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) - { - if (typeof(object) === "string") - { - switch (attrname) - { - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - case "replace": - return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count){ return ul4._replace(object, old, new_, count); }); - case "strip": - return ul4.expose(["chars=", null], function strip(chars){ return ul4._strip(object, chars); }); - case "lstrip": - return ul4.expose(["chars=", null], function lstrip(chars){ return ul4._lstrip(object, chars); }); - case "rstrip": - return ul4.expose(["chars=", null], function rstrip(chars){ return ul4._rstrip(object, chars); }); - case "split": - return ul4.expose(["sep=", null, "count=", null], function split(sep, count){ return ul4._split(object, sep, count); }); - case "rsplit": - return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count){ return ul4._rsplit(object, sep, count); }); - case "splitlines": - return ul4.expose(["keepends=", false], function splitlines(keepends){ return ul4._splitlines(object, keepends); }); - case "lower": - return ul4.expose([], function lower(){ return object.toLowerCase(); }); - case "upper": - return ul4.expose([], function upper(){ return object.toUpperCase(); }); - case "capitalize": - return ul4.expose([], function capitalize(){ return ul4._capitalize(object); }); - case "join": - return ul4.expose(["iterable"], function join(iterable){ return ul4._join(object, iterable); }); - case "startswith": - return ul4.expose(["prefix"], function startswith(prefix){ return ul4._startswith(object, prefix); }); - case "endswith": - return ul4.expose(["suffix"], function endswith(suffix){ return ul4._endswith(object, suffix); }); - default: - return undefined; - } - } - else if (ul4._islist(object)) - { - switch (attrname) - { - case "append": - return ul4.expose(["*items"], function append(items){ return ul4._append(object, items); }); - case "insert": - return ul4.expose(["pos", "*items"], function insert(pos, items){ return ul4._insert(object, pos, items); }); - case "pop": - return ul4.expose(["pos=", -1], function pop(pos){ return ul4._pop(object, pos); }); - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - default: - return undefined; - } - } - else if (ul4._isdate(object)) - { - switch (attrname) - { - case "weekday": - return ul4.expose([], function weekday(){ return ul4._weekday(object); }); - case "week": - return ul4.expose(["firstweekday=", null], function week(firstweekday){ return ul4._week(object, firstweekday); }); - case "day": - return ul4.expose([], function day(){ return object.getDate(); }); - case "month": - return ul4.expose([], function month(){ return object.getMonth()+1; }); - case "year": - return ul4.expose([], function year(){ return object.getFullYear(); }); - case "hour": - return ul4.expose([], function hour(){ return object.getHours(); }); - case "minute": - return ul4.expose([], function minute(){ return object.getMinutes(); }); - case "second": - return ul4.expose([], function second(){ return object.getSeconds(); }); - case "microsecond": - return ul4.expose([], function microsecond(){ return object.getMilliseconds() * 1000; }); - case "mimeformat": - return ul4.expose([], function mimeformat(){ return ul4._mimeformat(object); }); - case "isoformat": - return ul4.expose([], function isoformat(){ return ul4._isoformat(object); }); - case "yearday": - return ul4.expose([], function yearday(){ return ul4._yearday(object); }); - default: - return undefined; - } - } - else if (ul4._ismap(object)) - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return object.get(attrname); - } - } - else if (ul4._isset(object)) - { - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ for (var i = 0; i < items.length; ++i) { object.add(items[i]); } } ); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return undefined; - } - } - else if (Object.prototype.toString.call(object) === "[object Object]") - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - var result; - if (object && typeof(object.__getattr__) === "function") // test this before the generic object test - result = object.__getattr__(attrname); - else - result = object[attrname]; - if (typeof(result) !== "function") - return result; - var realresult = function() { - return result.apply(object, arguments); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } - } - throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); - }, - _set: function _set(object, attrname, value) - { - if (typeof(object) === "object" && typeof(object.__setattr__) === "function") - object.__setattr__(attrname, value); - else if (ul4._ismap(object)) - object.set(attrname, value) - else if (ul4._isobject(object)) - object[attrname] = value; - else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) - { - var oldvalue = this._get(object, attrname); - var newvalue = operator._ido(oldvalue, value); - this._set(object, attrname, newvalue); - } - } - ); - - ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) - { - var call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) - { - out.push(""); - }, - _makeargs: function _makeargs(context) - { - var args = [], kwargs = {}; - for (var i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return {args: args, kwargs: kwargs}; - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var args = this._makeargs(context); - var result = ul4._call(context, obj, args.args, args.kwargs); - return result; - } - } - ); - - ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) - { - var render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) - { - out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); - } - }, - _handle_eval: function _handle_eval(context) - { - var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - var obj = this.obj._handle_eval(localcontext); - var args = this._makeargs(localcontext); - - try - { - var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); - return result; - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - // Slice object - ul4.slice = ul4._inherit( - ul4.Proto, - { - create: function create(start, stop) - { - var slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() - { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; - } - } - ); - - - // List/String slice - ul4.SliceAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, index1, index2) - { - var slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); - } - } - ); - - - ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, lvalue, value) - { - var changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" lvalue="); - out.push(ul4._repr(this.lvalue)); - out.push(" value="); - this.value._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_set(context, item[1]); - } - } - } - ); - - ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, - { - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); - } - } - } - ); - - ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); - - ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); - - ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); - - ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); - - ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); - - ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); - - ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); - - ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); - - ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); - - ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); - - ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); - - ul4.BlockAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) - { - if (this.content.length) - { - for (var i = 0; i < this.content.length; ++i) - { - this.content[i]._str(out); - out.push(0); - } - } - else - { - out.push("pass"); - out.push(0); - } - } - } - ); - - ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) - { - var for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str_varname: function _str_varname(out, varname) - { - if (ul4._islist(varname)) - { - out.push("("); - for (var i = 0; i < varname.length; ++i) - { - if (i) - out.push(", "); - this._str_varname(out, varname[i]); - } - if (varname.length == 1) - out.push(","); - out.push(")"); - } - else - varname._str(out); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - for (var iter = ul4._iter(container);;) - { - var value = iter.next(); - if (value.done) - break; - var varitems = ul4._unpackvar(this.varname, value.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("for "); - this._str_varname(out, this.varname); - out.push(" in "); - this.container._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("while "), - this.container._repr(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _eval: function _eval(context) - { - while (true) - { - var cond = this.condition._handle_eval(context); - if (!ul4._bool(cond)) - break; - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("while "); - ul4.AST._str.call(this, out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.BreakAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.BreakException; - }, - _str: function _str(out) - { - out.push("break"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.ContinueException; - }, - _str: function _str(out) - { - out.push("continue"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, - { - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - { - var block = this.content[i]; - var execute = block._execute(context); - if (execute) - { - block._handle_eval(context); - break; - } - } - } - } - ); - - ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" condition="); - this.condition._repr(out); - out.push(">"); - }, - _str: function _str(out) - { - out.push(this._strname); - out.push(" "); - this.condition._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - var cond = this.condition._handle_eval(context); - var result = ul4._bool(cond); - return result; - } - } - ); - - ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); - - ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); - - ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, - { - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("else:"), - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - return true; - }, - _str: function _str(out) - { - out.push("else:"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) - { - var template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) - { - var signature; - encoder.dump(ul4.version); - encoder.dump(this.name); - encoder.dump(this.source); - encoder.dump(this.whitespace); - encoder.dump(this.startdelim); - encoder.dump(this.enddelim); - encoder.dump(this.docpos); - encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) - signature = this.signature; - else - { - signature = []; - for (var i = 0; i < this.signature.args.length; ++i) - { - var arg = this.signature.args[i]; - if (typeof(arg.defaultValue) === "undefined") - signature.push(arg.name); - else - signature.push(arg.name+"=", arg.defaultValue); - } - if (this.signature.remargs !== null) - signature.push("*" + this.signature.remargs); - if (this.signature.remkwargs !== null) - signature.push("**" + this.signature.remkwargs); - } - encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) - { - var version = decoder.load(); - var signature; - - if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); - - if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); - this.name = decoder.load(); - this.source = decoder.load(); - this.whitespace = decoder.load(); - this.startdelim = decoder.load(); - this.enddelim = decoder.load(); - this.docpos = decoder.load(); - this.parenttemplate = decoder.load(); - signature = decoder.load(); - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - this.signature = signature; - this._ul4_callsignature = signature; - this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) - { - return ul4on.loads(string); - }, - _eval: function _eval(context) - { - var signature = null; - if (this.signature !== null) - signature = this.signature._handle_eval(context); - var closure = ul4.TemplateClosure.create(this, signature, context.vars); - context.set(this.name, closure); - }, - _repr: function _repr(out) - { - out.push("") - { - out.push(" enddelim="); - out.push(ul4._repr(this.enddelim)); - } - out.push(">"); - }, - _str: function _str(out) - { - out.push("def "); - out.push(this.name ? this.name : "unnamed"); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (!ul4.ReturnException.isprotoof(exc)) - throw exc; - } - }, - __render__: function __render__(context, vars) - { - this._renderbound(context, vars); - }, - render: function render(context, vars) - { - this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) - { - var localcontext = context.replaceoutput(); - this._renderbound(localcontext, vars); - return localcontext.getoutput(); - }, - renders: function renders(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._rendersbound(context, vars); - }, - doc: function doc() - { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - default: - return undefined; - } - }, - _callbound: function _callbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (ul4.ReturnException.isprotoof(exc)) - return exc.result; - else - throw exc; - } - return null; - }, - call: function call(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) - { - return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } - ); - - ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.CodeAST.ul4ondump.call(this, encoder); - - var dump = []; - - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - dump.push(param[0]); - else - dump.push(param); - } - encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) - { - ul4.AST.ul4onload.call(this, decoder); - var dump = decoder.load(); - this.params = []; - for (var i = 0; i < dump.length; ++i) - { - var param = dump[i]; - if (typeof(param) === "string") - this.params.push([param, null]); - else - this.params.push(param); - } - }, - _eval: function _eval(context) - { - var args = []; - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - args.push(param[0]); - else - { - args.push(param[0] + "="); - args.push(param[1]._handle_eval(context)); - } - } - return ul4.Signature.create.apply(ul4.Signature, args); - }, - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" params="); - this.params._repr(out); - out.push(">"); - } - } - ); - - ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) - { - var closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; - // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) - { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) - { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - case "signature": - return this.signature; - default: - return this.template.__getattr__(attrname); - } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } - ); - - // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` - ul4._rgb = function _rgb(r, g, b, a) - { - return this.Color.create(255*r, 255*g, 255*b, 255*a); - }; - - // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference - ul4._xmlescape = function _xmlescape(obj) - { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; - }; - - // Convert ``obj`` to a string suitable for output into a CSV file - ul4._csv = function _csv(obj) - { - if (obj === null) - return ""; - else if (typeof(obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; - }; - - // Return a string containing one character with the codepoint ``i`` - ul4._chr = function _chr(i) - { - if (typeof(i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); - }; - - // Return the codepoint for the one and only character in the string ``c`` - ul4._ord = function _ord(c) - { - if (typeof(c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); - }; - - // Convert an integer to a hexadecimal string - ul4._hex = function _hex(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); - }; - - // Convert an integer to a octal string - ul4._oct = function _oct(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); - }; - - // Convert an integer to a binary string - ul4._bin = function _bin(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); - }; - - // Return the minimum value - ul4._min = function _min(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; - } - if (first || (item.value < result)) - result = item.value; - first = false; - } - }; - - // Return the maximum value - ul4._max = function _max(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; - } - if (first || (item.value > result)) - result = item.value; - first = false; - } - }; - - // Return the of the values from the iterable starting with ``start`` (default ``0``) - ul4._sum = function _sum(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; - }; - - // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._first = function _first(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; - }; - - // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._last = function _last(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var value = defaultValue; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; - }; - - // Return a sorted version of ``iterable`` - ul4._sorted = function _sorted(context, iterable, key, reverse) - { - var cmp; - if (key === null) - { - // FIXME: stability - if (reverse) - { - cmp = function cmp(a, b) - { - return -ul4._cmp("<=>", a, b); - } - } - else - { - cmp = function cmp(a, b) - { - return ul4._cmp("<=>", a, b); - } - } - var result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else - { - var sort = []; - - for (var i = 0, iter = ul4._iter(iterable);;++i) - { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); - } - cmp = function cmp(s1, s2) - { - var res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; - } - - sort.sort(cmp); - - var result = []; - for (var i = 0; i < sort.length; ++i) - { - result.push(sort[i][2]); - } - return result; - } - }; - - // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` - ul4._range = function _range(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) - { - lower = start; - heigher = stop; - } - else - { - lower = stop; - heigher = start; - } - var length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function() - { - if (this.index >= length) - return {done: true}; - return {value: start + (this.index++) * step, done: false}; - } - }; - }; - - // Return a iterable object returning a slice from the argument - ul4._slice = function _slice(args) - { - var iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) - { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - var next = start, count = 0; - var iter = ul4._iter(iterable); - return { - next: function() { - var result; - while (count < next) - { - result = iter.next(); - if (result.done) - return result; - ++count; - } - if (stop !== null && count >= stop) - return {done: true}; - result = iter.next(); - if (result.done) - return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } - }; - }; - - // ``%`` escape unsafe characters in the string ``string`` - ul4._urlquote = function _urlquote(string) - { - return encodeURIComponent(string); - }; - - // The inverse function of ``urlquote`` - ul4._urlunquote = function _urlunquote(string) - { - return decodeURIComponent(string); - }; - - // Return a reverse iterator over ``sequence`` - ul4._reversed = function _reversed(sequence) - { - if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length-1, - next: function() { - return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; - } - }; - }; - - // Returns a random number in the interval ``[0;1[`` - ul4._random = function _random() - { - return Math.random(); - }; - - // Return a randomly select item from ``range(start, stop, step)`` - ul4._randrange = function _randrange(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var width = stop-start; - - var value = Math.random(); - - var n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step*Math.floor(value * n); - }; - - // Return a random item/char from the list/string ``sequence`` - ul4._randchoice = function _randchoice(sequence) - { - var iscolor = ul4._iscolor(sequence); - if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; - }; - - // Round a number ``x`` to ``digits`` decimal places (may be negative) - ul4._round = function _round(x, digits) - { - if (typeof(digits) === "undefined") - digits = 0; - if (digits) - { - var threshhold = Math.pow(10, digits); - return Math.round(x*threshhold)/threshhold; - } - else - return Math.round(x); - }; - - // Return a hex-encode MD5 hash of the argument - // This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 - ul4._md5 = function _md5(string) - { - return md5(string); - }; - - // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) - ul4._enumerate = function _enumerate(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - return { - iter: ul4._iter(iterable), - index: start, - next: function() { - var item = this.iter.next(); - return item.done ? item : {value: [this.index++, item.value], done: false}; - } - }; - }; - - // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) - ul4._isfirst = function _isfirst(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - return { - next: function() { - var item = iter.next(); - var result = item.done ? item : {value: [isfirst, item.value], done: false}; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) - ul4._islast = function _islast(iterable) - { - var iter = ul4._iter(iterable); - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [item.done, lastitem.value], done: false}; - lastitem = item; - return result; - } - }; - }; - - // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._isfirstlast = function _isfirstlast(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._enumfl = function _enumfl(iterable, start) - { - var iter = ul4._iter(iterable); - var i = start; - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) - ul4._zip = function _zip(iterables) - { - var result; - if (iterables.length) - { - var iters = []; - for (var i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); - - return { - next: function() { - var items = []; - for (var i = 0; i < iters.length; ++i) - { - var item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return {value: items, done: false}; - } - }; - } - else - { - return { - next: function() { - return {done: true}; - } - }; - } - }; - - // Return the absolute value for the number ``number`` - ul4._abs = function _abs(number) - { - if (number !== null && typeof(number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); - }; - - // Return a ``Date`` object from the arguments passed in - ul4._date = function _date(year, month, day, hour, minute, second, microsecond) - { - if (typeof(hour) === "undefined") - hour = 0; - - if (typeof(minute) === "undefined") - minute = 0; - - if (typeof(second) === "undefined") - second = 0; - - if (typeof(microsecond) === "undefined") - microsecond = 0; - - return new Date(year, month-1, day, hour, minute, second, microsecond/1000); - }; - - // Return a ``TimeDelta`` object from the arguments passed in - ul4._timedelta = function _timedelta(days, seconds, microseconds) - { - return this.TimeDelta.create(days, seconds, microseconds); - }; - - // Return a ``MonthDelta`` object from the arguments passed in - ul4._monthdelta = function _monthdelta(months) - { - return this.MonthDelta.create(months); - }; - - // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) - ul4._hls = function _hls(h, l, s, a) - { - var _v = function(m1, m2, hue) - { - hue = hue % 1.0; - if (hue < 1/6) - return m1 + (m2-m1)*hue*6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2/3) - return m1 + (m2-m1)*(2/3-hue)*6.0; - return m1; - }; - - var m1, m2; - if (typeof(a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0+s); - else - m2 = l+s-(l*s); - m1 = 2.0*l - m2; - return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); - }; - - // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) - ul4._hsv = function _hsv(h, s, v, a) - { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - var i = Math.floor(h*6.0); - var f = (h*6.0) - i; - var p = v*(1.0 - s); - var q = v*(1.0 - s*f); - var t = v*(1.0 - s*(1.0-f)); - switch (i%6) - { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } - }; - - // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` - ul4._get = function _get(container, key, defaultvalue) - { - if (ul4._ismap(container)) - { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) - { - var result = container[key]; - if (typeof(result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); - }; - - // Return a ``Date`` object for the current time - ul4.now = function now() - { - return new Date(); - }; - - // Return a ``Date`` object for the current time in UTC - ul4.utcnow = function utcnow() - { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); - }; - - ul4.functions = { - repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), - ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), - str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), - float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), - list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), - set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), - bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), - len: ul4.expose(["sequence"], {name: "len"}, ul4._len), - type: ul4.expose(["obj"], {name: "type"}, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), - any: ul4.expose(["iterable"], {name: "any"}, ul4._any), - all: ul4.expose(["iterable"], {name: "all"}, ul4._all), - zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), - isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), - isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), - isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), - isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), - isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), - isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), - isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), - isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), - iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), - istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), - isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), - islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), - isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), - isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), - asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), - fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), - asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), - fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), - isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), - islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), - isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), - abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), - xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), - csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), - chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), - ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), - hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), - oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), - bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), - min: ul4.expose(["*obj"], {name: "min"}, ul4._min), - max: ul4.expose(["*obj"], {name: "max"}, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), - first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), - last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), - range: ul4.expose(["*args"], {name: "range"}, ul4._range), - slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), - urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), - urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), - reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), - random: ul4.expose([], {name: "random"}, ul4._random), - randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), - randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), - md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) - }; - - // Functions implementing UL4 methods - ul4._replace = function _replace(string, old, new_, count) - { - if (count === null) - count = string.length; - - var result = []; - while (string.length) - { - var pos = string.indexOf(old); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); - }; - - ul4._strip = function _strip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._lstrip = function _lstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; - }; - - ul4._rstrip = function _rstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._split = function _split(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.indexOf(sep); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._lstrip(string, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); - } - return result; - } - } - }; - - ul4._rsplit = function _rsplit(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) - { - result.unshift(string); - break; - } - result.unshift(string.substr(pos+sep.length)); - string = string.substr(0, pos); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._rstrip(string, null, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - { - part = string.split(/[ \n\r\t]+/); - part = part[part.length-1]; - } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length-part.length); - } - return result; - } - } - }; - - ul4._splitlines = function _splitlines(string, keepends) - { - var lookingAtLineEnd = function lookingAtLineEnd() - { - var c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') - { - if (pos == length-1) - return 1; - if (string[pos+1] === '\n') - return 2; - return 1; - } - return 0; - }; - - var result = [], length = string.length; - - for (var pos = 0, startpos = 0;;) - { - if (pos >= length) - { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; - } - var lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else - { - var endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; - } - } - }; - - ul4._count = function _count(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - - var isstr = ul4._isstr(obj); - - if (isstr && !sub.length) - { - if (end < 0 || start > obj.length || start > end) - return 0; - var result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } - - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - var count = 0; - if (ul4._islist(obj)) - { - for (var i = start; i < end; ++i) - { - if (ul4._eq(obj[i], sub)) - ++count; - } - return count; - } - else // string - { - var lastIndex = start; - - for (;;) - { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; - } - return count; - } - }; - - ul4._find = function _find(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._rfind = function _rfind(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._capitalize = function _capitalize(obj) - { - if (typeof(obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; - }; - - ul4._items = function _items(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push([key, obj[key]]); - return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); - }; - - ul4._values = function _values(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push(obj[key]); - return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); - }; - - ul4._join = function _join(sep, iterable) - { - var resultlist = []; - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); - }; - - ul4._startswith = function _startswith(string, prefix) - { - if (typeof(prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; - }; - - ul4._endswith = function _endswith(string, suffix) - { - if (typeof(suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length-suffix.length) === suffix; - }; - - ul4._isoformat = function _isoformat(obj) - { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - if (hour || minute || second || ms) - { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; - }; - - ul4._mimeformat = function _mimeformat(obj) - { - var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; - }; - - ul4._weekday = function _weekday(obj) - { - var d = obj.getDay(); - return d ? d-1 : 6; - }; - - ul4._week = function _week(obj, firstweekday) - { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - var yearday = ul4._yearday(obj)+6; - var jan1 = new Date(obj.getFullYear(), 0, 1); - var jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) - { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday/7); - }; - - ul4._isleap = function _isleap(obj) - { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; - }; - - ul4._yearday = function _yearday(obj) - { - var leap = ul4._isleap(obj) ? 1 : 0; - var day = obj.getDate(); - switch (obj.getMonth()) - { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } - }; - - ul4._append = function _append(obj, items) - { - for (var i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; - }; - - ul4._insert = function _insert(obj, pos, items) - { - if (pos < 0) - pos += obj.length; - - for (var i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; - }; - - ul4._pop = function _pop(obj, pos) - { - if (pos < 0) - pos += obj.length; - - var result = obj[pos]; - obj.splice(pos, 1); - return result; - }; - - ul4._update = function _update(obj, others, kwargs) - { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (var i = 0; i < others.length; ++i) - { - var other = others[i]; - if (ul4._ismap(other)) - { - other.forEach(function(value, key){ - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) - { - for (var key in other) - ul4on._setmap(obj, key, other[key]); - } - else if (ul4._islist(other)) - { - for (var j = 0; j < other.length; ++j) - { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); - } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - for (var key in kwargs) - ul4on._setmap(obj, key, kwargs[key]); - return null; - }; - - ul4._clear = function _clear(obj) - { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) - { - for (var key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; - }; - - ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r, g, b, a) - { - var c = ul4._clone(this); - c._r = typeof(r) !== "undefined" ? r : 0; - c._g = typeof(g) !== "undefined" ? g : 0; - c._b = typeof(b) !== "undefined" ? b : 0; - c._a = typeof(a) !== "undefined" ? a : 255; - return c; - }, - - __repr__: function __repr__() - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) - return "#" + r[0] + g[0] + b[0] + a[0]; - else - return "#" + r + g + b + a; - } - else - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __str__: function __str__() - { - if (this._a !== 0xff) - { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; - } - else - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __iter__: function __iter__() - { - return { - obj: this, - index: 0, - next: function() { - if (this.index == 0) - { - ++this.index; - return {value: this.obj._r, done: false}; - } - else if (this.index == 1) - { - ++this.index; - return {value: this.obj._g, done: false}; - } - else if (this.index == 2) - { - ++this.index; - return {value: this.obj._b, done: false}; - } - else if (this.index == 3) - { - ++this.index; - return {value: this.obj._a, done: false}; - } - else - return {done: true}; - } - }; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "r": - return ul4.expose([], function r(){ return self._r; }); - case "g": - return ul4.expose([], function g(){ return self._g; }); - case "b": - return ul4.expose([], function b(){ return self._b; }); - case "a": - return ul4.expose([], function a(){ return self._a; }); - case "lum": - return ul4.expose([], function lum(){ return self.lum(); }); - case "hls": - return ul4.expose([], function hls(){ return self.hls(); }); - case "hlsa": - return ul4.expose([], function hlsa(){ return self.hlsa(); }); - case "hsv": - return ul4.expose([], function hsv(){ return self.hsv(); }); - case "hsva": - return ul4.expose([], function hsva(){ return self.hsva(); }); - case "witha": - return ul4.expose(["a"], function witha(a){ return self.witha(a); }); - case "withlum": - return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); - case "abslum": - return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); - case "rellum": - return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); - default: - return undefined; - } - }, - - __getitem__: function __getitem__(key) - { - var orgkey = key; - if (key < 0) - key += 4; - switch (key) - { - case 0: - return this._r; - case 1: - return this._g; - case 2: - return this._b; - case 3: - return this._a; - default: - return undefined; - } - }, - - __eq__: function __eq__(other) - { - if (ul4._iscolor(other)) - return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; - return false; - }, - - r: ul4.expose([], function r() { return this._r; }), - - g: ul4.expose([], function g() { return this._g; }), - - b: ul4.expose([], function b() { return this._b; }), - - a: ul4.expose([], function a() { return this._a; }), - - lum: ul4.expose([], function lum() {return this.hls()[1]; }), - - hls: ul4.expose([], - function hls() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var h, l, s; - var rc, gc, bc; - - l = (minc+maxc)/2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc-minc) / (maxc+minc); - else - s = (maxc-minc) / (2.0-maxc-minc); - rc = (maxc-r) / (maxc-minc); - gc = (maxc-g) / (maxc-minc); - bc = (maxc-b) / (maxc-minc); - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() - { - var hls = this.hls(); - return hls.concat(this._a/255.0); - } - ), - - hsv: ul4.expose([], - function hsv() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - var s = (maxc-minc) / maxc; - var rc = (maxc-r) / (maxc-minc); - var gc = (maxc-g) / (maxc-minc); - var bc = (maxc-b) / (maxc-minc); - var h; - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, s, v]; - } - ), - - hsva: ul4.expose([], - function hsva() - { - var hsv = this.hsv(); - return hsv.concat(this._a/255.0); - } - ), - - witha: ul4.expose(["a"], - function witha(a) - { - if (typeof(a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), - - withlum: ul4.expose(["lum"], - function withlum(lum) - { - if (typeof(lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - var hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } - ); - - ul4.TimeDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.TimeDelta", - - create: function create(days, seconds, microseconds) - { - var td = ul4._clone(this); - if (typeof(days) === "undefined") - days = 0; - if (typeof(seconds) === "undefined") - seconds = 0; - if (typeof(microseconds) === "undefined") - microseconds = 0; - - var total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); - - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - var total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); - days = Math.floor(total_seconds / 86400); - if (seconds < 0) - { - seconds += 86400; - --days; - } - - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, - - __repr__: function __repr__() - { - if (!this._microseconds) - { - if (!this._seconds) - { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, - - __str__: function __str__() - { - var v = []; - if (this._days) - { - v.push(this._days + " day"); - if (this._days !== -1 && this._days !== 1) - v.push("s"); - v.push(", "); - } - var seconds = this._seconds % 60; - var minutes = Math.floor(this._seconds / 60); - var hours = Math.floor(minutes / 60); - minutes = minutes % 60; - - v.push("" + hours); - v.push(":"); - v.push(ul4._lpad(minutes.toString(), "0", 2)); - v.push(":"); - v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) - { - v.push("."); - v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); - } - return v.join(""); - }, - - __bool__: function __bool__() - { - return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, - - __abs__: function __abs__() - { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._istimedelta(other)) - return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds < other._microseconds; - } - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds <= other._microseconds; - } - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds > other._microseconds; - } - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds >= other._microseconds; - } - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) - { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate() + days; - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds() + seconds; - var millisecond = date.getMilliseconds() + microseconds/1000; - return new Date(year, month, day, hour, minute, second, millisecond); - }, - - __add__: function __add__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); - else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __sub__: function __sub__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) - { - var myValue = this._days; - var otherValue = other._days; - var hasSeconds = this._seconds || other._seconds; - var hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) - { - myValue = myValue*86400+this._seconds; - otherValue = otherValue*86400 + other._seconds; - if (hasMicroseconds) - { - myValue = myValue * 1000000 + this._microseconds; - otherValue = otherValue * 1000000 + other._microseconds; - } - } - return myValue/otherValue; - } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "days": - return ul4.expose([], function days(){ return self._days; }); - case "seconds": - return ul4.expose([], function seconds(){ return self._seconds; }); - case "microseconds": - return ul4.expose([], function microseconds(){ return self._microseconds; }); - default: - return undefined; - } - }, - - days: function days() - { - return this._days; - }, - - seconds: function seconds() - { - return this._seconds; - }, - - microseconds: function microseconds() - { - return this._microseconds; - } - } - ); - - ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", - - create: function create(months) - { - var md = ul4._clone(this); - md._months = typeof(months) !== "undefined" ? months : 0; - return md; - }, - - __repr__: function __repr__() - { - if (!this._months) - return "monthdelta()"; - return "monthdelta(" + this._months + ")"; - }, - - __str__: function __str__() - { - if (this._months) - { - if (this._months !== -1 && this._months !== 1) - return this._months + " months"; - return this._months + " month"; - } - return "0 months"; - }, - - __bool__: function __bool__() - { - return this._months !== 0; - }, - - __abs__: function __abs__() - { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._ismonthdelta(other)) - return this._months === other._months; - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months < other._months; - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._ismonthdelta(other)) - return this._months <= other._months; - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months > other._months; - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._ismonthdelta(other)) - return this._months >= other._months; - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) - { - var year = date.getFullYear(); - var month = date.getMonth() + months; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds(); - var millisecond = date.getMilliseconds(); - - while (true) - { - // As the month might be out of bounds, we have to find out, what the real target month is - var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - var result = new Date(year, month, day, hour, minute, second, millisecond); - if (result.getMonth() === targetmonth) - return result; - --day; - } - }, - - __add__: function __add__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); - else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __sub__: function __sub__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); - else if (ul4._ismonthdelta(other)) - return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, - - __truediv__: function __truediv__(other) - { - if (ul4._ismonthdelta(other)) - return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "months": - return ul4.expose([], function months(){ return self._months; }); - default: - return undefined; - } - }, - - months: function months() - { - return this._months; - } - } - ); - - // When we don't have a real ``Set`` type, emulate one that supports strings - ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create() - { - var set = ul4._clone(this); - set.items = {}; - set.add.apply(set, arguments); - return set; - }, - - add: function add() - { - for (var i = 0; i < arguments.length; ++i) - { - this.items[arguments[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ self.add.apply(self, items); }); - default: - return undefined; - } - }, - - __contains__: function __contains__(item) - { - return this.items[item] || false; - }, - - __bool__: function __bool__() - { - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - - __repr__: function __repr__() - { - var v = []; - v.push("{"); - var i = 0; - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function(other) - { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (var item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function(other) - { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function(other) - { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) - { - var result = true; - other.forEach(function(value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in other.items) - { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); - } - } - ); - - var classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var ul4onname = name; - if (ul4onname.substr(ul4onname.length-3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length-3); - ul4onname = ul4onname.toLowerCase(); - var object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); - } - - })(); \ No newline at end of file + + +let amd = (typeof define === 'function' && define.amd); +let commonjs = (typeof module === 'object' && module.exports); + +export let ul4 = {}; +export let ul4on = {}; + +ul4.version = "41"; + +// +// UL4ON +// + +ul4on._registry = {}; + +ul4on._havemap = (typeof (Map) === "function" && typeof (Map.prototype.forEach) === "function"); + +ul4on._havemapconstructor = false; + +if (ul4on._havemap) { + try { + if (new Map([[1, 2]]).size == 1) + ul4on._havemapconstructor = true; + } + catch (error) { + } +} + +ul4on._haveset = (typeof (Set) === "function" && typeof (Set.prototype.forEach) === "function"); + +ul4on._havesetconstructor = false; + +if (ul4on._haveset) { + try { + if (new Set([1, 2]).size == 2) + ul4on._havesetconstructor = true; + } + catch (error) { + } +} + +// Function used for making maps, when the Map constructor doesn't work +ul4on._makemap = function _makemap() { + var map = new Map(); + + for (var i = 0; i < arguments.length; ++i) { + var argument = arguments[i]; + map.set(argument[0], argument[1]); + } + return map; +}; + +// Function that creates en empty Map (if supported) or an empty object +ul4on._emptymap = function _emptymap() { + return ul4on._havemap ? new Map() : {}; +}; + +// Function that adds a (key, value) item to an object (or map) +if (ul4on._havemap) { + ul4on._setmap = function _setmap(map, key, value) { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; +} +else { + ul4on._setmap = function _setmap(map, key, value) { + map[key] = value; + }; +} + +// Function used for making sets, when the Set constructor doesn't work (or we don't have sets) +if (ul4on._haveset) { + ul4on._makeset = function _makeset() { + var set = this._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; +} +else { + ul4on._makeset = function _makeset() { + var set = ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; +} + +// Register the object ``obj`` under the name ``name`` with the UL4ON machinery +ul4on.register = function register(name, obj) { + obj.ul4onname = name; + ul4on._registry[name] = function () { return obj.create(); }; +}, + + // Return a string that contains the object ``obj`` in the UL4ON serialization format + ul4on.dumps = function dumps(obj, indent) { + var encoder = ul4on.Encoder.create(indent); + encoder.dump(obj); + return encoder.finish(); + }, + + // Load an object from the string ``data``. + // ``data`` must contain the object in the UL4ON serialization format + // ``registry`` may be null or a dictionary mapping type names to objects with a create method + ul4on.loads = function loads(data, registry) { + var decoder = ul4on.Decoder.create(data, registry); + return decoder.load(); + }, + + // Helper "class" for encoding + ul4on.Encoder = { + // Create a new Encoder object + create: function create(indent) { + var encoder = ul4._clone(this); + encoder.indent = indent || null; + encoder.data = []; + encoder._level = 0; + encoder._strings2index = {}; + encoder._ids2index = {}; + encoder._backrefs = 0; + return encoder; + }, + + _line: function _line(line) { + var i, oldindent; + + if (this.indent !== null) { + for (i = 0; i < this._level; ++i) + this.data.push(this.indent); + } + else { + if (this.data.length) + this.data.push(" "); + } + this.data.push(line); + + if (arguments.length > 1) { + oldindent = this.indent; + this.indent = null; + for (i = 1; i < arguments.length; ++i) + this.dump(arguments[i]); + this.indent = oldindent; + } + + if (this.indent !== null) + this.data.push("\n"); + }, + + // Return the complete string written to the buffer + finish: function finish() { + return this.data.join(""); + }, + + dump: function dump(obj) { + if (obj === null) + this._line("n"); + else if (typeof (obj) == "boolean") + this._line(obj ? "bT" : "bF"); + else if (typeof (obj) == "number") { + var type = (Math.round(obj) == obj) ? "i" : "f"; + this._line(type + obj); + } + else if (typeof (obj) == "string") { + var index = this._strings2index[obj]; + if (typeof (index) !== "undefined") { + this._line("^" + index); + } + else { + this._strings2index[obj] = this._backrefs++; + this._line("S" + ul4._str_repr(obj)); + } + } + else if (ul4._iscolor(obj)) + this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); + else if (ul4._isdate(obj)) + this._line("z", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + else if (ul4._istimedelta(obj)) + this._line("t", obj.days(), obj.seconds(), obj.microseconds()); + else if (ul4._ismonthdelta(obj)) + this._line("m", obj.months()); + else if (typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.slice)) + this._line("r", obj.start, obj.stop); + else if (obj.ul4onname && obj.ul4ondump) { + if (obj.__id__) { + var index = this._ids2index[obj.__id__]; + if (typeof (index) != "undefined") { + this._line("^" + index); + return; + } + } + if (obj.__id__) + this._ids2index[obj.__id__] = this._backrefs++; + this._line("O", obj.ul4onname); + ++this._level; + obj.ul4ondump(this); + --this._level; + this._line(")"); + } + else if (ul4._islist(obj)) { + this._line("l"); + ++this._level; + for (var i in obj) + this.dump(obj[i]); + --this._level; + this._line("]"); + } + else if (ul4._ismap(obj)) { + this._line("e"); + ++this._level; + obj.forEach(function (value, key) { + this.dump(key); + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else if (ul4._isdict(obj)) { + this._line("d"); + ++this._level; + for (var key in obj) { + this.dump(key); + this.dump(obj[key]); + } + --this._level; + this._line("}"); + } + else if (ul4._isset(obj)) { + this._line("y"); + ++this._level; + obj.forEach(function (value) { + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else + throw "can't handle object"; + } + }; + +// Helper "class" for decoding +ul4on.Decoder = { + // Creates a new decoder for reading from the string ``data`` + create: function create(data, registry) { + var decoder = ul4._clone(this); + decoder.data = data; + decoder.pos = 0; + decoder.backrefs = []; + decoder.registry = typeof (registry) === "undefined" ? null : registry; + return decoder; + }, + + // Read a character from the buffer + readchar: function readchar() { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + return this.data.charAt(this.pos++); + }, + + // Read a character from the buffer (return null on eof) + readcharoreof: function readcharoreof() { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + }, + + // Read next not-whitespace character from the buffer + readblackchar: function readblackchar() { + var re_white = /\s/; + + for (; ;) { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + var c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } + }, + + // Read ``size`` characters from the buffer + read: function read(size) { + if (this.pos + size > this.length) + size = this.length - this.pos; + var result = this.data.substring(this.pos, this.pos + size); + this.pos += size; + return result; + }, + + // "unread" one character + backup: function backup() { + --this.pos; + }, + + // Read a number from the buffer + readnumber: function readnumber() { + var re_digits = /[-+0123456789.eE]/, value = ""; + for (; ;) { + var c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else { + var result = parseFloat(value); + if (result == NaN) + throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; + return result; + } + } + }, + + _beginfakeloading: function _beginfakeloading() { + var oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + }, + + _endfakeloading: function _endfakeloading(oldpos, value) { + this.backrefs[oldpos] = value; + }, + + _readescape: function _readescape(escapechar, length) { + var chars = this.read(length); + if (chars.length != length) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + var codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + return String.fromCharCode(codepoint); + }, + + // Load the next object from the buffer + load: function load() { + var typecode = this.readblackchar(); + var result; + switch (typecode) { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + var delimiter = this.readblackchar(); + for (; ;) { + var c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") { + var c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } + else + result.push(c); + } + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = ul4.Color.create(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load() / 1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = ul4.TimeDelta.create(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = ul4.slice.create(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = ul4.MonthDelta.create(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "]") + return result; + this.backup(); + result.push(this.load()); + } + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4on._havemap && (typecode == "e" || typecode == "E")) + throw "ordered dictionaries are not supported!"; + result = ul4on._emptymap(); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + var key = this.load(); + var value = this.load(); + ul4on._setmap(result, key, value); + } + return result; + case "y": + case "Y": + result = ul4on._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + result.add(this.load()); + } + return result; + case "o": + case "O": + var oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + var name = this.load(); + var proto; + if (this.registry !== null) { + proto = this.registry[name]; + if (typeof (proto) === "undefined") + proto = ul4on._registry[name]; + } + else + proto = ul4on._registry[name]; + if (typeof (proto) === "undefined") + throw "can't load object of type " + ul4._repr(name); + result = proto(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); + typecode = this.readblackchar(); + if (typecode !== ")") + throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; + return result; + default: + throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + } + }, + + // Return an iterator for loading the content of a object + loadcontent: function load(loadcontent) { + let self = this; + return { + next: function () { + let typecode = self.readblackchar(); + self.backup(); + if (typecode == ")") + return { done: true }; + else + return { done: false, value: self.load() }; + } + }; + } +}; + + +// +// UL4 +// + +// REs for parsing JSON +ul4._rvalidchars = /^[\],:{}\s]*$/; +ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; +ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; +ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; + +/// Helper functions + +// Crockford style object creation +ul4._simpleclone = function _simpleclone(obj) { + function F() { }; + F.prototype = obj; + var result = new F(); + return result; +}; + +// Crockford style object creation + prototype chain + object ids +ul4._clone = function _clone(obj) { + var result = ul4._simpleclone(obj); + result.__prototype__ = obj; + result.__id__ = ul4.Proto._nextid++; + return result; +}; + +// Adds attributes from on object to another and returns it +ul4._extend = function _extend(obj, attrs) { + for (var name in attrs) + obj[name] = attrs[name]; + return obj; +}; + +// Clone an object via ``_simpleclone`` and extend it +ul4._simpleinherit = function _simpleinherit(baseobj, attrs) { + return ul4._extend(ul4._simpleclone(baseobj), attrs); +}; + +// Clone an object via ``_clone`` and extend it +ul4._inherit = function _inherit(baseobj, attrs) { + return ul4._extend(ul4._clone(baseobj), attrs); +}; + +// Convert a map to an object +ul4._map2object = function _map2object(obj) { + if (ul4._ismap(obj)) { + var newobj = {}; + obj.forEach(function (value, key) { + if (typeof (key) !== "string") + throw ul4.TypeError.create("keys must be strings"); + newobj[key] = value; + }); + return newobj; + } + return obj; +}; + +// Clip a number to the range [0;max) +ul4._bound = function _bound(value, upper) { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; +}; + +// Create a pretty stacktrace from an exception +ul4._stacktrace = function _stacktrace(exc) { + var output = ul4._type(exc); + var s = exc.toString(); + if (s) + output += ": " + s; + if (exc.cause) + output += "\n\n" + ul4._stacktrace(exc.cause); + return output; +}; + +// Call a function ``f`` with UL4 argument handling +ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) { + var finalargs; + if (needsobject) { + if (signature === null) { + if (args.length) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; + } + else + finalargs = [signature.bindObject(name, args, kwargs)]; + } + else { + if (signature === null) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); +}; + +ul4._callfunction = function _callfunction(context, f, args, kwargs) { + var name = f._ul4_name || f.name; + if (typeof (f._ul4_signature) === "undefined" || typeof (f._ul4_needsobject) === "undefined" || typeof (f._ul4_needscontext) === "undefined") + throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); +} + +ul4._callobject = function _callobject(context, obj, args, kwargs) { + if (typeof (obj._ul4_callsignature) === "undefined" || typeof (obj._ul4_callneedsobject) === "undefined" || typeof (obj._ul4_callneedscontext) === "undefined") + throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); +} + +ul4._callrender = function _callrender(context, obj, args, kwargs) { + if (typeof (obj._ul4_rendersignature) === "undefined" || typeof (obj._ul4_renderneedsobject) === "undefined" || typeof (obj._ul4_renderneedscontext) === "undefined") + throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); +} + +ul4._call = function _call(context, f, args, kwargs) { + if (typeof (f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof (f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); + else + throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); +} + +ul4._unpackvar = function _unpackvar(lvalue, value) { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else { + var newvalue = []; + var iter = ul4._iter(value); + + for (var i = 0; ; ++i) { + var item = iter.next(); + + if (item.done) { + if (i === lvalue.length) + break; + else + throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); + } + else { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); + } + } + return newvalue; + } +}; + +ul4._formatsource = function _formatsource(out) { + var finalout = []; + var level = 0, needlf = false; + for (var i = 0; i < out.length; ++i) { + if (typeof (out[i]) === "number") { + level += out[i]; + needlf = true; + } + else { + if (needlf) { + finalout.push("\n"); + for (var j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; + } + finalout.push(out[i]); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); +}; + +// Compare ``obj1`` and ``obj2`` if they have the same value +ul4._eq = function _eq(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof (obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 == obj2 + else + return false; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 == obj2; + else + return false; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; + } + else + return false; + } + else if (ul4._isobject(obj1)) { + if (ul4._isobject(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) { + if (obj2.hasOwnProperty(key)) { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) { + if (!obj1.hasOwnProperty(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) { + if (obj2.has(key)) { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + var result = true; + obj2.forEach(function (value, key) { + if (!obj1.hasOwnProperty(key)) + result = false; + }); + return result; + } + else + return false; + } + else if (ul4._ismap(obj1)) { + if (ul4._isobject(obj2)) { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function (value, key) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.hasOwnProperty(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + result = false; + } + }); + if (!result) + return false; + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function (value, key) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2.get(key))) + result = false; + } + }); + return result; + } + else + return false; + } + else if (ul4._isset(obj1)) { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + var result = true; + obj1.forEach(function (value) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(value)) + result = false; + } + }); + return result; + } + else + return false; + } + else + return obj1 === obj2; +}; + +// Compare ``obj1`` and ``obj2`` if they don't have the same value +ul4._ne = function _ne(obj1, obj2) { + if (obj1 && typeof (obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof (obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); +} + +ul4._unorderable = function _unorderable(operator, obj1, obj2) { + throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); +}; + +// Return: +// -1 when ``obj1 < obj2``, +// 0 when ``obj1 == obj2``, +// 1 when ``obj1 > obj2``, +// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) +// raise TypeError if objects are uncomparable +// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= +// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + +ul4._cmp = function _cmp(operator, obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) { + var v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); + } + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return 0; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return 1; + var res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; + } + return obj2.length > obj1.length ? -1 : 0; + } + } + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + else + ul4._unorderable(operator, obj1, obj2); +} + +// Return whether ``obj1 < obj2`` +ul4._lt = function _lt(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 < obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1)) { + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<", obj1, obj2); +}; + +// Return whether ``obj1 <= obj2`` +ul4._le = function _le(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length <= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<=", obj1, obj2); +}; + +// Return whether ``obj1 > obj2`` +ul4._gt = function _gt(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 > obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length > obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">", obj1, obj2); +}; + +// Return whether ``obj1 >= obj2`` +ul4._ge = function _ge(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length >= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">=", obj1, obj2); +}; + +// Return an iterator for ``obj`` +ul4._iter = function _iter(obj) { + if (typeof (obj) === "string" || ul4._islist(obj)) { + return { + index: 0, + next: function () { + if (this.index < obj.length) + return { value: obj[this.index++], done: false }; + else + return { done: true }; + } + }; + } + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof (obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) { + var keys = []; + obj.forEach(function (value, key) { + keys.push(key); + }); + return { + index: 0, + next: function () { + if (this.index >= keys.length) + return { done: true }; + return { value: keys[this.index++], done: false }; + } + }; + } + else if (ul4._isset(obj)) { + var values = []; + obj.forEach(function (value, key) { + values.push(value); + }); + return { + index: 0, + next: function () { + if (this.index >= values.length) + return { done: true }; + return { value: values[this.index++], done: false }; + } + }; + } + else if (ul4._isul4set(obj)) { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) { + var keys = []; + for (var key in obj) + keys.push(key); + return { + index: 0, + next: function () { + if (this.index >= keys.length) + return { done: true }; + return { value: keys[this.index++], done: false }; + } + }; + } + throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); +}; + +ul4._str_repr = function _str_repr(str, ascii) { + var result = ""; + var squote = false, dquote = false; + + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + if (c == '"') { + dquote = true; + if (squote) + break; + } + else if (c == "'") { + squote = true; + if (dquote) + break; + } + } + + // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes + var quote = (squote && !dquote) ? '"' : "'"; + + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + switch (c) { + case '"': + result += (quote == c) ? '\\"' : c; + break; + case "'": + result += (quote == c) ? "\\'" : c; + break; + case "\\": + result += "\\\\"; + break; + case "\t": + result += "\\t"; + break; + case "\n": + result += "\\n"; + break; + case "\r": + result += "\\r"; + break; + default: + var code = str.charCodeAt(i); + var escape; + if (code < 32) + escape = 2; + else if (code < 0x7f) + escape = 0; + else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) + escape = 0; + else if (code <= 0xff) + escape = 2; + else if (code <= 0xffff) + escape = 4; + else + escape = 8; + + if (escape === 0) + result += c; + else if (escape === 2) + result += "\\x" + ul4._lpad(code.toString(16), "0", 2); + else if (escape === 4) + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + else + result += "\\U" + ul4._lpad(code.toString(16), "0", 8); + break; + } + } + return quote + result + quote; +}; + +ul4._date_repr = function _date_repr(obj, ascii) { + var year = obj.getFullYear(); + var month = obj.getMonth() + 1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + var result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); + + if (hour || minute || second || ms) { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + result += ")"; + + return result; +}; + +ul4._map_repr = function _map_repr(obj, ascii) { + var v = []; + v.push("{"); + + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(value, ascii)); + }); + + v.push("}"); + return v.join(""); +}; + +ul4._list_repr = function _list_repr(obj, ascii) { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) { + if (i !== 0) + v.push(", "); + v.push(ul4._repr_internal(obj[i], ascii)); + } + v.push("]"); + return v.join(""); +}; + +ul4._set_repr = function _set_repr(obj, ascii) { + var v = []; + v.push("{"); + if (!obj.size) + v.push("/"); + else { + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(value, ascii)); + }); + } + v.push("}"); + return v.join(""); +}; + +ul4._object_repr = function _object_repr(obj, ascii) { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) { + if (!obj.hasOwnProperty(key)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(obj[key], ascii)); + } + v.push("}"); + return v.join(""); +}; + +ul4._repr_internal = function _repr_internal(obj, ascii) { + if (obj === null) + return "None"; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof (obj) === "string") + return ul4._str_repr(obj, ascii); + else if (typeof (obj) === "number") + return "" + obj; + else if (typeof (obj) === "function") + if (obj._ul4_name || obj.name) + return ""; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (typeof (obj) === "undefined") + return ""; + else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; +}; + +// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` +ul4._repr = function _repr(obj) { + return ul4._repr_internal(obj, false); +} + +ul4._ascii = function _ascii(obj) { + return ul4._repr_internal(obj, true); +} + +ul4._date_str = function _date_str(obj) { + var year = obj.getFullYear(); + var month = obj.getMonth() + 1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + + var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; +}; + +ul4._str = function _str(obj) { + if (typeof (obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof (obj) === "string") + return obj; + else if (typeof (obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof (obj) === "object" && typeof (obj.__str__) === "function") + return obj.__str__(); + else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; +}; + +// Convert ``obj`` to bool, according to its "truth value" +ul4._bool = function _bool(obj) { + if (typeof (obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else { + if (typeof (obj) === "object", typeof (obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) { + for (var key in obj) { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } +}; + +// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) +ul4._int = function _int(obj, base) { + var result; + if (base !== null) { + if (typeof (obj) !== "string" || !ul4._isint(base)) + throw ul4.TypeError.create("int()", "int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else { + if (typeof (obj) == "string") { + result = parseInt(obj); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else if (typeof (obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); + } +}; + +// Convert ``obj`` to a float +ul4._float = function _float(obj) { + if (typeof (obj) === "string") + return parseFloat(obj); + else if (typeof (obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); +}; + +// Convert ``obj`` to a list +ul4._list = function _list(obj) { + var iter = ul4._iter(obj); + + var result = []; + for (; ;) { + var value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } +}; + +// Convert ``obj`` to a set +ul4._set = function _set(obj) { + var iter = ul4._iter(obj); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (; ;) { + var value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } +}; + +// Return the length of ``sequence`` +ul4._len = function _len(sequence) { + if (typeof (sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) { + var i = 0; + for (var key in sequence) + ++i; + return i; + } + throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); +}; + +ul4._type = function _type(obj) { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof (obj) === "undefined") + return "undefined"; + else if (typeof (obj) === "string") + return "str"; + else if (typeof (obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (ul4._islist(obj)) + return "list"; + else if (ul4._isset(obj)) + return "set"; + else if (ul4._isdate(obj)) + return "date"; + else if (typeof (obj.__type__) !== "undefined") + return obj.__type__; + else if (ul4._istimedelta(obj)) + return "timedelta"; + else if (ul4._isdict(obj)) + return "dict"; + else if (ul4._istemplate(obj)) + return "template"; + else if (ul4._isfunction(obj)) + return "function"; + return null; +}; + + +// Return whether any of the items in ``iterable`` are true +ul4._any = function _any(iterable) { + if (typeof (iterable) == "string") { + for (var i = 0; i < iterable.length; ++i) { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else { + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } +}; + +// Return whether all of the items in ``iterable`` are true +ul4._all = function _all(iterable) { + if (typeof (iterable) == "string") { + for (var i = 0; i < iterable.length; ++i) { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else { + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } +}; + +// Check if ``obj`` is undefined +ul4._isundefined = function _isundefined(obj) { + return typeof (obj) === "undefined"; +}; + + +// Check if ``obj`` is *not* undefined +ul4._isdefined = function _isdefined(obj) { + return typeof (obj) !== "undefined"; +}; + +// Check if ``obj`` is ``None`` +ul4._isnone = function _isnone(obj) { + return obj === null; +}; + +// Check if ``obj`` is a boolean +ul4._isbool = function _isbool(obj) { + return typeof (obj) == "boolean"; +}; + +// Check if ``obj`` is a int +ul4._isint = function _isint(obj) { + return (typeof (obj) == "number") && Math.round(obj) == obj; +}; + +// Check if ``obj`` is a float +ul4._isfloat = function _isfloat(obj) { + return (typeof (obj) == "number") && Math.round(obj) != obj; +}; + +// Check if ``obj`` is a string +ul4._isstr = function _isstr(obj) { + return typeof (obj) == "string"; +}; + +// Check if ``obj`` is a date +ul4._isdate = function _isdate(obj) { + return Object.prototype.toString.call(obj) == "[object Date]"; +}; + +// Check if ``obj`` is a color +ul4._iscolor = function _iscolor(obj) { + return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Color)); +}; + +// Check if ``obj`` is a timedelta object +ul4._istimedelta = function _istimedelta(obj) { + return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.TimeDelta)); +}; + +// Check if ``obj`` is a monthdelta object +ul4._ismonthdelta = function _ismonthdelta(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.MonthDelta); +}; + +// Check if ``obj`` is a template +ul4._istemplate = function _istemplate(obj) { + return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); +}; + +// Check if ``obj`` is a function +ul4._isfunction = function _isfunction(obj) { + return typeof (obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); +}; + +// Check if ``obj`` is a list +ul4._islist = function _islist(obj) { + return Object.prototype.toString.call(obj) == "[object Array]"; +}; + +// Check if ``obj`` is a set +ul4._isset = function _isset(obj) { + return Object.prototype.toString.call(obj) == "[object Set]"; +}; + +// Check if ``obj`` is an exception (at least a UL4 exception) +ul4._isexception = function _isexception(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Error); +}; + +ul4._isul4set = function _isul4set(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4._Set); +}; + +// Check if ``obj`` is an iterator +ul4._isiter = function _isiter(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.next) === "function"; +}; + +// Check if ``obj`` is a JS object +ul4._isobject = function _isobject(obj) { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof (obj.__type__) === "undefined"; +}; + +// Check if ``obj`` is a map +ul4._ismap = function _ismap(obj) { + if (ul4on._havemap) + return obj !== null && typeof (obj) === "object" && typeof (obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + return false; +}; + +// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) +ul4._isdict = function _isdict(obj) { + return ul4._isobject(obj) || ul4._ismap(obj); +}; + + +// Repeat string ``str`` ``rep`` times +ul4._str_repeat = function _str_repeat(str, rep) { + var result = ""; + for (; rep > 0; --rep) + result += str; + return result; +}; + +ul4._list_repeat = function _list_repeat(list, rep) { + var result = []; + for (; rep > 0; --rep) + for (var i = 0; i < list.length; ++i) + result.push(list[i]); + return result; +}; + +ul4._str_json = function _str_json(str) { + var result = ""; + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + switch (c) { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + default: + var code = str.charCodeAt(i); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; +}; + +// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) +ul4._asjson = function _asjson(obj) { + if (obj === null) + return "null"; + else if (typeof (obj) === "undefined") + return "{}.undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof (obj) === "string") + return ul4._str_json(obj); + else if (typeof (obj) === "number") { + return "" + obj; + } + else if (ul4._islist(obj)) { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) { + var v = []; + v.push("{"); + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) { + return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) { + return "ul4.MonthDelta.create(" + obj.months + ")"; + } + else if (ul4._iscolor(obj)) { + return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); +}; + +// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object +ul4._fromjson = function _fromjson(string) { + // The following is from jQuery's parseJSON function + string = ul4._strip(string, null); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw ul4.TypeError.create("fromjson()", "invalid JSON"); +}; + +// Encodes ``obj`` in the UL4 Object Notation format +ul4._asul4on = function _asul4on(obj) { + return ul4on.dumps(obj); +}; + +// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object +ul4._fromul4on = function _fromul4on(string) { + return ul4on.loads(string); +}; + +ul4._format_date = function _format_date(obj, fmt, lang) { + var translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p " + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + var translation = translations[lang]; + + var firstday; + + var result = []; + var inspec = false; + for (var i = 0; i < fmt.length; ++i) { + var c = fmt[i]; + if (inspec) { + switch (c) { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours() - 1) % 12) + 1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4._yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth() + 1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); +}; + +ul4._format_int = function _format_int(obj, fmt, lang) { + var work = fmt; + + // Defaults + var fill = ' '; + var align = '>'; // '<', '>', '=' or '^' + var sign = '-'; // '+', '-' or ' ' + var alternate = false; + var minimumwidth = 0; + var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) { + type = work.substring(work.length - 1); + work = work.substring(0, work.length - 1); + } + + // Extract minimum width + if (/\d+$/.test(work)) { + var minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) { + alternate = true; + work = work.substring(0, work.length - 1); + } + + // Determine sign + if (/[+ -]$/.test(work)) { + if (type == 'c') + throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length - 1); + work = work.substring(0, work.length - 1); + } + + // Extract fill and align char + if (work.length >= 3) + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) { + if (/[<>=^]$/.test(work)) { + align = work[1]; + fill = work[0]; + } + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + var neg = obj < 0; + + if (neg) + obj = -obj; + + var output; + switch (type) { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw ul4.ValueError.create("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth - output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + else // if (align == '^') + { + var pad = minimumwidth - output.length; + var padBefore = Math.floor(pad / 2); + var padAfter = pad - padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; +}; + +// Format ``obj`` using the format string ``fmt`` in the language ``lang`` +ul4._format = function _format(obj, fmt, lang) { + if (typeof (lang) === "undefined" || lang === null) + lang = "en"; + else { + var translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null }; + lang = lang.toLowerCase(); + if (typeof (translations[lang]) === "undefined") { + lang = lang.split(/_/)[0]; + if (typeof (translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_date(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); +}; + +ul4._lpad = function _lpad(string, pad, len) { + if (typeof (string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; +}; + +ul4._rpad = function _rpad(string, pad, len) { + if (typeof (string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; +}; + +ul4.Proto = { + __prototype__: null, + __id__: 0, + _nextid: 1, + isa: function isa(type) { + if (this === type) + return true; + if (this.__prototype__ === null) + return false; + return this.__prototype__.isa(type); + }, + + isprotoof: function isprotoof(obj) { + while (true) { + if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof (obj.__prototype__) === "undefined") + return false; + if (obj === this) + return true; + obj = obj.__prototype__; + } + }, + + // equality comparison of objects defaults to identity comparison + __eq__: function __eq__(other) { + return this === other; + }, + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__: function __ne__(other) { + return !this.__eq__(other); + }, + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__: function __bool__() { + return true; + } +}; + +ul4.Signature = ul4._inherit( + ul4.Proto, + { + create: function create() { + var signature = ul4._clone(this); + signature.args = []; + signature.argNames = {}; + signature.remargs = null; + signature.remkwargs = null; + + var nextDefault = false; + var lastArgname = null; + for (var i = 0; i < arguments.length; ++i) { + var argName = arguments[i]; + if (nextDefault) { + signature.args.push({ name: lastArgname, defaultValue: argName }); + signature.argNames[lastArgname] = true; + nextDefault = false; + } + else { + if (argName.substr(argName.length - 1) === "=") { + lastArgname = argName.substr(0, argName.length - 1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + signature.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + signature.remargs = argName.substr(1); + else { + signature.args.push({ name: argName }); + signature.argNames[argName] = true; + } + } + } + return signature; + }, + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray: function bindArray(name, args, kwargs) { + var finalargs = []; + var decname = name !== null ? name + "() " : ""; + + for (var i = 0; i < this.args.length; ++i) { + var arg = this.args[i]; + if (i < args.length) { + if (kwargs.hasOwnProperty(arg.name)) + throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) { + // No, but we have them -> complain + if (args.length > this.args.length) { + var prefix = name === null ? "expected" : name + "() expects"; + throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) { + // No => complain about unknown ones + for (var key in kwargs) { + if (!this.argNames[key]) { + if (name === null) + throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else { + // Yes => Put the unknown ones into an object and add that to the arguments array + var remkwargs = {}; + for (var key in kwargs) { + if (!this.argNames[key]) + remkwargs[key] = kwargs[key]; + } + finalargs.push(remkwargs); + } + + return finalargs; + }, + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject: function bindObject(name, args, kwargs) { + args = this.bindArray(name, args, kwargs); + var argObject = {}; + var i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + }, + + __repr__: function __repr__() { + return ""; + }, + + __str__: function __str__() { + return this.toString(); + }, + + toString: function toString() { + var v = []; + for (var i = 0; i < this.args.length; ++i) { + var arg = this.args[i]; + + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + } +); + +// Adds name and signature to a function/method and makes the method callable in templates +ul4.expose = function expose(signature, options, f) { + if (typeof (f) === "undefined") { + f = options; + options = {}; + } + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + + return f; +}; + +ul4.Context = ul4._inherit( + ul4.Proto, + { + create: function create(vars) { + if (vars === null || typeof (vars) === "undefined") + vars = {}; + var context = ul4._clone(this); + context.vars = vars; + context.indents = []; + context._output = []; + return context; + }, + + /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. + * This is used by the various comprehensions to avoid leaking loop variables. + */ + inheritvars: function inheritvars() { + var context = ul4._clone(this); + context.vars = ul4._simpleclone(this.vars); + return context; + }, + + /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ + withindent: function withindent(indent) { + var context = ul4._clone(this); + if (indent !== null) { + context.indents = this.indents.slice(); + context.indents.push(indent); + } + return context; + }, + + /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ + replaceoutput: function replaceoutput() { + var context = ul4._clone(this); + context._output = []; + return context; + }, + + clone: function clone(vars) { + return ul4._clone(this); + }, + + output: function output(value) { + this._output.push(value); + }, + + getoutput: function getoutput() { + return this._output.join(""); + }, + + get: function get(name) { + return this.vars[name]; + }, + + set: function set(name, value) { + this.vars[name] = value; + } + } +); + +/// Exceptions + +ul4.Exception = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Exception", + "cause": null, + + __getattr__: function __getattr__(attrname) { + switch (attrname) { + case "cause": + return this.cause; + default: + return undefined; + } + } + } +); + +// Exceptions used internally by UL4 for flow control +ul4.InternalException = ul4._inherit(ul4.Exception, {}); + +// Control flow exceptions +ul4.ReturnException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ReturnException", + + create: function create(result) { + var exception = ul4._clone(this); + exception.result = result; + return exception; + } + } +); + +ul4.BreakException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.BreakException" + } +); + +ul4.ContinueException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ContinueException" + } +); + +// Real exceptions raised by various parts of UL4 +ul4.SyntaxError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.SyntaxError" + } +); + +ul4.LValueRequiredError = ul4._inherit( + ul4.SyntaxError, + { + __type__: "ul4.LValueRequiredError", + + toString: function toString() { + return "lvalue required!"; + } + } +); + +ul4.TypeError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.TypeError", + + create: function create(operation, message) { + var exception = ul4._clone(this); + exception.operation = operation; + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +ul4.ValueError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ValueError", + + create: function create(message) { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +ul4.ArgumentError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ArgumentError", + + create: function create(message) { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +/// Exception that wraps other exceptions while they bubble up the stack +ul4.LocationError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.LocationError", + + create: function create(location, cause) { + var exception = ul4._clone(this); + exception.location = location; + exception.cause = cause; + return exception; + }, + + _templateprefix: function (template) { + var out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + var first = true; + while (template != null) { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + }, + + _template: function _template() { + if (ul4.Tag.isprotoof(this.location)) + return this.location.template; + else + return this.location.tag.template; + }, + + _outerpos: function _outerpos() { + if (ul4.Tag.isprotoof(this.location)) + return this.location.pos; + else { + var tag = this.location.tag; + if (tag === null) // A top level template as no tag + return this.location.pos; + else + return tag.pos; + } + }, + + _innerpos: function _innerpos() { + return this.location.pos; + }, + + toString: function toString() { + var template = this._template(); + var templateprefix = this._templateprefix(template); + var outerpos = this._outerpos(); + var innerpos = this._innerpos(); + + var prefix = template.source.substring(outerpos.start, innerpos.start); + var code = template.source.substring(innerpos.start, innerpos.stop); + var suffix = template.source.substring(innerpos.stop, outerpos.stop); + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + var text = prefix + code + suffix; + var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + // find line numbers + var lineno = 1, colno = 1; + for (var i = 0; i < innerpos.start; ++i) { + if (template.source[i] === "\n") { + ++lineno; + colno = 1; + } + else + ++colno; + } + + pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; + + return templateprefix + ": " + pos + "\n" + text + "\n" + underline; + }, + + __getattr__: function __getattr__(attrname) { + switch (attrname) { + case "cause": + return this.cause; + case "location": + return this.location; + case "template": + return this._template; + case "outerpos": + return this._outerpos; + case "innerpos": + return this._innerpos; + default: + return undefined; + } + } + } +); + + +/// Classes for the syntax tree +ul4.AST = ul4._inherit( + ul4.Proto, + { + create: function create(pos) { + var ast = ul4._clone(this); + ast.pos = pos; + return ast; + }, + __str__: function __str__() { + var out = []; + this._str(out); + return ul4._formatsource(out); + }, + __repr__: function __repr__() { + var out = []; + this._repr(out); + return ul4._formatsource(out); + }, + _handle_eval: function _handle_eval(context) { + try { + return this._eval(context); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, value) { + try { + return this._eval_set(context, value); + } + catch (exc) { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_set: function _eval_set(context, value) { + throw ul4.LValueRequiredError; + }, + _handle_eval_modify: function _handle_eval_modify(context, operator, value) { + try { + return this._eval_modify(context, operator, value); + } + catch (exc) { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_modify: function _eval_modify(context, operator, value) { + throw ul4.LValueRequiredError; + }, + _repr: function _repr(out) { + }, + _str: function _str(out) { + }, + ul4ondump: function ul4ondump(encoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this[this._ul4onattrs[i]]); + }, + ul4onload: function ul4onload(decoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + this[this._ul4onattrs[i]] = decoder.load(); + }, + __setitem__: function __setitem__(attrname, value) { + throw ul4.TypeError.create("mutate", "object is immutable"); + }, + // used in ul4ondump/ul4ondump to automatically dump these attributes + _ul4onattrs: ["pos"] + } +); + +ul4.TextAST = ul4._inherit( + ul4.AST, + { + create: function create(template, pos) { + var text = ul4.AST.create.call(this, pos); + text.template = template; + return text; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), + _text: function _text() { + return this.template.source.substring(this.pos.start, this.pos.stop); + }, + _eval: function _eval(context) { + context.output(this._text()); + }, + _str: function _str(out) { + out.push("text "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.IndentAST = ul4._inherit( + ul4.TextAST, + { + create: function create(template, pos, text) { + var indent = ul4.TextAST.create.call(this, template, pos); + indent._maketext(text); + return indent; + }, + _maketext: function _maketext(text) { + if (typeof (this.template) !== "undefined") { + if (text === null) + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + else + this.text = text; + } + else + this.text = null; + }, + _text: function _text() { + if (this.text === null) + return this.template.source.substring(this.pos.start, this.pos.stop); + else + return this.text; + }, + _eval: function _eval(context) { + for (var i = 0; i < context.indents.length; ++i) + context.output(context.indents[i]); + context.output(this._text()); + }, + ul4ondump: function ul4ondump(encoder) { + ul4.TextAST.ul4ondump.call(this, encoder); + + if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + encoder.dump(null); + else + encoder.dump(this.text); + }, + ul4onload: function ul4onload(decoder) { + ul4.TextAST.ul4onload.call(this, decoder); + // Recreate ``text`` attribute + this._maketext(decoder.load()); + }, + _str: function _str(out) { + out.push("indent "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.LineEndAST = ul4._inherit( + ul4.TextAST, + { + _str: function _str(out) { + out.push("lineend "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.Tag = ul4._inherit( + ul4.AST, + { + create: function create(template, tag, tagpos, codepos) { + var tago = ul4.AST.create.call(this, tagpos); + tago.template = template; + tago.tag = tag; + tago.codepos = codepos; + tago._maketext(); + return tago; + }, + _maketext: function _maketext() { + if (typeof (this.template) !== "undefined") { + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); + } + else { + this.text = null; + this.code = null; + } + }, + ul4ondump: function ul4ondump(encoder) { + ul4.AST.ul4ondump.call(this, encoder); + encoder.dump(this.template); + encoder.dump(this.tag); + encoder.dump(this.codepos); + }, + ul4onload: function ul4onload(decoder) { + ul4.TextAST.ul4onload.call(this, decoder); + this.template = decoder.load(); + this.tag = decoder.load(); + this.codepos = decoder.load(); + // Recreate ``text`` attribute + this._maketext(); + } + } +); + +ul4.CodeAST = ul4._inherit( + ul4.AST, + { + create: function create(tag, pos) { + var code = ul4.AST.create.call(this, pos); + code.tag = tag; + return code; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), + _str: function _str(out) { + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + } + } +); + +ul4.ConstAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, value) { + var constant = ul4.CodeAST.create.call(this, tag, pos); + constant.value = value; + return constant; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + return this.value; + } + } +); + +ul4.ItemArgBase = ul4._inherit( + ul4.CodeAST, + { + _handle_eval_list: function _handle_eval_list(context, result) { + try { + return this._eval_list(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, result) { + try { + return this._eval_set(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_dict: function _handle_eval_dict(context, result) { + try { + return this._eval_dict(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_call: function _handle_eval_call(context, args, kwargs) { + try { + return this._eval_call(context, args, kwargs); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } +); + +ul4.SeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); + seqitem.value = value; + return seqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_list: function _eval_list(context, result) { + var value = this.value._handle_eval(context); + result.push(value); + }, + _eval_set: function _eval_set(context, result) { + var value = this.value._handle_eval(context); + result.add(value); + } + } +); + + +ul4.UnpackSeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackseqitem.value = value; + return unpackseqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_list: function _eval_list(context, result) { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + result.push(item.value); + } + }, + _eval_set: function _eval_set(context, result) { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + result.add(item.value); + } + } + } +); + +ul4.DictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, key, value) { + var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); + dictitem.key = key; + dictitem.value = value; + return dictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) { + var key = this.key._handle_eval(context); + var value = this.value._handle_eval(context); + ul4on._setmap(result, key, value); + } + } +); + +ul4.UnpackDictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackdictitem.item = item; + return unpackdictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) { + for (var i = 0; i < item.length; ++i) { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + ul4on._setmap(result, key, value); + } + } + else if (ul4._ismap(item)) { + item.forEach(function (value, key) { + ul4on._setmap(result, key, value); + }); + } + else if (ul4._isobject(item)) { + for (var key in item) + ul4on._setmap(result, key, item[key]); + } + } + } +); + +ul4.PosArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var value = this.value._handle_eval(context); + args.push(value); + } + } +); + +ul4.KeywordArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, name, value) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.name = name; + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + if (kwargs.hasOwnProperty(this.name)) + throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); + var value = this.value._handle_eval(context); + kwargs[this.name] = value; + } + } +); + +ul4.UnpackListArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var item = this.item._handle_eval(context); + args.push.apply(args, item); + } + } +); + +ul4.UnpackDictArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) { + for (var i = 0; i < item.length; ++i) { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + } + } + else if (ul4._ismap(item)) { + item.forEach(function (value, key) { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + }); + } + else if (ul4._isobject(item)) { + for (var key in item) { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = item[key]; + } + } + } + } +); + +ul4.ListAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var list = ul4.CodeAST.create.call(this, tag, pos); + list.items = []; + return list; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = []; + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_list(context, result); + return result; + } + } +); + +ul4.ListCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.item = item; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = []; + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.push(this.item._handle_eval(localcontext)); + } + return result; + } + } +); + +ul4.DictAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var dict = ul4.CodeAST.create.call(this, tag, pos); + dict.items = []; + return dict; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = ul4on._emptymap(); + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_dict(context, result); + return result; + } + } +); + +ul4.DictCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, key, value, varname, container, condition) { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.key = key; + listcomp.value = value; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._emptymap(); + + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) { + var key = this.key._handle_eval(localcontext); + var value = this.value._handle_eval(localcontext); + ul4on._setmap(result, key, value); + } + } + + return result; + } + } +); + +ul4.SetAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var set = ul4.CodeAST.create.call(this, tag, pos); + set.items = []; + return set; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_set(context, result); + + return result; + } + } +); + +ul4.SetCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var setcomp = ul4.CodeAST.create.call(this, tag, pos); + setcomp.item = item; + setcomp.container = container; + setcomp.condition = condition; + return setcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); + } + + return result; + } + } +); + +ul4.GenExprAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var genexp = ul4.CodeAST.create.call(this, tag, pos); + genexp.item = item; + genexp.varname = varname; + genexp.container = container; + genexp.condition = condition; + return genexp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + var iter = ul4._iter(container); + + var localcontext = context.inheritvars(); + + var self = this; + + var result = { + next: function () { + while (true) { + var item = iter.next(); + if (item.done) + return item; + var varitems = ul4._unpackvar(self.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) { + var value = self.item._handle_eval(localcontext); + return { value: value, done: false }; + } + } + } + }; + + return result; + } + } +); + +ul4.VarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, name) { + var variable = ul4.CodeAST.create.call(this, tag, pos); + variable.name = name; + return variable; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + return this._get(context, this.name); + }, + _eval_set: function _eval_set(context, value) { + this._set(context, this.name, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + this._modify(context, operator, this.name, value); + }, + _get: function _get(context, name) { + var result = context.get(name); + if (typeof (result) === "undefined") + result = ul4.functions[name]; + return result; + }, + _set: function _set(context, name, value) { + context.set(name, value); + }, + _modify: function _modify(context, operator, name, value) { + var newvalue = operator._ido(context.get(name), value) + context.set(name, newvalue); + } + } +); + +ul4.UnaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj) { + var unary = ul4.CodeAST.create.call(this, tag, pos); + unary.obj = obj; + return unary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" obj="); + this.obj._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + return this._do(obj); + } + } +); + +// Negation +ul4.NegAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + if (obj !== null && typeof (obj.__neg__) === "function") + return obj.__neg__(); + return -obj; + } + } +); + +// Bitwise not +ul4.BitNotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + return -obj - 1; + } + } +); + +// Not +ul4.NotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + return !ul4._bool(obj); + } + } +); + +// If expression +ul4.IfAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, objif, objcond, objelse) { + var ifexpr = ul4.CodeAST.create.call(this, tag, pos); + ifexpr.objif = objif; + ifexpr.objcond = objcond; + ifexpr.objelse = objelse; + return ifexpr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(+1); + out.push("objif="); + this.objif._repr(out); + out.push(0); + out.push("objcond="); + this.objcond._repr(out); + out.push(0); + out.push("objelse="); + this.objelse._repr(out); + out.push(-1); + out.push(">"); + }, + _eval: function _eval(context) { + var result; + var condvalue = this.objcond._handle_eval(context); + if (ul4._bool(condvalue)) + result = this.objif._handle_eval(context); + else + result = this.objelse._handle_eval(context); + return result; + } + } +); + +ul4.ReturnAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var result = this.obj._handle_eval(context); + throw ul4.ReturnException.create(result); + }, + _str: function _str(out) { + out.push("return "); + this.obj._str(out); + } + } +); + +ul4.PrintAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var output = ul4._str(obj); + context.output(output); + }, + _str: function _str(out) { + out.push("print "); + this.obj._str(out); + } + } +); + +ul4.PrintXAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var output = ul4._xmlescape(obj); + context.output(output); + }, + _str: function _str(out) { + out.push("printx "); + this.obj._str(out); + } + } +); + +ul4.BinaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj1, obj2) { + var binary = ul4.CodeAST.create.call(this, tag, pos); + binary.obj1 = obj1; + binary.obj2 = obj2; + return binary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.type); + out.push(" obj1="); + this.obj1._repr(out); + out.push(" obj2="); + this.obj2._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + return this._do(obj1, obj2); + } + } +); + +// Item access and assignment: dict[key], list[index], string[index], color[index] +ul4.ItemAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + var result = this._get(obj1, obj2); + return result; + }, + _eval_set: function _eval_set(context, value) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._set(obj1, obj2, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._modify(operator, obj1, obj2, value); + }, + _get: function _get(container, key) { + if (typeof (container) === "string" || ul4._islist(container)) { + if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { + var start = key.start, stop = key.stop; + if (typeof (start) === "undefined" || start === null) + start = 0; + if (typeof (stop) === "undefined" || stop === null) + stop = container.length; + return container.slice(start, stop); + } + else { + var orgkey = key; + if (key < 0) + key += container.length; + return container[key]; + } + } + else if (container && typeof (container.__getitem__) === "function") // test this before the generic object test + return container.__getitem__(key); + else if (ul4._ismap(container)) + return container.get(key); + else if (Object.prototype.toString.call(container) === "[object Object]") + return container[key]; + else + throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); + }, + _set: function _set(container, key, value) { + if (ul4._islist(container)) { + if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { + var start = key.start, stop = key.stop; + if (start === null) + start = 0; + else if (start < 0) + start += container.length; + if (start < 0) + start = 0; + else if (start > container.length) + start = container.length; + if (stop === null) + stop = container.length; + else if (stop < 0) + stop += container.length; + if (stop < 0) + stop = 0; + else if (stop > container.length) + stop = container.length; + if (stop < start) + stop = start; + container.splice(start, stop - start); // Remove old element + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + container.splice(start++, 0, item.value); + } + } + else { + var orgkey = key; + if (key < 0) + key += container.length; + container[key] = value; + } + } + else if (container && typeof (container.__setitem__) === "function") // test this before the generic object test + container.__setitem__(key, value); + else if (ul4._ismap(container)) + container.set(key, value); + else if (Object.prototype.toString.call(container) === "[object Object]") + container[key] = value; + else + throw ul4.NotSubscriptableError.create(container); + }, + _modify: function _modify(operator, container, key, value) { + this._set(container, key, operator._ido(this._get(container, key), value)); + } + } +); + +// Identifty test operator ``is`` +ul4.IsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return obj1 === obj2; + } + } +); + +// Inverted tdentifty test operator ``is not`` +ul4.IsNotAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return obj1 !== obj2; + } + } +); + +// Comparison operator == +ul4.EQAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._eq(obj1, obj2); + } + } +); + +// Comparison operator != +ul4.NEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._ne(obj1, obj2); + } + } +); + +// Comparison operator < +ul4.LTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._lt(obj1, obj2); + } + } +); + +// Comparison operator <= +ul4.LEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._le(obj1, obj2); + } + } +); + +// Comparison operator > +ul4.GTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._gt(obj1, obj2); + } + } +); + +// Comparison operator >= +ul4.GEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._ge(obj1, obj2); + } + } +); + +// Containment test: string in string, obj in list, key in dict, value in rgb +ul4.ContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) { + if (typeof (obj) === "string" && typeof (container) === "string") { + return container.indexOf(obj) !== -1; + } + else if (ul4._islist(container)) { + return container.indexOf(obj) !== -1; + } + else if (container && typeof (container.__contains__) === "function") // test this before the generic object test + return container.__contains__(obj); + else if (ul4._ismap(container) || ul4._isset(container)) + return container.has(obj); + else if (ul4._isobject(container)) { + for (var key in container) { + if (key === obj) + return true; + } + return false; + } + else if (ul4._iscolor(container)) { + return container._r === obj || container._g === obj || container._b === obj || container._a === obj; + } + throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + } + } +); + +// Inverted containment test +ul4.NotContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) { + return !ul4.ContainsAST._do(obj, container); + } + } +); + +// Addition: num + num, string + string +ul4.AddAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__add__) === "function") + return obj1.__add__(obj2); + else if (obj2 && typeof (obj2.__radd__) === "function") + return obj2.__radd__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) { + var result = []; + ul4._append(result, obj1); + ul4._append(result, obj2); + return result; + } + else + return obj1 + obj2; + }, + _ido: function _ido(obj1, obj2) { + if (ul4._islist(obj1) && ul4._islist(obj2)) { + ul4._append(obj1, obj2); + return obj1; + } + else + return this._do(obj1, obj2); + } + } +); + +// Substraction: num - num +ul4.SubAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__sub__) === "function") + return obj1.__sub__(obj2); + else if (obj2 && typeof (obj2.__rsub__) === "function") + return obj2.__rsub__(obj1); + else if (ul4._isdate(obj1) && ul4._isdate(obj2)) + return this._date_sub(obj1, obj2); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + return obj1 - obj2; + }, + _date_sub: function _date_sub(obj1, obj2) { + var swap = (obj2 > obj1); + + if (swap) { + var t = obj1; + obj1 = obj2; + obj2 = t; + } + // From now on obj1 is > than obj2 + + var year1 = obj1.getFullYear(); + var yearday1 = ul4._yearday(obj1); + var year2 = obj2.getFullYear(); + var yearday2 = ul4._yearday(obj2); + + var diffdays = 0; + + while (year1 > year2) { + diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + ++year2; + } + diffdays += yearday1 - yearday2; + + var hours1 = obj1.getHours(); + var minutes1 = obj1.getMinutes(); + var seconds1 = obj1.getSeconds(); + var hours2 = obj2.getHours(); + var minutes2 = obj2.getMinutes(); + var seconds2 = obj2.getSeconds(); + + var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + + var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + + if (swap) { + diffdays = -diffdays; + diffseconds = -diffseconds; + diffmilliseconds = -diffmilliseconds; + } + return ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Multiplication: num * num, int * str, str * int, int * list, list * int +ul4.MulAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__mul__) === "function") + return obj1.__mul__(obj2); + else if (obj2 && typeof (obj2.__rmul__) === "function") + return obj2.__rmul__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) { + if (typeof (obj2) === "string") { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj2, obj1); + } + else if (ul4._islist(obj2)) { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj2, obj1); + } + } + else if (ul4._isint(obj2) || ul4._isbool(obj2)) { + if (typeof (obj1) === "string") { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj1, obj2); + } + else if (ul4._islist(obj1)) { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj1, obj2); + } + } + return obj1 * obj2; + }, + _ido: function _ido(obj1, obj2) { + if (ul4._islist(obj1) && ul4._isint(obj2)) { + if (obj2 > 0) { + var i = 0; + var targetsize = obj1.length * obj2; + while (obj1.length < targetsize) + obj1.push(obj1[i++]) + } + else + obj1.splice(0, obj1.length); + return obj1; + } + else + return this._do(obj1, obj2); + } + } +); + +// Truncating division +ul4.FloorDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__floordiv__) === "function") + return obj1.__floordiv__(obj2); + else if (obj2 && typeof (obj2.__rfloordiv__) === "function") + return obj2.__rfloordiv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + return Math.floor(obj1 / obj2); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// "Real" division +ul4.TrueDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__truediv__) === "function") + return obj1.__truediv__(obj2); + else if (obj2 && typeof (obj2.__rtruediv__) === "function") + return obj2.__rtruediv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + return obj1 / obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Modulo +ul4.ModAST = ul4._inherit( + ul4.BinaryAST, + { + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + _do: function _do(obj1, obj2) { + var div = Math.floor(obj1 / obj2); + var mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise left shift +ul4.ShiftLeftAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftRightAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 *= 2; + return obj1; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise right shift +ul4.ShiftRightAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftLeftAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 /= 2; + return Math.floor(obj1); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise and +ul4.BitAndAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 & obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise exclusive or +ul4.BitXOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 ^ obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise or +ul4.BitOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 | obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +ul4.AndAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + if (!ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } +); + +ul4.OrAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + if (ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } +); + +ul4.AttrAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, attrname) { + var attr = ul4.CodeAST.create.call(this, tag, pos); + attr.obj = obj; + attr.attrname = attrname; + return attr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var result = this._get(obj, this.attrname); + return result; + }, + _eval_set: function _eval_set(context, value) { + var obj = this.obj._handle_eval(context); + this._set(obj, this.attrname, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + var obj = this.obj._handle_eval(context); + this._modify(operator, obj, this.attrname, value); + }, + _get: function _get(object, attrname) { + if (typeof (object) === "string") { + switch (attrname) { + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); + case "replace": + return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); }); + case "strip": + return ul4.expose(["chars=", null], function strip(chars) { return ul4._strip(object, chars); }); + case "lstrip": + return ul4.expose(["chars=", null], function lstrip(chars) { return ul4._lstrip(object, chars); }); + case "rstrip": + return ul4.expose(["chars=", null], function rstrip(chars) { return ul4._rstrip(object, chars); }); + case "split": + return ul4.expose(["sep=", null, "count=", null], function split(sep, count) { return ul4._split(object, sep, count); }); + case "rsplit": + return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); }); + case "splitlines": + return ul4.expose(["keepends=", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); }); + case "lower": + return ul4.expose([], function lower() { return object.toLowerCase(); }); + case "upper": + return ul4.expose([], function upper() { return object.toUpperCase(); }); + case "capitalize": + return ul4.expose([], function capitalize() { return ul4._capitalize(object); }); + case "join": + return ul4.expose(["iterable"], function join(iterable) { return ul4._join(object, iterable); }); + case "startswith": + return ul4.expose(["prefix"], function startswith(prefix) { return ul4._startswith(object, prefix); }); + case "endswith": + return ul4.expose(["suffix"], function endswith(suffix) { return ul4._endswith(object, suffix); }); + default: + return undefined; + } + } + else if (ul4._islist(object)) { + switch (attrname) { + case "append": + return ul4.expose(["*items"], function append(items) { return ul4._append(object, items); }); + case "insert": + return ul4.expose(["pos", "*items"], function insert(pos, items) { return ul4._insert(object, pos, items); }); + case "pop": + return ul4.expose(["pos=", -1], function pop(pos) { return ul4._pop(object, pos); }); + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); + default: + return undefined; + } + } + else if (ul4._isdate(object)) { + switch (attrname) { + case "weekday": + return ul4.expose([], function weekday() { return ul4._weekday(object); }); + case "week": + return ul4.expose(["firstweekday=", null], function week(firstweekday) { return ul4._week(object, firstweekday); }); + case "day": + return ul4.expose([], function day() { return object.getDate(); }); + case "month": + return ul4.expose([], function month() { return object.getMonth() + 1; }); + case "year": + return ul4.expose([], function year() { return object.getFullYear(); }); + case "hour": + return ul4.expose([], function hour() { return object.getHours(); }); + case "minute": + return ul4.expose([], function minute() { return object.getMinutes(); }); + case "second": + return ul4.expose([], function second() { return object.getSeconds(); }); + case "microsecond": + return ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; }); + case "mimeformat": + return ul4.expose([], function mimeformat() { return ul4._mimeformat(object); }); + case "isoformat": + return ul4.expose([], function isoformat() { return ul4._isoformat(object); }); + case "yearday": + return ul4.expose([], function yearday() { return ul4._yearday(object); }); + default: + return undefined; + } + } + else if (ul4._ismap(object)) { + switch (attrname) { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items() { return ul4._items(object); }); + case "values": + return ul4.expose([], function values() { return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + return object.get(attrname); + } + } + else if (ul4._isset(object)) { + switch (attrname) { + case "add": + return ul4.expose(["*items"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + return undefined; + } + } + else if (Object.prototype.toString.call(object) === "[object Object]") { + switch (attrname) { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items() { return ul4._items(object); }); + case "values": + return ul4.expose([], function values() { return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + var result; + if (object && typeof (object.__getattr__) === "function") // test this before the generic object test + result = object.__getattr__(attrname); + else + result = object[attrname]; + if (typeof (result) !== "function") + return result; + var realresult = function () { + return result.apply(object, arguments); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + } + throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); + }, + _set: function _set(object, attrname, value) { + if (typeof (object) === "object" && typeof (object.__setattr__) === "function") + object.__setattr__(attrname, value); + else if (ul4._ismap(object)) + object.set(attrname, value) + else if (ul4._isobject(object)) + object[attrname] = value; + else + throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); + }, + _modify: function _modify(operator, object, attrname, value) { + var oldvalue = this._get(object, attrname); + var newvalue = operator._ido(oldvalue, value); + this._set(object, attrname, newvalue); + } + } +); + +ul4.CallAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, args) { + var call = ul4.CodeAST.create.call(this, tag, pos); + call.obj = obj; + call.args = args; + return call; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), + _repr: function _repr(out) { + out.push(""); + }, + _makeargs: function _makeargs(context) { + var args = [], kwargs = {}; + for (var i = 0; i < this.args.length; ++i) + this.args[i]._handle_eval_call(context, args, kwargs); + return { args: args, kwargs: kwargs }; + }, + _handle_eval: function _handle_eval(context) { + try { + return this._eval(context); + } + catch (exc) { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var args = this._makeargs(context); + var result = ul4._call(context, obj, args.args, args.kwargs); + return result; + } + } +); + +ul4.RenderAST = ul4._inherit( + ul4.CallAST, + { + create: function create(tag, pos, obj, args) { + var render = ul4.CallAST.create.call(this, tag, pos, obj, args); + render.indent = null; + return render; + }, + _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("render "); + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + if (this.indent !== null) { + out.push(" with indent "); + out.push(ul4._repr(this.indent._text())); + } + }, + _handle_eval: function _handle_eval(context) { + var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); + var obj = this.obj._handle_eval(localcontext); + var args = this._makeargs(localcontext); + + try { + var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + return result; + } + catch (exc) { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } +); + +// Slice object +ul4.slice = ul4._inherit( + ul4.Proto, + { + create: function create(start, stop) { + var slice = ul4._clone(this); + slice.start = start; + slice.stop = stop; + return slice; + }, + __repr__: function __repr__() { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + } + } +); + + +// List/String slice +ul4.SliceAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, index1, index2) { + var slice = ul4.CodeAST.create.call(this, tag, pos); + slice.index1 = index1; + slice.index2 = index2; + return slice; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return ul4.slice.create(index1, index2); + } + } +); + + +ul4.SetVarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, lvalue, value) { + var changevar = ul4.CodeAST.create.call(this, tag, pos); + changevar.lvalue = lvalue; + changevar.value = value; + return changevar; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" lvalue="); + out.push(ul4._repr(this.lvalue)); + out.push(" value="); + this.value._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item[0]._handle_eval_set(context, item[1]); + } + } + } +); + +ul4.ModifyVarAST = ul4._inherit( + ul4.SetVarAST, + { + _eval: function _eval(context) { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item[0]._handle_eval_modify(context, this._operator, item[1]); + } + } + } +); + +ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + +ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + +ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + +ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + +ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + +ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + +ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + +ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + +ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + +ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + +ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + +ul4.BlockAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var block = ul4.CodeAST.create.call(this, tag, pos); + block.endtag = null; + block.content = []; + return block; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), + _eval: function _eval(context) { + for (var i = 0; i < this.content.length; ++i) + this.content[i]._handle_eval(context); + }, + _str: function _str(out) { + if (this.content.length) { + for (var i = 0; i < this.content.length; ++i) { + this.content[i]._str(out); + out.push(0); + } + } + else { + out.push("pass"); + out.push(0); + } + } + } +); + +ul4.ForBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, varname, container) { + var for_ = ul4.BlockAST.create.call(this, tag, pos); + for_.varname = varname; + for_.container = container; + return for_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), + _repr: function _repr(out) { + out.push(""); + }, + _str_varname: function _str_varname(out, varname) { + if (ul4._islist(varname)) { + out.push("("); + for (var i = 0; i < varname.length; ++i) { + if (i) + out.push(", "); + this._str_varname(out, varname[i]); + } + if (varname.length == 1) + out.push(","); + out.push(")"); + } + else + varname._str(out); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + for (var iter = ul4._iter(container); ;) { + var value = iter.next(); + if (value.done) + break; + var varitems = ul4._unpackvar(this.varname, value.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(context, varitems[i][1]); + try { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) { + out.push("for "); + this._str_varname(out, this.varname); + out.push(" in "); + this.container._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.WhileBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) { + var while_ = ul4.BlockAST.create.call(this, tag, pos); + while_.condition = condition; + return while_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("while "), + this.container._repr(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _eval: function _eval(context) { + while (true) { + var cond = this.condition._handle_eval(context); + if (!ul4._bool(cond)) + break; + try { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) { + out.push("while "); + ul4.AST._str.call(this, out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.BreakAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) { + throw ul4.BreakException; + }, + _str: function _str(out) { + out.push("break"); + out.push(0); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.ContinueAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) { + throw ul4.ContinueException; + }, + _str: function _str(out) { + out.push("continue"); + out.push(0); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.CondBlockAST = ul4._inherit( + ul4.BlockAST, + { + _eval: function _eval(context) { + for (var i = 0; i < this.content.length; ++i) { + var block = this.content[i]; + var execute = block._execute(context); + if (execute) { + block._handle_eval(context); + break; + } + } + } + } +); + +ul4.ConditionalBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) { + var block = ul4.BlockAST.create.call(this, tag, pos); + block.condition = condition; + return block; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" condition="); + this.condition._repr(out); + out.push(">"); + }, + _str: function _str(out) { + out.push(this._strname); + out.push(" "); + this.condition._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) { + var cond = this.condition._handle_eval(context); + var result = ul4._bool(cond); + return result; + } + } +); + +ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "if" }); + +ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "else if" }); + +ul4.ElseBlockAST = ul4._inherit( + ul4.BlockAST, + { + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("else:"), + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) { + return true; + }, + _str: function _str(out) { + out.push("else:"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.Template = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) { + var template = ul4.BlockAST.create.call(this, tag, pos); + template.source = source; + template.name = name; + template.whitespace = whitespace; + template.startdelim = startdelim; + template.enddelim = enddelim; + template.docpos = null; + template.signature = signature; + template._jsfunction = null; + template._asts = null; + template._ul4_callsignature = signature; + template._ul4_rendersignature = signature; + template.parenttemplate = null; + return template; + }, + ul4ondump: function ul4ondump(encoder) { + var signature; + encoder.dump(ul4.version); + encoder.dump(this.name); + encoder.dump(this.source); + encoder.dump(this.whitespace); + encoder.dump(this.startdelim); + encoder.dump(this.enddelim); + encoder.dump(this.docpos); + encoder.dump(this.parenttemplate); + if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + signature = this.signature; + else { + signature = []; + for (var i = 0; i < this.signature.args.length; ++i) { + var arg = this.signature.args[i]; + if (typeof (arg.defaultValue) === "undefined") + signature.push(arg.name); + else + signature.push(arg.name + "=", arg.defaultValue); + } + if (this.signature.remargs !== null) + signature.push("*" + this.signature.remargs); + if (this.signature.remkwargs !== null) + signature.push("**" + this.signature.remkwargs); + } + encoder.dump(signature); + ul4.BlockAST.ul4ondump.call(this, encoder); + }, + ul4onload: function ul4onload(decoder) { + var version = decoder.load(); + var signature; + + if (version === null) + throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + + if (version !== ul4.version) + throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); + this.source = decoder.load(); + this.whitespace = decoder.load(); + this.startdelim = decoder.load(); + this.enddelim = decoder.load(); + this.docpos = decoder.load(); + this.parenttemplate = decoder.load(); + signature = decoder.load(); + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + this.signature = signature; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + ul4.BlockAST.ul4onload.call(this, decoder); + }, + loads: function loads(string) { + return ul4on.loads(string); + }, + _eval: function _eval(context) { + var signature = null; + if (this.signature !== null) + signature = this.signature._handle_eval(context); + var closure = ul4.TemplateClosure.create(this, signature, context.vars); + context.set(this.name, closure); + }, + _repr: function _repr(out) { + out.push("") { + out.push(" enddelim="); + out.push(ul4._repr(this.enddelim)); + } + out.push(">"); + }, + _str: function _str(out) { + out.push("def "); + out.push(this.name ? this.name : "unnamed"); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + _renderbound: function _renderbound(context, vars) { + var localcontext = context.clone(); + localcontext.vars = vars; + try { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) { + if (!ul4.ReturnException.isprotoof(exc)) + throw exc; + } + }, + __render__: function __render__(context, vars) { + this._renderbound(context, vars); + }, + render: function render(context, vars) { + this._renderbound(context, vars); + }, + _rendersbound: function _rendersbound(context, vars) { + var localcontext = context.replaceoutput(); + this._renderbound(localcontext, vars); + return localcontext.getoutput(); + }, + renders: function renders(vars) { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._rendersbound(context, vars); + }, + doc: function doc() { + return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; + }, + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "tag": + return this.tag; + case "endtag": + return this.endtag; + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + default: + return undefined; + } + }, + _callbound: function _callbound(context, vars) { + var localcontext = context.clone(); + localcontext.vars = vars; + try { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) { + if (ul4.ReturnException.isprotoof(exc)) + return exc.result; + else + throw exc; + } + return null; + }, + call: function call(vars) { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._callbound(context, vars); + }, + __call__: function __call__(context, vars) { + return this._callbound(context, vars); + }, + __type__: "ul4.Template" // used by ``istemplate()`` + } +); + +ul4.SignatureAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var signature = ul4.CodeAST.create.call(this, tag, pos); + signature.params = []; + return signature; + }, + ul4ondump: function ul4ondump(encoder) { + ul4.CodeAST.ul4ondump.call(this, encoder); + + var dump = []; + + for (var i = 0; i < this.params.length; ++i) { + var param = this.params[i]; + if (param[1] === null) + dump.push(param[0]); + else + dump.push(param); + } + encoder.dump(dump); + }, + ul4onload: function ul4onload(decoder) { + ul4.AST.ul4onload.call(this, decoder); + var dump = decoder.load(); + this.params = []; + for (var i = 0; i < dump.length; ++i) { + var param = dump[i]; + if (typeof (param) === "string") + this.params.push([param, null]); + else + this.params.push(param); + } + }, + _eval: function _eval(context) { + var args = []; + for (var i = 0; i < this.params.length; ++i) { + var param = this.params[i]; + if (param[1] === null) + args.push(param[0]); + else { + args.push(param[0] + "="); + args.push(param[1]._handle_eval(context)); + } + } + return ul4.Signature.create.apply(ul4.Signature, args); + }, + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" params="); + this.params._repr(out); + out.push(">"); + } + } +); + +ul4.TemplateClosure = ul4._inherit( + ul4.Proto, + { + create: function create(template, signature, vars) { + var closure = ul4._clone(this); + closure.template = template; + closure.signature = signature; + closure.vars = vars; + closure._ul4_callsignature = signature; + closure._ul4_rendersignature = signature; + // Copy over the required attribute from the template + closure.name = template.name; + closure.tag = template.tag; + closure.endtag = template.endtag; + closure.source = template.source; + closure.startdelim = template.startdelim; + closure.enddelim = template.enddelim; + closure.docpos = template.docpos; + closure.content = template.content; + return closure; + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + __render__: function __render__(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + render: function render(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __call__: function __call__(context, vars) { + return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _renderbound: function _renderbound(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _rendersbound: function _rendersbound(context, vars) { + return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "render": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + case "signature": + return this.signature; + default: + return this.template.__getattr__(attrname); + } + }, + __type__: "ul4.TemplateClosure" // used by ``istemplate()`` + } +); + +// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` +ul4._rgb = function _rgb(r, g, b, a) { + return this.Color.create(255 * r, 255 * g, 255 * b, 255 * a); +}; + +// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference +ul4._xmlescape = function _xmlescape(obj) { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; +}; + +// Convert ``obj`` to a string suitable for output into a CSV file +ul4._csv = function _csv(obj) { + if (obj === null) + return ""; + else if (typeof (obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; +}; + +// Return a string containing one character with the codepoint ``i`` +ul4._chr = function _chr(i) { + if (typeof (i) != "number") + throw ul4.TypeError.create("chr()", "chr() requires an int"); + return String.fromCharCode(i); +}; + +// Return the codepoint for the one and only character in the string ``c`` +ul4._ord = function _ord(c) { + if (typeof (c) != "string" || c.length != 1) + throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); + return c.charCodeAt(0); +}; + +// Convert an integer to a hexadecimal string +ul4._hex = function _hex(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("hex()", "hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); +}; + +// Convert an integer to a octal string +ul4._oct = function _oct(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("oct()", "oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); +}; + +// Convert an integer to a binary string +ul4._bin = function _bin(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("bin()", "bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); +}; + +// Return the minimum value +ul4._min = function _min(obj) { + if (obj.length == 0) + throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) { + var item = iter.next(); + if (item.done) { + if (first) + throw ul4.ValueError.create("min() argument is an empty sequence!"); + return result; + } + if (first || (item.value < result)) + result = item.value; + first = false; + } +}; + +// Return the maximum value +ul4._max = function _max(obj) { + if (obj.length == 0) + throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) { + var item = iter.next(); + if (item.done) { + if (first) + throw ul4.ValueError.create("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } +}; + +// Return the of the values from the iterable starting with ``start`` (default ``0``) +ul4._sum = function _sum(iterable, start) { + if (typeof (start) === "undefined") + start = 0; + + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; +}; + +// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) +ul4._first = function _first(iterable, defaultValue) { + if (typeof (defaultValue) === "undefined") + defaultValue = null; + + var item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; +}; + +// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) +ul4._last = function _last(iterable, defaultValue) { + if (typeof (defaultValue) === "undefined") + defaultValue = null; + + var value = defaultValue; + + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + value = item.value; + } + return value; +}; + +// Return a sorted version of ``iterable`` +ul4._sorted = function _sorted(context, iterable, key, reverse) { + var cmp; + if (key === null) { + // FIXME: stability + if (reverse) { + cmp = function cmp(a, b) { + return -ul4._cmp("<=>", a, b); + } + } + else { + cmp = function cmp(a, b) { + return ul4._cmp("<=>", a, b); + } + } + var result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else { + var sort = []; + + for (var i = 0, iter = ul4._iter(iterable); ; ++i) { + var item = iter.next(); + if (item.done) + break; + var keyvalue = ul4._call(context, key, [item.value], {}); + sort.push([keyvalue, i, item.value]); + } + cmp = function cmp(s1, s2) { + var res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp(s1[1], s2[1]); + return reverse ? -res : res; + } + + sort.sort(cmp); + + var result = []; + for (var i = 0; i < sort.length; ++i) { + result.push(sort[i][2]); + } + return result; + } +}; + +// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` +ul4._range = function _range(args) { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required range() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var lower, higher; + if (step === 0) + throw ul4.ValueError.create("range() requires a step argument != 0"); + else if (step > 0) { + lower = start; + heigher = stop; + } + else { + lower = stop; + heigher = start; + } + var length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0; + + return { + index: 0, + next: function () { + if (this.index >= length) + return { done: true }; + return { value: start + (this.index++) * step, done: false }; + } + }; +}; + +// Return a iterable object returning a slice from the argument +ul4._slice = function _slice(args) { + var iterable, start, stop, step; + if (args.length < 2) + throw ul4.ArgumentError.create("required slice() argument missing"); + else if (args.length > 4) + throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw ul4.ValueError.create("slice() requires a start argument >= 0"); + if (stop < 0) + throw ul4.ValueError.create("slice() requires a stop argument >= 0"); + if (step <= 0) + throw ul4.ValueError.create("slice() requires a step argument > 0"); + + var next = start, count = 0; + var iter = ul4._iter(iterable); + return { + next: function () { + var result; + while (count < next) { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return { done: true }; + result = iter.next(); + if (result.done) + return result; + ++count; + next += step; + if (stop !== null && next > stop) + next = stop; + return result; + } + }; +}; + +// ``%`` escape unsafe characters in the string ``string`` +ul4._urlquote = function _urlquote(string) { + return encodeURIComponent(string); +}; + +// The inverse function of ``urlquote`` +ul4._urlunquote = function _urlunquote(string) { + return decodeURIComponent(string); +}; + +// Return a reverse iterator over ``sequence`` +ul4._reversed = function _reversed(sequence) { + if (typeof (sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length - 1, + next: function () { + return this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true }; + } + }; +}; + +// Returns a random number in the interval ``[0;1[`` +ul4._random = function _random() { + return Math.random(); +}; + +// Return a randomly select item from ``range(start, stop, step)`` +ul4._randrange = function _randrange(args) { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required randrange() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var width = stop - start; + + var value = Math.random(); + + var n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw ul4.ValueError.create("randrange() requires a step argument != 0"); + return start + step * Math.floor(value * n); +}; + +// Return a random item/char from the list/string ``sequence`` +ul4._randchoice = function _randchoice(sequence) { + var iscolor = ul4._iscolor(sequence); + if (typeof (sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw ul4.TypeError.create("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; +}; + +// Round a number ``x`` to ``digits`` decimal places (may be negative) +ul4._round = function _round(x, digits) { + if (typeof (digits) === "undefined") + digits = 0; + if (digits) { + var threshhold = Math.pow(10, digits); + return Math.round(x * threshhold) / threshhold; + } + else + return Math.round(x); +}; + +// Return a hex-encode MD5 hash of the argument +// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 +ul4._md5 = function _md5(string) { + return md5(string); +}; + +// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) +ul4._enumerate = function _enumerate(iterable, start) { + if (typeof (start) === "undefined") + start = 0; + + return { + iter: ul4._iter(iterable), + index: start, + next: function () { + var item = this.iter.next(); + return item.done ? item : { value: [this.index++, item.value], done: false }; + } + }; +}; + +// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) +ul4._isfirst = function _isfirst(iterable) { + var iter = ul4._iter(iterable); + var isfirst = true; + return { + next: function () { + var item = iter.next(); + var result = item.done ? item : { value: [isfirst, item.value], done: false }; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) +ul4._islast = function _islast(iterable) { + var iter = ul4._iter(iterable); + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [item.done, lastitem.value], done: false }; + lastitem = item; + return result; + } + }; +}; + +// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) +ul4._isfirstlast = function _isfirstlast(iterable) { + var iter = ul4._iter(iterable); + var isfirst = true; + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [isfirst, item.done, lastitem.value], done: false }; + lastitem = item; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) +ul4._enumfl = function _enumfl(iterable, start) { + var iter = ul4._iter(iterable); + var i = start; + var isfirst = true; + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [i++, isfirst, item.done, lastitem.value], done: false }; + lastitem = item; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) +ul4._zip = function _zip(iterables) { + var result; + if (iterables.length) { + var iters = []; + for (var i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); + + return { + next: function () { + var items = []; + for (var i = 0; i < iters.length; ++i) { + var item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return { value: items, done: false }; + } + }; + } + else { + return { + next: function () { + return { done: true }; + } + }; + } +}; + +// Return the absolute value for the number ``number`` +ul4._abs = function _abs(number) { + if (number !== null && typeof (number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); +}; + +// Return a ``Date`` object from the arguments passed in +ul4._date = function _date(year, month, day, hour, minute, second, microsecond) { + if (typeof (hour) === "undefined") + hour = 0; + + if (typeof (minute) === "undefined") + minute = 0; + + if (typeof (second) === "undefined") + second = 0; + + if (typeof (microsecond) === "undefined") + microsecond = 0; + + return new Date(year, month - 1, day, hour, minute, second, microsecond / 1000); +}; + +// Return a ``TimeDelta`` object from the arguments passed in +ul4._timedelta = function _timedelta(days, seconds, microseconds) { + return this.TimeDelta.create(days, seconds, microseconds); +}; + +// Return a ``MonthDelta`` object from the arguments passed in +ul4._monthdelta = function _monthdelta(months) { + return this.MonthDelta.create(months); +}; + +// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) +ul4._hls = function _hls(h, l, s, a) { + var _v = function (m1, m2, hue) { + hue = hue % 1.0; + if (hue < 1 / 6) + return m1 + (m2 - m1) * hue * 6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2 / 3) + return m1 + (m2 - m1) * (2 / 3 - hue) * 6.0; + return m1; + }; + + var m1, m2; + if (typeof (a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0 + s); + else + m2 = l + s - (l * s); + m1 = 2.0 * l - m2; + return ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a); +}; + +// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) +ul4._hsv = function _hsv(h, s, v, a) { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + var i = Math.floor(h * 6.0); + var f = (h * 6.0) - i; + var p = v * (1.0 - s); + var q = v * (1.0 - s * f); + var t = v * (1.0 - s * (1.0 - f)); + switch (i % 6) { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } +}; + +// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` +ul4._get = function _get(container, key, defaultvalue) { + if (ul4._ismap(container)) { + if (container.has(key)) + return container.get(key); + return defaultvalue; + } + else if (ul4._isobject(container)) { + var result = container[key]; + if (typeof (result) === "undefined") + return defaultvalue; + return result; + } + throw ul4.TypeError.create("get()", "get() requires a dict"); +}; + +// Return a ``Date`` object for the current time +ul4.now = function now() { + return new Date(); +}; + +// Return a ``Date`` object for the current time in UTC +ul4.utcnow = function utcnow() { + var now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); +}; + +ul4.functions = { + repr: ul4.expose(["obj"], { name: "repr" }, ul4._repr), + ascii: ul4.expose(["obj"], { name: "ascii" }, ul4._ascii), + str: ul4.expose(["obj=", ""], { name: "str" }, ul4._str), + int: ul4.expose(["obj=", 0, "base=", null], { name: "int" }, ul4._int), + float: ul4.expose(["obj=", 0.0], { name: "float" }, ul4._float), + list: ul4.expose(["iterable=", []], { name: "list" }, ul4._list), + set: ul4.expose(["iterable=", []], { name: "set" }, ul4._set), + bool: ul4.expose(["obj=", false], { name: "bool" }, ul4._bool), + len: ul4.expose(["sequence"], { name: "len" }, ul4._len), + type: ul4.expose(["obj"], { name: "type" }, ul4._type), + format: ul4.expose(["obj", "fmt", "lang=", null], { name: "format" }, ul4._format), + any: ul4.expose(["iterable"], { name: "any" }, ul4._any), + all: ul4.expose(["iterable"], { name: "all" }, ul4._all), + zip: ul4.expose(["*iterables"], { name: "zip" }, ul4._zip), + isundefined: ul4.expose(["obj"], { name: "isundefined" }, ul4._isundefined), + isdefined: ul4.expose(["obj"], { name: "isdefined" }, ul4._isdefined), + isnone: ul4.expose(["obj"], { name: "isnone" }, ul4._isnone), + isbool: ul4.expose(["obj"], { name: "isbool" }, ul4._isbool), + isint: ul4.expose(["obj"], { name: "isint" }, ul4._isint), + isfloat: ul4.expose(["obj"], { name: "isfloat" }, ul4._isfloat), + isstr: ul4.expose(["obj"], { name: "isstr" }, ul4._isstr), + isdate: ul4.expose(["obj"], { name: "isdate" }, ul4._isdate), + iscolor: ul4.expose(["obj"], { name: "iscolor" }, ul4._iscolor), + istimedelta: ul4.expose(["obj"], { name: "istimedelta" }, ul4._istimedelta), + ismonthdelta: ul4.expose(["obj"], { name: "ismonthdelta" }, ul4._ismonthdelta), + istemplate: ul4.expose(["obj"], { name: "istemplate" }, ul4._istemplate), + isfunction: ul4.expose(["obj"], { name: "isfunction" }, ul4._isfunction), + islist: ul4.expose(["obj"], { name: "islist" }, ul4._islist), + isset: ul4.expose(["obj"], { name: "isset" }, ul4on._haveset ? ul4._isset : ul4._isul4set), + isdict: ul4.expose(["obj"], { name: "isdict" }, ul4._isdict), + isexception: ul4.expose(["obj"], { name: "isexception" }, ul4._isexception), + asjson: ul4.expose(["obj"], { name: "asjson" }, ul4._asjson), + fromjson: ul4.expose(["string"], { name: "fromjson" }, ul4._fromjson), + asul4on: ul4.expose(["obj"], { name: "asul4on" }, ul4._asul4on), + fromul4on: ul4.expose(["string"], { name: "fromul4on" }, ul4._fromul4on), + now: ul4.expose([], ul4.now), + utcnow: ul4.expose([], ul4.utcnow), + enumerate: ul4.expose(["iterable", "start=", 0], { name: "enumerate" }, ul4._enumerate), + isfirst: ul4.expose(["iterable"], { name: "isfirst" }, ul4._isfirst), + islast: ul4.expose(["iterable"], { name: "islast" }, ul4._islast), + isfirstlast: ul4.expose(["iterable"], { name: "isfirstlast" }, ul4._isfirstlast), + enumfl: ul4.expose(["iterable", "start=", 0], { name: "enumfl" }, ul4._enumfl), + abs: ul4.expose(["number"], { name: "abs" }, ul4._abs), + date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], { name: "date" }, ul4._date), + timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], { name: "timedelta" }, ul4._timedelta), + monthdelta: ul4.expose(["months=", 0], { name: "monthdelta" }, ul4._monthdelta), + rgb: ul4.expose(["r", "g", "b", "a=", 1.0], { name: "rgb" }, ul4._rgb), + hls: ul4.expose(["h", "l", "s", "a=", 1.0], { name: "hls" }, ul4._hls), + hsv: ul4.expose(["h", "s", "v", "a=", 1.0], { name: "hsv" }, ul4._hsv), + xmlescape: ul4.expose(["obj"], { name: "xmlescape" }, ul4._xmlescape), + csv: ul4.expose(["obj"], { name: "csv" }, ul4._csv), + chr: ul4.expose(["i"], { name: "chr" }, ul4._chr), + ord: ul4.expose(["c"], { name: "ord" }, ul4._ord), + hex: ul4.expose(["number"], { name: "hex" }, ul4._hex), + oct: ul4.expose(["number"], { name: "oct" }, ul4._oct), + bin: ul4.expose(["number"], { name: "bin" }, ul4._bin), + min: ul4.expose(["*obj"], { name: "min" }, ul4._min), + max: ul4.expose(["*obj"], { name: "max" }, ul4._max), + sum: ul4.expose(["iterable", "start=", 0], { name: "sum" }, ul4._sum), + first: ul4.expose(["iterable", "default=", null], { name: "first" }, ul4._first), + last: ul4.expose(["iterable", "default=", null], { name: "last" }, ul4._last), + sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], { name: "sorted", needscontext: true }, ul4._sorted), + range: ul4.expose(["*args"], { name: "range" }, ul4._range), + slice: ul4.expose(["*args"], { name: "slice" }, ul4._slice), + urlquote: ul4.expose(["string"], { name: "urlquote" }, ul4._urlquote), + urlunquote: ul4.expose(["string"], { name: "urlunquote" }, ul4._urlunquote), + reversed: ul4.expose(["sequence"], { name: "reversed" }, ul4._reversed), + random: ul4.expose([], { name: "random" }, ul4._random), + randrange: ul4.expose(["*args"], { name: "randrange" }, ul4._randrange), + randchoice: ul4.expose(["sequence"], { name: "randchoice" }, ul4._randchoice), + round: ul4.expose(["x", "digit=", 0], { name: "round" }, ul4._round), + md5: ul4.expose(["string"], { name: "md5" }, ul4._md5) +}; + +// Functions implementing UL4 methods +ul4._replace = function _replace(string, old, new_, count) { + if (count === null) + count = string.length; + + var result = []; + while (string.length) { + var pos = string.indexOf(old); + if (pos === -1 || !count--) { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + result.push(new_); + string = string.substr(pos + old.length); + } + return result.join(""); +}; + +ul4._strip = function _strip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("strip()", "strip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + while (string && chars.indexOf(string[string.length - 1]) >= 0) + string = string.substr(0, string.length - 1); + return string; +}; + +ul4._lstrip = function _lstrip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + return string; +}; + +ul4._rstrip = function _rstrip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); + + while (string && chars.indexOf(string[string.length - 1]) >= 0) + string = string.substr(0, string.length - 1); + return string; +}; + +ul4._split = function _split(string, sep, count) { + if (sep !== null && typeof (sep) !== "string") + throw ul4.TypeError.create("split()", "split() requires a string"); + + if (count === null) { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length - 1].length) + result.splice(-1); + } + return result; + } + else { + if (sep !== null) { + var result = []; + while (string.length) { + var pos = string.indexOf(sep); + if (pos === -1 || !count--) { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + string = string.substr(pos + sep.length); + } + return result; + } + else { + var result = []; + while (string.length) { + string = ul4._lstrip(string, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + part = string.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + string = string.substr(part.length); + } + return result; + } + } +}; + +ul4._rsplit = function _rsplit(string, sep, count) { + if (sep !== null && typeof (sep) !== "string") + throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + + if (count === null) { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length - 1].length) + result.splice(-1); + } + return result; + } + else { + if (sep !== null) { + var result = []; + while (string.length) { + var pos = string.lastIndexOf(sep); + if (pos === -1 || !count--) { + result.unshift(string); + break; + } + result.unshift(string.substr(pos + sep.length)); + string = string.substr(0, pos); + } + return result; + } + else { + var result = []; + while (string.length) { + string = ul4._rstrip(string, null, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else { + part = string.split(/[ \n\r\t]+/); + part = part[part.length - 1]; + } + if (part.length) + result.unshift(part); + string = string.substr(0, string.length - part.length); + } + return result; + } + } +}; + +ul4._splitlines = function _splitlines(string, keepends) { + var lookingAtLineEnd = function lookingAtLineEnd() { + var c = string[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') { + if (pos == length - 1) + return 1; + if (string[pos + 1] === '\n') + return 2; + return 1; + } + return 0; + }; + + var result = [], length = string.length; + + for (var pos = 0, startpos = 0; ;) { + if (pos >= length) { + if (startpos != pos) + result.push(string.substring(startpos)); + return result; + } + var lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else { + var endpos = pos + (keepends ? lineendlen : 0); + result.push(string.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } +}; + +ul4._count = function _count(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + var isstr = ul4._isstr(obj); + + if (isstr && !sub.length) { + if (end < 0 || start > obj.length || start > end) + return 0; + var result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } + + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + var count = 0; + if (ul4._islist(obj)) { + for (var i = start; i < end; ++i) { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + var lastIndex = start; + + for (; ;) { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; + ++count; + lastIndex += sub.length; + } + return count; + } +}; + +ul4._find = function _find(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) { + if (typeof (obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.indexOf(sub); + if (result !== -1) + result += start; + return result; +}; + +ul4._rfind = function _rfind(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) { + if (typeof (obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; + return result; +}; + +ul4._capitalize = function _capitalize(obj) { + if (typeof (obj) != "string") + throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); + + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; +}; + +ul4._items = function _items(obj) { + if (ul4._ismap(obj)) { + var result = []; + obj.forEach(function (value, key) { + result.push([key, value]); + }); + return result; + } + else if (ul4._isobject(obj)) { + var result = []; + for (var key in obj) + result.push([key, obj[key]]); + return result; + } + throw ul4.TypeError.create("items()", "items() requires a dict"); +}; + +ul4._values = function _values(obj) { + if (ul4._ismap(obj)) { + var result = []; + obj.forEach(function (value, key) { + result.push(value); + }); + return result; + } + else if (ul4._isobject(obj)) { + var result = []; + for (var key in obj) + result.push(obj[key]); + return result; + } + throw ul4.TypeError.create("values()", "values() requires a dict"); +}; + +ul4._join = function _join(sep, iterable) { + var resultlist = []; + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(sep); +}; + +ul4._startswith = function _startswith(string, prefix) { + if (typeof (prefix) !== "string") + throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); + + return string.substr(0, prefix.length) === prefix; +}; + +ul4._endswith = function _endswith(string, suffix) { + if (typeof (suffix) !== "string") + throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); + + return string.substr(string.length - suffix.length) === suffix; +}; + +ul4._isoformat = function _isoformat(obj) { + if (!ul4._isdate(obj)) + throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); + + var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth() + 1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + if (hour || minute || second || ms) { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; +}; + +ul4._mimeformat = function _mimeformat(obj) { + var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; +}; + +ul4._weekday = function _weekday(obj) { + var d = obj.getDay(); + return d ? d - 1 : 6; +}; + +ul4._week = function _week(obj, firstweekday) { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; + + var yearday = ul4._yearday(obj) + 6; + var jan1 = new Date(obj.getFullYear(), 0, 1); + var jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; + + while (jan1weekday != firstweekday) { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; + } + return Math.floor(yearday / 7); +}; + +ul4._isleap = function _isleap(obj) { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; +}; + +ul4._yearday = function _yearday(obj) { + var leap = ul4._isleap(obj) ? 1 : 0; + var day = obj.getDate(); + switch (obj.getMonth()) { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; + } +}; + +ul4._append = function _append(obj, items) { + for (var i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; +}; + +ul4._insert = function _insert(obj, pos, items) { + if (pos < 0) + pos += obj.length; + + for (var i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; +}; + +ul4._pop = function _pop(obj, pos) { + if (pos < 0) + pos += obj.length; + + var result = obj[pos]; + obj.splice(pos, 1); + return result; +}; + +ul4._update = function _update(obj, others, kwargs) { + if (!ul4._isdict(obj)) + throw ul4.TypeError.create("update()", "update() requires a dict"); + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + if (ul4._ismap(other)) { + other.forEach(function (value, key) { + ul4on._setmap(obj, key, value); + }); + } + else if (ul4._isobject(other)) { + for (var key in other) + ul4on._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) { + for (var j = 0; j < other.length; ++j) { + if (!ul4._islist(other[j]) || (other[j].length != 2)) + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + ul4on._setmap(obj, other[j][0], other[j][1]); + } + } + else + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + } + for (var key in kwargs) + ul4on._setmap(obj, key, kwargs[key]); + return null; +}; + +ul4._clear = function _clear(obj) { + if (ul4._ismap(obj)) + obj.clear(); + else if (ul4._isset(obj)) + obj.clear(); + else if (ul4._isobject(obj)) { + for (var key in obj) + delete obj[key]; + } + else + throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); + return null; +}; + +ul4.Color = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Color", + + create: function create(r, g, b, a) { + var c = ul4._clone(this); + c._r = typeof (r) !== "undefined" ? r : 0; + c._g = typeof (g) !== "undefined" ? g : 0; + c._b = typeof (b) !== "undefined" ? b : 0; + c._a = typeof (a) !== "undefined" ? a : 255; + return c; + }, + + __repr__: function __repr__() { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) + return "#" + r[0] + g[0] + b[0] + a[0]; + else + return "#" + r + g + b + a; + } + else { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __str__: function __str__() { + if (this._a !== 0xff) { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a / 255) + ")"; + } + else { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __iter__: function __iter__() { + return { + obj: this, + index: 0, + next: function () { + if (this.index == 0) { + ++this.index; + return { value: this.obj._r, done: false }; + } + else if (this.index == 1) { + ++this.index; + return { value: this.obj._g, done: false }; + } + else if (this.index == 2) { + ++this.index; + return { value: this.obj._b, done: false }; + } + else if (this.index == 3) { + ++this.index; + return { value: this.obj._a, done: false }; + } + else + return { done: true }; + } + }; + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "r": + return ul4.expose([], function r() { return self._r; }); + case "g": + return ul4.expose([], function g() { return self._g; }); + case "b": + return ul4.expose([], function b() { return self._b; }); + case "a": + return ul4.expose([], function a() { return self._a; }); + case "lum": + return ul4.expose([], function lum() { return self.lum(); }); + case "hls": + return ul4.expose([], function hls() { return self.hls(); }); + case "hlsa": + return ul4.expose([], function hlsa() { return self.hlsa(); }); + case "hsv": + return ul4.expose([], function hsv() { return self.hsv(); }); + case "hsva": + return ul4.expose([], function hsva() { return self.hsva(); }); + case "witha": + return ul4.expose(["a"], function witha(a) { return self.witha(a); }); + case "withlum": + return ul4.expose(["lum"], function withlum(lum) { return self.withlum(lum); }); + case "abslum": + return ul4.expose(["lum"], function abslum(lum) { return self.abslum(lum); }); + case "rellum": + return ul4.expose(["lum"], function rellum(lum) { return self.rellum(lum); }); + default: + return undefined; + } + }, + + __getitem__: function __getitem__(key) { + var orgkey = key; + if (key < 0) + key += 4; + switch (key) { + case 0: + return this._r; + case 1: + return this._g; + case 2: + return this._b; + case 3: + return this._a; + default: + return undefined; + } + }, + + __eq__: function __eq__(other) { + if (ul4._iscolor(other)) + return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; + return false; + }, + + r: ul4.expose([], function r() { return this._r; }), + + g: ul4.expose([], function g() { return this._g; }), + + b: ul4.expose([], function b() { return this._b; }), + + a: ul4.expose([], function a() { return this._a; }), + + lum: ul4.expose([], function lum() { return this.hls()[1]; }), + + hls: ul4.expose([], + function hls() { + var r = this._r / 255.0; + var g = this._g / 255.0; + var b = this._b / 255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var h, l, s; + var rc, gc, bc; + + l = (minc + maxc) / 2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc - minc) / (maxc + minc); + else + s = (maxc - minc) / (2.0 - maxc - minc); + rc = (maxc - r) / (maxc - minc); + gc = (maxc - g) / (maxc - minc); + bc = (maxc - b) / (maxc - minc); + if (r == maxc) + h = bc - gc; + else if (g == maxc) + h = 2.0 + rc - bc; + else + h = 4.0 + gc - rc; + h = (h / 6.0) % 1.0; + return [h, l, s]; + } + ), + + hlsa: ul4.expose([], + function hlsa() { + var hls = this.hls(); + return hls.concat(this._a / 255.0); + } + ), + + hsv: ul4.expose([], + function hsv() { + var r = this._r / 255.0; + var g = this._g / 255.0; + var b = this._b / 255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + var s = (maxc - minc) / maxc; + var rc = (maxc - r) / (maxc - minc); + var gc = (maxc - g) / (maxc - minc); + var bc = (maxc - b) / (maxc - minc); + var h; + if (r == maxc) + h = bc - gc; + else if (g == maxc) + h = 2.0 + rc - bc; + else + h = 4.0 + gc - rc; + h = (h / 6.0) % 1.0; + return [h, s, v]; + } + ), + + hsva: ul4.expose([], + function hsva() { + var hsv = this.hsv(); + return hsv.concat(this._a / 255.0); + } + ), + + witha: ul4.expose(["a"], + function witha(a) { + if (typeof (a) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + return ul4.Color.create(this._r, this._g, this._b, a); + } + ), + + withlum: ul4.expose(["lum"], + function withlum(lum) { + if (typeof (lum) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + var hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + ) + } +); + +ul4.TimeDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.TimeDelta", + + create: function create(days, seconds, microseconds) { + var td = ul4._clone(this); + if (typeof (days) === "undefined") + days = 0; + if (typeof (seconds) === "undefined") + seconds = 0; + if (typeof (microseconds) === "undefined") + microseconds = 0; + + var total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds); + + microseconds = ul4.ModAST._do(total_microseconds, 1000000); + var total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST._do(total_seconds, 86400); + days = Math.floor(total_seconds / 86400); + if (seconds < 0) { + seconds += 86400; + --days; + } + + td._microseconds = microseconds; + td._seconds = seconds; + td._days = days; + + return td; + }, + + __repr__: function __repr__() { + if (!this._microseconds) { + if (!this._seconds) { + if (!this._days) + return "timedelta()"; + return "timedelta(" + this._days + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; + }, + + __str__: function __str__() { + var v = []; + if (this._days) { + v.push(this._days + " day"); + if (this._days !== -1 && this._days !== 1) + v.push("s"); + v.push(", "); + } + var seconds = this._seconds % 60; + var minutes = Math.floor(this._seconds / 60); + var hours = Math.floor(minutes / 60); + minutes = minutes % 60; + + v.push("" + hours); + v.push(":"); + v.push(ul4._lpad(minutes.toString(), "0", 2)); + v.push(":"); + v.push(ul4._lpad(seconds.toString(), "0", 2)); + if (this._microseconds) { + v.push("."); + v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); + } + return v.join(""); + }, + + __bool__: function __bool__() { + return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; + }, + + __abs__: function __abs__() { + return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; + }, + + __eq__: function __eq__(other) { + if (ul4._istimedelta(other)) + return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); + return false; + }, + + __lt__: function __lt__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds < other._microseconds; + } + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds <= other._microseconds; + } + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds > other._microseconds; + } + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds >= other._microseconds; + } + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() { + return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); + }, + + _add: function _add(date, days, seconds, microseconds) { + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate() + days; + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds() + seconds; + var millisecond = date.getMilliseconds() + microseconds / 1000; + return new Date(year, month, day, hour, minute, second, millisecond); + }, + + __add__: function __add__(other) { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + else if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __radd__: function __radd__(other) { + if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __sub__: function __sub__(other) { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __rsub__: function __rsub__(other) { + if (ul4._isdate(other)) + return this._add(other, -this._days, -this._seconds, -this._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __mul__: function __mul__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __rmul__: function __rmul__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __truediv__: function __truediv__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (ul4._istimedelta(other)) { + var myValue = this._days; + var otherValue = other._days; + var hasSeconds = this._seconds || other._seconds; + var hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) { + myValue = myValue * 86400 + this._seconds; + otherValue = otherValue * 86400 + other._seconds; + if (hasMicroseconds) { + myValue = myValue * 1000000 + this._microseconds; + otherValue = otherValue * 1000000 + other._microseconds; + } + } + return myValue / otherValue; + } + throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "days": + return ul4.expose([], function days() { return self._days; }); + case "seconds": + return ul4.expose([], function seconds() { return self._seconds; }); + case "microseconds": + return ul4.expose([], function microseconds() { return self._microseconds; }); + default: + return undefined; + } + }, + + days: function days() { + return this._days; + }, + + seconds: function seconds() { + return this._seconds; + }, + + microseconds: function microseconds() { + return this._microseconds; + } + } +); + +ul4.MonthDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.MonthDelta", + + create: function create(months) { + var md = ul4._clone(this); + md._months = typeof (months) !== "undefined" ? months : 0; + return md; + }, + + __repr__: function __repr__() { + if (!this._months) + return "monthdelta()"; + return "monthdelta(" + this._months + ")"; + }, + + __str__: function __str__() { + if (this._months) { + if (this._months !== -1 && this._months !== 1) + return this._months + " months"; + return this._months + " month"; + } + return "0 months"; + }, + + __bool__: function __bool__() { + return this._months !== 0; + }, + + __abs__: function __abs__() { + return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; + }, + + __eq__: function __eq__(other) { + if (ul4._ismonthdelta(other)) + return this._months === other._months; + return false; + }, + + __lt__: function __lt__(other) { + if (ul4._ismonthdelta(other)) + return this._months < other._months; + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) { + if (ul4._ismonthdelta(other)) + return this._months <= other._months; + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) { + if (ul4._ismonthdelta(other)) + return this._months > other._months; + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) { + if (ul4._ismonthdelta(other)) + return this._months >= other._months; + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() { + return ul4.MonthDelta.create(-this._months); + }, + + _add: function _add(date, months) { + var year = date.getFullYear(); + var month = date.getMonth() + months; + var day = date.getDate(); + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds(); + var millisecond = date.getMilliseconds(); + + while (true) { + // As the month might be out of bounds, we have to find out, what the real target month is + var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + var result = new Date(year, month, day, hour, minute, second, millisecond); + if (result.getMonth() === targetmonth) + return result; + --day; + } + }, + + __add__: function __add__(other) { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months + other._months); + else if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __radd__: function __radd__(other) { + if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __sub__: function __sub__(other) { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months - other._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __rsub__: function __rsub__(other) { + if (ul4._isdate(other)) + return this._add(other, -this._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __mul__: function __mul__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __rmul__: function __rmul__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __floordiv__: function __floordiv__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(Math.floor(this._months / other)); + else if (ul4._ismonthdelta(other)) + return Math.floor(this._months / other._months); + throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; + }, + + __truediv__: function __truediv__(other) { + if (ul4._ismonthdelta(other)) + return this._months / other._months; + throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "months": + return ul4.expose([], function months() { return self._months; }); + default: + return undefined; + } + }, + + months: function months() { + return this._months; + } + } +); + +// When we don't have a real ``Set`` type, emulate one that supports strings +ul4._Set = ul4._inherit( + ul4.Proto, + { + __type__: "ul4._Set", + + create: function create() { + var set = ul4._clone(this); + set.items = {}; + set.add.apply(set, arguments); + return set; + }, + + add: function add() { + for (var i = 0; i < arguments.length; ++i) { + this.items[arguments[i]] = true; + } + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "add": + return ul4.expose(["*items"], function add(items) { self.add.apply(self, items); }); + default: + return undefined; + } + }, + + __contains__: function __contains__(item) { + return this.items[item] || false; + }, + + __bool__: function __bool__() { + for (var item in this.items) { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + }, + + __repr__: function __repr__() { + var v = []; + v.push("{"); + var i = 0; + for (var item in this.items) { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + }, + + __eq__: function (other) { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) { + var count = 0; + for (var item in this.items) { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in this.items) { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Substract the number of items that ``other`` has + for (var item in other.items) + --count; + return count == 0; + } + else + return false; + }, + + __le__: function (other) { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) { + var count = 0; + for (var item in this.items) { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in this.items) { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + }, + + __ge__: function (other) { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) { + var result = true; + other.forEach(function (value) { + if (!this.items[value]) + result = false; + }); + return result; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in other.items) { + if (!this.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + } +); + +var classes = [ + "TextAST", + "IndentAST", + "LineEndAST", + "Tag", + "ConstAST", + "SeqItemAST", + "UnpackSeqItemAST", + "DictItemAST", + "UnpackDictItemAST", + "PosArgAST", + "KeywordArgAST", + "UnpackListArgAST", + "UnpackDictArgAST", + "ListAST", + "ListCompAST", + "DictAST", + "DictCompAST", + "SetAST", + "SetCompAST", + "GenExprAST", + "VarAST", + "NotAST", + "NegAST", + "BitNotAST", + "IfAST", + "ReturnAST", + "PrintAST", + "PrintXAST", + "ItemAST", + "IsAST", + "IsNotAST", + "EQAST", + "NEAST", + "LTAST", + "LEAST", + "GTAST", + "GEAST", + "NotContainsAST", + "ContainsAST", + "AddAST", + "SubAST", + "MulAST", + "FloorDivAST", + "TrueDivAST", + "ModAST", + "ShiftLeftAST", + "ShiftRightAST", + "BitAndAST", + "BitXOrAST", + "BitOrAST", + "AndAST", + "OrAST", + "SliceAST", + "AttrAST", + "CallAST", + "RenderAST", + "SetVarAST", + "AddVarAST", + "SubVarAST", + "MulVarAST", + "TrueDivVarAST", + "FloorDivVarAST", + "ModVarAST", + "ShiftLeftVarAST", + "ShiftRightVarAST", + "BitAndVarAST", + "BitXOrVarAST", + "BitOrVarAST", + "ForBlockAST", + "WhileBlockAST", + "BreakAST", + "ContinueAST", + "CondBlockAST", + "IfBlockAST", + "ElIfBlockAST", + "ElseBlockAST", + "SignatureAST", + "Template" +]; + +for (var i = 0; i < classes.length; ++i) { + var name = classes[i]; + var ul4onname = name; + if (ul4onname.substr(ul4onname.length - 3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length - 3); + ul4onname = ul4onname.toLowerCase(); + var object = ul4[name]; + object.typename = name; + object.type = ul4onname; + ul4on.register("de.livinglogic.ul4." + ul4onname, object); +} diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index e040384..7af52d2 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -1,174 +1,2 @@ -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "axios"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const axios_1 = __importDefault(require("axios")); - let commonjs = (typeof module === 'object' && module.exports); - let nodejs = {}; - let ul4on; - let livingApi; - if (commonjs) { - livingApi = require('./modules/livingapi'); - nodejs.https = require('https'); - ul4on = require('./modules/ul4').ul4on; - } - else { - ul4on = window.ul4on; - livingApi = window.livingapi; - } - class LivingSDK { - constructor(options = {}, username, password) { - this._password = password || ''; - this._userName = username || ''; - this._options = { - url: options.url || 'https://my.living-apps.de', - loginRequired: options.loginRequired !== undefined ? options.loginRequired : true - }; - this._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`; - this.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1); - if (this._options.loginRequired && !this._userName) { - throw new Error('[LivingSDK] You want to login without a username'); - } - this.session = this.login(); - } - login() { - if (!this._options.loginRequired) { - return Promise.resolve(undefined); - } - let url = `https://${this.hostName}/gateway/login`; - return axios_1.default.post(url, { - username: this._userName, - password: this._password - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - "Content-Type": "application/json" - } - }) - .then((a) => a.data.auth_token); - } - get(appId, templateName) { - return this.session.then((auth_token) => { - return axios_1.default.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - Accept: 'application/la-ul4on' - } - }) - .then((res) => { - let dump; - dump = ul4on.loads(res.data); - dump.get('globals').Login = this; - return dump; - }); - }); - } - _insert(app, values) { - return this.session.then((auth_token) => { - let fields = {}; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`insert() got an unexpected keyword argument ${ident}`); - } - fields[ident] = app.controls.get(ident).asjson(values[ident]); - } - let data = {}; - { - } - data.id = app.id; - data.data = [{ 'fields': fields }]; - return axios_1.default.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - } - }) - .then((res) => { - return { - HTTPstatusCode: res.status, - recordid: res.data.id, - Record: livingApi.Record.create({ - id: res.data.id, - createdat: new Date(Date.now()), - updatedat: null, - updatedby: null, - updatecount: 0 - }) - }; - }); - }); - } - _update(record, values) { - return this.session.then((auth_token) => { - let fields = {}; - let app = record.app; - for (let ident in values) { - if (!app.controls.has(ident)) { - throw new Error(`update() got an unexpected keyword argument ${ident}`); - } - fields[ident] = values[ident]; - } - let data = {}; - data.id = app.id; - data.data = [{ 'id': record.id, 'fields': fields }]; - console.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`); - return axios_1.default.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { - appdd: data - }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - 'Content-Type': 'application/json' - } - }) - .then((res) => { - let body = res.data; - for (let ident in values) - record.fields.get(ident).value = values[ident]; - let returnObj = { - HTTPstatusCode: res.status, - recordid: body.id, - Record: record - }; - return returnObj; - }); - }); - } - _delete(record) { - let app = record.app; - return this.session.then((auth_token) => { - return axios_1.default.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ - ecdhCurve: 'auto' - }) : undefined, - headers: { - 'X-La-Auth-Token': auth_token !== undefined ? auth_token : '', - } - }); - }); - } - } - exports.LivingSDK = LivingSDK; - exports.default = LivingSDK; -}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("axios")):"function"==typeof define&&define.amd?define(["exports","axios"],t):t(e.livingsdk={},e.axios)}(this,function(e,u){"use strict";function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){for(var r=0;r=this.data.length)throw"UL4 decoder at EOF";return this.data.charAt(this.pos++)},readcharoreof:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)},readblackchar:function(){for(var e=/\s/;;){if(this.pos>=this.data.length)throw"UL4 decoder at EOF";var t=this.data.charAt(this.pos++);if(!t.match(e))return t}},read:function(e){this.pos+e>this.length&&(e=this.length-this.pos);var t=this.data.substring(this.pos,this.pos+e);return this.pos+=e,t},backup:function(){--this.pos},readnumber:function(){for(var e=/[-+0123456789.eE]/,t="";;){var r=this.readcharoreof();if(null===r||!r.match(e)){var n=parseFloat(t);if(NaN==n)throw"invalid number, got "+m._repr("value")+" at position "+this.pos;return n}t+=r}},_beginfakeloading:function(){var e=this.backrefs.length;return this.backrefs.push(null),e},_endfakeloading:function(e,t){this.backrefs[e]=t},_readescape:function(e,t){var r=this.read(t);if(r.length!=t)throw"broken escape "+m._repr("\\"+e+r)+" at position "+this.pos;var n=parseInt(r,16);if(isNaN(n))throw"broken escape "+m._repr("\\"+e+r)+" at position "+this.pos;return String.fromCharCode(n)},load:function(){var e,t=this.readblackchar();switch(t){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===t&&this.backrefs.push(null),null;case"b":case"B":if("T"===(e=this.readchar()))e=!0;else{if("F"!==e)throw"wrong value for boolean, expected 'T' or 'F', got "+m._repr(e)+" at position "+this.pos;e=!1}return"B"===t&&this.backrefs.push(e),e;case"i":case"I":case"f":case"F":return e=this.readnumber(),"I"!==t&&"F"!==t||this.backrefs.push(e),e;case"s":case"S":e=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var i=this.readchar();"\\"==i?e.push("\\"):"n"==i?e.push("\n"):"r"==i?e.push("\r"):"t"==i?e.push("\t"):"f"==i?e.push("\f"):"b"==i?e.push("\b"):"a"==i?e.push(""):"'"==i?e.push("'"):'"'==i?e.push('"'):"x"==i?e.push(this._readescape("x",2)):"u"==i?e.push(this._readescape("u",4)):"U"==i?e.push(this._readescape("U",8)):e.push("\\"+i)}else e.push(n)}return e=e.join(""),"S"===t&&this.backrefs.push(e),e;case"c":case"C":return e=m.Color.create(),"C"===t&&this.backrefs.push(e),e._r=this.load(),e._g=this.load(),e._b=this.load(),e._a=this.load(),e;case"z":case"Z":return(e=new Date).setFullYear(this.load()),e.setDate(1),e.setMonth(this.load()-1),e.setDate(this.load()),e.setHours(this.load()),e.setMinutes(this.load()),e.setSeconds(this.load()),e.setMilliseconds(this.load()/1e3),"Z"===t&&this.backrefs.push(e),e;case"t":case"T":return(e=m.TimeDelta.create())._days=this.load(),e._seconds=this.load(),e._microseconds=this.load(),"T"===t&&this.backrefs.push(e),e;case"r":case"R":return e=m.slice.create(),"R"===t&&this.backrefs.push(e),e.start=this.load(),e.stop=this.load(),e;case"m":case"M":return e=m.MonthDelta.create(),"M"===t&&this.backrefs.push(e),e._months=this.load(),e;case"l":case"L":for(e=[],"L"===t&&this.backrefs.push(e);;){if("]"===(t=this.readblackchar()))return e;this.backup(),e.push(this.load())}return e;case"d":case"D":case"e":case"E":if(!_._havemap&&("e"==t||"E"==t))throw"ordered dictionaries are not supported!";for(e=_._emptymap(),"D"!==t&&"E"!==t||this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup();var o=this.load(),a=this.load();_._setmap(e,o,a)}return e;case"y":case"Y":for(e=_._makeset(),"Y"===t&&this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup(),e.add(this.load())}return e;case"o":case"O":var s;"O"===t&&(s=this._beginfakeloading());var u,l=this.load();if(null!==this.registry?void 0===(u=this.registry[l])&&(u=_._registry[l]):u=_._registry[l],void 0===u)throw"can't load object of type "+m._repr(l);if(e=u(),"O"===t&&this._endfakeloading(s,e),e.ul4onload(this),")"!==(t=this.readblackchar()))throw"object terminator ')' for object of type '"+l+"' expected, got "+m._repr(t)+" at position "+this.pos;return e;default:throw"unknown typecode "+m._repr(t)+" at position "+this.pos}},loadcontent:function(e){var t=this;return{next:function(){var e=t.readblackchar();return t.backup(),")"==e?{done:!0}:{done:!1,value:t.load()}}}}},m._rvalidchars=/^[\],:{}\s]*$/,m._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,m._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,m._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,m._simpleclone=function(e){function t(){}return t.prototype=e,new t},m._clone=function(e){var t=m._simpleclone(e);return t.__prototype__=e,t.__id__=m.Proto._nextid++,t},m._extend=function(e,t){for(var r in t)e[r]=t[r];return e},m._simpleinherit=function(e,t){return m._extend(m._simpleclone(e),t)},m._inherit=function(e,t){return m._extend(m._clone(e),t)},m._map2object=function(e){if(m._ismap(e)){var r={};return e.forEach(function(e,t){if("string"!=typeof t)throw m.TypeError.create("keys must be strings");r[t]=e}),r}return e},m._bound=function(e,t){return e<0?0:t=r.length)return 1;var s=m._cmp(e,t[a],r[a]);if(s)return s}return r.length>t.length?-1:0}}else{if(m._isset(t)||m._isul4set(t)){var u=!1,l=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(u=!0)}),r.forEach(function(e){t.has(e)||(l=!0)});else if(m._isul4set(r))for(var _ in t.forEach(function(e){r.items[e]||(u=!0)}),r.items)if(!t.has(_)){l=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var _ in t.items)if(!r.has(_)){u=!0;break}r.forEach(function(e){t.items[e]||(l=!0)})}else if(m._isul4set(r)){for(var _ in t.items)if(!r.items[_]){u=!0;break}for(var _ in r.items)if(!t.items[_]){l=!0;break}}}else m._unorderable(e,t,r);return u?l?null:1:l?-1:0}m._unorderable(e,t,r)}},m._lt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return t=r.length)return!1;if(!m._eq(t[n],r[n]))return m._lt(t[n],r[n])}return t.length=r.length)return!1;if(!m._eq(t[n],r[n]))return m._lt(t[n],r[n])}return t.length<=r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable("<=",t,r)},m._gt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__gt__)return t.__gt__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return rr.getTime()}else if(m._islist(t)){if(m._islist(r)){if(t===r)return!1;for(var n=0;n=r.length)return!0;if(!m._eq(t[n],r[n]))return m._gt(t[n],r[n])}return t.length>r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable(">",t,r)},m._ge=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__ge__)return t.__ge__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return r<=t}else if("string"==typeof t){if("string"==typeof r)return r<=t}else if(m._isdate(t)){if(m._isdate(r))return t.getTime()>=r.getTime()}else if(m._islist(t)){if(m._islist(r)){if(t===r)return!0;for(var n=0;n=r.length)return!0;if(!m._eq(t[n],r[n]))return m._gt(t[n],r[n])}return t.length>=r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable(">=",t,r)},m._iter=function(e){if("string"==typeof e||m._islist(e))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(m._isset(e)){var n=[];return e.forEach(function(e,t){n.push(e)}),{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}if(m._isul4set(e))return m._iter(e.items);if(m._isobject(e)){r=[];for(var t in e)r.push(t);return{index:0,next:function(){return this.index>=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}throw m.TypeError.create("iter",m._type(e)+" object is not iterable")},m._str_repr=function(e,t){for(var r="",n=!1,i=!1,o=0;o":"":m._isdate(e)?m._date_repr(e,t):void 0===e?"":"object"===c(e)&&"function"==typeof e.__repr__?e.__repr__():m._islist(e)?m._list_repr(e,t):m._ismap(e)?m._map_repr(e,t):m._isset(e)?m._set_repr(e,t):m._isobject(e)?m._object_repr(e,t):"?"},m._repr=function(e){return m._repr_internal(e,!1)},m._ascii=function(e){return m._repr_internal(e,!0)},m._date_str=function(e){var t=e.getFullYear(),r=e.getMonth()+1,n=e.getDate(),i=e.getHours(),o=e.getMinutes(),a=e.getSeconds(),s=e.getMilliseconds(),u=t+"-"+m._lpad(r.toString(),"0",2)+"-"+m._lpad(n.toString(),"0",2)+" "+m._lpad(i.toString(),"0",2)+":"+m._lpad(o.toString(),"0",2)+":"+m._lpad(a.toString(),"0",2);return s&&(u+="."+m._lpad(s.toString(),"0",3)+"000"),u},m._str=function(e){return void 0===e?"":null===e?"":!1===e?"False":!0===e?"True":"string"==typeof e?e:"number"==typeof e?e.toString():m._isdate(e)?m._date_str(e):m._islist(e)?m._list_repr(e):m._isset(e)?m._set_repr(e):m._ismap(e)?m._map_repr(e):"object"===c(e)&&"function"==typeof e.__str__?e.__str__():"object"===c(e)&&"function"==typeof e.__repr__?e.__repr__():m._isobject(e)?m._object_repr(e):"?"},m._bool=function(e){if(null==e||!1===e||0===e||""===e)return!1;if(c(e),"function"==typeof e.__bool__)return e.__bool__();if(m._islist(e))return 0!==e.length;if(m._ismap(e)||m._isset(e))return 0!=e.size;if(m._isobject(e)){for(var t in e)if(e.hasOwnProperty(t))return!0;return!1}return!0},m._int=function(e,t){var r;if(null!==t){if("string"!=typeof e||!m._isint(t))throw m.TypeError.create("int()","int() requires a string and an integer");if("NaN"==(r=parseInt(e,t)).toString())throw m.TypeError.create("int()","invalid literal for int()");return r}if("string"==typeof e){if("NaN"==(r=parseInt(e)).toString())throw m.TypeError.create("int()","invalid literal for int()");return r}if("number"==typeof e)return Math.floor(e);if(!0===e)return 1;if(!1===e)return 0;throw m.TypeError.create("int()","int() argument must be a string or a number")},m._float=function(e){if("string"==typeof e)return parseFloat(e);if("number"==typeof e)return e;if(!0===e)return 1;if(!1===e)return 0;throw m.TypeError.create("float()","float() argument must be a string or a number")},m._list=function(e){for(var t=m._iter(e),r=[];;){var n=t.next();if(n.done)return r;r.push(n.value)}},m._set=function(e){for(var t=m._iter(e),r=_._haveset?new Set:m._Set.create();;){var n=t.next();if(n.done)return r;r.add(n.value)}},m._len=function(e){if("string"==typeof e||m._islist(e))return e.length;if(m._ismap(e)||m._isset(e))return e.size;if(m._isobject(e)){var t=0;for(var r in e)++t;return t}throw m.TypeError.create("len","object of type '"+m._type(e)+"' has no len()")},m._type=function(e){return null===e?"none":!1===e||!0===e?"bool":void 0===e?"undefined":"string"==typeof e?"str":"number"==typeof e?Math.round(e)==e?"int":"float":m._islist(e)?"list":m._isset(e)?"set":m._isdate(e)?"date":void 0!==e.__type__?e.__type__:m._istimedelta(e)?"timedelta":m._isdict(e)?"dict":m._istemplate(e)?"template":m._isfunction(e)?"function":null},m._any=function(e){if("string"==typeof e){for(var t=0;t=^]$/.test(n))throw m.ValueError.create("illegal integer format string "+m._repr(t));o=n[1],i=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw m.ValueError.create("illegal integer format string "+m._repr(t));o=n}var c,h=e<0;switch(h&&(e=-e),l){case"b":c=e.toString(2);break;case"c":if(h||65535"==o)c=m._str_repeat(i,u-c.length)+c;else{var f=u-c.length,p=Math.floor(f/2),d=f-p;c=m._str_repeat(i,p)+c+m._str_repeat(i,d)}return c},m._format=function(e,t,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return m._isdate(e)?m._format_date(e,t,r):m._isint(e)?m._format_int(e,t,r):!0===e?m._format_int(1,t,r):!1===e?m._format_int(0,t,r):void 0},m._lpad=function(e,t,r){for("number"==typeof e&&(e=e.toString());e.lengththis.args.length){var s=null===e?"expected":e+"() expects";throw m.ArgumentError.create(s+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+t.length+" given")}}else n.push(t.slice(this.args.length));if(null===this.remkwargs){for(var u in r)if(!this.argNames[u])throw null===e?m.ArgumentError.create("an argument named "+m._repr(u)+" isn't supported"):m.ArgumentError.create(e+"() doesn't support an argument named "+m._repr(u))}else{var l={};for(var u in r)this.argNames[u]||(l[u]=r[u]);n.push(l)}return n},bindObject:function(e,t,r){t=this.bindArray(e,t,r);var n,i={};for(n=0;n"},__str__:function(){return this.toString()},toString:function(){for(var e=[],t=0;t")}}),m.IndentAST=m._inherit(m.TextAST,{create:function(e,t,r){var n=m.TextAST.create.call(this,e,t);return n._maketext(r),n},_maketext:function(e){void 0!==this.template?this.text=null===e?this.template.source.substring(this.pos.start,this.pos.stop):e:this.text=null},_text:function(){return null===this.text?this.template.source.substring(this.pos.start,this.pos.stop):this.text},_eval:function(e){for(var t=0;t")}}),m.LineEndAST=m._inherit(m.TextAST,{_str:function(e){e.push("lineend "),e.push(m._repr(this._text()))},_repr:function(e){e.push("")}}),m.Tag=m._inherit(m.AST,{create:function(e,t,r,n){var i=m.AST.create.call(this,r);return i.template=e,i.tag=t,i.codepos=n,i._maketext(),i},_maketext:function(){void 0!==this.template?(this.text=this.template.source.substring(this.pos.start,this.pos.stop),this.code=this.template.source.substring(this.codepos.start,this.codepos.stop)):(this.text=null,this.code=null)},ul4ondump:function(e){m.AST.ul4ondump.call(this,e),e.dump(this.template),e.dump(this.tag),e.dump(this.codepos)},ul4onload:function(e){m.TextAST.ul4onload.call(this,e),this.template=e.load(),this.tag=e.load(),this.codepos=e.load(),this._maketext()}}),m.CodeAST=m._inherit(m.AST,{create:function(e,t){var r=m.AST.create.call(this,t);return r.tag=e,r},_ul4onattrs:m.AST._ul4onattrs.concat(["tag"]),_str:function(e){e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," "))}}),m.ConstAST=m._inherit(m.CodeAST,{create:function(e,t,r){var n=m.CodeAST.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval:function(e){return this.value}}),m.ItemArgBase=m._inherit(m.CodeAST,{_handle_eval_list:function(e,t){try{return this._eval_list(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_set:function(e,t){try{return this._eval_set(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_dict:function(e,t){try{return this._eval_dict(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_call:function(e,t,r){try{return this._eval_call(e,t,r)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}}}),m.SeqItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){var r=this.value._handle_eval(e);t.push(r)},_eval_set:function(e,t){var r=this.value._handle_eval(e);t.add(r)}}),m.UnpackSeqItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){for(var r=this.value._handle_eval(e),n=m._iter(r);;){var i=n.next();if(i.done)break;t.push(i.value)}},_eval_set:function(e,t){for(var r=this.value._handle_eval(e),n=m._iter(r);;){var i=n.next();if(i.done)break;t.add(i.value)}}}),m.DictItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r,n){var i=m.ItemArgBase.create.call(this,e,t);return i.key=r,i.value=n,i},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["key","value"]),_repr:function(e){e.push("")},_eval_dict:function(e,t){var r=this.key._handle_eval(e),n=this.value._handle_eval(e);_._setmap(t,r,n)}}),m.UnpackDictItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_dict:function(e,r){var t=this.item._handle_eval(e);if(m._islist(t))for(var n=0;n")},_eval_call:function(e,t,r){var n=this.value._handle_eval(e);t.push(n)}}),m.KeywordArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r,n){var i=m.ItemArgBase.create.call(this,e,t);return i.name=r,i.value=n,i},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["name","value"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){if(r.hasOwnProperty(this.name))throw m.ArgumentError.create("duplicate keyword argument "+this.name);var n=this.value._handle_eval(e);r[this.name]=n}}),m.UnpackListArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);t.push.apply(t,n)}}),m.UnpackDictArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);if(m._islist(n))for(var i=0;i")},_eval:function(e){for(var t=[],r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=[],i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){for(var t=_._emptymap(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=_._emptymap(),i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){for(var t=_._haveset?new Set:m._Set.create(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=_._haveset?new Set:m._Set.create(),i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){var t=this.container._handle_eval(e),n=m._iter(t),i=e.inheritvars(),o=this;return{next:function(){for(;;){var e=n.next();if(e.done)return e;for(var t=m._unpackvar(o.varname,e.value),r=0;r")},_eval:function(e){return this._get(e,this.name)},_eval_set:function(e,t){this._set(e,this.name,t)},_eval_modify:function(e,t,r){this._modify(e,t,this.name,r)},_get:function(e,t){var r=e.get(t);return void 0===r&&(r=m.functions[t]),r},_set:function(e,t,r){e.set(t,r)},_modify:function(e,t,r,n){var i=t._ido(e.get(r),n);e.set(r,i)}}),m.UnaryAST=m._inherit(m.CodeAST,{create:function(e,t,r){var n=m.CodeAST.create.call(this,e,t);return n.obj=r,n},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["obj"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" obj="),this.obj._repr(e),e.push(">")},_eval:function(e){var t=this.obj._handle_eval(e);return this._do(t)}}),m.NegAST=m._inherit(m.UnaryAST,{_do:function(e){return null!==e&&"function"==typeof e.__neg__?e.__neg__():-e}}),m.BitNotAST=m._inherit(m.UnaryAST,{_do:function(e){return-e-1}}),m.NotAST=m._inherit(m.UnaryAST,{_do:function(e){return!m._bool(e)}}),m.IfAST=m._inherit(m.CodeAST,{create:function(e,t,r,n,i){var o=m.CodeAST.create.call(this,e,t);return o.objif=r,o.objcond=n,o.objelse=i,o},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["objif","objcond","objelse"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(1),e.push("objif="),this.objif._repr(e),e.push(0),e.push("objcond="),this.objcond._repr(e),e.push(0),e.push("objelse="),this.objelse._repr(e),e.push(-1),e.push(">")},_eval:function(e){var t=this.objcond._handle_eval(e);return m._bool(t)?this.objif._handle_eval(e):this.objelse._handle_eval(e)}}),m.ReturnAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e);throw m.ReturnException.create(t)},_str:function(e){e.push("return "),this.obj._str(e)}}),m.PrintAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=m._str(t);e.output(r)},_str:function(e){e.push("print "),this.obj._str(e)}}),m.PrintXAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=m._xmlescape(t);e.output(r)},_str:function(e){e.push("printx "),this.obj._str(e)}}),m.BinaryAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.obj1=r,i.obj2=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["obj1","obj2"]),_repr:function(e){e.push("<"),e.push(this.type),e.push(" obj1="),this.obj1._repr(e),e.push(" obj2="),this.obj2._repr(e),e.push(">")},_eval:function(e){var t=this.obj1._handle_eval(e),r=this.obj2._handle_eval(e);return this._do(t,r)}}),m.ItemAST=m._inherit(m.BinaryAST,{_do:function(e,t){return this._get(e,t)},_eval_set:function(e,t){var r=this.obj1._handle_eval(e),n=this.obj2._handle_eval(e);this._set(r,n,t)},_eval_modify:function(e,t,r){var n=this.obj1._handle_eval(e),i=this.obj2._handle_eval(e);this._modify(t,n,i,r)},_get:function(e,t){if("string"==typeof e||m._islist(e)){if("object"===c(t)&&"function"==typeof t.isa&&t.isa(m.slice)){var r=t.start,n=t.stop;return null==r&&(r=0),null==n&&(n=e.length),e.slice(r,n)}return t<0&&(t+=e.length),e[t]}if(e&&"function"==typeof e.__getitem__)return e.__getitem__(t);if(m._ismap(e))return e.get(t);if("[object Object]"===Object.prototype.toString.call(e))return e[t];throw m.TypeError.create("[]",m._type(e)+" object is not subscriptable")},_set:function(e,t,r){if(m._islist(e))if("object"===c(t)&&"function"==typeof t.isa&&t.isa(m.slice)){var n=t.start,i=t.stop;null===n?n=0:n<0&&(n+=e.length),n<0?n=0:n>e.length&&(n=e.length),null===i?i=e.length:i<0&&(i+=e.length),i<0?i=0:i>e.length&&(i=e.length),i")},_eval:function(e){var t=this.obj._handle_eval(e);return this._get(t,this.attrname)},_eval_set:function(e,t){var r=this.obj._handle_eval(e);this._set(r,this.attrname,t)},_eval_modify:function(e,t,r){var n=this.obj._handle_eval(e);this._modify(t,n,this.attrname,r)},_get:function(n,e){if("string"==typeof n)switch(e){case"count":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._count(n,e,t,r)});case"find":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._find(n,e,t,r)});case"rfind":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._rfind(n,e,t,r)});case"replace":return m.expose(["old","new","count=",null],function(e,t,r){return m._replace(n,e,t,r)});case"strip":return m.expose(["chars=",null],function(e){return m._strip(n,e)});case"lstrip":return m.expose(["chars=",null],function(e){return m._lstrip(n,e)});case"rstrip":return m.expose(["chars=",null],function(e){return m._rstrip(n,e)});case"split":return m.expose(["sep=",null,"count=",null],function(e,t){return m._split(n,e,t)});case"rsplit":return m.expose(["sep=",null,"count=",null],function(e,t){return m._rsplit(n,e,t)});case"splitlines":return m.expose(["keepends=",!1],function(e){return m._splitlines(n,e)});case"lower":return m.expose([],function(){return n.toLowerCase()});case"upper":return m.expose([],function(){return n.toUpperCase()});case"capitalize":return m.expose([],function(){return m._capitalize(n)});case"join":return m.expose(["iterable"],function(e){return m._join(n,e)});case"startswith":return m.expose(["prefix"],function(e){return m._startswith(n,e)});case"endswith":return m.expose(["suffix"],function(e){return m._endswith(n,e)});default:return}else if(m._islist(n))switch(e){case"append":return m.expose(["*items"],function(e){return m._append(n,e)});case"insert":return m.expose(["pos","*items"],function(e,t){return m._insert(n,e,t)});case"pop":return m.expose(["pos=",-1],function(e){return m._pop(n,e)});case"count":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._count(n,e,t,r)});case"find":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._find(n,e,t,r)});case"rfind":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._rfind(n,e,t,r)});default:return}else if(m._isdate(n))switch(e){case"weekday":return m.expose([],function(){return m._weekday(n)});case"week":return m.expose(["firstweekday=",null],function(e){return m._week(n,e)});case"day":return m.expose([],function(){return n.getDate()});case"month":return m.expose([],function(){return n.getMonth()+1});case"year":return m.expose([],function(){return n.getFullYear()});case"hour":return m.expose([],function(){return n.getHours()});case"minute":return m.expose([],function(){return n.getMinutes()});case"second":return m.expose([],function(){return n.getSeconds()});case"microsecond":return m.expose([],function(){return 1e3*n.getMilliseconds()});case"mimeformat":return m.expose([],function(){return m._mimeformat(n)});case"isoformat":return m.expose([],function(){return m._isoformat(n)});case"yearday":return m.expose([],function(){return m._yearday(n)});default:return}else if(m._ismap(n))switch(e){case"get":return m.expose(["key","default=",null],function(e,t){return m._get(n,e,t)});case"items":return m.expose([],function(){return m._items(n)});case"values":return m.expose([],function(){return m._values(n)});case"update":return m.expose(["*other","**kwargs"],function(e,t){return m._update(n,e,t)});case"clear":return m.expose([],function(){return m._clear(n)});default:return n.get(e)}else if(m._isset(n))switch(e){case"add":return m.expose(["*items"],function(e){for(var t=0;t")},_makeargs:function(e){for(var t=[],r={},n=0;n")},_str:function(e){e.push("render "),e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," ")),null!==this.indent&&(e.push(" with indent "),e.push(m._repr(this.indent._text())))},_handle_eval:function(e){var t=e.withindent(null!==this.indent?this.indent._text():null),r=this.obj._handle_eval(t),n=this._makeargs(t);try{return m._callrender(t,r,n.args,n.kwargs)}catch(e){throw e=m.LocationError.create(this,e)}}}),m.slice=m._inherit(m.Proto,{create:function(e,t){var r=m._clone(this);return r.start=e,r.stop=t,r},__repr__:function(){return"slice("+m._repr(this.start)+", "+m._repr(this.stop)+")"}}),m.SliceAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.index1=r,i.index2=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["index1","index2"]),_repr:function(e){e.push("")},_eval:function(e){var t=null!==this.index1?this.index1._handle_eval(e):null,r=null!==this.index2?this.index2._handle_eval(e):null;return m.slice.create(t,r)}}),m.SetVarAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.lvalue=r,i.value=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["lvalue","value"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" lvalue="),e.push(m._repr(this.lvalue)),e.push(" value="),this.value._repr(e),e.push(">")},_eval:function(e){for(var t=this.value._handle_eval(e),r=m._unpackvar(this.lvalue,t),n=0;n")},_str_varname:function(e,t){if(m._islist(t)){e.push("(");for(var r=0;r")},_str:function(e){e.push("while "),this.container._repr(e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_eval:function(e){for(;;){var t=this.condition._handle_eval(e);if(!m._bool(t))break;try{m.BlockAST._eval.call(this,e)}catch(e){if(e===m.BreakException)break;if(e!==m.ContinueException)throw e}}}},"_str",function(e){e.push("while "),m.AST._str.call(this,e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)})),m.BreakAST=m._inherit(m.CodeAST,{_eval:function(e){throw m.BreakException},_str:function(e){e.push("break"),e.push(0)},_repr:function(e){e.push("")}}),m.ContinueAST=m._inherit(m.CodeAST,{_eval:function(e){throw m.ContinueException},_str:function(e){e.push("continue"),e.push(0)},_repr:function(e){e.push("")}}),m.CondBlockAST=m._inherit(m.BlockAST,{_eval:function(e){for(var t=0;t")},_str:function(e){e.push(this._strname),e.push(" "),this.condition._str(e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){var t=this.condition._handle_eval(e);return m._bool(t)}}),m.IfBlockAST=m._inherit(m.ConditionalBlockAST,{_strname:"if"}),m.ElIfBlockAST=m._inherit(m.ConditionalBlockAST,{_strname:"else if"}),m.ElseBlockAST=m._inherit(m.BlockAST,t({_repr:function(e){e.push("")},_str:function(e){e.push("else:"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){return!0}},"_str",function(e){e.push("else:"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)})),m.Template=m._inherit(m.BlockAST,{create:function(e,t,r,n,i,o,a,s){var u=m.BlockAST.create.call(this,e,t);return u.source=r,u.name=n,u.whitespace=i,u.startdelim=o,u.enddelim=a,u.docpos=null,u.signature=s,u._jsfunction=null,u._asts=null,u._ul4_callsignature=s,u._ul4_rendersignature=s,u.parenttemplate=null,u},ul4ondump:function(e){var t;if(e.dump(m.version),e.dump(this.name),e.dump(this.source),e.dump(this.whitespace),e.dump(this.startdelim),e.dump(this.enddelim),e.dump(this.docpos),e.dump(this.parenttemplate),null===this.signature||m.SignatureAST.isprotoof(this.signature))t=this.signature;else{t=[];for(var r=0;r"!==this.enddelim&&(e.push(" enddelim="),e.push(m._repr(this.enddelim))),e.push(">")},_str:function(e){e.push("def "),e.push(this.name?this.name:"unnamed"),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,_renderbound:function(e,t){var r=e.clone();r.vars=t;try{m.BlockAST._eval.call(this,r)}catch(e){if(!m.ReturnException.isprotoof(e))throw e}},__render__:function(e,t){this._renderbound(e,t)},render:function(e,t){this._renderbound(e,t)},_rendersbound:function(e,t){var r=e.replaceoutput();return this._renderbound(r,t),r.getoutput()},renders:function(e){e=e||{};var t=m.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._rendersbound(t,e)},doc:function(){return null!=this.docpos?this.source.substring(this.docpos.start,this.docpos.stop):null},__getattr__:function(e){var r=this;switch(e){case"tag":return this.tag;case"endtag":return this.endtag;case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});default:return}},_callbound:function(e,t){var r=e.clone();r.vars=t;try{m.BlockAST._eval.call(this,r)}catch(e){if(m.ReturnException.isprotoof(e))return e.result;throw e}return null},call:function(e){e=e||{};var t=m.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._callbound(t,e)},__call__:function(e,t){return this._callbound(e,t)},__type__:"ul4.Template"}),m.SignatureAST=m._inherit(m.CodeAST,{create:function(e,t){var r=m.CodeAST.create.call(this,e,t);return r.params=[],r},ul4ondump:function(e){m.CodeAST.ul4ondump.call(this,e);for(var t=[],r=0;r")}}),m.TemplateClosure=m._inherit(m.Proto,{create:function(e,t,r){var n=m._clone(this);return n.template=e,n.signature=t,n.vars=r,n._ul4_callsignature=t,n._ul4_rendersignature=t,n.name=e.name,n.tag=e.tag,n.endtag=e.endtag,n.source=e.source,n.startdelim=e.startdelim,n.enddelim=e.enddelim,n.docpos=e.docpos,n.content=e.content,n},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,__render__:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},render:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},__call__:function(e,t){return this.template._callbound(e,m._simpleinherit(this.vars,t))},_renderbound:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},_rendersbound:function(e,t){return this.template._rendersbound(e,m._simpleinherit(this.vars,t))},__getattr__:function(e){var r=this;switch(e){case"render":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});case"signature":return this.signature;default:return this.template.__getattr__(e)}},__type__:"ul4.TemplateClosure"}),m._rgb=function(e,t,r,n){return this.Color.create(255*e,255*t,255*r,255*n)},m._xmlescape=function(e){return e=(e=(e=(e=(e=(e=m._str(e)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},m._csv=function(e){return null===e?"":("string"!=typeof e&&(e=m._repr(e)),-1===e.indexOf(",")&&-1===e.indexOf('"')&&-1===e.indexOf("\n")||(e='"'+e.replace(/"/g,'""')+'"'),e)},m._chr=function(e){if("number"!=typeof e)throw m.TypeError.create("chr()","chr() requires an int");return String.fromCharCode(e)},m._ord=function(e){if("string"!=typeof e||1!=e.length)throw m.TypeError.create("ord()","ord() requires a string of length 1");return e.charCodeAt(0)},m._hex=function(e){if("number"!=typeof e)throw m.TypeError.create("hex()","hex() requires an int");return e<0?"-0x"+e.toString(16).substr(1):"0x"+e.toString(16)},m._oct=function(e){if("number"!=typeof e)throw m.TypeError.create("oct()","oct() requires an int");return e<0?"-0o"+e.toString(8).substr(1):"0o"+e.toString(8)},m._bin=function(e){if("number"!=typeof e)throw m.TypeError.create("bin()","bin() requires an int");return e<0?"-0b"+e.toString(2).substr(1):"0b"+e.toString(2)},m._min=function(e){if(0==e.length)throw m.ArgumentError.create("min() requires at least 1 argument, 0 given");1==e.length&&(e=e[0]);for(var t,r=m._iter(e),n=!0;;){var i=r.next();if(i.done){if(n)throw m.ValueError.create("min() argument is an empty sequence!");return t}(n||i.valuet)&&(t=i.value),n=!1}},m._sum=function(e,t){void 0===t&&(t=0);for(var r=m._iter(e);;){var n=r.next();if(n.done)break;t+=n.value}return t},m._first=function(e,t){void 0===t&&(t=null);var r=m._iter(e).next();return r.done?t:r.value},m._last=function(e,t){void 0===t&&(t=null);for(var r=t,n=m._iter(e);;){var i=n.next();if(i.done)break;r=i.value}return r},m._sorted=function(e,t,r,n){var i;if(null===r)return i=n?function(e,t){return-m._cmp("<=>",e,t)}:function(e,t){return m._cmp("<=>",e,t)},(_=m._list(t)).sort(i),_;for(var o=[],a=0,s=m._iter(t);;++a){var u=s.next();if(u.done)break;var l=m._call(e,r,[u.value],{});o.push([l,a,u.value])}i=function(e,t){var r=m._cmp("<=>",e[0],t[0]);return r||(r=m._cmp(e[1],t[1])),n?-r:r},o.sort(i);var _=[];for(a=0;a=o?{done:!0}:{value:t+this.index++*n,done:!1}}}},m._slice=function(e){var t,r,n,i;if(e.length<2)throw m.ArgumentError.create("required slice() argument missing");if(4= 0");if(n<0)throw m.ValueError.create("slice() requires a stop argument >= 0");if(i<=0)throw m.ValueError.create("slice() requires a step argument > 0");var o=r,a=0,s=m._iter(t);return{next:function(){for(var e;ae.length||ne.length+1&&(i=e.length+1),i}r=m._bound(r,e.length),n=m._bound(n,e.length);var o=0;if(m._islist(e)){for(var a=r;an);)++o,s+=t.length;return o},m._find=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=m._bound(r,e.length),n=m._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.indexOf(t);return-1!==i&&(i+=r),i},m._rfind=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=m._bound(r,e.length),n=m._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.lastIndexOf(t);return-1!==i&&(i+=r),i},m._capitalize=function(e){if("string"!=typeof e)throw m.TypeError.create("capitalize()","capitalize() requires a string");return e.length&&(e=e[0].toUpperCase()+e.slice(1).toLowerCase()),e},m._items=function(e){if(m._ismap(e)){var r=[];return e.forEach(function(e,t){r.push([t,e])}),r}if(m._isobject(e)){r=[];for(var t in e)r.push([t,e[t]]);return r}throw m.TypeError.create("items()","items() requires a dict")},m._values=function(e){if(m._ismap(e)){var r=[];return e.forEach(function(e,t){r.push(e)}),r}if(m._isobject(e)){r=[];for(var t in e)r.push(e[t]);return r}throw m.TypeError.create("values()","values() requires a dict")},m._join=function(e,t){for(var r=[],n=m._iter(t);;){var i=n.next();if(i.done)break;r.push(i.value)}return r.join(e)},m._startswith=function(e,t){if("string"!=typeof t)throw m.TypeError.create("startswith()","startswith() argument must be string");return e.substr(0,t.length)===t},m._endswith=function(e,t){if("string"!=typeof t)throw m.TypeError.create("endswith()","endswith() argument must be string");return e.substr(e.length-t.length)===t},m._isoformat=function(e){if(!m._isdate(e))throw m.TypeError.create("isoformat()","isoformat() requires a date");var t=e.getFullYear()+"-"+m._lpad((e.getMonth()+1).toString(),"0",2)+"-"+m._lpad(e.getDate().toString(),"0",2),r=e.getHours(),n=e.getMinutes(),i=e.getSeconds(),o=e.getMilliseconds();return(r||n||i||o)&&(t+="T"+m._lpad(r.toString(),"0",2)+":"+m._lpad(n.toString(),"0",2)+":"+m._lpad(i.toString(),"0",2),o&&(t+="."+m._lpad(o.toString(),"0",3)+"000")),t},m._mimeformat=function(e){return["Mon","Tue","Wed","Thu","Fri","Sat","Sun"][m._weekday(e)]+", "+m._lpad(e.getDate(),"0",2)+" "+["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][e.getMonth()]+" "+e.getFullYear()+" "+m._lpad(e.getHours(),"0",2)+":"+m._lpad(e.getMinutes(),"0",2)+":"+m._lpad(e.getSeconds(),"0",2)+" GMT"},m._weekday=function(e){var t=e.getDay();return t?t-1:6},m._week=function(e,t){null===t?t=0:t%=7;var r=m._yearday(e)+6,n=new Date(e.getFullYear(),0,1).getDay();for(--n<0&&(n=6);n!=t;)--r,7==++n&&(n=0);return Math.floor(r/7)},m._isleap=function(e){return 1===new Date(e.getFullYear(),1,29).getMonth()},m._yearday=function(e){var t=m._isleap(e)?1:0,r=e.getDate();switch(e.getMonth()){case 0:return r;case 1:return 31+r;case 2:return 59+t+r;case 3:return 59+t+31+r;case 4:return 59+t+31+30+r;case 5:return 59+t+31+30+31+r;case 6:return 59+t+31+30+31+30+r;case 7:return 59+t+31+30+31+30+31+r;case 8:return 59+t+31+30+31+30+31+31+r;case 9:return 59+t+31+30+31+30+31+31+30+r;case 10:return 59+t+31+30+31+30+31+31+30+31+r;case 11:return 59+t+31+30+31+30+31+31+30+31+30+r}},m._append=function(e,t){for(var r=0;re._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>e._microseconds;m._unorderable(">",this,e)},__ge__:function(e){if(m._istimedelta(e))return this._days!=e._days?this._days>e._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>=e._microseconds;m._unorderable(">=",this,e)},__neg__:function(){return m.TimeDelta.create(-this._days,-this._seconds,-this._microseconds)},_add:function(e,t,r,n){var i=e.getFullYear(),o=e.getMonth(),a=e.getDate()+t,s=e.getHours(),u=e.getMinutes(),l=e.getSeconds()+r,_=e.getMilliseconds()+n/1e3;return new Date(i,o,a,s,u,l,_)},__add__:function(e){if(m._istimedelta(e))return m.TimeDelta.create(this._days+e._days,this._seconds+e._seconds,this._microseconds+e._microseconds);if(m._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw m.TypeError.create("+",m._type(this)+" + "+m._type(e)+" not supported")},__radd__:function(e){if(m._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw m.TypeError.create("+",m._type(this)+" + "+m._type(e)+" not supported")},__sub__:function(e){if(m._istimedelta(e))return m.TimeDelta.create(this._days-e._days,this._seconds-e._seconds,this._microseconds-e._microseconds);throw m.TypeError.create("-",m._type(this)+" - "+m._type(e)+" not supported")},__rsub__:function(e){if(m._isdate(e))return this._add(e,-this._days,-this._seconds,-this._microseconds);throw m.TypeError.create("-",m._type(this)+" - "+m._type(e)+" not supported")},__mul__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw m.TypeError.create("*",m._type(this)+" * "+m._type(e)+" not supported")},__rmul__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw m.TypeError.create("*",m._type(this)+" * "+m._type(e)+" not supported")},__truediv__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days/e,this._seconds/e,this._microseconds/e);if(m._istimedelta(e)){var t=this._days,r=e._days,n=this._seconds||e._seconds,i=this._microseconds||e._microseconds;return(n||i)&&(t=86400*t+this._seconds,r=86400*r+e._seconds,i&&(t=1e6*t+this._microseconds,r=1e6*r+e._microseconds)),t/r}throw m.TypeError.create("/",m._type(this)+" / "+m._type(e)+" not supported")},__getattr__:function(e){var t=this;switch(e){case"days":return m.expose([],function(){return t._days});case"seconds":return m.expose([],function(){return t._seconds});case"microseconds":return m.expose([],function(){return t._microseconds});default:return}},days:function(){return this._days},seconds:function(){return this._seconds},microseconds:function(){return this._microseconds}}),m.MonthDelta=m._inherit(m.Proto,{__type__:"ul4.MonthDelta",create:function(e){var t=m._clone(this);return t._months=void 0!==e?e:0,t},__repr__:function(){return this._months?"monthdelta("+this._months+")":"monthdelta()"},__str__:function(){return this._months?-1!==this._months&&1!==this._months?this._months+" months":this._months+" month":"0 months"},__bool__:function(){return 0!==this._months},__abs__:function(){return this._months<0?m.MonthDelta.create(-this._months):this},__eq__:function(e){return!!m._ismonthdelta(e)&&this._months===e._months},__lt__:function(e){if(m._ismonthdelta(e))return this._monthse._months;m._unorderable(">",this,e)},__ge__:function(e){if(m._ismonthdelta(e))return this._months>=e._months;m._unorderable(">=",this,e)},__neg__:function(){return m.MonthDelta.create(-this._months)},_add:function(e,t){for(var r=e.getFullYear(),n=e.getMonth()+t,i=e.getDate(),o=e.getHours(),a=e.getMinutes(),s=e.getSeconds(),u=e.getMilliseconds();;){var l=new Date(r,n,1,o,a,s,u).getMonth(),_=new Date(r,n,i,o,a,s,u);if(_.getMonth()===l)return _;--i}},__add__:function(e){if(m._ismonthdelta(e))return m.MonthDelta.create(this._months+e._months);if(m._isdate(e))return this._add(e,this._months);throw m._type(this)+" + "+m._type(e)+" not supported"},__radd__:function(e){if(m._isdate(e))return this._add(e,this._months);throw m._type(this)+" + "+m._type(e)+" not supported"},__sub__:function(e){if(m._ismonthdelta(e))return m.MonthDelta.create(this._months-e._months);throw m._type(this)+" - "+m._type(e)+" not supported"},__rsub__:function(e){if(m._isdate(e))return this._add(e,-this._months);throw m._type(this)+" - "+m._type(e)+" not supported"},__mul__:function(e){if("number"==typeof e)return m.MonthDelta.create(this._months*Math.floor(e));throw m._type(this)+" * "+m._type(e)+" not supported"},__rmul__:function(e){if("number"==typeof e)return m.MonthDelta.create(this._months*Math.floor(e));throw m._type(this)+" * "+m._type(e)+" not supported"},__floordiv__:function(e){if("number"==typeof e)return m.MonthDelta.create(Math.floor(this._months/e));if(m._ismonthdelta(e))return Math.floor(this._months/e._months);throw m._type(this)+" // "+m._type(e)+" not supported"},__truediv__:function(e){if(m._ismonthdelta(e))return this._months/e._months;throw m._type(this)+" / "+m._type(e)+" not supported"},__getattr__:function(e){var t=this;switch(e){case"months":return m.expose([],function(){return t._months});default:return}},months:function(){return this._months}}),m._Set=m._inherit(m.Proto,{__type__:"ul4._Set",create:function(){var e=m._clone(this);return e.items={},e.add.apply(e,arguments),e},add:function(){for(var e=0;e"},geodist:function(e,t){var r=function(e){return(e=Math.sin(e))*e},n=function(e){return(e=Math.cos(e))*e},i=Math.PI/180,o=1/298.257223563,a=e.lat*i,s=e.long*i,u=t.lat*i,l=(a+u)/2,_=(a-u)/2,c=(s-t.long*i)/2,h=r(_)*n(c)+n(l)*r(c),f=n(_)*n(c)+r(l)*r(c),p=Math.atan(Math.sqrt(h/f)),d=2*p*6378.137,m=Math.sqrt(h*f)/p,g=(3*m+1)/(2*h);return d*(1+o*((3*m-1)/(2*f))*r(l)*n(_)-o*g*n(l)*r(_))}}),l.FlashMessage=m._inherit(l.Base,{_ul4onattrs:["timestamp","type","title","message"],__repr__:function(){return""}}),l.App=m._inherit(l.Base,{_ul4onattrs:["id","globals","name","description","language","startlink","iconlarge","iconsmall","owner","controls","records","recordcount","installation","categories","params","views","datamanagement_identifier"],insert:function(e){return this.globals.Login._insert(this,e)},__repr__:function(){return""}}),l.View=m._inherit(l.Base,{_ul4onattrs:["id","name","app","order","width","height","start","end"],__repr__:function(){return""}}),l.DataSource=m._inherit(l.Base,{_ul4onattrs:["id","identifier","app","apps"],__repr__:function(){return""}}),l.Record=m._inherit(l.Base,{_ul4onattrs:["id","app","createdat","createdby","updatedat","updatedby","updatecount","values","attachments","children"],delete:function(){return this.app.globals.Login._delete(this)},update:function(e){return this.app.globals.Login._update(this,e)},__repr__:function(){return""},search:function(e){for(var t in e){var r=e[t];if(m._bool(r)&&!this.fields.get(t).search(r))return!1}return!0},_dumpUL4ONAttr:function(e){return"values"===e?this._sparsevalues:this[e]},_loadUL4ONAttr:function(e,t){"values"===e?(this._sparsevalues=t,this._values=null,this._fields=null):this[e]=t}}),Object.defineProperty(l.Record,"values",{get:function(){if(null===this._values){this._values=_._havemap?new Map:{};var n=this;this.app.controls.forEach(function(e,t){var r=n._sparsevalues.get(e.identifier);void 0===r&&(r=null),n._values.set(t,r)})}return this._values}}),Object.defineProperty(l.Record,"fields",{get:function(){if(null===this._fields){this._fields=_._havemap?new Map:{};var n=this;this.values.forEach(function(e,t){var r=l.Field.create(n.app.controls.get(t),n.app,e);n._fields.set(t,r)})}return this._fields}}),l.Control=m._inherit(l.Base,{type:null,subtype:null,_ul4onattrs:["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],__repr__:function(){return""},asjson:function(e){return e},_logsearch:function(e,t){},search:function(e,t){return!1}}),l.BoolControl=m._inherit(l.Control,{type:"bool",__type__:"BoolControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),l.IntControl=m._inherit(l.Control,{type:"int",__type__:"IntControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),l.NumberControl=m._inherit(l.Control,{type:"number",__type__:"NumberControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator?t.value===e:"range"===t.operator&&(null!==e&&((null===t.minvalue||t.minvalue<=e)&&(null===t.maxvalue||e"}}),l.LookupItem=m._inherit(l.Base,{_ul4onattrs:["key","label"],__repr__:function(){return""}}),l.User=m._inherit(l.Base,{_ul4onattrs:["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],__repr__:function(){return""}}),l.File=m._inherit(l.Base,{_ul4onattrs:["id","url","filename","mimetype","width","height"],__repr__:function(){return""}}),l.Geo=m._inherit(l.Base,{_ul4onattrs:["lat","long","info"],__repr__:function(){return""}}),l.Attachment=m._inherit(l.Base,{_ul4onattrs:["id","record","label","active"],__repr__:function(){return""}}),l.NoteAttachment=m._inherit(l.Attachment,{type:"noteattachment",__type__:"NoteAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.URLAttachment=m._inherit(l.Attachment,{type:"urlattachment",__type__:"URLAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.FileAttachment=m._inherit(l.Attachment,{type:"fileattachment",__type__:"FileAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.ImageAttachment=m._inherit(l.Attachment,{type:"imageattachment",__type__:"ImageAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["original","thumb","small","medium","large"])}),l.JSONAttachment=m._inherit(l.Attachment,{type:"jsonattachment",__type__:"JSONAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"]),_dumpUL4ONAttr:function(e){return"value"===e?m._asjson(this.value):this[e]},_loadUL4ONAttr:function(e,t){"value"===e?this.value=m._fromjson(t):this[e]=t}}),l.Installation=m._inherit(l.Base,{_ul4onattrs:["id","name"],__repr__:function(){return""}}),l.Category=m._inherit(l.Base,{_ul4onattrs:["id","identifier","name","order","parent","children","apps"],__repr__:function(){for(var e=[],t=this;null!==t;)e.splice(0,0,t.identifier),t=t.parent;return""}}),l.KeyView=m._inherit(l.Base,{_ul4onattrs:["id","identifier","name","key","user"],__repr__:function(){return""}}),l.AppParameter=m._inherit(l.Base,{_ul4onattrs:["id","app","identifier","description","value"],__repr__:function(){return""}});for(var h=["Globals","App","View","DataSource","Record","BoolControl","IntControl","NumberControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","FileControl","ButtonControl","Field","LookupItem","User","File","Geo","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","KeyView","AppParameter"],f=0;f 1) {\n\t\t\t\toldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (i = 1; i < arguments.length; ++i)\n\t\t\t\t\tthis.dump(arguments[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t},\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish: function finish() {\n\t\t\treturn this.data.join(\"\");\n\t\t},\n\n\t\tdump: function dump(obj) {\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof (obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof (obj) == \"number\") {\n\t\t\t\tvar type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof (obj) == \"string\") {\n\t\t\t\tvar index = this._strings2index[obj];\n\t\t\t\tif (typeof (index) !== \"undefined\") {\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tthis._line(\"S\" + ul4._str_repr(obj));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.slice))\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump) {\n\t\t\t\tif (obj.__id__) {\n\t\t\t\t\tvar index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof (index) != \"undefined\") {\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (obj.__id__)\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj)) {\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var i in obj)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj)) {\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj)) {\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var key in obj) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj)) {\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow \"can't handle object\";\n\t\t}\n\t};\n\n// Helper \"class\" for decoding\nul4on.Decoder = {\n\t// Creates a new decoder for reading from the string ``data``\n\tcreate: function create(data, registry) {\n\t\tvar decoder = ul4._clone(this);\n\t\tdecoder.data = data;\n\t\tdecoder.pos = 0;\n\t\tdecoder.backrefs = [];\n\t\tdecoder.registry = typeof (registry) === \"undefined\" ? null : registry;\n\t\treturn decoder;\n\t},\n\n\t// Read a character from the buffer\n\treadchar: function readchar() {\n\t\tif (this.pos >= this.data.length)\n\t\t\tthrow \"UL4 decoder at EOF\";\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read a character from the buffer (return null on eof)\n\treadcharoreof: function readcharoreof() {\n\t\tif (this.pos >= this.data.length)\n\t\t\treturn null;\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read next not-whitespace character from the buffer\n\treadblackchar: function readblackchar() {\n\t\tvar re_white = /\\s/;\n\n\t\tfor (; ;) {\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow \"UL4 decoder at EOF\";\n\t\t\tvar c = this.data.charAt(this.pos++);\n\t\t\tif (!c.match(re_white))\n\t\t\t\treturn c;\n\t\t}\n\t},\n\n\t// Read ``size`` characters from the buffer\n\tread: function read(size) {\n\t\tif (this.pos + size > this.length)\n\t\t\tsize = this.length - this.pos;\n\t\tvar result = this.data.substring(this.pos, this.pos + size);\n\t\tthis.pos += size;\n\t\treturn result;\n\t},\n\n\t// \"unread\" one character\n\tbackup: function backup() {\n\t\t--this.pos;\n\t},\n\n\t// Read a number from the buffer\n\treadnumber: function readnumber() {\n\t\tvar re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\tfor (; ;) {\n\t\t\tvar c = this.readcharoreof();\n\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\tvalue += c;\n\t\t\telse {\n\t\t\t\tvar result = parseFloat(value);\n\t\t\t\tif (result == NaN)\n\t\t\t\t\tthrow \"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t},\n\n\t_beginfakeloading: function _beginfakeloading() {\n\t\tvar oldpos = this.backrefs.length;\n\t\tthis.backrefs.push(null);\n\t\treturn oldpos;\n\t},\n\n\t_endfakeloading: function _endfakeloading(oldpos, value) {\n\t\tthis.backrefs[oldpos] = value;\n\t},\n\n\t_readescape: function _readescape(escapechar, length) {\n\t\tvar chars = this.read(length);\n\t\tif (chars.length != length)\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\tvar codepoint = parseInt(chars, 16);\n\t\tif (isNaN(codepoint))\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\treturn String.fromCharCode(codepoint);\n\t},\n\n\t// Load the next object from the buffer\n\tload: function load() {\n\t\tvar typecode = this.readblackchar();\n\t\tvar result;\n\t\tswitch (typecode) {\n\t\t\tcase \"^\":\n\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\tcase \"n\":\n\t\t\tcase \"N\":\n\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\treturn null;\n\t\t\tcase \"b\":\n\t\t\tcase \"B\":\n\t\t\t\tresult = this.readchar();\n\t\t\t\tif (result === \"T\")\n\t\t\t\t\tresult = true;\n\t\t\t\telse if (result === \"F\")\n\t\t\t\t\tresult = false;\n\t\t\t\telse\n\t\t\t\t\tthrow \"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos;\n\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"i\":\n\t\t\tcase \"I\":\n\t\t\tcase \"f\":\n\t\t\tcase \"F\":\n\t\t\t\tresult = this.readnumber();\n\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"s\":\n\t\t\tcase \"S\":\n\t\t\t\tresult = [];\n\t\t\t\tvar delimiter = this.readblackchar();\n\t\t\t\tfor (; ;) {\n\t\t\t\t\tvar c = this.readchar();\n\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (c == \"\\\\\") {\n\t\t\t\t\t\tvar c2 = this.readchar();\n\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tresult.push(c);\n\t\t\t\t}\n\t\t\t\tresult = result.join(\"\");\n\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"c\":\n\t\t\tcase \"C\":\n\t\t\t\tresult = ul4.Color.create();\n\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._r = this.load();\n\t\t\t\tresult._g = this.load();\n\t\t\t\tresult._b = this.load();\n\t\t\t\tresult._a = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"z\":\n\t\t\tcase \"Z\":\n\t\t\t\tresult = new Date();\n\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\tresult.setDate(1);\n\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\tresult.setDate(this.load());\n\t\t\t\tresult.setHours(this.load());\n\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\tresult.setMilliseconds(this.load() / 1000);\n\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"t\":\n\t\t\tcase \"T\":\n\t\t\t\tresult = ul4.TimeDelta.create();\n\t\t\t\tresult._days = this.load();\n\t\t\t\tresult._seconds = this.load();\n\t\t\t\tresult._microseconds = this.load();\n\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"r\":\n\t\t\tcase \"R\":\n\t\t\t\tresult = ul4.slice.create();\n\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult.start = this.load();\n\t\t\t\tresult.stop = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"m\":\n\t\t\tcase \"M\":\n\t\t\t\tresult = ul4.MonthDelta.create();\n\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._months = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"l\":\n\t\t\tcase \"L\":\n\t\t\t\tresult = [];\n\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.push(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"d\":\n\t\t\tcase \"D\":\n\t\t\tcase \"e\":\n\t\t\tcase \"E\":\n\t\t\t\tif (!ul4on._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\tthrow \"ordered dictionaries are not supported!\";\n\t\t\t\tresult = ul4on._emptymap();\n\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tvar key = this.load();\n\t\t\t\t\tvar value = this.load();\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"y\":\n\t\t\tcase \"Y\":\n\t\t\t\tresult = ul4on._makeset();\n\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.add(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"o\":\n\t\t\tcase \"O\":\n\t\t\t\tvar oldpos;\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\tvar name = this.load();\n\t\t\t\tvar proto;\n\t\t\t\tif (this.registry !== null) {\n\t\t\t\t\tproto = this.registry[name];\n\t\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\tthrow \"can't load object of type \" + ul4._repr(name);\n\t\t\t\tresult = proto();\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\tresult.ul4onload(this);\n\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\tthrow \"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\tdefault:\n\t\t\t\tthrow \"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t}\n\t},\n\n\t// Return an iterator for loading the content of a object\n\tloadcontent: function load(loadcontent) {\n\t\tlet self = this;\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\tself.backup();\n\t\t\t\tif (typecode == \")\")\n\t\t\t\t\treturn { done: true };\n\t\t\t\telse\n\t\t\t\t\treturn { done: false, value: self.load() };\n\t\t\t}\n\t\t};\n\t}\n};\n\n\n//\n// UL4\n//\n\n// REs for parsing JSON\nul4._rvalidchars = /^[\\],:{}\\s]*$/;\nul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n/// Helper functions\n\n// Crockford style object creation\nul4._simpleclone = function _simpleclone(obj) {\n\tfunction F() { };\n\tF.prototype = obj;\n\tvar result = new F();\n\treturn result;\n};\n\n// Crockford style object creation + prototype chain + object ids\nul4._clone = function _clone(obj) {\n\tvar result = ul4._simpleclone(obj);\n\tresult.__prototype__ = obj;\n\tresult.__id__ = ul4.Proto._nextid++;\n\treturn result;\n};\n\n// Adds attributes from on object to another and returns it\nul4._extend = function _extend(obj, attrs) {\n\tfor (var name in attrs)\n\t\tobj[name] = attrs[name];\n\treturn obj;\n};\n\n// Clone an object via ``_simpleclone`` and extend it\nul4._simpleinherit = function _simpleinherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._simpleclone(baseobj), attrs);\n};\n\n// Clone an object via ``_clone`` and extend it\nul4._inherit = function _inherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._clone(baseobj), attrs);\n};\n\n// Convert a map to an object\nul4._map2object = function _map2object(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar newobj = {};\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (typeof (key) !== \"string\")\n\t\t\t\tthrow ul4.TypeError.create(\"keys must be strings\");\n\t\t\tnewobj[key] = value;\n\t\t});\n\t\treturn newobj;\n\t}\n\treturn obj;\n};\n\n// Clip a number to the range [0;max)\nul4._bound = function _bound(value, upper) {\n\tif (value < 0)\n\t\treturn 0;\n\telse if (value > upper)\n\t\treturn upper;\n\telse\n\t\treturn value;\n};\n\n// Create a pretty stacktrace from an exception\nul4._stacktrace = function _stacktrace(exc) {\n\tvar output = ul4._type(exc);\n\tvar s = exc.toString();\n\tif (s)\n\t\toutput += \": \" + s;\n\tif (exc.cause)\n\t\toutput += \"\\n\\n\" + ul4._stacktrace(exc.cause);\n\treturn output;\n};\n\n// Call a function ``f`` with UL4 argument handling\nul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) {\n\tvar finalargs;\n\tif (needsobject) {\n\t\tif (signature === null) {\n\t\t\tif (args.length)\n\t\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = [kwargs];\n\t\t}\n\t\telse\n\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t}\n\telse {\n\t\tif (signature === null)\n\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t}\n\tif (needscontext)\n\t\tfinalargs.unshift(context);\n\treturn f.apply(functioncontext, finalargs);\n};\n\nul4._callfunction = function _callfunction(context, f, args, kwargs) {\n\tvar name = f._ul4_name || f.name;\n\tif (typeof (f._ul4_signature) === \"undefined\" || typeof (f._ul4_needsobject) === \"undefined\" || typeof (f._ul4_needscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", \"function \" + ul4.repr(f) + \" is not callable by UL4\");\n\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n}\n\nul4._callobject = function _callobject(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_callsignature) === \"undefined\" || typeof (obj._ul4_callneedsobject) === \"undefined\" || typeof (obj._ul4_callneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", ul4.type(obj) + \" object is not callable by UL4\");\n\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n}\n\nul4._callrender = function _callrender(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_rendersignature) === \"undefined\" || typeof (obj._ul4_renderneedsobject) === \"undefined\" || typeof (obj._ul4_renderneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"render\", ul4.type(obj) + \" object is not renderable by UL4\");\n\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n}\n\nul4._call = function _call(context, f, args, kwargs) {\n\tif (typeof (f) === \"function\")\n\t\treturn ul4._callfunction(context, f, args, kwargs);\n\telse if (f && typeof (f.__call__) === \"function\")\n\t\treturn ul4._callobject(context, f, args, kwargs);\n\telse\n\t\tthrow ul4.TypeError.create(\"call\", ul4._type(f) + \" is not callable\");\n}\n\nul4._unpackvar = function _unpackvar(lvalue, value) {\n\tif (!ul4._islist(lvalue))\n\t\treturn [[lvalue, value]];\n\telse {\n\t\tvar newvalue = [];\n\t\tvar iter = ul4._iter(value);\n\n\t\tfor (var i = 0; ; ++i) {\n\t\t\tvar item = iter.next();\n\n\t\t\tif (item.done) {\n\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t}\n\t\t}\n\t\treturn newvalue;\n\t}\n};\n\nul4._formatsource = function _formatsource(out) {\n\tvar finalout = [];\n\tvar level = 0, needlf = false;\n\tfor (var i = 0; i < out.length; ++i) {\n\t\tif (typeof (out[i]) === \"number\") {\n\t\t\tlevel += out[i];\n\t\t\tneedlf = true;\n\t\t}\n\t\telse {\n\t\t\tif (needlf) {\n\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\tfor (var j = 0; j < level; ++j)\n\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\tneedlf = false;\n\t\t\t}\n\t\t\tfinalout.push(out[i]);\n\t\t}\n\t}\n\tif (needlf)\n\t\tfinalout.push(\"\\n\");\n\treturn finalout.join(\"\");\n};\n\n// Compare ``obj1`` and ``obj2`` if they have the same value\nul4._eq = function _eq(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__eq__) === \"function\")\n\t\treturn obj1.__eq__(obj2);\n\telse if (obj2 && typeof (obj2.__eq__) === \"function\")\n\t\treturn obj2.__eq__(obj1);\n\telse if (obj1 === null)\n\t\treturn obj2 === null;\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 == obj2\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 == obj2;\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.length != obj2.length)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isobject(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.hasOwnProperty(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.has(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tvar result = true;\n\t\t\tobj2.forEach(function (value, key) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\tresult = false;\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._ismap(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!result)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isset(obj1)) {\n\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\tif (ul4._isset(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse\n\t\treturn obj1 === obj2;\n};\n\n// Compare ``obj1`` and ``obj2`` if they don't have the same value\nul4._ne = function _ne(obj1, obj2) {\n\tif (obj1 && typeof (obj1.__ne__) === \"function\")\n\t\treturn obj1.__ne__(obj2);\n\telse if (obj2 && typeof (obj2.__ne__) === \"function\")\n\t\treturn obj2.__ne__(obj1);\n\telse\n\t\treturn !ul4._eq(obj1, obj2);\n}\n\nul4._unorderable = function _unorderable(operator, obj1, obj2) {\n\tthrow ul4.TypeError.create(operator, \"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n};\n\n// Return:\n// -1 when ``obj1 < obj2``,\n// 0 when ``obj1 == obj2``,\n// 1 when ``obj1 > obj2``,\n// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n// raise TypeError if objects are uncomparable\n// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\nul4._cmp = function _cmp(operator, obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2)) {\n\t\t\tvar v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t}\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn 0;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn 1;\n\t\t\t\tvar res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t}\n\t}\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\telse\n\t\tul4._unorderable(operator, obj1, obj2);\n}\n\n// Return whether ``obj1 < obj2``\nul4._lt = function _lt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__lt__) === \"function\")\n\t\treturn obj1.__lt__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() < obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length < obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1)) {\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<\", obj1, obj2);\n};\n\n// Return whether ``obj1 <= obj2``\nul4._le = function _le(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__le__) === \"function\")\n\t\treturn obj1.__le__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length <= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<=\", obj1, obj2);\n};\n\n// Return whether ``obj1 > obj2``\nul4._gt = function _gt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__gt__) === \"function\")\n\t\treturn obj1.__gt__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() > obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length > obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">\", obj1, obj2);\n};\n\n// Return whether ``obj1 >= obj2``\nul4._ge = function _ge(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__ge__) === \"function\")\n\t\treturn obj1.__ge__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length >= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">=\", obj1, obj2);\n};\n\n// Return an iterator for ``obj``\nul4._iter = function _iter(obj) {\n\tif (typeof (obj) === \"string\" || ul4._islist(obj)) {\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\treturn { value: obj[this.index++], done: false };\n\t\t\t\telse\n\t\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isiter(obj))\n\t\treturn obj;\n\telse if (obj !== null && typeof (obj.__iter__) === \"function\")\n\t\treturn obj.__iter__();\n\telse if (ul4._ismap(obj)) {\n\t\tvar keys = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tkeys.push(key);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isset(obj)) {\n\t\tvar values = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tvalues.push(value);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: values[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isul4set(obj)) {\n\t\treturn ul4._iter(obj.items);\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar keys = [];\n\t\tfor (var key in obj)\n\t\t\tkeys.push(key);\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\tthrow ul4.TypeError.create(\"iter\", ul4._type(obj) + \" object is not iterable\");\n};\n\nul4._str_repr = function _str_repr(str, ascii) {\n\tvar result = \"\";\n\tvar squote = false, dquote = false;\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tif (c == '\"') {\n\t\t\tdquote = true;\n\t\t\tif (squote)\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (c == \"'\") {\n\t\t\tsquote = true;\n\t\t\tif (dquote)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\tvar quote = (squote && !dquote) ? '\"' : \"'\";\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase '\"':\n\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\tbreak;\n\t\t\tcase \"'\":\n\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tvar escape;\n\t\t\t\tif (code < 32)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\tescape = 4;\n\t\t\t\telse\n\t\t\t\t\tescape = 8;\n\n\t\t\t\tif (escape === 0)\n\t\t\t\t\tresult += c;\n\t\t\t\telse if (escape === 2)\n\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\telse if (escape === 4)\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn quote + result + quote;\n};\n\nul4._date_repr = function _date_repr(obj, ascii) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tvar result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\tresult += \")\";\n\n\treturn result;\n};\n\nul4._map_repr = function _map_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\n\tvar i = 0;\n\tobj.forEach(function (value, key) {\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(value, ascii));\n\t});\n\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._list_repr = function _list_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"[\");\n\tfor (var i = 0; i < obj.length; ++i) {\n\t\tif (i !== 0)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(obj[i], ascii));\n\t}\n\tv.push(\"]\");\n\treturn v.join(\"\");\n};\n\nul4._set_repr = function _set_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tif (!obj.size)\n\t\tv.push(\"/\");\n\telse {\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._object_repr = function _object_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tvar i = 0;\n\tfor (var key in obj) {\n\t\tif (!obj.hasOwnProperty(key))\n\t\t\tcontinue;\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._repr_internal = function _repr_internal(obj, ascii) {\n\tif (obj === null)\n\t\treturn \"None\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_repr(obj, ascii);\n\telse if (typeof (obj) === \"number\")\n\t\treturn \"\" + obj;\n\telse if (typeof (obj) === \"function\")\n\t\tif (obj._ul4_name || obj.name)\n\t\t\treturn \"\";\n\t\telse\n\t\t\treturn \"\";\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_repr(obj, ascii);\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj, ascii);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj, ascii);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj, ascii);\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj, ascii);\n\treturn \"?\";\n};\n\n// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\nul4._repr = function _repr(obj) {\n\treturn ul4._repr_internal(obj, false);\n}\n\nul4._ascii = function _ascii(obj) {\n\treturn ul4._repr_internal(obj, true);\n}\n\nul4._date_str = function _date_str(obj) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\n\tvar result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\tif (ms)\n\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\treturn result;\n};\n\nul4._str = function _str(obj) {\n\tif (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (obj === null)\n\t\treturn \"\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn obj;\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj.toString();\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_str(obj);\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj);\n\telse if (typeof (obj) === \"object\" && typeof (obj.__str__) === \"function\")\n\t\treturn obj.__str__();\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj);\n\treturn \"?\";\n};\n\n// Convert ``obj`` to bool, according to its \"truth value\"\nul4._bool = function _bool(obj) {\n\tif (typeof (obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\treturn false;\n\telse {\n\t\tif (typeof (obj) === \"object\", typeof (obj.__bool__) === \"function\")\n\t\t\treturn obj.__bool__();\n\t\tif (ul4._islist(obj))\n\t\t\treturn obj.length !== 0;\n\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\treturn obj.size != 0;\n\t\telse if (ul4._isobject(obj)) {\n\t\t\tfor (var key in obj) {\n\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\nul4._int = function _int(obj, base) {\n\tvar result;\n\tif (base !== null) {\n\t\tif (typeof (obj) !== \"string\" || !ul4._isint(base))\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"int() requires a string and an integer\");\n\t\tresult = parseInt(obj, base);\n\t\tif (result.toString() == \"NaN\")\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\treturn result;\n\t}\n\telse {\n\t\tif (typeof (obj) == \"string\") {\n\t\t\tresult = parseInt(obj);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse if (typeof (obj) == \"number\")\n\t\t\treturn Math.floor(obj);\n\t\telse if (obj === true)\n\t\t\treturn 1;\n\t\telse if (obj === false)\n\t\t\treturn 0;\n\t\tthrow ul4.TypeError.create(\"int()\", \"int() argument must be a string or a number\");\n\t}\n};\n\n// Convert ``obj`` to a float\nul4._float = function _float(obj) {\n\tif (typeof (obj) === \"string\")\n\t\treturn parseFloat(obj);\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj;\n\telse if (obj === true)\n\t\treturn 1.0;\n\telse if (obj === false)\n\t\treturn 0.0;\n\tthrow ul4.TypeError.create(\"float()\", \"float() argument must be a string or a number\");\n};\n\n// Convert ``obj`` to a list\nul4._list = function _list(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = [];\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.push(value.value);\n\t}\n};\n\n// Convert ``obj`` to a set\nul4._set = function _set(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.add(value.value);\n\t}\n};\n\n// Return the length of ``sequence``\nul4._len = function _len(sequence) {\n\tif (typeof (sequence) == \"string\" || ul4._islist(sequence))\n\t\treturn sequence.length;\n\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\treturn sequence.size;\n\telse if (ul4._isobject(sequence)) {\n\t\tvar i = 0;\n\t\tfor (var key in sequence)\n\t\t\t++i;\n\t\treturn i;\n\t}\n\tthrow ul4.TypeError.create(\"len\", \"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n};\n\nul4._type = function _type(obj) {\n\tif (obj === null)\n\t\treturn \"none\";\n\telse if (obj === false || obj === true)\n\t\treturn \"bool\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"undefined\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn \"str\";\n\telse if (typeof (obj) === \"number\")\n\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\telse if (ul4._islist(obj))\n\t\treturn \"list\";\n\telse if (ul4._isset(obj))\n\t\treturn \"set\";\n\telse if (ul4._isdate(obj))\n\t\treturn \"date\";\n\telse if (typeof (obj.__type__) !== \"undefined\")\n\t\treturn obj.__type__;\n\telse if (ul4._istimedelta(obj))\n\t\treturn \"timedelta\";\n\telse if (ul4._isdict(obj))\n\t\treturn \"dict\";\n\telse if (ul4._istemplate(obj))\n\t\treturn \"template\";\n\telse if (ul4._isfunction(obj))\n\t\treturn \"function\";\n\treturn null;\n};\n\n\n// Return whether any of the items in ``iterable`` are true\nul4._any = function _any(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn false;\n\t\t\tif (ul4._bool(item.value))\n\t\t\t\treturn true;\n\t\t}\n\t}\n};\n\n// Return whether all of the items in ``iterable`` are true\nul4._all = function _all(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn true;\n\t\t\tif (!ul4._bool(item.value))\n\t\t\t\treturn false;\n\t\t}\n\t}\n};\n\n// Check if ``obj`` is undefined\nul4._isundefined = function _isundefined(obj) {\n\treturn typeof (obj) === \"undefined\";\n};\n\n\n// Check if ``obj`` is *not* undefined\nul4._isdefined = function _isdefined(obj) {\n\treturn typeof (obj) !== \"undefined\";\n};\n\n// Check if ``obj`` is ``None``\nul4._isnone = function _isnone(obj) {\n\treturn obj === null;\n};\n\n// Check if ``obj`` is a boolean\nul4._isbool = function _isbool(obj) {\n\treturn typeof (obj) == \"boolean\";\n};\n\n// Check if ``obj`` is a int\nul4._isint = function _isint(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) == obj;\n};\n\n// Check if ``obj`` is a float\nul4._isfloat = function _isfloat(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) != obj;\n};\n\n// Check if ``obj`` is a string\nul4._isstr = function _isstr(obj) {\n\treturn typeof (obj) == \"string\";\n};\n\n// Check if ``obj`` is a date\nul4._isdate = function _isdate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n};\n\n// Check if ``obj`` is a color\nul4._iscolor = function _iscolor(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Color));\n};\n\n// Check if ``obj`` is a timedelta object\nul4._istimedelta = function _istimedelta(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.TimeDelta));\n};\n\n// Check if ``obj`` is a monthdelta object\nul4._ismonthdelta = function _ismonthdelta(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.MonthDelta);\n};\n\n// Check if ``obj`` is a template\nul4._istemplate = function _istemplate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\");\n};\n\n// Check if ``obj`` is a function\nul4._isfunction = function _isfunction(obj) {\n\treturn typeof (obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\"));\n};\n\n// Check if ``obj`` is a list\nul4._islist = function _islist(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n};\n\n// Check if ``obj`` is a set\nul4._isset = function _isset(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n};\n\n// Check if ``obj`` is an exception (at least a UL4 exception)\nul4._isexception = function _isexception(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Error);\n};\n\nul4._isul4set = function _isul4set(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4._Set);\n};\n\n// Check if ``obj`` is an iterator\nul4._isiter = function _isiter(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.next) === \"function\";\n};\n\n// Check if ``obj`` is a JS object\nul4._isobject = function _isobject(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof (obj.__type__) === \"undefined\";\n};\n\n// Check if ``obj`` is a map\nul4._ismap = function _ismap(obj) {\n\tif (ul4on._havemap)\n\t\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\treturn false;\n};\n\n// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\nul4._isdict = function _isdict(obj) {\n\treturn ul4._isobject(obj) || ul4._ismap(obj);\n};\n\n\n// Repeat string ``str`` ``rep`` times\nul4._str_repeat = function _str_repeat(str, rep) {\n\tvar result = \"\";\n\tfor (; rep > 0; --rep)\n\t\tresult += str;\n\treturn result;\n};\n\nul4._list_repeat = function _list_repeat(list, rep) {\n\tvar result = [];\n\tfor (; rep > 0; --rep)\n\t\tfor (var i = 0; i < list.length; ++i)\n\t\t\tresult.push(list[i]);\n\treturn result;\n};\n\nul4._str_json = function _str_json(str) {\n\tvar result = \"\";\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tresult += '\\\\\"';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\tresult += c;\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn '\"' + result + '\"';\n};\n\n// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\nul4._asjson = function _asjson(obj) {\n\tif (obj === null)\n\t\treturn \"null\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"{}.undefined\";\n\telse if (obj === false)\n\t\treturn \"false\";\n\telse if (obj === true)\n\t\treturn \"true\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_json(obj);\n\telse if (typeof (obj) === \"number\") {\n\t\treturn \"\" + obj;\n\t}\n\telse if (ul4._islist(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"[\");\n\t\tfor (var i = 0; i < obj.length; ++i) {\n\t\t\tif (i != 0)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._ismap(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(value));\n\t\t});\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tfor (var key in obj) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isdate(obj)) {\n\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t}\n\telse if (ul4._istimedelta(obj)) {\n\t\treturn \"ul4.TimeDelta.create(\" + obj.days + \", \" + obj.seconds + \", \" + obj.microseconds + \")\";\n\t}\n\telse if (ul4._ismonthdelta(obj)) {\n\t\treturn \"ul4.MonthDelta.create(\" + obj.months + \")\";\n\t}\n\telse if (ul4._iscolor(obj)) {\n\t\treturn \"ul4.Color.create(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t}\n\telse if (ul4._istemplate(obj)) {\n\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t}\n\tthrow ul4.TypeError.create(\"asjson()\", \"asjson() requires a serializable object\");\n};\n\n// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\nul4._fromjson = function _fromjson(string) {\n\t// The following is from jQuery's parseJSON function\n\tstring = ul4._strip(string, null);\n\tif (root.JSON && root.JSON.parse)\n\t\treturn root.JSON.parse(string);\n\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\treturn (new Function(\"return \" + string))();\n\tthrow ul4.TypeError.create(\"fromjson()\", \"invalid JSON\");\n};\n\n// Encodes ``obj`` in the UL4 Object Notation format\nul4._asul4on = function _asul4on(obj) {\n\treturn ul4on.dumps(obj);\n};\n\n// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\nul4._fromul4on = function _fromul4on(string) {\n\treturn ul4on.loads(string);\n};\n\nul4._format_date = function _format_date(obj, fmt, lang) {\n\tvar translations = {\n\t\tde: {\n\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\ten: {\n\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\txf: \"%m/%d/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p \"\n\t\t},\n\t\tfr: {\n\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tes: {\n\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\txf: \"%d/%m/%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tit: {\n\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tda: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsv: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t},\n\t\tnl: {\n\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\txf: \"%d-%m-%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tpt: {\n\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tcs: {\n\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tsk: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tpl: {\n\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t},\n\t\thr: {\n\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsr: {\n\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y.\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t},\n\t\tro: {\n\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\thu: {\n\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t},\n\t\ttr: {\n\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tru: {\n\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tzh: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t},\n\t\tko: {\n\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t},\n\t\tja: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t}\n\t};\n\n\tvar translation = translations[lang];\n\n\tvar firstday;\n\n\tvar result = [];\n\tvar inspec = false;\n\tfor (var i = 0; i < fmt.length; ++i) {\n\t\tvar c = fmt[i];\n\t\tif (inspec) {\n\t\t\tswitch (c) {\n\t\t\t\tcase \"a\":\n\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"A\":\n\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"B\":\n\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"H\":\n\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"I\":\n\t\t\t\t\tc = ul4._lpad(((obj.getHours() - 1) % 12) + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"j\":\n\t\t\t\t\tc = ul4._lpad(ul4._yearday(obj), \"0\", 3);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"m\":\n\t\t\t\t\tc = ul4._lpad(obj.getMonth() + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"M\":\n\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"p\":\n\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"S\":\n\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"U\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 6), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"w\":\n\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"W\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 0), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"x\":\n\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"X\":\n\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"y\":\n\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"z\":\n\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\t\t// Time zone name\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.push(c);\n\t\t\tinspec = false;\n\t\t}\n\t\telse {\n\t\t\tif (c == \"%\")\n\t\t\t\tinspec = true;\n\t\t\telse\n\t\t\t\tresult.push(c);\n\t\t}\n\t}\n\treturn result.join(\"\");\n};\n\nul4._format_int = function _format_int(obj, fmt, lang) {\n\tvar work = fmt;\n\n\t// Defaults\n\tvar fill = ' ';\n\tvar align = '>'; // '<', '>', '=' or '^'\n\tvar sign = '-'; // '+', '-' or ' '\n\tvar alternate = false;\n\tvar minimumwidth = 0;\n\tvar type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t// Determine output type\n\tif (/[bcdoxXn]$/.test(work)) {\n\t\ttype = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract minimum width\n\tif (/\\d+$/.test(work)) {\n\t\tvar minimumwidthStr = /\\d+$/.exec(work);\n\t\twork = work.replace(/\\d+$/, \"\");\n\t\tif (/^0/.test(minimumwidthStr)) {\n\t\t\talign = '=';\n\t\t\tfill = '0';\n\t\t}\n\t\tminimumwidth = parseInt(minimumwidthStr);\n\t}\n\n\t// Alternate form?\n\tif (/#$/.test(work)) {\n\t\talternate = true;\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Determine sign\n\tif (/[+ -]$/.test(work)) {\n\t\tif (type == 'c')\n\t\t\tthrow ul4.ValueError.create(\"sign not allowed for integer format type 'c'\");\n\t\tsign = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract fill and align char\n\tif (work.length >= 3)\n\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\telse if (work.length == 2) {\n\t\tif (/[<>=^]$/.test(work)) {\n\t\t\talign = work[1];\n\t\t\tfill = work[0];\n\t\t}\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\telse if (work.length == 1) {\n\t\tif (/^[<>=^]$/.test(work))\n\t\t\talign = work;\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\n\t// Basic number formatting\n\tvar neg = obj < 0;\n\n\tif (neg)\n\t\tobj = -obj;\n\n\tvar output;\n\tswitch (type) {\n\t\tcase 'b':\n\t\t\toutput = obj.toString(2);\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tif (neg || obj > 65535)\n\t\t\t\tthrow ul4.ValueError.create(\"value out of bounds for c format\");\n\t\t\toutput = String.fromCharCode(obj);\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t\tcase 'o':\n\t\t\toutput = obj.toString(8);\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\toutput = obj.toString(16);\n\t\t\tbreak;\n\t\tcase 'X':\n\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\tbreak;\n\t\tcase 'n':\n\t\t\t// FIXME: locale formatting\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t}\n\n\t// The rest of the formatting\n\tif (align === '=') {\n\t\tif (neg || sign !== '-')\n\t\t\t--minimumwidth;\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\tminimumwidth -= 2;\n\n\t\tif (output.length < minimumwidth)\n\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\toutput = \"0\" + type + output;\n\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t}\n\telse {\n\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\toutput = \"0\" + type + output;\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t\tif (output.length < minimumwidth) {\n\t\t\tif (align == '<')\n\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth - output.length);\n\t\t\telse if (align == '>')\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\t\t\telse // if (align == '^')\n\t\t\t{\n\t\t\t\tvar pad = minimumwidth - output.length;\n\t\t\t\tvar padBefore = Math.floor(pad / 2);\n\t\t\t\tvar padAfter = pad - padBefore;\n\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n};\n\n// Format ``obj`` using the format string ``fmt`` in the language ``lang``\nul4._format = function _format(obj, fmt, lang) {\n\tif (typeof (lang) === \"undefined\" || lang === null)\n\t\tlang = \"en\";\n\telse {\n\t\tvar translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null };\n\t\tlang = lang.toLowerCase();\n\t\tif (typeof (translations[lang]) === \"undefined\") {\n\t\t\tlang = lang.split(/_/)[0];\n\t\t\tif (typeof (translations[lang]) === \"undefined\")\n\t\t\t\tlang = \"en\";\n\t\t}\n\t}\n\tif (ul4._isdate(obj))\n\t\treturn ul4._format_date(obj, fmt, lang);\n\telse if (ul4._isint(obj))\n\t\treturn ul4._format_int(obj, fmt, lang);\n\telse if (obj === true)\n\t\treturn ul4._format_int(1, fmt, lang);\n\telse if (obj === false)\n\t\treturn ul4._format_int(0, fmt, lang);\n};\n\nul4._lpad = function _lpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = pad + string;\n\treturn string;\n};\n\nul4._rpad = function _rpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = string + pad;\n\treturn string;\n};\n\nul4.Proto = {\n\t__prototype__: null,\n\t__id__: 0,\n\t_nextid: 1,\n\tisa: function isa(type) {\n\t\tif (this === type)\n\t\t\treturn true;\n\t\tif (this.__prototype__ === null)\n\t\t\treturn false;\n\t\treturn this.__prototype__.isa(type);\n\t},\n\n\tisprotoof: function isprotoof(obj) {\n\t\twhile (true) {\n\t\t\tif (obj === null || Object.prototype.toString.call(obj) !== \"[object Object]\" || typeof (obj.__prototype__) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\tif (obj === this)\n\t\t\t\treturn true;\n\t\t\tobj = obj.__prototype__;\n\t\t}\n\t},\n\n\t// equality comparison of objects defaults to identity comparison\n\t__eq__: function __eq__(other) {\n\t\treturn this === other;\n\t},\n\n\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t// ``__ne__`` will be synthesized from that\n\t__ne__: function __ne__(other) {\n\t\treturn !this.__eq__(other);\n\t},\n\n\t// For other comparison operators, each method has to be implemented:\n\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t// ``>=`` calls ``__ge__``\n\n\t__bool__: function __bool__() {\n\t\treturn true;\n\t}\n};\n\nul4.Signature = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create() {\n\t\t\tvar signature = ul4._clone(this);\n\t\t\tsignature.args = [];\n\t\t\tsignature.argNames = {};\n\t\t\tsignature.remargs = null;\n\t\t\tsignature.remkwargs = null;\n\n\t\t\tvar nextDefault = false;\n\t\t\tvar lastArgname = null;\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tvar argName = arguments[i];\n\t\t\t\tif (nextDefault) {\n\t\t\t\t\tsignature.args.push({ name: lastArgname, defaultValue: argName });\n\t\t\t\t\tsignature.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (argName.substr(argName.length - 1) === \"=\") {\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length - 1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tsignature.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tsignature.remargs = argName.substr(1);\n\t\t\t\t\telse {\n\t\t\t\t\t\tsignature.args.push({ name: argName });\n\t\t\t\t\t\tsignature.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn signature;\n\t\t},\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray: function bindArray(name, args, kwargs) {\n\t\t\tvar finalargs = [];\n\t\t\tvar decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\t\t\t\tif (i < args.length) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null) {\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length) {\n\t\t\t\t\tvar prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow ul4.ArgumentError.create(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null) {\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key]) {\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tvar remkwargs = {};\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tremkwargs[key] = kwargs[key];\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t},\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject: function bindObject(name, args, kwargs) {\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tvar argObject = {};\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\treturn this.toString();\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar v = [];\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t}\n);\n\n// Adds name and signature to a function/method and makes the method callable in templates\nul4.expose = function expose(signature, options, f) {\n\tif (typeof (f) === \"undefined\") {\n\t\tf = options;\n\t\toptions = {};\n\t}\n\tif (options.name)\n\t\tf._ul4_name = options.name;\n\tif (ul4._islist(signature))\n\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\tf._ul4_signature = signature;\n\tf._ul4_needsobject = options.needsobject || false;\n\tf._ul4_needscontext = options.needscontext || false;\n\n\treturn f;\n};\n\nul4.Context = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(vars) {\n\t\t\tif (vars === null || typeof (vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = vars;\n\t\t\tcontext.indents = [];\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars: function inheritvars() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = ul4._simpleclone(this.vars);\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent: function withindent(indent) {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tif (indent !== null) {\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput: function replaceoutput() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\tclone: function clone(vars) {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\toutput: function output(value) {\n\t\t\tthis._output.push(value);\n\t\t},\n\n\t\tgetoutput: function getoutput() {\n\t\t\treturn this._output.join(\"\");\n\t\t},\n\n\t\tget: function get(name) {\n\t\t\treturn this.vars[name];\n\t\t},\n\n\t\tset: function set(name, value) {\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t}\n);\n\n/// Exceptions\n\nul4.Exception = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Exception\",\n\t\t\"cause\": null,\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Exceptions used internally by UL4 for flow control\nul4.InternalException = ul4._inherit(ul4.Exception, {});\n\n// Control flow exceptions\nul4.ReturnException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ReturnException\",\n\n\t\tcreate: function create(result) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.result = result;\n\t\t\treturn exception;\n\t\t}\n\t}\n);\n\nul4.BreakException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.BreakException\"\n\t}\n);\n\nul4.ContinueException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ContinueException\"\n\t}\n);\n\n// Real exceptions raised by various parts of UL4\nul4.SyntaxError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.SyntaxError\"\n\t}\n);\n\nul4.LValueRequiredError = ul4._inherit(\n\tul4.SyntaxError,\n\t{\n\t\t__type__: \"ul4.LValueRequiredError\",\n\n\t\ttoString: function toString() {\n\t\t\treturn \"lvalue required!\";\n\t\t}\n\t}\n);\n\nul4.TypeError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.TypeError\",\n\n\t\tcreate: function create(operation, message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.operation = operation;\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ValueError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ValueError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ArgumentError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ArgumentError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\n/// Exception that wraps other exceptions while they bubble up the stack\nul4.LocationError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.LocationError\",\n\n\t\tcreate: function create(location, cause) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.location = location;\n\t\t\texception.cause = cause;\n\t\t\treturn exception;\n\t\t},\n\n\t\t_templateprefix: function (template) {\n\t\t\tvar out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tvar first = true;\n\t\t\twhile (template != null) {\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name !== null ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t},\n\n\t\t_template: function _template() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.template;\n\t\t\telse\n\t\t\t\treturn this.location.tag.template;\n\t\t},\n\n\t\t_outerpos: function _outerpos() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.pos;\n\t\t\telse {\n\t\t\t\tvar tag = this.location.tag;\n\t\t\t\tif (tag === null) // A top level template as no tag\n\t\t\t\t\treturn this.location.pos;\n\t\t\t\telse\n\t\t\t\t\treturn tag.pos;\n\t\t\t}\n\t\t},\n\n\t\t_innerpos: function _innerpos() {\n\t\t\treturn this.location.pos;\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar template = this._template();\n\t\t\tvar templateprefix = this._templateprefix(template);\n\t\t\tvar outerpos = this._outerpos();\n\t\t\tvar innerpos = this._innerpos();\n\n\t\t\tvar prefix = template.source.substring(outerpos.start, innerpos.start);\n\t\t\tvar code = template.source.substring(innerpos.start, innerpos.stop);\n\t\t\tvar suffix = template.source.substring(innerpos.stop, outerpos.stop);\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\t\t\tvar text = prefix + code + suffix;\n\t\t\tvar underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\t// find line numbers\n\t\t\tvar lineno = 1, colno = 1;\n\t\t\tfor (var i = 0; i < innerpos.start; ++i) {\n\t\t\t\tif (template.source[i] === \"\\n\") {\n\t\t\t\t\t++lineno;\n\t\t\t\t\tcolno = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++colno;\n\t\t\t}\n\n\t\t\tpos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + lineno + \"; col \" + colno;\n\n\t\t\treturn templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tcase \"template\":\n\t\t\t\t\treturn this._template;\n\t\t\t\tcase \"outerpos\":\n\t\t\t\t\treturn this._outerpos;\n\t\t\t\tcase \"innerpos\":\n\t\t\t\t\treturn this._innerpos;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n\n/// Classes for the syntax tree\nul4.AST = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(pos) {\n\t\t\tvar ast = ul4._clone(this);\n\t\t\tast.pos = pos;\n\t\t\treturn ast;\n\t\t},\n\t\t__str__: function __str__() {\n\t\t\tvar out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\tvar out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_handle_eval_modify: function _handle_eval_modify(context, operator, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t},\n\t\t_str: function _str(out) {\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this[this._ul4onattrs[i]]);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tthis[this._ul4onattrs[i]] = decoder.load();\n\t\t},\n\t\t__setitem__: function __setitem__(attrname, value) {\n\t\t\tthrow ul4.TypeError.create(\"mutate\", \"object is immutable\");\n\t\t},\n\t\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\t\t_ul4onattrs: [\"pos\"]\n\t}\n);\n\nul4.TextAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, pos) {\n\t\t\tvar text = ul4.AST.create.call(this, pos);\n\t\t\ttext.template = template;\n\t\t\treturn text;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"template\"]),\n\t\t_text: function _text() {\n\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.IndentAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\tcreate: function create(template, pos, text) {\n\t\t\tvar indent = ul4.TextAST.create.call(this, template, pos);\n\t\t\tindent._maketext(text);\n\t\t\treturn indent;\n\t\t},\n\t\t_maketext: function _maketext(text) {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tif (text === null)\n\t\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\telse\n\t\t\t\t\tthis.text = text;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.text = null;\n\t\t},\n\t\t_text: function _text() {\n\t\t\tif (this.text === null)\n\t\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\telse\n\t\t\t\treturn this.text;\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < context.indents.length; ++i)\n\t\t\t\tcontext.output(context.indents[i]);\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.TextAST.ul4ondump.call(this, encoder);\n\n\t\t\tif (this.text === this.template.source.substring(this.pos.start, this.pos.stop))\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this.text);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext(decoder.load());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.LineEndAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.Tag = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, tag, tagpos, codepos) {\n\t\t\tvar tago = ul4.AST.create.call(this, tagpos);\n\t\t\ttago.template = template;\n\t\t\ttago.tag = tag;\n\t\t\ttago.codepos = codepos;\n\t\t\ttago._maketext();\n\t\t\treturn tago;\n\t\t},\n\t\t_maketext: function _maketext() {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\tthis.code = this.template.source.substring(this.codepos.start, this.codepos.stop);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.text = null;\n\t\t\t\tthis.code = null;\n\t\t\t}\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.AST.ul4ondump.call(this, encoder);\n\t\t\tencoder.dump(this.template);\n\t\t\tencoder.dump(this.tag);\n\t\t\tencoder.dump(this.codepos);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\tthis.template = decoder.load();\n\t\t\tthis.tag = decoder.load();\n\t\t\tthis.codepos = decoder.load();\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext();\n\t\t}\n\t}\n);\n\nul4.CodeAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar code = ul4.AST.create.call(this, pos);\n\t\t\tcode.tag = tag;\n\t\t\treturn code;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"tag\"]),\n\t\t_str: function _str(out) {\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t}\n\t}\n);\n\nul4.ConstAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar constant = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tconstant.value = value;\n\t\t\treturn constant;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this.value;\n\t\t}\n\t}\n);\n\nul4.ItemArgBase = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_handle_eval_list: function _handle_eval_list(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_dict: function _handle_eval_dict(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_call: function _handle_eval_call(context, args, kwargs) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.SeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar seqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tseqitem.value = value;\n\t\t\treturn seqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t}\n);\n\n\nul4.UnpackSeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackseqitem.value = value;\n\t\t\treturn unpackseqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.DictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, key, value) {\n\t\t\tvar dictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tdictitem.key = key;\n\t\t\tdictitem.value = value;\n\t\t\treturn dictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"key\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar key = this.key._handle_eval(context);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tul4on._setmap(result, key, value);\n\t\t}\n\t}\n);\n\nul4.UnpackDictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackdictitem.item = item;\n\t\t\treturn unpackdictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item)\n\t\t\t\t\tul4on._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.PosArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t}\n);\n\nul4.KeywordArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, name, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.name = name;\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"name\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + this.name);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t}\n);\n\nul4.UnpackListArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\targs.push.apply(args, item);\n\t\t}\n\t}\n);\n\nul4.UnpackDictArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ListAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar list = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlist.items = [];\n\t\t\treturn list;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = [];\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_list(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ListCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.item = item;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = [];\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar dict = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tdict.items = [];\n\t\t\treturn dict;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._emptymap();\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_dict(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, key, value, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.key = key;\n\t\t\tlistcomp.value = value;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._emptymap();\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) {\n\t\t\t\t\tvar key = this.key._handle_eval(localcontext);\n\t\t\t\t\tvar value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar set = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tset.items = [];\n\t\t\treturn set;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_set(context, result);\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar setcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsetcomp.item = item;\n\t\t\tsetcomp.container = container;\n\t\t\tsetcomp.condition = condition;\n\t\t\treturn setcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.GenExprAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar genexp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tgenexp.item = item;\n\t\t\tgenexp.varname = varname;\n\t\t\tgenexp.container = container;\n\t\t\tgenexp.condition = condition;\n\t\t\treturn genexp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\t\t\tvar iter = ul4._iter(container);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar self = this;\n\n\t\t\tvar result = {\n\t\t\t\tnext: function () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tvar varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) {\n\t\t\t\t\t\t\tvar value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn { value: value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.VarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, name) {\n\t\t\tvar variable = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tvariable.name = name;\n\t\t\treturn variable;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"name\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this._get(context, this.name);\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthis._set(context, this.name, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t},\n\t\t_get: function _get(context, name) {\n\t\t\tvar result = context.get(name);\n\t\t\tif (typeof (result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t},\n\t\t_set: function _set(context, name, value) {\n\t\t\tcontext.set(name, value);\n\t\t},\n\t\t_modify: function _modify(context, operator, name, value) {\n\t\t\tvar newvalue = operator._ido(context.get(name), value)\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t}\n);\n\nul4.UnaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj) {\n\t\t\tvar unary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tunary.obj = obj;\n\t\t\treturn unary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t}\n);\n\n// Negation\nul4.NegAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\tif (obj !== null && typeof (obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t}\n);\n\n// Bitwise not\nul4.BitNotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn -obj - 1;\n\t\t}\n\t}\n);\n\n// Not\nul4.NotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t}\n);\n\n// If expression\nul4.IfAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, objif, objcond, objelse) {\n\t\t\tvar ifexpr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tifexpr.objif = objif;\n\t\t\tifexpr.objcond = objcond;\n\t\t\tifexpr.objelse = objelse;\n\t\t\treturn ifexpr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result;\n\t\t\tvar condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ReturnAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = this.obj._handle_eval(context);\n\t\t\tthrow ul4.ReturnException.create(result);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintXAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.BinaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj1, obj2) {\n\t\t\tvar binary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tbinary.obj1 = obj1;\n\t\t\tbinary.obj2 = obj2;\n\t\t\treturn binary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj1\", \"obj2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.type);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Item access and assignment: dict[key], list[index], string[index], color[index]\nul4.ItemAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t},\n\t\t_get: function _get(container, key) {\n\t\t\tif (typeof (container) === \"string\" || ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof (start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof (stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__getitem__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\treturn container[key];\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"[]\", ul4._type(container) + \" object is not subscriptable\");\n\t\t},\n\t\t_set: function _set(container, key, value) {\n\t\t\tif (ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop - start); // Remove old element\n\t\t\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.NotSubscriptableError.create(container);\n\t\t},\n\t\t_modify: function _modify(operator, container, key, value) {\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t}\n);\n\n// Identifty test operator ``is``\nul4.IsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t}\n);\n\n// Inverted tdentifty test operator ``is not``\nul4.IsNotAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t}\n);\n\n// Comparison operator ==\nul4.EQAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator !=\nul4.NEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <\nul4.LTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <=\nul4.LEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >\nul4.GTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >=\nul4.GEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Containment test: string in string, obj in list, key in dict, value in rgb\nul4.ContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\tif (typeof (obj) === \"string\" && typeof (container) === \"string\") {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container)) {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof (container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container)) {\n\t\t\t\tfor (var key in container) {\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container)) {\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"in\", ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t}\n);\n\n// Inverted containment test\nul4.NotContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\treturn !ul4.ContainsAST._do(obj, container);\n\t\t}\n\t}\n);\n\n// Addition: num + num, string + string\nul4.AddAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tvar result = [];\n\t\t\t\tul4._append(result, obj1);\n\t\t\t\tul4._append(result, obj2);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tul4._append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Substraction: num - num\nul4.SubAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t},\n\t\t_date_sub: function _date_sub(obj1, obj2) {\n\t\t\tvar swap = (obj2 > obj1);\n\n\t\t\tif (swap) {\n\t\t\t\tvar t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tvar year1 = obj1.getFullYear();\n\t\t\tvar yearday1 = ul4._yearday(obj1);\n\t\t\tvar year2 = obj2.getFullYear();\n\t\t\tvar yearday2 = ul4._yearday(obj2);\n\n\t\t\tvar diffdays = 0;\n\n\t\t\twhile (year1 > year2) {\n\t\t\t\tdiffdays += ul4._yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tvar hours1 = obj1.getHours();\n\t\t\tvar minutes1 = obj1.getMinutes();\n\t\t\tvar seconds1 = obj1.getSeconds();\n\t\t\tvar hours2 = obj2.getHours();\n\t\t\tvar minutes2 = obj2.getMinutes();\n\t\t\tvar seconds2 = obj2.getSeconds();\n\n\t\t\tvar diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tvar diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap) {\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Multiplication: num * num, int * str, str * int, int * list, list * int\nul4.MulAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1)) {\n\t\t\t\tif (typeof (obj2) === \"string\") {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2)) {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2)) {\n\t\t\t\tif (typeof (obj1) === \"string\") {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1)) {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2)) {\n\t\t\t\tif (obj2 > 0) {\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++])\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Truncating division\nul4.FloorDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"//\", ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// \"Real\" division\nul4.TrueDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn obj1 / obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Modulo\nul4.ModAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar div = Math.floor(obj1 / obj2);\n\t\t\tvar mod = obj1 - div * obj2;\n\n\t\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) {\n\t\t\t\tmod += obj2;\n\t\t\t\t--div;\n\t\t\t}\n\t\t\treturn obj1 - div * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise left shift\nul4.ShiftLeftAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise right shift\nul4.ShiftRightAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise and\nul4.BitAndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise exclusive or\nul4.BitXOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise or\nul4.BitOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\nul4.AndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.OrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.AttrAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, attrname) {\n\t\t\tvar attr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tattr.obj = obj;\n\t\t\tattr.attrname = attrname;\n\t\t\treturn attr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"attrname\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t},\n\t\t_get: function _get(object, attrname) {\n\t\t\tif (typeof (object) === \"string\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\treturn ul4.expose([\"old\", \"new\", \"count=\", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); });\n\t\t\t\t\tcase \"strip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function strip(chars) { return ul4._strip(object, chars); });\n\t\t\t\t\tcase \"lstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function lstrip(chars) { return ul4._lstrip(object, chars); });\n\t\t\t\t\tcase \"rstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function rstrip(chars) { return ul4._rstrip(object, chars); });\n\t\t\t\t\tcase \"split\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function split(sep, count) { return ul4._split(object, sep, count); });\n\t\t\t\t\tcase \"rsplit\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); });\n\t\t\t\t\tcase \"splitlines\":\n\t\t\t\t\t\treturn ul4.expose([\"keepends=\", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); });\n\t\t\t\t\tcase \"lower\":\n\t\t\t\t\t\treturn ul4.expose([], function lower() { return object.toLowerCase(); });\n\t\t\t\t\tcase \"upper\":\n\t\t\t\t\t\treturn ul4.expose([], function upper() { return object.toUpperCase(); });\n\t\t\t\t\tcase \"capitalize\":\n\t\t\t\t\t\treturn ul4.expose([], function capitalize() { return ul4._capitalize(object); });\n\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\treturn ul4.expose([\"iterable\"], function join(iterable) { return ul4._join(object, iterable); });\n\t\t\t\t\tcase \"startswith\":\n\t\t\t\t\t\treturn ul4.expose([\"prefix\"], function startswith(prefix) { return ul4._startswith(object, prefix); });\n\t\t\t\t\tcase \"endswith\":\n\t\t\t\t\t\treturn ul4.expose([\"suffix\"], function endswith(suffix) { return ul4._endswith(object, suffix); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._islist(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"append\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function append(items) { return ul4._append(object, items); });\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\treturn ul4.expose([\"pos\", \"*items\"], function insert(pos, items) { return ul4._insert(object, pos, items); });\n\t\t\t\t\tcase \"pop\":\n\t\t\t\t\t\treturn ul4.expose([\"pos=\", -1], function pop(pos) { return ul4._pop(object, pos); });\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isdate(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"weekday\":\n\t\t\t\t\t\treturn ul4.expose([], function weekday() { return ul4._weekday(object); });\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\treturn ul4.expose([\"firstweekday=\", null], function week(firstweekday) { return ul4._week(object, firstweekday); });\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\treturn ul4.expose([], function day() { return object.getDate(); });\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\treturn ul4.expose([], function month() { return object.getMonth() + 1; });\n\t\t\t\t\tcase \"year\":\n\t\t\t\t\t\treturn ul4.expose([], function year() { return object.getFullYear(); });\n\t\t\t\t\tcase \"hour\":\n\t\t\t\t\t\treturn ul4.expose([], function hour() { return object.getHours(); });\n\t\t\t\t\tcase \"minute\":\n\t\t\t\t\t\treturn ul4.expose([], function minute() { return object.getMinutes(); });\n\t\t\t\t\tcase \"second\":\n\t\t\t\t\t\treturn ul4.expose([], function second() { return object.getSeconds(); });\n\t\t\t\t\tcase \"microsecond\":\n\t\t\t\t\t\treturn ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; });\n\t\t\t\t\tcase \"mimeformat\":\n\t\t\t\t\t\treturn ul4.expose([], function mimeformat() { return ul4._mimeformat(object); });\n\t\t\t\t\tcase \"isoformat\":\n\t\t\t\t\t\treturn ul4.expose([], function isoformat() { return ul4._isoformat(object); });\n\t\t\t\t\tcase \"yearday\":\n\t\t\t\t\t\treturn ul4.expose([], function yearday() { return ul4._yearday(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn object.get(attrname);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isset(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Object.prototype.toString.call(object) === \"[object Object]\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar result;\n\t\t\t\t\t\tif (object && typeof (object.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\t\t\t\tresult = object.__getattr__(attrname);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult = object[attrname];\n\t\t\t\t\t\tif (typeof (result) !== \"function\")\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\tvar realresult = function () {\n\t\t\t\t\t\t\treturn result.apply(object, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\t\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\t\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\t\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\t\t\t\treturn realresult;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"get\", ul4._type(object) + \" object has no readable attributes\");\n\t\t},\n\t\t_set: function _set(object, attrname, value) {\n\t\t\tif (typeof (object) === \"object\" && typeof (object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value)\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"set\", ul4._type(object) + \" object has no writable attributes\");\n\t\t},\n\t\t_modify: function _modify(operator, object, attrname, value) {\n\t\t\tvar oldvalue = this._get(object, attrname);\n\t\t\tvar newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t}\n);\n\nul4.CallAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar call = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tcall.obj = obj;\n\t\t\tcall.args = args;\n\t\t\treturn call;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"args\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_makeargs: function _makeargs(context) {\n\t\t\tvar args = [], kwargs = {};\n\t\t\tfor (var i = 0; i < this.args.length; ++i)\n\t\t\t\tthis.args[i]._handle_eval_call(context, args, kwargs);\n\t\t\treturn { args: args, kwargs: kwargs };\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar args = this._makeargs(context);\n\t\t\tvar result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.RenderAST = ul4._inherit(\n\tul4.CallAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar render = ul4.CallAST.create.call(this, tag, pos, obj, args);\n\t\t\trender.indent = null;\n\t\t\treturn render;\n\t\t},\n\t\t_ul4onattrs: ul4.CallAST._ul4onattrs.concat([\"indent\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null) {\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent._text()));\n\t\t\t}\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\tvar localcontext = context.withindent(this.indent !== null ? this.indent._text() : null);\n\t\t\tvar obj = this.obj._handle_eval(localcontext);\n\t\t\tvar args = this._makeargs(localcontext);\n\n\t\t\ttry {\n\t\t\t\tvar result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Slice object\nul4.slice = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(start, stop) {\n\t\t\tvar slice = ul4._clone(this);\n\t\t\tslice.start = start;\n\t\t\tslice.stop = stop;\n\t\t\treturn slice;\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \")\";\n\t\t}\n\t}\n);\n\n\n// List/String slice\nul4.SliceAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, index1, index2) {\n\t\t\tvar slice = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tslice.index1 = index1;\n\t\t\tslice.index2 = index2;\n\t\t\treturn slice;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"index1\", \"index2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tvar index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn ul4.slice.create(index1, index2);\n\t\t}\n\t}\n);\n\n\nul4.SetVarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, lvalue, value) {\n\t\t\tvar changevar = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tchangevar.lvalue = lvalue;\n\t\t\tchangevar.value = value;\n\t\t\treturn changevar;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"lvalue\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_set(context, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ModifyVarAST = ul4._inherit(\n\tul4.SetVarAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_modify(context, this._operator, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST });\n\nul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST });\n\nul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST });\n\nul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST });\n\nul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST });\n\nul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST });\n\nul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST });\n\nul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST });\n\nul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST });\n\nul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST });\n\nul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST });\n\nul4.BlockAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar block = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tblock.endtag = null;\n\t\t\tblock.content = [];\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"endtag\", \"content\"]),\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i)\n\t\t\t\tthis.content[i]._handle_eval(context);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tif (this.content.length) {\n\t\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\t\tthis.content[i]._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ForBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, varname, container) {\n\t\t\tvar for_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tfor_.varname = varname;\n\t\t\tfor_.container = container;\n\t\t\treturn for_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"varname\", \"container\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str_varname: function _str_varname(out, varname) {\n\t\t\tif (ul4._islist(varname)) {\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (var i = 0; i < varname.length; ++i) {\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(context, varitems[i][1]);\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.WhileBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar while_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\twhile_.condition = condition;\n\t\t\treturn while_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \"),\n\t\t\t\tthis.container._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\twhile (true) {\n\t\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \");\n\t\t\tul4.AST._str.call(this, out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.BreakAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.BreakException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.ContinueAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.ContinueException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.CondBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\tvar block = this.content[i];\n\t\t\t\tvar execute = block._execute(context);\n\t\t\t\tif (execute) {\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ConditionalBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar block = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tblock.condition = condition;\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\tvar result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"if\" });\n\nul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"else if\" });\n\nul4.ElseBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\"),\n\t\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\treturn true;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.Template = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) {\n\t\t\tvar template = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\ttemplate.source = source;\n\t\t\ttemplate.name = name;\n\t\t\ttemplate.whitespace = whitespace;\n\t\t\ttemplate.startdelim = startdelim;\n\t\t\ttemplate.enddelim = enddelim;\n\t\t\ttemplate.docpos = null;\n\t\t\ttemplate.signature = signature;\n\t\t\ttemplate._jsfunction = null;\n\t\t\ttemplate._asts = null;\n\t\t\ttemplate._ul4_callsignature = signature;\n\t\t\ttemplate._ul4_rendersignature = signature;\n\t\t\ttemplate.parenttemplate = null;\n\t\t\treturn template;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tvar signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this.source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || ul4.SignatureAST.isprotoof(this.signature))\n\t\t\t\tsignature = this.signature;\n\t\t\telse {\n\t\t\t\tsignature = [];\n\t\t\t\tfor (var i = 0; i < this.signature.args.length; ++i) {\n\t\t\t\t\tvar arg = this.signature.args[i];\n\t\t\t\t\tif (typeof (arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name + \"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tul4.BlockAST.ul4ondump.call(this, encoder);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tvar version = decoder.load();\n\t\t\tvar signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow ul4.ValueError.create(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow ul4.ValueError.create(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\t\t\tthis.name = decoder.load();\n\t\t\tthis.source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tul4.BlockAST.ul4onload.call(this, decoder);\n\t\t},\n\t\tloads: function loads(string) {\n\t\t\treturn ul4on.loads(string);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tvar closure = ul4.TemplateClosure.create(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\") {\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\tvar localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t},\n\t\trenders: function renders(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t},\n\t\tdoc: function doc() {\n\t\t\treturn this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null;\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"tag\":\n\t\t\t\t\treturn this.tag;\n\t\t\t\tcase \"endtag\":\n\t\t\t\t\treturn this.endtag;\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\t_callbound: function _callbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcall: function call(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__type__: \"ul4.Template\" // used by ``istemplate()``\n\t}\n);\n\nul4.SignatureAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar signature = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsignature.params = [];\n\t\t\treturn signature;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.CodeAST.ul4ondump.call(this, encoder);\n\n\t\t\tvar dump = [];\n\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.AST.ul4onload.call(this, decoder);\n\t\t\tvar dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (var i = 0; i < dump.length; ++i) {\n\t\t\t\tvar param = dump[i];\n\t\t\t\tif (typeof (param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar args = [];\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse {\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ul4.Signature.create.apply(ul4.Signature, args);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t}\n);\n\nul4.TemplateClosure = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(template, signature, vars) {\n\t\t\tvar closure = ul4._clone(this);\n\t\t\tclosure.template = template;\n\t\t\tclosure.signature = signature;\n\t\t\tclosure.vars = vars;\n\t\t\tclosure._ul4_callsignature = signature;\n\t\t\tclosure._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tclosure.name = template.name;\n\t\t\tclosure.tag = template.tag;\n\t\t\tclosure.endtag = template.endtag;\n\t\t\tclosure.source = template.source;\n\t\t\tclosure.startdelim = template.startdelim;\n\t\t\tclosure.enddelim = template.enddelim;\n\t\t\tclosure.docpos = template.docpos;\n\t\t\tclosure.content = template.content;\n\t\t\treturn closure;\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this.template._callbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\treturn this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t},\n\t\t__type__: \"ul4.TemplateClosure\" // used by ``istemplate()``\n\t}\n);\n\n// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\nul4._rgb = function _rgb(r, g, b, a) {\n\treturn this.Color.create(255 * r, 255 * g, 255 * b, 255 * a);\n};\n\n// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\nul4._xmlescape = function _xmlescape(obj) {\n\tobj = ul4._str(obj);\n\tobj = obj.replace(/&/g, \"&\");\n\tobj = obj.replace(//g, \">\");\n\tobj = obj.replace(/'/g, \"'\");\n\tobj = obj.replace(/\"/g, \""\");\n\treturn obj;\n};\n\n// Convert ``obj`` to a string suitable for output into a CSV file\nul4._csv = function _csv(obj) {\n\tif (obj === null)\n\t\treturn \"\";\n\telse if (typeof (obj) !== \"string\")\n\t\tobj = ul4._repr(obj);\n\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\treturn obj;\n};\n\n// Return a string containing one character with the codepoint ``i``\nul4._chr = function _chr(i) {\n\tif (typeof (i) != \"number\")\n\t\tthrow ul4.TypeError.create(\"chr()\", \"chr() requires an int\");\n\treturn String.fromCharCode(i);\n};\n\n// Return the codepoint for the one and only character in the string ``c``\nul4._ord = function _ord(c) {\n\tif (typeof (c) != \"string\" || c.length != 1)\n\t\tthrow ul4.TypeError.create(\"ord()\", \"ord() requires a string of length 1\");\n\treturn c.charCodeAt(0);\n};\n\n// Convert an integer to a hexadecimal string\nul4._hex = function _hex(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"hex()\", \"hex() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0x\" + number.toString(16).substr(1);\n\telse\n\t\treturn \"0x\" + number.toString(16);\n};\n\n// Convert an integer to a octal string\nul4._oct = function _oct(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"oct()\", \"oct() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0o\" + number.toString(8).substr(1);\n\telse\n\t\treturn \"0o\" + number.toString(8);\n};\n\n// Convert an integer to a binary string\nul4._bin = function _bin(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"bin()\", \"bin() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0b\" + number.toString(2).substr(1);\n\telse\n\t\treturn \"0b\" + number.toString(2);\n};\n\n// Return the minimum value\nul4._min = function _min(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"min() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"min() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value < result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the maximum value\nul4._max = function _max(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"max() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"max() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value > result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the of the values from the iterable starting with ``start`` (default ``0``)\nul4._sum = function _sum(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tstart += item.value;\n\t}\n\treturn start;\n};\n\n// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._first = function _first(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar item = ul4._iter(iterable).next();\n\treturn item.done ? defaultValue : item.value;\n};\n\n// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._last = function _last(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar value = defaultValue;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tvalue = item.value;\n\t}\n\treturn value;\n};\n\n// Return a sorted version of ``iterable``\nul4._sorted = function _sorted(context, iterable, key, reverse) {\n\tvar cmp;\n\tif (key === null) {\n\t\t// FIXME: stability\n\t\tif (reverse) {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\tvar result = ul4._list(iterable);\n\t\tresult.sort(cmp);\n\t\treturn result;\n\t}\n\telse {\n\t\tvar sort = [];\n\n\t\tfor (var i = 0, iter = ul4._iter(iterable); ; ++i) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvar keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\tsort.push([keyvalue, i, item.value]);\n\t\t}\n\t\tcmp = function cmp(s1, s2) {\n\t\t\tvar res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\tif (res)\n\t\t\t\treturn reverse ? -res : res;\n\t\t\tres = ul4._cmp(s1[1], s2[1]);\n\t\t\treturn reverse ? -res : res;\n\t\t}\n\n\t\tsort.sort(cmp);\n\n\t\tvar result = [];\n\t\tfor (var i = 0; i < sort.length; ++i) {\n\t\t\tresult.push(sort[i][2]);\n\t\t}\n\t\treturn result;\n\t}\n};\n\n// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step``\nul4._range = function _range(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required range() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar lower, higher;\n\tif (step === 0)\n\t\tthrow ul4.ValueError.create(\"range() requires a step argument != 0\");\n\telse if (step > 0) {\n\t\tlower = start;\n\t\theigher = stop;\n\t}\n\telse {\n\t\tlower = stop;\n\t\theigher = start;\n\t}\n\tvar length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0;\n\n\treturn {\n\t\tindex: 0,\n\t\tnext: function () {\n\t\t\tif (this.index >= length)\n\t\t\t\treturn { done: true };\n\t\t\treturn { value: start + (this.index++) * step, done: false };\n\t\t}\n\t};\n};\n\n// Return a iterable object returning a slice from the argument\nul4._slice = function _slice(args) {\n\tvar iterable, start, stop, step;\n\tif (args.length < 2)\n\t\tthrow ul4.ArgumentError.create(\"required slice() argument missing\");\n\telse if (args.length > 4)\n\t\tthrow ul4.ArgumentError.create(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 2) {\n\t\titerable = args[0];\n\t\tstart = 0;\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 4) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = args[3] !== null ? args[3] : 1;\n\t}\n\tif (start < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a start argument >= 0\");\n\tif (stop < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a stop argument >= 0\");\n\tif (step <= 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a step argument > 0\");\n\n\tvar next = start, count = 0;\n\tvar iter = ul4._iter(iterable);\n\treturn {\n\t\tnext: function () {\n\t\t\tvar result;\n\t\t\twhile (count < next) {\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t}\n\t\t\tif (stop !== null && count >= stop)\n\t\t\t\treturn { done: true };\n\t\t\tresult = iter.next();\n\t\t\tif (result.done)\n\t\t\t\treturn result;\n\t\t\t++count;\n\t\t\tnext += step;\n\t\t\tif (stop !== null && next > stop)\n\t\t\t\tnext = stop;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// ``%`` escape unsafe characters in the string ``string``\nul4._urlquote = function _urlquote(string) {\n\treturn encodeURIComponent(string);\n};\n\n// The inverse function of ``urlquote``\nul4._urlunquote = function _urlunquote(string) {\n\treturn decodeURIComponent(string);\n};\n\n// Return a reverse iterator over ``sequence``\nul4._reversed = function _reversed(sequence) {\n\tif (typeof (sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\tsequence = ul4._list(sequence);\n\treturn {\n\t\tindex: sequence.length - 1,\n\t\tnext: function () {\n\t\t\treturn this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true };\n\t\t}\n\t};\n};\n\n// Returns a random number in the interval ``[0;1[``\nul4._random = function _random() {\n\treturn Math.random();\n};\n\n// Return a randomly select item from ``range(start, stop, step)``\nul4._randrange = function _randrange(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required randrange() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar width = stop - start;\n\n\tvar value = Math.random();\n\n\tvar n;\n\tif (step > 0)\n\t\tn = Math.floor((width + step - 1) / step);\n\telse if (step < 0)\n\t\tn = Math.floor((width + step + 1) / step);\n\telse\n\t\tthrow ul4.ValueError.create(\"randrange() requires a step argument != 0\");\n\treturn start + step * Math.floor(value * n);\n};\n\n// Return a random item/char from the list/string ``sequence``\nul4._randchoice = function _randchoice(sequence) {\n\tvar iscolor = ul4._iscolor(sequence);\n\tif (typeof (sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\tthrow ul4.TypeError.create(\"randchoice() requires a string or list\");\n\tif (iscolor)\n\t\tsequence = ul4._list(sequence);\n\treturn sequence[Math.floor(Math.random() * sequence.length)];\n};\n\n// Round a number ``x`` to ``digits`` decimal places (may be negative)\nul4._round = function _round(x, digits) {\n\tif (typeof (digits) === \"undefined\")\n\t\tdigits = 0;\n\tif (digits) {\n\t\tvar threshhold = Math.pow(10, digits);\n\t\treturn Math.round(x * threshhold) / threshhold;\n\t}\n\telse\n\t\treturn Math.round(x);\n};\n\n// Return a hex-encode MD5 hash of the argument\n// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5\nul4._md5 = function _md5(string) {\n\treturn md5(string);\n};\n\n// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\nul4._enumerate = function _enumerate(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\treturn {\n\t\titer: ul4._iter(iterable),\n\t\tindex: start,\n\t\tnext: function () {\n\t\t\tvar item = this.iter.next();\n\t\t\treturn item.done ? item : { value: [this.index++, item.value], done: false };\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\nul4._isfirst = function _isfirst(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\treturn {\n\t\tnext: function () {\n\t\t\tvar item = iter.next();\n\t\t\tvar result = item.done ? item : { value: [isfirst, item.value], done: false };\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\nul4._islast = function _islast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._isfirstlast = function _isfirstlast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._enumfl = function _enumfl(iterable, start) {\n\tvar iter = ul4._iter(iterable);\n\tvar i = start;\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [i++, isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\nul4._zip = function _zip(iterables) {\n\tvar result;\n\tif (iterables.length) {\n\t\tvar iters = [];\n\t\tfor (var i = 0; i < iterables.length; ++i)\n\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tvar items = [];\n\t\t\t\tfor (var i = 0; i < iters.length; ++i) {\n\t\t\t\t\tvar item = iters[i].next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\treturn item;\n\t\t\t\t\titems.push(item.value);\n\t\t\t\t}\n\t\t\t\treturn { value: items, done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n};\n\n// Return the absolute value for the number ``number``\nul4._abs = function _abs(number) {\n\tif (number !== null && typeof (number.__abs__) === \"function\")\n\t\treturn number.__abs__();\n\treturn Math.abs(number);\n};\n\n// Return a ``Date`` object from the arguments passed in\nul4._date = function _date(year, month, day, hour, minute, second, microsecond) {\n\tif (typeof (hour) === \"undefined\")\n\t\thour = 0;\n\n\tif (typeof (minute) === \"undefined\")\n\t\tminute = 0;\n\n\tif (typeof (second) === \"undefined\")\n\t\tsecond = 0;\n\n\tif (typeof (microsecond) === \"undefined\")\n\t\tmicrosecond = 0;\n\n\treturn new Date(year, month - 1, day, hour, minute, second, microsecond / 1000);\n};\n\n// Return a ``TimeDelta`` object from the arguments passed in\nul4._timedelta = function _timedelta(days, seconds, microseconds) {\n\treturn this.TimeDelta.create(days, seconds, microseconds);\n};\n\n// Return a ``MonthDelta`` object from the arguments passed in\nul4._monthdelta = function _monthdelta(months) {\n\treturn this.MonthDelta.create(months);\n};\n\n// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\nul4._hls = function _hls(h, l, s, a) {\n\tvar _v = function (m1, m2, hue) {\n\t\thue = hue % 1.0;\n\t\tif (hue < 1 / 6)\n\t\t\treturn m1 + (m2 - m1) * hue * 6.0;\n\t\telse if (hue < 0.5)\n\t\t\treturn m2;\n\t\telse if (hue < 2 / 3)\n\t\t\treturn m1 + (m2 - m1) * (2 / 3 - hue) * 6.0;\n\t\treturn m1;\n\t};\n\n\tvar m1, m2;\n\tif (typeof (a) === \"undefined\")\n\t\ta = 1;\n\tif (s === 0.0)\n\t\treturn ul4._rgb(l, l, l, a);\n\tif (l <= 0.5)\n\t\tm2 = l * (1.0 + s);\n\telse\n\t\tm2 = l + s - (l * s);\n\tm1 = 2.0 * l - m2;\n\treturn ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a);\n};\n\n// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\nul4._hsv = function _hsv(h, s, v, a) {\n\tif (s === 0.0)\n\t\treturn ul4._rgb(v, v, v, a);\n\tvar i = Math.floor(h * 6.0);\n\tvar f = (h * 6.0) - i;\n\tvar p = v * (1.0 - s);\n\tvar q = v * (1.0 - s * f);\n\tvar t = v * (1.0 - s * (1.0 - f));\n\tswitch (i % 6) {\n\t\tcase 0:\n\t\t\treturn ul4._rgb(v, t, p, a);\n\t\tcase 1:\n\t\t\treturn ul4._rgb(q, v, p, a);\n\t\tcase 2:\n\t\t\treturn ul4._rgb(p, v, t, a);\n\t\tcase 3:\n\t\t\treturn ul4._rgb(p, q, v, a);\n\t\tcase 4:\n\t\t\treturn ul4._rgb(t, p, v, a);\n\t\tcase 5:\n\t\t\treturn ul4._rgb(v, p, q, a);\n\t}\n};\n\n// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\nul4._get = function _get(container, key, defaultvalue) {\n\tif (ul4._ismap(container)) {\n\t\tif (container.has(key))\n\t\t\treturn container.get(key);\n\t\treturn defaultvalue;\n\t}\n\telse if (ul4._isobject(container)) {\n\t\tvar result = container[key];\n\t\tif (typeof (result) === \"undefined\")\n\t\t\treturn defaultvalue;\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"get()\", \"get() requires a dict\");\n};\n\n// Return a ``Date`` object for the current time\nul4.now = function now() {\n\treturn new Date();\n};\n\n// Return a ``Date`` object for the current time in UTC\nul4.utcnow = function utcnow() {\n\tvar now = new Date();\n\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n};\n\nul4.functions = {\n\trepr: ul4.expose([\"obj\"], { name: \"repr\" }, ul4._repr),\n\tascii: ul4.expose([\"obj\"], { name: \"ascii\" }, ul4._ascii),\n\tstr: ul4.expose([\"obj=\", \"\"], { name: \"str\" }, ul4._str),\n\tint: ul4.expose([\"obj=\", 0, \"base=\", null], { name: \"int\" }, ul4._int),\n\tfloat: ul4.expose([\"obj=\", 0.0], { name: \"float\" }, ul4._float),\n\tlist: ul4.expose([\"iterable=\", []], { name: \"list\" }, ul4._list),\n\tset: ul4.expose([\"iterable=\", []], { name: \"set\" }, ul4._set),\n\tbool: ul4.expose([\"obj=\", false], { name: \"bool\" }, ul4._bool),\n\tlen: ul4.expose([\"sequence\"], { name: \"len\" }, ul4._len),\n\ttype: ul4.expose([\"obj\"], { name: \"type\" }, ul4._type),\n\tformat: ul4.expose([\"obj\", \"fmt\", \"lang=\", null], { name: \"format\" }, ul4._format),\n\tany: ul4.expose([\"iterable\"], { name: \"any\" }, ul4._any),\n\tall: ul4.expose([\"iterable\"], { name: \"all\" }, ul4._all),\n\tzip: ul4.expose([\"*iterables\"], { name: \"zip\" }, ul4._zip),\n\tisundefined: ul4.expose([\"obj\"], { name: \"isundefined\" }, ul4._isundefined),\n\tisdefined: ul4.expose([\"obj\"], { name: \"isdefined\" }, ul4._isdefined),\n\tisnone: ul4.expose([\"obj\"], { name: \"isnone\" }, ul4._isnone),\n\tisbool: ul4.expose([\"obj\"], { name: \"isbool\" }, ul4._isbool),\n\tisint: ul4.expose([\"obj\"], { name: \"isint\" }, ul4._isint),\n\tisfloat: ul4.expose([\"obj\"], { name: \"isfloat\" }, ul4._isfloat),\n\tisstr: ul4.expose([\"obj\"], { name: \"isstr\" }, ul4._isstr),\n\tisdate: ul4.expose([\"obj\"], { name: \"isdate\" }, ul4._isdate),\n\tiscolor: ul4.expose([\"obj\"], { name: \"iscolor\" }, ul4._iscolor),\n\tistimedelta: ul4.expose([\"obj\"], { name: \"istimedelta\" }, ul4._istimedelta),\n\tismonthdelta: ul4.expose([\"obj\"], { name: \"ismonthdelta\" }, ul4._ismonthdelta),\n\tistemplate: ul4.expose([\"obj\"], { name: \"istemplate\" }, ul4._istemplate),\n\tisfunction: ul4.expose([\"obj\"], { name: \"isfunction\" }, ul4._isfunction),\n\tislist: ul4.expose([\"obj\"], { name: \"islist\" }, ul4._islist),\n\tisset: ul4.expose([\"obj\"], { name: \"isset\" }, ul4on._haveset ? ul4._isset : ul4._isul4set),\n\tisdict: ul4.expose([\"obj\"], { name: \"isdict\" }, ul4._isdict),\n\tisexception: ul4.expose([\"obj\"], { name: \"isexception\" }, ul4._isexception),\n\tasjson: ul4.expose([\"obj\"], { name: \"asjson\" }, ul4._asjson),\n\tfromjson: ul4.expose([\"string\"], { name: \"fromjson\" }, ul4._fromjson),\n\tasul4on: ul4.expose([\"obj\"], { name: \"asul4on\" }, ul4._asul4on),\n\tfromul4on: ul4.expose([\"string\"], { name: \"fromul4on\" }, ul4._fromul4on),\n\tnow: ul4.expose([], ul4.now),\n\tutcnow: ul4.expose([], ul4.utcnow),\n\tenumerate: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumerate\" }, ul4._enumerate),\n\tisfirst: ul4.expose([\"iterable\"], { name: \"isfirst\" }, ul4._isfirst),\n\tislast: ul4.expose([\"iterable\"], { name: \"islast\" }, ul4._islast),\n\tisfirstlast: ul4.expose([\"iterable\"], { name: \"isfirstlast\" }, ul4._isfirstlast),\n\tenumfl: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumfl\" }, ul4._enumfl),\n\tabs: ul4.expose([\"number\"], { name: \"abs\" }, ul4._abs),\n\tdate: ul4.expose([\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], { name: \"date\" }, ul4._date),\n\ttimedelta: ul4.expose([\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], { name: \"timedelta\" }, ul4._timedelta),\n\tmonthdelta: ul4.expose([\"months=\", 0], { name: \"monthdelta\" }, ul4._monthdelta),\n\trgb: ul4.expose([\"r\", \"g\", \"b\", \"a=\", 1.0], { name: \"rgb\" }, ul4._rgb),\n\thls: ul4.expose([\"h\", \"l\", \"s\", \"a=\", 1.0], { name: \"hls\" }, ul4._hls),\n\thsv: ul4.expose([\"h\", \"s\", \"v\", \"a=\", 1.0], { name: \"hsv\" }, ul4._hsv),\n\txmlescape: ul4.expose([\"obj\"], { name: \"xmlescape\" }, ul4._xmlescape),\n\tcsv: ul4.expose([\"obj\"], { name: \"csv\" }, ul4._csv),\n\tchr: ul4.expose([\"i\"], { name: \"chr\" }, ul4._chr),\n\tord: ul4.expose([\"c\"], { name: \"ord\" }, ul4._ord),\n\thex: ul4.expose([\"number\"], { name: \"hex\" }, ul4._hex),\n\toct: ul4.expose([\"number\"], { name: \"oct\" }, ul4._oct),\n\tbin: ul4.expose([\"number\"], { name: \"bin\" }, ul4._bin),\n\tmin: ul4.expose([\"*obj\"], { name: \"min\" }, ul4._min),\n\tmax: ul4.expose([\"*obj\"], { name: \"max\" }, ul4._max),\n\tsum: ul4.expose([\"iterable\", \"start=\", 0], { name: \"sum\" }, ul4._sum),\n\tfirst: ul4.expose([\"iterable\", \"default=\", null], { name: \"first\" }, ul4._first),\n\tlast: ul4.expose([\"iterable\", \"default=\", null], { name: \"last\" }, ul4._last),\n\tsorted: ul4.expose([\"iterable\", \"key=\", null, \"reverse=\", false], { name: \"sorted\", needscontext: true }, ul4._sorted),\n\trange: ul4.expose([\"*args\"], { name: \"range\" }, ul4._range),\n\tslice: ul4.expose([\"*args\"], { name: \"slice\" }, ul4._slice),\n\turlquote: ul4.expose([\"string\"], { name: \"urlquote\" }, ul4._urlquote),\n\turlunquote: ul4.expose([\"string\"], { name: \"urlunquote\" }, ul4._urlunquote),\n\treversed: ul4.expose([\"sequence\"], { name: \"reversed\" }, ul4._reversed),\n\trandom: ul4.expose([], { name: \"random\" }, ul4._random),\n\trandrange: ul4.expose([\"*args\"], { name: \"randrange\" }, ul4._randrange),\n\trandchoice: ul4.expose([\"sequence\"], { name: \"randchoice\" }, ul4._randchoice),\n\tround: ul4.expose([\"x\", \"digit=\", 0], { name: \"round\" }, ul4._round),\n\tmd5: ul4.expose([\"string\"], { name: \"md5\" }, ul4._md5)\n};\n\n// Functions implementing UL4 methods\nul4._replace = function _replace(string, old, new_, count) {\n\tif (count === null)\n\t\tcount = string.length;\n\n\tvar result = [];\n\twhile (string.length) {\n\t\tvar pos = string.indexOf(old);\n\t\tif (pos === -1 || !count--) {\n\t\t\tresult.push(string);\n\t\t\tbreak;\n\t\t}\n\t\tresult.push(string.substr(0, pos));\n\t\tresult.push(new_);\n\t\tstring = string.substr(pos + old.length);\n\t}\n\treturn result.join(\"\");\n};\n\nul4._strip = function _strip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"strip()\", \"strip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._lstrip = function _lstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"lstrip()\", \"lstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\treturn string;\n};\n\nul4._rstrip = function _rstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rstrip()\", \"rstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._split = function _split(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"split()\", \"split() requires a string\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.indexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.push(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(string.substr(0, pos));\n\t\t\t\tstring = string.substr(pos + sep.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._lstrip(string, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.push(part);\n\t\t\t\tstring = string.substr(part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._rsplit = function _rsplit(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rsplit()\", \"rsplit() requires a string as second argument\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.lastIndexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.unshift(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.unshift(string.substr(pos + sep.length));\n\t\t\t\tstring = string.substr(0, pos);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._rstrip(string, null, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse {\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\tpart = part[part.length - 1];\n\t\t\t\t}\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.unshift(part);\n\t\t\t\tstring = string.substr(0, string.length - part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._splitlines = function _splitlines(string, keepends) {\n\tvar lookingAtLineEnd = function lookingAtLineEnd() {\n\t\tvar c = string[pos];\n\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\treturn 1;\n\t\tif (c === '\\r') {\n\t\t\tif (pos == length - 1)\n\t\t\t\treturn 1;\n\t\t\tif (string[pos + 1] === '\\n')\n\t\t\t\treturn 2;\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tvar result = [], length = string.length;\n\n\tfor (var pos = 0, startpos = 0; ;) {\n\t\tif (pos >= length) {\n\t\t\tif (startpos != pos)\n\t\t\t\tresult.push(string.substring(startpos));\n\t\t\treturn result;\n\t\t}\n\t\tvar lineendlen = lookingAtLineEnd();\n\t\tif (!lineendlen)\n\t\t\t++pos;\n\t\telse {\n\t\t\tvar endpos = pos + (keepends ? lineendlen : 0);\n\t\t\tresult.push(string.substring(startpos, endpos));\n\t\t\tpos += lineendlen;\n\t\t\tstartpos = pos;\n\t\t}\n\t}\n};\n\nul4._count = function _count(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\n\tvar isstr = ul4._isstr(obj);\n\n\tif (isstr && !sub.length) {\n\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\treturn 0;\n\t\tvar result = end - start + 1;\n\t\tif (result > obj.length + 1)\n\t\t\tresult = obj.length + 1;\n\t\treturn result;\n\t}\n\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tvar count = 0;\n\tif (ul4._islist(obj)) {\n\t\tfor (var i = start; i < end; ++i) {\n\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t++count;\n\t\t}\n\t\treturn count;\n\t}\n\telse // string\n\t{\n\t\tvar lastIndex = start;\n\n\t\tfor (; ;) {\n\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\tif (lastIndex == -1)\n\t\t\t\tbreak;\n\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\tbreak;\n\t\t\t++count;\n\t\t\tlastIndex += sub.length;\n\t\t}\n\t\treturn count;\n\t}\n};\n\nul4._find = function _find(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.indexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._rfind = function _rfind(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.lastIndexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._capitalize = function _capitalize(obj) {\n\tif (typeof (obj) != \"string\")\n\t\tthrow ul4.TypeError.create(\"capitalize()\", \"capitalize() requires a string\");\n\n\tif (obj.length)\n\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\treturn obj;\n};\n\nul4._items = function _items(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push([key, value]);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push([key, obj[key]]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"items()\", \"items() requires a dict\");\n};\n\nul4._values = function _values(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push(value);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push(obj[key]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"values()\", \"values() requires a dict\");\n};\n\nul4._join = function _join(sep, iterable) {\n\tvar resultlist = [];\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tresultlist.push(item.value);\n\t}\n\treturn resultlist.join(sep);\n};\n\nul4._startswith = function _startswith(string, prefix) {\n\tif (typeof (prefix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"startswith()\", \"startswith() argument must be string\");\n\n\treturn string.substr(0, prefix.length) === prefix;\n};\n\nul4._endswith = function _endswith(string, suffix) {\n\tif (typeof (suffix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"endswith()\", \"endswith() argument must be string\");\n\n\treturn string.substr(string.length - suffix.length) === suffix;\n};\n\nul4._isoformat = function _isoformat(obj) {\n\tif (!ul4._isdate(obj))\n\t\tthrow ul4.TypeError.create(\"isoformat()\", \"isoformat() requires a date\");\n\n\tvar result = obj.getFullYear() + \"-\" + ul4._lpad((obj.getMonth() + 1).toString(), \"0\", 2) + \"-\" + ul4._lpad(obj.getDate().toString(), \"0\", 2);\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\treturn result;\n};\n\nul4._mimeformat = function _mimeformat(obj) {\n\tvar weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\tvar monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\treturn weekdayname[ul4._weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n};\n\nul4._weekday = function _weekday(obj) {\n\tvar d = obj.getDay();\n\treturn d ? d - 1 : 6;\n};\n\nul4._week = function _week(obj, firstweekday) {\n\tif (firstweekday === null)\n\t\tfirstweekday = 0;\n\telse\n\t\tfirstweekday %= 7;\n\n\tvar yearday = ul4._yearday(obj) + 6;\n\tvar jan1 = new Date(obj.getFullYear(), 0, 1);\n\tvar jan1weekday = jan1.getDay();\n\tif (--jan1weekday < 0)\n\t\tjan1weekday = 6;\n\n\twhile (jan1weekday != firstweekday) {\n\t\t--yearday;\n\t\tif (++jan1weekday == 7)\n\t\t\tjan1weekday = 0;\n\t}\n\treturn Math.floor(yearday / 7);\n};\n\nul4._isleap = function _isleap(obj) {\n\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n};\n\nul4._yearday = function _yearday(obj) {\n\tvar leap = ul4._isleap(obj) ? 1 : 0;\n\tvar day = obj.getDate();\n\tswitch (obj.getMonth()) {\n\t\tcase 0:\n\t\t\treturn day;\n\t\tcase 1:\n\t\t\treturn 31 + day;\n\t\tcase 2:\n\t\t\treturn 31 + 28 + leap + day;\n\t\tcase 3:\n\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\tcase 4:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\tcase 5:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\tcase 6:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\tcase 7:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\tcase 8:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\tcase 9:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\tcase 10:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\tcase 11:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t}\n};\n\nul4._append = function _append(obj, items) {\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.push(items[i]);\n\treturn null;\n};\n\nul4._insert = function _insert(obj, pos, items) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.splice(pos++, 0, items[i]);\n\treturn null;\n};\n\nul4._pop = function _pop(obj, pos) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tvar result = obj[pos];\n\tobj.splice(pos, 1);\n\treturn result;\n};\n\nul4._update = function _update(obj, others, kwargs) {\n\tif (!ul4._isdict(obj))\n\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict\");\n\tfor (var i = 0; i < others.length; ++i) {\n\t\tvar other = others[i];\n\t\tif (ul4._ismap(other)) {\n\t\t\tother.forEach(function (value, key) {\n\t\t\t\tul4on._setmap(obj, key, value);\n\t\t\t});\n\t\t}\n\t\telse if (ul4._isobject(other)) {\n\t\t\tfor (var key in other)\n\t\t\t\tul4on._setmap(obj, key, other[key]);\n\t\t}\n\t\telse if (ul4._islist(other)) {\n\t\t\tfor (var j = 0; j < other.length; ++j) {\n\t\t\t\tif (!ul4._islist(other[j]) || (other[j].length != 2))\n\t\t\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\tul4on._setmap(obj, other[j][0], other[j][1]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t}\n\tfor (var key in kwargs)\n\t\tul4on._setmap(obj, key, kwargs[key]);\n\treturn null;\n};\n\nul4._clear = function _clear(obj) {\n\tif (ul4._ismap(obj))\n\t\tobj.clear();\n\telse if (ul4._isset(obj))\n\t\tobj.clear();\n\telse if (ul4._isobject(obj)) {\n\t\tfor (var key in obj)\n\t\t\tdelete obj[key];\n\t}\n\telse\n\t\tthrow ul4.TypeError.create(\"clear()\", \"clear() requires a dict or set\");\n\treturn null;\n};\n\nul4.Color = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Color\",\n\n\t\tcreate: function create(r, g, b, a) {\n\t\t\tvar c = ul4._clone(this);\n\t\t\tc._r = typeof (r) !== \"undefined\" ? r : 0;\n\t\t\tc._g = typeof (g) !== \"undefined\" ? g : 0;\n\t\t\tc._b = typeof (b) !== \"undefined\" ? b : 0;\n\t\t\tc._a = typeof (a) !== \"undefined\" ? a : 255;\n\t\t\treturn c;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a / 255) + \")\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__iter__: function __iter__() {\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function () {\n\t\t\t\t\tif (this.index == 0) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._r, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._g, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._b, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._a, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"r\":\n\t\t\t\t\treturn ul4.expose([], function r() { return self._r; });\n\t\t\t\tcase \"g\":\n\t\t\t\t\treturn ul4.expose([], function g() { return self._g; });\n\t\t\t\tcase \"b\":\n\t\t\t\t\treturn ul4.expose([], function b() { return self._b; });\n\t\t\t\tcase \"a\":\n\t\t\t\t\treturn ul4.expose([], function a() { return self._a; });\n\t\t\t\tcase \"lum\":\n\t\t\t\t\treturn ul4.expose([], function lum() { return self.lum(); });\n\t\t\t\tcase \"hls\":\n\t\t\t\t\treturn ul4.expose([], function hls() { return self.hls(); });\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\treturn ul4.expose([], function hlsa() { return self.hlsa(); });\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\treturn ul4.expose([], function hsv() { return self.hsv(); });\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\treturn ul4.expose([], function hsva() { return self.hsva(); });\n\t\t\t\tcase \"witha\":\n\t\t\t\t\treturn ul4.expose([\"a\"], function witha(a) { return self.witha(a); });\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function withlum(lum) { return self.withlum(lum); });\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function abslum(lum) { return self.abslum(lum); });\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function rellum(lum) { return self.rellum(lum); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__getitem__: function __getitem__(key) {\n\t\t\tvar orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._iscolor(other))\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t},\n\n\t\tr: ul4.expose([], function r() { return this._r; }),\n\n\t\tg: ul4.expose([], function g() { return this._g; }),\n\n\t\tb: ul4.expose([], function b() { return this._b; }),\n\n\t\ta: ul4.expose([], function a() { return this._a; }),\n\n\t\tlum: ul4.expose([], function lum() { return this.hls()[1]; }),\n\n\t\thls: ul4.expose([],\n\t\t\tfunction hls() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar h, l, s;\n\t\t\t\tvar rc, gc, bc;\n\n\t\t\t\tl = (minc + maxc) / 2.0;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, l, 0.0];\n\t\t\t\tif (l <= 0.5)\n\t\t\t\t\ts = (maxc - minc) / (maxc + minc);\n\t\t\t\telse\n\t\t\t\t\ts = (maxc - minc) / (2.0 - maxc - minc);\n\t\t\t\trc = (maxc - r) / (maxc - minc);\n\t\t\t\tgc = (maxc - g) / (maxc - minc);\n\t\t\t\tbc = (maxc - b) / (maxc - minc);\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, l, s];\n\t\t\t}\n\t\t),\n\n\t\thlsa: ul4.expose([],\n\t\t\tfunction hlsa() {\n\t\t\t\tvar hls = this.hls();\n\t\t\t\treturn hls.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\thsv: ul4.expose([],\n\t\t\tfunction hsv() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar v = maxc;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, 0.0, v];\n\t\t\t\tvar s = (maxc - minc) / maxc;\n\t\t\t\tvar rc = (maxc - r) / (maxc - minc);\n\t\t\t\tvar gc = (maxc - g) / (maxc - minc);\n\t\t\t\tvar bc = (maxc - b) / (maxc - minc);\n\t\t\t\tvar h;\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\t\t),\n\n\t\thsva: ul4.expose([],\n\t\t\tfunction hsva() {\n\t\t\t\tvar hsv = this.hsv();\n\t\t\t\treturn hsv.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\twitha: ul4.expose([\"a\"],\n\t\t\tfunction witha(a) {\n\t\t\t\tif (typeof (a) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\treturn ul4.Color.create(this._r, this._g, this._b, a);\n\t\t\t}\n\t\t),\n\n\t\twithlum: ul4.expose([\"lum\"],\n\t\t\tfunction withlum(lum) {\n\t\t\t\tif (typeof (lum) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\tvar hlsa = this.hlsa();\n\t\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t\t}\n\t\t)\n\t}\n);\n\nul4.TimeDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.TimeDelta\",\n\n\t\tcreate: function create(days, seconds, microseconds) {\n\t\t\tvar td = ul4._clone(this);\n\t\t\tif (typeof (days) === \"undefined\")\n\t\t\t\tdays = 0;\n\t\t\tif (typeof (seconds) === \"undefined\")\n\t\t\t\tseconds = 0;\n\t\t\tif (typeof (microseconds) === \"undefined\")\n\t\t\t\tmicroseconds = 0;\n\n\t\t\tvar total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST._do(total_microseconds, 1000000);\n\t\t\tvar total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0) {\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\ttd._microseconds = microseconds;\n\t\t\ttd._seconds = seconds;\n\t\t\ttd._days = days;\n\n\t\t\treturn td;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._microseconds) {\n\t\t\t\tif (!this._seconds) {\n\t\t\t\t\tif (!this._days)\n\t\t\t\t\t\treturn \"timedelta()\";\n\t\t\t\t\treturn \"timedelta(\" + this._days + \")\";\n\t\t\t\t}\n\t\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \")\";\n\t\t\t}\n\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \", \" + this._microseconds + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tvar v = [];\n\t\t\tif (this._days) {\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tvar seconds = this._seconds % 60;\n\t\t\tvar minutes = Math.floor(this._seconds / 60);\n\t\t\tvar hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds) {\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds);\n\t\t},\n\n\t\t_add: function _add(date, days, seconds, microseconds) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth();\n\t\t\tvar day = date.getDate() + days;\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds() + seconds;\n\t\t\tvar millisecond = date.getMilliseconds() + microseconds / 1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (ul4._istimedelta(other)) {\n\t\t\t\tvar myValue = this._days;\n\t\t\t\tvar otherValue = other._days;\n\t\t\t\tvar hasSeconds = this._seconds || other._seconds;\n\t\t\t\tvar hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds) {\n\t\t\t\t\tmyValue = myValue * 86400 + this._seconds;\n\t\t\t\t\totherValue = otherValue * 86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds) {\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue / otherValue;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"days\":\n\t\t\t\t\treturn ul4.expose([], function days() { return self._days; });\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\treturn ul4.expose([], function seconds() { return self._seconds; });\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\treturn ul4.expose([], function microseconds() { return self._microseconds; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tdays: function days() {\n\t\t\treturn this._days;\n\t\t},\n\n\t\tseconds: function seconds() {\n\t\t\treturn this._seconds;\n\t\t},\n\n\t\tmicroseconds: function microseconds() {\n\t\t\treturn this._microseconds;\n\t\t}\n\t}\n);\n\nul4.MonthDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.MonthDelta\",\n\n\t\tcreate: function create(months) {\n\t\t\tvar md = ul4._clone(this);\n\t\t\tmd._months = typeof (months) !== \"undefined\" ? months : 0;\n\t\t\treturn md;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._months) {\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._months !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._months < 0 ? ul4.MonthDelta.create(-this._months) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.MonthDelta.create(-this._months);\n\t\t},\n\n\t\t_add: function _add(date, months) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth() + months;\n\t\t\tvar day = date.getDate();\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds();\n\t\t\tvar millisecond = date.getMilliseconds();\n\n\t\t\twhile (true) {\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tvar targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tvar result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months - other._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__floordiv__: function __floordiv__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"months\":\n\t\t\t\t\treturn ul4.expose([], function months() { return self._months; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tmonths: function months() {\n\t\t\treturn this._months;\n\t\t}\n\t}\n);\n\n// When we don't have a real ``Set`` type, emulate one that supports strings\nul4._Set = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4._Set\",\n\n\t\tcreate: function create() {\n\t\t\tvar set = ul4._clone(this);\n\t\t\tset.items = {};\n\t\t\tset.add.apply(set, arguments);\n\t\t\treturn set;\n\t\t},\n\n\t\tadd: function add() {\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tthis.items[arguments[i]] = true;\n\t\t\t}\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { self.add.apply(self, items); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__contains__: function __contains__(item) {\n\t\t\treturn this.items[item] || false;\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar v = [];\n\t\t\tv.push(\"{\");\n\t\t\tvar i = 0;\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__eq__: function (other) {\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Substract the number of items that ``other`` has\n\t\t\t\tfor (var item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t},\n\n\t\t__le__: function (other) {\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__ge__: function (other) {\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar result = true;\n\t\t\t\tother.forEach(function (value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in other.items) {\n\t\t\t\t\tif (!this.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"TextAST\",\n\t\"IndentAST\",\n\t\"LineEndAST\",\n\t\"Tag\",\n\t\"ConstAST\",\n\t\"SeqItemAST\",\n\t\"UnpackSeqItemAST\",\n\t\"DictItemAST\",\n\t\"UnpackDictItemAST\",\n\t\"PosArgAST\",\n\t\"KeywordArgAST\",\n\t\"UnpackListArgAST\",\n\t\"UnpackDictArgAST\",\n\t\"ListAST\",\n\t\"ListCompAST\",\n\t\"DictAST\",\n\t\"DictCompAST\",\n\t\"SetAST\",\n\t\"SetCompAST\",\n\t\"GenExprAST\",\n\t\"VarAST\",\n\t\"NotAST\",\n\t\"NegAST\",\n\t\"BitNotAST\",\n\t\"IfAST\",\n\t\"ReturnAST\",\n\t\"PrintAST\",\n\t\"PrintXAST\",\n\t\"ItemAST\",\n\t\"IsAST\",\n\t\"IsNotAST\",\n\t\"EQAST\",\n\t\"NEAST\",\n\t\"LTAST\",\n\t\"LEAST\",\n\t\"GTAST\",\n\t\"GEAST\",\n\t\"NotContainsAST\",\n\t\"ContainsAST\",\n\t\"AddAST\",\n\t\"SubAST\",\n\t\"MulAST\",\n\t\"FloorDivAST\",\n\t\"TrueDivAST\",\n\t\"ModAST\",\n\t\"ShiftLeftAST\",\n\t\"ShiftRightAST\",\n\t\"BitAndAST\",\n\t\"BitXOrAST\",\n\t\"BitOrAST\",\n\t\"AndAST\",\n\t\"OrAST\",\n\t\"SliceAST\",\n\t\"AttrAST\",\n\t\"CallAST\",\n\t\"RenderAST\",\n\t\"SetVarAST\",\n\t\"AddVarAST\",\n\t\"SubVarAST\",\n\t\"MulVarAST\",\n\t\"TrueDivVarAST\",\n\t\"FloorDivVarAST\",\n\t\"ModVarAST\",\n\t\"ShiftLeftVarAST\",\n\t\"ShiftRightVarAST\",\n\t\"BitAndVarAST\",\n\t\"BitXOrVarAST\",\n\t\"BitOrVarAST\",\n\t\"ForBlockAST\",\n\t\"WhileBlockAST\",\n\t\"BreakAST\",\n\t\"ContinueAST\",\n\t\"CondBlockAST\",\n\t\"IfBlockAST\",\n\t\"ElIfBlockAST\",\n\t\"ElseBlockAST\",\n\t\"SignatureAST\",\n\t\"Template\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar ul4onname = name;\n\tif (ul4onname.substr(ul4onname.length - 3) === \"AST\")\n\t\tul4onname = ul4onname.substr(0, ul4onname.length - 3);\n\tul4onname = ul4onname.toLowerCase();\n\tvar object = ul4[name];\n\tobject.typename = name;\n\tobject.type = ul4onname;\n\tul4on.register(\"de.livinglogic.ul4.\" + ul4onname, object);\n}\n","import { ul4, ul4on } from './ul4';\nlet amd = (typeof define === 'function' && define.amd);\nlet commonjs = (typeof module === 'object' && module.exports);\n\nlet la = {};\n\n\nla.Base = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function () {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\treturn this[name];\n\t\t},\n\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0, iter = decoder.loadcontent(); ; ++i) {\n\t\t\t\tvar iteritem = iter.next();\n\t\t\t\tif (iteritem.done)\n\t\t\t\t\tbreak;\n\t\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t\t}\n\t\t\tfor (; i < this._ul4onattrs.length; ++i) {\n\t\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t\t\t}\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tthis[name] = value;\n\t\t},\n\n\t\t_setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) {\n\t\t\tthis[name] = null;\n\t\t}\n\t}\n);\n\nla.Globals = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\t\tgeodist: function geodist(geo1, geo2) {\n\t\t\tvar sqsin = function sqsin(x) { x = Math.sin(x); return x * x };\n\t\t\tvar sqcos = function sqsos(x) { x = Math.cos(x); return x * x };\n\t\t\tvar deg2rad = Math.PI / 180; // Conversion factor degree -> radians\n\t\t\tvar radius = 6378.137; // Equatorial radius of earth in km\n\t\t\tvar flat = 1 / 298.257223563; // Earth flattening\n\n\t\t\tvar lat1 = geo1.lat * deg2rad;\n\t\t\tvar long1 = geo1.long * deg2rad;\n\t\t\tvar lat2 = geo2.lat * deg2rad;\n\t\t\tvar long2 = geo2.long * deg2rad;\n\t\t\tvar F = (lat1 + lat2) / 2;\n\t\t\tvar G = (lat1 - lat2) / 2;\n\t\t\tvar l = (long1 - long2) / 2;\n\t\t\tvar S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\t\tvar C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\t\tvar w = Math.atan(Math.sqrt(S / C));\n\t\t\tvar D = 2 * w * radius;\n\t\t\tvar T = Math.sqrt(S * C) / w;\n\t\t\tvar H1 = (3 * T - 1) / (2 * C);\n\t\t\tvar H2 = (3 * T + 1) / (2 * S);\n\t\t\tvar s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\t\treturn s;\n\t\t}\n\t}\n);\n\nla.FlashMessage = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"timestamp\", \"type\", \"title\", \"message\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.App = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"owner\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\"],\n\n\t\tinsert: function (values) {\n\t\t\treturn this.globals.Login._insert(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.View = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.DataSource = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"app\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Record = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"],\n\n\t\tdelete: function () {\n\t\t\treturn this.app.globals.Login._delete(this);\n\t\t},\n\n\t\tupdate: function (values) {\n\t\t\treturn this.app.globals.Login._update(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tsearch: function search(search) {\n\t\t\tfor (var identifier in search) {\n\t\t\t\tvar fieldsearch = search[identifier];\n\t\t\t\tif (ul4._bool(fieldsearch)) {\n\t\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"values\")\n\t\t\t\treturn this._sparsevalues;\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"values\") {\n\t\t\t\tthis._sparsevalues = value;\n\t\t\t\tthis._values = null;\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis[name] = value;\n\t\t}\n\t}\n);\n\nObject.defineProperty(la.Record, \"values\", {\n\tget: function () {\n\t\tif (this._values === null) {\n\t\t\tthis._values = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.app.controls.forEach(function (control, id) {\n\t\t\t\tvar fieldvalue = self._sparsevalues.get(control.identifier);\n\t\t\t\tif (typeof (fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tself._values.set(id, fieldvalue);\n\t\t\t});\n\t\t}\n\t\treturn this._values;\n\t}\n});\n\nObject.defineProperty(la.Record, \"fields\", {\n\tget: function () {\n\t\tif (this._fields === null) {\n\t\t\tthis._fields = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.values.forEach(function (value, id) {\n\t\t\t\tvar field = la.Field.create(self.app.controls.get(id), self.app, value);\n\t\t\t\tself._fields.set(id, field);\n\t\t\t});\n\t\t}\n\t\treturn this._fields;\n\t}\n});\n\nla.Control = ul4._inherit(\n\tla.Base,\n\t{\n\t\ttype: null,\n\t\tsubtype: null,\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\t_logsearch: function _logsearch(value, search) {\n\t\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t\t},\n\n\t\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t\t// ``value`` is the value of the field\n\t\t// ``search`` is an object with information what we're searching for\n\t\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\t\tsearch: function search(value, search) {\n\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.BoolControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"bool\",\n\t\t__type__: \"BoolControl\",\n\n\t\t// ``search`` must by ``null``, ``false`` or ``true``\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.IntControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"int\",\n\t\t__type__: \"IntControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.NumberControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"number\",\n\t\t__type__: \"NumberControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"range\") {\n\t\t\t\tif (value === null)\n\t\t\t\t\treturn false;\n\t\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.StringControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"string\",\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (search.value === null || value === null)\n\t\t\t\t\treturn search.value === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.TextControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"text\",\n\t\t__type__: \"TextControl\"\n\t}\n);\n\nla.EmailControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"email\",\n\t\t__type__: \"EmailControl\"\n\t}\n);\n\nla.URLControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"url\",\n\t\t__type__: \"URLControl\"\n\t}\n);\n\nla.TelControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"tel\"\n\t}\n);\n\nla.PasswordControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"password\"\n\t}\n);\n\nla.TextAreaControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"textarea\",\n\t\t__type__: \"TextAreaControl\"\n\t}\n);\n\nla.DateControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"date\",\n\t\tsubtype: \"date\",\n\t\t__type__: \"DateControl\",\n\n\t\tasjson: function (value) {\n\t\t\tif (value instanceof Date) {\n\t\t\t\tvalue = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`;\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y\";\n\t\t},\n\n\t\t// searchvalue must be ``null``, a ``Date`` object or a string\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\n\t\t\tvar searchvalue = search.value;\n\t\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\t\tif (value !== null)\n\t\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn searchvalue === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (searchvalue === null || value === null)\n\t\t\t\t\treturn searchvalue === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.DatetimeMinuteControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimeminute\",\n\t\t__type__: \"DatetimeMinuteControl\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t\t}\n\t}\n);\n\nla.DatetimeSecondControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimesecond\",\n\t\t__type__: \"DatetimeMinuteSecond\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t\t}\n\t}\n);\n\nla.LookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"lookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupdata\"]),\n\n\t\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (this.lookupapp === null) {\n\t\t\t\tif (search.operator === \"equals\") {\n\t\t\t\t\tif (value === null)\n\t\t\t\t\t\treturn search.value === null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn value.key === search.value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (value === null || search.value === null)\n\t\t\t\t\treturn value === search.value;\n\t\t\t\telse\n\t\t\t\t\treturn value.search(search);\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.LookupSelectControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"LookupSelectControl\"\n\t}\n);\n\nla.LookupRadioControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"LookupRadioControl\"\n\t}\n);\n\nla.LookupChoiceControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"LookupChoiceControl\"\n\t}\n);\n\nla.AppLookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"applookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]),\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (value === null || search.value === null)\n\t\t\t\treturn value === search.value;\n\t\t\telse\n\t\t\t\treturn value.search(search);\n\t\t}\n\t}\n);\n\nla.AppLookupSelectControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"AppLookupSelectControl\"\n\t}\n);\n\nla.AppLookupRadioControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"AppLookupRadioControl\"\n\t}\n);\n\nla.AppLookupChoiceControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"AppLookupChoiceControl\"\n\t}\n);\n\nla.MultipleLookupControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\ttype: \"multiplelookup\",\n\n\t\t// search.value must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (this.lookupapp === null) {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].key === search.value)\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (search.value === null)\n\t\t\t\t\t\treturn value.length === 0;\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleLookupSelectControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleLookupSelectControl\"\n\t}\n);\n\nla.MultipleLookupCheckboxControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleLookupCheckboxControl\"\n\t}\n);\n\nla.MultipleAppLookupControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\ttype: \"multipleapplookup\",\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (search.value === null)\n\t\t\t\t\treturn value.length === 0;\n\t\t\t\telse {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleAppLookupSelectControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleAppLookupSelectControl\"\n\t}\n);\n\nla.MultipleAppLookupCheckboxControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleAppLookupCheckboxControl\"\n\t}\n);\n\nla.GeoControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"geo\",\n\n\n\t\tasjson: function (value) {\n\t\t\tif (la.Geo.isprotoof(value))\n\t\t\t\tvalue = `${value.lat}, ${value.long}, ${value.info}`;\n\t\t\treturn value;\n\t\t},\n\n\t\t__type__: \"GeoControl\"\n\t}\n);\n\nla.FileControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"file\",\n\t\t__type__: \"FileControl\"\n\t}\n);\n\nla.ButtonControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"button\",\n\t\t__type__: \"ButtonControl\"\n\t}\n);\n\nla.Field = ul4._inherit(\n\tla.Base,\n\t{\n\t\tcreate: function create(control, record, value) {\n\t\t\tvar field = la.Base.create.call(this);\n\t\t\tfield.control = control;\n\t\t\tfield.record = record;\n\t\t\tfield.value = value;\n\t\t\treturn field;\n\t\t},\n\n\t\tsearch: function search(searchvalue) {\n\t\t\treturn this.control.search(this.value, searchvalue);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.LookupItem = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"key\", \"label\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.User = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.File = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Geo = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"lat\", \"long\", \"info\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Attachment = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"record\", \"label\", \"active\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.NoteAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"noteattachment\",\n\t\t__type__: \"NoteAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.URLAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"urlattachment\",\n\t\t__type__: \"URLAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.FileAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"fileattachment\",\n\t\t__type__: \"FileAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.ImageAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"imageattachment\",\n\t\t__type__: \"ImageAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"])\n\t}\n);\n\nla.JSONAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"jsonattachment\",\n\t\t__type__: \"JSONAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"]),\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"value\")\n\t\t\t\treturn ul4._asjson(this.value);\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"value\")\n\t\t\t\tthis.value = ul4._fromjson(value);\n\t\t\telse\n\t\t\t\tthis[name] = value\n\t\t}\n\t}\n);\n\nla.Installation = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Category = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\tvar v = [];\n\t\t\tvar category = this;\n\t\t\twhile (category !== null) {\n\t\t\t\tv.splice(0, 0, category.identifier);\n\t\t\t\tcategory = category.parent;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.KeyView = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"key\", \"user\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.AppParameter = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"identifier\", \"description\", \"value\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"Globals\",\n\t\"App\",\n\t\"View\",\n\t\"DataSource\",\n\t\"Record\",\n\t\"BoolControl\",\n\t\"IntControl\",\n\t\"NumberControl\",\n\t\"TextControl\",\n\t\"EmailControl\",\n\t\"URLControl\",\n\t\"TelControl\",\n\t\"PasswordControl\",\n\t\"TextAreaControl\",\n\t\"DateControl\",\n\t\"DatetimeMinuteControl\",\n\t\"DatetimeSecondControl\",\n\t\"LookupControl\",\n\t\"LookupSelectControl\",\n\t\"LookupRadioControl\",\n\t\"LookupChoiceControl\",\n\t\"AppLookupControl\",\n\t\"AppLookupSelectControl\",\n\t\"AppLookupRadioControl\",\n\t\"AppLookupChoiceControl\",\n\t\"MultipleLookupControl\",\n\t\"MultipleLookupSelectControl\",\n\t\"MultipleLookupCheckboxControl\",\n\t\"MultipleAppLookupControl\",\n\t\"MultipleAppLookupSelectControl\",\n\t\"MultipleAppLookupCheckboxControl\",\n\t\"GeoControl\",\n\t\"FileControl\",\n\t\"ButtonControl\",\n\t\"Field\",\n\t\"LookupItem\",\n\t\"User\",\n\t\"File\",\n\t\"Geo\",\n\t\"NoteAttachment\",\n\t\"URLAttachment\",\n\t\"FileAttachment\",\n\t\"ImageAttachment\",\n\t\"JSONAttachment\",\n\t\"Installation\",\n\t\"Category\",\n\t\"KeyView\",\n\t\"AppParameter\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar object = la[name];\n\tul4on.register(\"de.livingapps.appdd.\" + name.toLowerCase(), object);\n}\n\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4, ul4on } from './modules/ul4';\n\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nlet nodejs: any = {};\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4on.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["define","amd","module","exports","ul4","ul4on","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","argument","set","_emptymap","_setmap","key","value","__proto__","_makeset","this","_Set","create","add","register","name","obj","ul4onname","dumps","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_clone","_level","_strings2index","_ids2index","_backrefs","_line","line","oldindent","push","join","type","Math","round","index","_str_repr","_iscolor","r","g","b","a","_isdate","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","_typeof","isa","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","decoder","pos","backrefs","readchar","charAt","readcharoreof","readblackchar","re_white","c","match","read","result","substring","backup","readnumber","re_digits","parseFloat","NaN","_repr","_beginfakeloading","oldpos","_endfakeloading","_readescape","escapechar","chars","codepoint","parseInt","isNaN","String","fromCharCode","typecode","delimiter","c2","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","proto","ul4onload","loadcontent","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_simpleclone","F","__prototype__","Proto","_nextid","_extend","attrs","_simpleinherit","baseobj","_inherit","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","_type","s","toString","cause","_internal_call","context","f","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","repr","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_unpackvar","lvalue","newvalue","iter","_iter","item","ValueError","concat","_formatsource","out","finalout","level","needlf","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","get","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","items","_lt","__lt__","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","escape","code","charCodeAt","test","_lpad","_date_repr","year","month","day","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","__repr__","_ascii","_date_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","__type__","_istemplate","_isfunction","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","Object","call","_isexception","Error","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","_strip","root","JSON","parse","replace","Function","_asul4on","_fromul4on","_format_date","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","_yearday","_week","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","isprotoof","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","decname","arg","prefix","argObject","expose","options","Context","vars","indents","_output","inheritvars","withindent","replaceoutput","clone","getoutput","Exception","__getattr__","attrname","InternalException","ReturnException","exception","BreakException","ContinueException","SyntaxError","LValueRequiredError","operation","message","LocationError","location","_templateprefix","template","parenttemplate","first","_template","Tag","tag","_outerpos","_innerpos","templateprefix","outerpos","innerpos","source","suffix","text","underline","lineno","colno","AST","ast","_handle_eval","_eval","_handle_eval_set","_eval_set","_handle_eval_modify","_eval_modify","_ul4onattrs","__setitem__","TextAST","_text","IndentAST","_maketext","LineEndAST","tagpos","codepos","tago","CodeAST","ConstAST","constant","ItemArgBase","_handle_eval_list","_eval_list","_handle_eval_dict","_eval_dict","_handle_eval_call","_eval_call","SeqItemAST","seqitem","UnpackSeqItemAST","unpackseqitem","DictItemAST","dictitem","UnpackDictItemAST","unpackdictitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","ListCompAST","varname","container","condition","listcomp","localcontext","varitems","DictAST","dict","DictCompAST","SetAST","SetCompAST","setcomp","GenExprAST","genexp","VarAST","variable","_get","_modify","functions","_ido","UnaryAST","unary","typename","_do","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","ifexpr","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","binary","ItemAST","__getitem__","splice","NotSubscriptableError","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","_append","SubAST","__sub__","__rsub__","_date_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","_date","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","div","mod","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","attr","object","sub","end","_count","_find","_rfind","old","new_","count","_replace","_lstrip","_rstrip","sep","_split","_rsplit","keepends","_splitlines","_capitalize","_join","_startswith","_endswith","_insert","_pop","_weekday","firstweekday","_mimeformat","_isoformat","default_","_items","_values","_update","_clear","realresult","__setattr__","oldvalue","CallAST","_makeargs","RenderAST","render","SliceAST","index1","index2","SetVarAST","changevar","ModifyVarAST","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","BlockAST","block","endtag","content","ForBlockAST","for_","_str_varname","WhileBlockAST","while_","cond","BreakAST","ContinueAST","CondBlockAST","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","Template","whitespace","startdelim","enddelim","docpos","_jsfunction","_asts","SignatureAST","closure","TemplateClosure","_renderbound","_rendersbound","renders","doc","_callbound","params","param","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","lower","heigher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshhold","pow","_md5","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","microsecond","_timedelta","_monthdelta","_hls","h","l","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","part","lastIndexOf","startpos","lineendlen","endpos","lastIndex","resultlist","d","yearday","jan1weekday","_isleap","leap","others","clear","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","td","total_microseconds","total_seconds","minutes","hours","_add","millisecond","myValue","otherValue","hasSeconds","hasMicroseconds","md","targetmonth","classes","la","Base","_dumpUL4ONAttr","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","Globals","geodist","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","insert","globals","Login","id","View","DataSource","identifier","Record","delete","app","_delete","update","search","fieldsearch","fields","_sparsevalues","_fields","defineProperty","controls","control","fieldvalue","field","Field","Control","subtype","_logsearch","BoolControl","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","formatstring","language","searchvalue","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","lookupapp","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","Geo","info","FileControl","ButtonControl","record","LookupItem","label","User","firstname","lastname","email","File","url","filename","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","undefined","hostName","httpsAgent","templateName","commonjs","Agent","auth_token","session","ident"],"mappings":"+wBAiC6B,mBAAXA,QAAyBA,OAAOC,IAChB,gCAAXC,qBAAAA,UAAuBA,OAAOC,QADrD,IAGWC,EAAM,GACNC,EAAQ,GAcnB,GAZAD,EAAIE,QAAU,KAMdD,EAAME,UAAY,GAElBF,EAAMG,SAA6B,mBAATC,KAA0D,mBAA3BA,IAAIC,UAAUC,QAEvEN,EAAMO,qBAAsB,EAExBP,EAAMG,aAEsB,GAA1B,IAAIC,IAAI,CAAC,CAAC,EAAG,KAAKI,OACrBR,EAAMO,qBAAsB,GAE9B,MAAOE,IAQR,GAJAT,EAAMU,SAA6B,mBAATC,KAA0D,mBAA3BA,IAAIN,UAAUC,QAEvEN,EAAMY,qBAAsB,EAExBZ,EAAMU,aAEoB,GAAxB,IAAIC,IAAI,CAAC,EAAG,IAAIH,OACnBR,EAAMY,qBAAsB,GAE9B,MAAOH,IAKRT,EAAMa,SAAW,mBACZC,EAAM,IAAIV,IAELW,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,EAAG,KACtCG,EAAWF,UAAUD,GACzBD,EAAIK,IAAID,EAAS,GAAIA,EAAS,WAExBJ,GAIRd,EAAMoB,UAAY,kBACVpB,EAAMG,SAAW,IAAIC,IAAQ,IAIjCJ,EAAMG,SACTH,EAAMqB,QAAU,SAAiBP,EAAKQ,EAAKC,GACtCT,EAAIU,YAAcpB,IAAIC,UACzBS,EAAIK,IAAIG,EAAKC,GAEbT,EAAIQ,GAAOC,GAIbvB,EAAMqB,QAAU,SAAiBP,EAAKQ,EAAKC,GAC1CT,EAAIQ,GAAOC,GAKTvB,EAAMU,SACTV,EAAMyB,SAAW,mBACZN,EAAMO,KAAKhB,SAAW,IAAIC,IAAQZ,EAAI4B,KAAKC,SAEtCb,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,EACvCI,EAAIU,IAAIb,UAAUD,WACZI,GAIRnB,EAAMyB,SAAW,mBACZN,EAAMpB,EAAI4B,KAAKC,SAEVb,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,EACvCI,EAAIU,IAAIb,UAAUD,WACZI,GAKTnB,EAAM8B,SAAW,SAAkBC,EAAMC,GACxCA,EAAIC,UAAYF,EAChB/B,EAAME,UAAU6B,GAAQ,kBAAqBC,EAAIJ,WAIjD5B,EAAMkC,MAAQ,SAAeF,EAAKG,OAC7BC,EAAUpC,EAAMqC,QAAQT,OAAOO,UACnCC,EAAQE,KAAKN,GACNI,EAAQG,UAMhBvC,EAAMwC,MAAQ,SAAeC,EAAMC,UACpB1C,EAAM2C,QAAQf,OAAOa,EAAMC,GAC1BE,QAIhB5C,EAAMqC,QAAU,CAEfT,OAAQ,SAAgBO,OACnBC,EAAUrC,EAAI8C,OAAOnB,aACzBU,EAAQD,OAASA,GAAU,KAC3BC,EAAQK,KAAO,GACfL,EAAQU,OAAS,EACjBV,EAAQW,eAAiB,GACzBX,EAAQY,WAAa,GACrBZ,EAAQa,UAAY,EACbb,GAGRc,MAAO,SAAeC,OACjBpC,EAAGqC,KAEa,OAAhB1B,KAAKS,WACHpB,EAAI,EAAGA,EAAIW,KAAKoB,SAAU/B,OACzB0B,KAAKY,KAAK3B,KAAKS,aAGjBT,KAAKe,KAAKxB,QACbS,KAAKe,KAAKY,KAAK,aAEZZ,KAAKY,KAAKF,GAEQ,EAAnBnC,UAAUC,OAAY,KACzBmC,EAAY1B,KAAKS,YACZA,OAAS,KACTpB,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,OAC9BuB,KAAKtB,UAAUD,SAChBoB,OAASiB,EAGK,OAAhB1B,KAAKS,QACRT,KAAKe,KAAKY,KAAK,OAIjBd,OAAQ,kBACAb,KAAKe,KAAKa,KAAK,KAGvBhB,KAAM,SAAcN,MACP,OAARA,EACHN,KAAKwB,MAAM,UACP,GAAoB,kBAARlB,EAChBN,KAAKwB,MAAMlB,EAAM,KAAO,WACpB,GAAoB,iBAARA,EAAkB,KAC9BuB,EAAQC,KAAKC,MAAMzB,IAAQA,EAAO,IAAM,SACvCkB,MAAMK,EAAOvB,QAEd,GAAoB,iBAARA,EAAkB,MAEX,KADnB0B,EAAQhC,KAAKqB,eAAef,SAE1BkB,MAAM,IAAMQ,SAGZX,eAAef,GAAON,KAAKuB,iBAC3BC,MAAM,IAAMnD,EAAI4D,UAAU3B,UAG5B,GAAIjC,EAAI6D,SAAS5B,GACrBN,KAAKwB,MAAM,IAAKlB,EAAI6B,IAAK7B,EAAI8B,IAAK9B,EAAI+B,IAAK/B,EAAIgC,UAC3C,GAAIjE,EAAIkE,QAAQjC,GACpBN,KAAKwB,MAAM,IAAKlB,EAAIkC,cAAelC,EAAImC,WAAa,EAAGnC,EAAIoC,UAAWpC,EAAIqC,WAAYrC,EAAIsC,aAActC,EAAIuC,aAAsC,IAAxBvC,EAAIwC,wBAC1H,GAAIzE,EAAI0E,aAAazC,GACzBN,KAAKwB,MAAM,IAAKlB,EAAI0C,OAAQ1C,EAAI2C,UAAW3C,EAAI4C,qBAC3C,GAAI7E,EAAI8E,cAAc7C,GAC1BN,KAAKwB,MAAM,IAAKlB,EAAI8C,eAChB,GAAqB,WAAjBC,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAIkF,OACpFvD,KAAKwB,MAAM,IAAKlB,EAAIkD,MAAOlD,EAAImD,WAC3B,GAAInD,EAAIC,WAAaD,EAAIoD,UAAW,KAEnC1B,KADD1B,EAAIqD,eAEe,KADlB3B,EAAQhC,KAAKsB,WAAWhB,EAAIqD,0BAE1BnC,MAAM,IAAMQ,GAIf1B,EAAIqD,SACP3D,KAAKsB,WAAWhB,EAAIqD,QAAU3D,KAAKuB,kBAC/BC,MAAM,IAAKlB,EAAIC,aAClBP,KAAKoB,OACPd,EAAIoD,UAAU1D,QACZA,KAAKoB,YACFI,MAAM,UAEP,GAAInD,EAAIuF,QAAQtD,GAAM,KAGrB,IAAIjB,UAFJmC,MAAM,OACTxB,KAAKoB,OACOd,OACRM,KAAKN,EAAIjB,MACbW,KAAKoB,YACFI,MAAM,UAEP,GAAInD,EAAIwF,OAAOvD,QACdkB,MAAM,OACTxB,KAAKoB,OACPd,EAAI1B,QAAQ,SAAUiB,EAAOD,QACvBgB,KAAKhB,QACLgB,KAAKf,IACRG,QACDA,KAAKoB,YACFI,MAAM,UAEP,GAAInD,EAAIyF,QAAQxD,GAAM,KAGrB,IAAIV,UAFJ4B,MAAM,OACTxB,KAAKoB,OACSd,OACVM,KAAKhB,QACLgB,KAAKN,EAAIV,MAEbI,KAAKoB,YACFI,MAAM,SAEP,CAAA,IAAInD,EAAI0F,OAAOzD,GAUnB,KAAM,2BATDkB,MAAM,OACTxB,KAAKoB,OACPd,EAAI1B,QAAQ,SAAUiB,QAChBe,KAAKf,IACRG,QACDA,KAAKoB,YACFI,MAAM,QAQflD,EAAM2C,QAAU,CAEff,OAAQ,SAAgBa,EAAMC,OACzBgD,EAAU3F,EAAI8C,OAAOnB,aACzBgE,EAAQjD,KAAOA,EACfiD,EAAQC,IAAM,EACdD,EAAQE,SAAW,GACnBF,EAAQhD,cAAiC,IAAdA,EAA4B,KAAOA,EACvDgD,GAIRG,SAAU,cACLnE,KAAKiE,KAAOjE,KAAKe,KAAKxB,OACzB,KAAM,4BACAS,KAAKe,KAAKqD,OAAOpE,KAAKiE,QAI9BI,cAAe,kBACVrE,KAAKiE,KAAOjE,KAAKe,KAAKxB,OAClB,KACDS,KAAKe,KAAKqD,OAAOpE,KAAKiE,QAI9BK,cAAe,mBACVC,EAAW,OAEL,IACLvE,KAAKiE,KAAOjE,KAAKe,KAAKxB,OACzB,KAAM,yBACHiF,EAAIxE,KAAKe,KAAKqD,OAAOpE,KAAKiE,WACzBO,EAAEC,MAAMF,GACZ,OAAOC,IAKVE,KAAM,SAAc5F,GACfkB,KAAKiE,IAAMnF,EAAOkB,KAAKT,SAC1BT,EAAOkB,KAAKT,OAASS,KAAKiE,SACvBU,EAAS3E,KAAKe,KAAK6D,UAAU5E,KAAKiE,IAAKjE,KAAKiE,IAAMnF,eACjDmF,KAAOnF,EACL6F,GAIRE,OAAQ,aACL7E,KAAKiE,KAIRa,WAAY,mBACPC,EAAY,oBAAqBlF,EAAQ,KACnC,KACL2E,EAAIxE,KAAKqE,mBACH,OAANG,IAAcA,EAAEC,MAAMM,GAErB,KACAJ,EAASK,WAAWnF,MACVoF,KAAVN,EACH,KAAM,uBAAyBtG,EAAI6G,MAAM,SAAW,gBAAkBlF,KAAKiE,WACrEU,EALP9E,GAAS2E,IAUZW,kBAAmB,eACdC,EAASpF,KAAKkE,SAAS3E,mBACtB2E,SAASvC,KAAK,MACZyD,GAGRC,gBAAiB,SAAyBD,EAAQvF,QAC5CqE,SAASkB,GAAUvF,GAGzByF,YAAa,SAAqBC,EAAYhG,OACzCiG,EAAQxF,KAAK0E,KAAKnF,MAClBiG,EAAMjG,QAAUA,EACnB,KAAM,iBAAmBlB,EAAI6G,MAAM,KAAOK,EAAaC,GAAS,gBAAkBxF,KAAKiE,QACpFwB,EAAYC,SAASF,EAAO,OAC5BG,MAAMF,GACT,KAAM,iBAAmBpH,EAAI6G,MAAM,KAAOK,EAAaC,GAAS,gBAAkBxF,KAAKiE,WACjF2B,OAAOC,aAAaJ,IAI5BvE,KAAM,eAEDyD,EADAmB,EAAW9F,KAAKsE,uBAEZwB,OACF,WACG9F,KAAKkE,SAASlE,KAAK8E,kBACtB,QACA,UACa,MAAbgB,GACH9F,KAAKkE,SAASvC,KAAK,MACb,SACH,QACA,OAEW,OADfgD,EAAS3E,KAAKmE,YAEbQ,GAAS,MACL,CAAA,GAAe,MAAXA,EAGR,KAAM,qDAAuDtG,EAAI6G,MAAMP,GAAU,gBAAkB3E,KAAKiE,IAFxGU,GAAS,QAGO,MAAbmB,GACH9F,KAAKkE,SAASvC,KAAKgD,GACbA,MACH,QACA,QACA,QACA,WACJA,EAAS3E,KAAK8E,aACG,MAAbgB,GAAiC,MAAbA,GACvB9F,KAAKkE,SAASvC,KAAKgD,GACbA,MACH,QACA,IACJA,EAAS,WACLoB,EAAY/F,KAAKsE,kBACX,KACLE,EAAIxE,KAAKmE,cACTK,GAAKuB,EACR,SACQ,MAALvB,EAAW,KACVwB,EAAKhG,KAAKmE,WACJ,MAAN6B,EACHrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,MACE,KAANqE,EACRrB,EAAOhD,KAAK,KACE,KAANqE,EACRrB,EAAOhD,KAAK,KACE,KAANqE,EACRrB,EAAOhD,KAAK,KACE,KAANqE,EACRrB,EAAOhD,KAAK3B,KAAKsF,YAAY,IAAK,IACpB,KAANU,EACRrB,EAAOhD,KAAK3B,KAAKsF,YAAY,IAAK,IACpB,KAANU,EACRrB,EAAOhD,KAAK3B,KAAKsF,YAAY,IAAK,IAElCX,EAAOhD,KAAK,KAAOqE,QAGpBrB,EAAOhD,KAAK6C,UAEdG,EAASA,EAAO/C,KAAK,IACJ,MAAbkE,GACH9F,KAAKkE,SAASvC,KAAKgD,GACbA,MACH,QACA,WACJA,EAAStG,EAAI4H,MAAM/F,SACF,MAAb4F,GACH9F,KAAKkE,SAASvC,KAAKgD,GACpBA,EAAOuB,GAAKlG,KAAKkB,OACjByD,EAAOwB,GAAKnG,KAAKkB,OACjByD,EAAOyB,GAAKpG,KAAKkB,OACjByD,EAAO0B,GAAKrG,KAAKkB,OACVyD,MACH,QACA,WACJA,EAAS,IAAI2B,MACNC,YAAYvG,KAAKkB,QACxByD,EAAO6B,QAAQ,GACf7B,EAAO8B,SAASzG,KAAKkB,OAAS,GAC9ByD,EAAO6B,QAAQxG,KAAKkB,QACpByD,EAAO+B,SAAS1G,KAAKkB,QACrByD,EAAOgC,WAAW3G,KAAKkB,QACvByD,EAAOiC,WAAW5G,KAAKkB,QACvByD,EAAOkC,gBAAgB7G,KAAKkB,OAAS,KACpB,MAAb4E,GACH9F,KAAKkE,SAASvC,KAAKgD,GACbA,MACH,QACA,WACJA,EAAStG,EAAIyI,UAAU5G,UAChB6G,MAAQ/G,KAAKkB,OACpByD,EAAOqC,SAAWhH,KAAKkB,OACvByD,EAAOsC,cAAgBjH,KAAKkB,OACX,MAAb4E,GACH9F,KAAKkE,SAASvC,KAAKgD,GACbA,MACH,QACA,WACJA,EAAStG,EAAIkF,MAAMrD,SACF,MAAb4F,GACH9F,KAAKkE,SAASvC,KAAKgD,GACpBA,EAAOnB,MAAQxD,KAAKkB,OACpByD,EAAOlB,KAAOzD,KAAKkB,OACZyD,MACH,QACA,WACJA,EAAStG,EAAI6I,WAAWhH,SACP,MAAb4F,GACH9F,KAAKkE,SAASvC,KAAKgD,GACpBA,EAAOwC,QAAUnH,KAAKkB,OACfyD,MACH,QACA,QACJA,EAAS,GACQ,MAAbmB,GACH9F,KAAKkE,SAASvC,KAAKgD,KACV,IAEQ,OADjBmB,EAAW9F,KAAKsE,iBAEf,OAAOK,OACHE,SACLF,EAAOhD,KAAK3B,KAAKkB,eAEXyD,MACH,QACA,QACA,QACA,QACCrG,EAAMG,WAAyB,KAAZqH,GAA+B,KAAZA,GAC1C,KAAM,8CACPnB,EAASrG,EAAMoB,YACE,MAAboG,GAAiC,MAAbA,GACvB9F,KAAKkE,SAASvC,KAAKgD,KACV,IAEQ,OADjBmB,EAAW9F,KAAKsE,iBAEf,OAAOK,OACHE,aACDjF,EAAMI,KAAKkB,OACXrB,EAAQG,KAAKkB,OACjB5C,EAAMqB,QAAQgF,EAAQ/E,EAAKC,UAErB8E,MACH,QACA,QACJA,EAASrG,EAAMyB,WACE,MAAb+F,GACH9F,KAAKkE,SAASvC,KAAKgD,KACV,IAEQ,OADjBmB,EAAW9F,KAAKsE,iBAEf,OAAOK,OACHE,SACLF,EAAOxE,IAAIH,KAAKkB,eAEVyD,MACH,QACA,QACAS,EACa,MAAbU,IACHV,EAASpF,KAAKmF,yBAEXiC,EADA/G,EAAOL,KAAKkB,UAEM,OAAlBlB,KAAKgB,cAEe,KADvBoG,EAAQpH,KAAKgB,SAASX,MAErB+G,EAAQ9I,EAAME,UAAU6B,IAGzB+G,EAAQ9I,EAAME,UAAU6B,QACF,IAAX+G,EACX,KAAM,6BAA+B/I,EAAI6G,MAAM7E,MAChDsE,EAASyC,IACQ,MAAbtB,GACH9F,KAAKqF,gBAAgBD,EAAQT,GAC9BA,EAAO0C,UAAUrH,MAEA,OADjB8F,EAAW9F,KAAKsE,iBAEf,KAAM,6CAA+CjE,EAAO,mBAAqBhC,EAAI6G,MAAMY,GAAY,gBAAkB9F,KAAKiE,WACxHU,eAED,oBAAsBtG,EAAI6G,MAAMY,GAAY,gBAAkB9F,KAAKiE,MAK5EqD,YAAa,SAAcA,OACtBC,EAAOvH,WACJ,CACNwH,KAAM,eACD1B,EAAWyB,EAAKjD,uBACpBiD,EAAK1C,SACW,KAAZiB,EACI,CAAE2B,MAAM,GAER,CAAEA,MAAM,EAAO5H,MAAO0H,EAAKrG,YAYvC7C,EAAIqJ,aAAe,gBACnBrJ,EAAIsJ,cAAgB,sCACpBtJ,EAAIuJ,cAAgB,mEACpBvJ,EAAIwJ,cAAgB,uBAKpBxJ,EAAIyJ,aAAe,SAAsBxH,YAC/ByH,YACTA,EAAEpJ,UAAY2B,EACD,IAAIyH,GAKlB1J,EAAI8C,OAAS,SAAgBb,OACxBqE,EAAStG,EAAIyJ,aAAaxH,UAC9BqE,EAAOqD,cAAgB1H,EACvBqE,EAAOhB,OAAStF,EAAI4J,MAAMC,UACnBvD,GAIRtG,EAAI8J,QAAU,SAAiB7H,EAAK8H,OAC9B,IAAI/H,KAAQ+H,EAChB9H,EAAID,GAAQ+H,EAAM/H,UACZC,GAIRjC,EAAIgK,eAAiB,SAAwBC,EAASF,UAC9C/J,EAAI8J,QAAQ9J,EAAIyJ,aAAaQ,GAAUF,IAI/C/J,EAAIkK,SAAW,SAAkBD,EAASF,UAClC/J,EAAI8J,QAAQ9J,EAAI8C,OAAOmH,GAAUF,IAIzC/J,EAAImK,YAAc,SAAqBlI,MAClCjC,EAAIwF,OAAOvD,GAAM,KAChBmI,EAAS,UACbnI,EAAI1B,QAAQ,SAAUiB,EAAOD,MACP,iBAATA,EACX,MAAMvB,EAAIqK,UAAUxI,OAAO,wBAC5BuI,EAAO7I,GAAOC,IAER4I,SAEDnI,GAIRjC,EAAIsK,OAAS,SAAgB9I,EAAO+I,UAC/B/I,EAAQ,EACJ,EACS+I,EAAR/I,EACD+I,EAEA/I,GAITxB,EAAIwK,YAAc,SAAqBC,OAClCC,EAAS1K,EAAI2K,MAAMF,GACnBG,EAAIH,EAAII,kBACRD,IACHF,GAAU,KAAOE,GACdH,EAAIK,QACPJ,GAAU,OAAS1K,EAAIwK,YAAYC,EAAIK,QACjCJ,GAIR1K,EAAI+K,eAAiB,SAAwBC,EAASC,EAAGjJ,EAAMkJ,EAAiBC,EAAWC,EAAcC,EAAaC,EAAMC,OACvHC,KACAH,KACe,OAAdF,EAAoB,IACnBG,EAAKpK,OACR,MAAMlB,EAAIyL,cAAc5J,OAAO7B,EAAI6G,MAAMoE,GAAK,0CAC/CO,EAAY,CAACD,QAGbC,EAAY,CAACL,EAAUO,WAAW1J,EAAMsJ,EAAMC,QAE3C,IACc,OAAdJ,EACH,MAAMnL,EAAIyL,cAAc5J,OAAO7B,EAAI6G,MAAMoE,GAAK,0CAC/CO,EAAYL,EAAUQ,UAAU3J,EAAMsJ,EAAMC,UAEzCH,GACHI,EAAUI,QAAQZ,GACZC,EAAEY,MAAMX,EAAiBM,IAGjCxL,EAAI8L,cAAgB,SAAuBd,EAASC,EAAGK,EAAMC,OACxDvJ,EAAOiJ,EAAEc,WAAad,EAAEjJ,aACM,IAAtBiJ,EAAEe,qBAAmE,IAAxBf,EAAEgB,uBAAsE,IAAzBhB,EAAEiB,kBACzG,MAAMlM,EAAIqK,UAAUxI,OAAO,OAAQ,YAAc7B,EAAImM,KAAKlB,GAAK,kCACzDjL,EAAI+K,eAAeC,EAASC,EAAGjJ,EAAMhC,EAAKiL,EAAEe,eAAgBf,EAAEiB,kBAAmBjB,EAAEgB,iBAAkBX,EAAMC,IAGnHvL,EAAIoM,YAAc,SAAqBpB,EAAS/I,EAAKqJ,EAAMC,WAClB,IAA5BtJ,EAAIoK,yBAA6E,IAA9BpK,EAAIqK,2BAAgF,IAA/BrK,EAAIsK,sBACvH,MAAMvM,EAAIqK,UAAUxI,OAAO,OAAQ7B,EAAIwD,KAAKvB,GAAO,yCAC7CjC,EAAI+K,eAAeC,EAAS/I,EAAIuK,SAAUvK,EAAID,KAAMC,EAAKA,EAAIoK,mBAAoBpK,EAAIsK,sBAAuBtK,EAAIqK,qBAAsBhB,EAAMC,IAGpJvL,EAAIyM,YAAc,SAAqBzB,EAAS/I,EAAKqJ,EAAMC,WAChB,IAA9BtJ,EAAIyK,2BAAiF,IAAhCzK,EAAI0K,6BAAoF,IAAjC1K,EAAI2K,wBAC3H,MAAM5M,EAAIqK,UAAUxI,OAAO,SAAU7B,EAAIwD,KAAKvB,GAAO,2CAC/CjC,EAAI+K,eAAeC,EAAS/I,EAAI4K,WAAY5K,EAAID,KAAMC,EAAKA,EAAIyK,qBAAsBzK,EAAI2K,wBAAyB3K,EAAI0K,uBAAwBrB,EAAMC,IAG5JvL,EAAI8M,MAAQ,SAAe9B,EAASC,EAAGK,EAAMC,MACzB,mBAAPN,EACX,OAAOjL,EAAI8L,cAAcd,EAASC,EAAGK,EAAMC,GACvC,GAAIN,GAA6B,mBAAhBA,EAAEuB,SACvB,OAAOxM,EAAIoM,YAAYpB,EAASC,EAAGK,EAAMC,GAEzC,MAAMvL,EAAIqK,UAAUxI,OAAO,OAAQ7B,EAAI2K,MAAMM,GAAK,qBAGpDjL,EAAI+M,WAAa,SAAoBC,EAAQxL,MACvCxB,EAAIuF,QAAQyH,GAEZ,SACAC,EAAW,GACXC,EAAOlN,EAAImN,MAAM3L,GAEZR,EAAI,KAAOA,EAAG,KAClBoM,EAAOF,EAAK/D,UAEZiE,EAAKhE,KAAM,IACVpI,IAAMgM,EAAO9L,OAChB,MAEA,MAAMlB,EAAIqN,WAAWxL,OAAO,QAAUmL,EAAO9L,OAAS,UAA8B,IAAlB8L,EAAO9L,OAAe,GAAK,KAAO,mBAAqBF,QAGtHA,EAAIgM,EAAO9L,QAGd,MAAMlB,EAAIqN,WAAWxL,OAAO,uCAAyCmL,EAAO9L,OAAS,KAFrF+L,EAAWA,EAASK,OAAOtN,EAAI+M,WAAWC,EAAOhM,GAAIoM,EAAK5L,eAKtDyL,EArBP,MAAO,CAAC,CAACD,EAAQxL,KAyBnBxB,EAAIuN,cAAgB,SAAuBC,WACtCC,EAAW,GACXC,EAAQ,EAAGC,GAAS,EACf3M,EAAI,EAAGA,EAAIwM,EAAItM,SAAUF,KACT,iBAAZwM,EAAIxM,GACf0M,GAASF,EAAIxM,GACb2M,GAAS,MAEL,IACAA,EAAQ,CACXF,EAASnK,KAAK,UACT,IAAIsK,EAAI,EAAGA,EAAIF,IAASE,EAC5BH,EAASnK,KAAK,MACfqK,GAAS,EAEVF,EAASnK,KAAKkK,EAAIxM,WAGhB2M,GACHF,EAASnK,KAAK,MACRmK,EAASlK,KAAK,KAItBvD,EAAI6N,IAAM,SAAaC,EAAMC,OACxBC,EAAc,CAAC,UAAW,aAE1BF,GAAiC,mBAAjBA,EAAKG,OACxB,OAAOH,EAAKG,OAAOF,GACf,GAAIA,GAAiC,mBAAjBA,EAAKE,OAC7B,OAAOF,EAAKE,OAAOH,GACf,GAAa,OAATA,EACR,OAAgB,OAATC,EACH,IAA2C,GAAvCC,EAAYE,UAAgBJ,WACO,GAAvCE,EAAYE,UAAgBH,KACxBD,GAAQC,EAIZ,GAAsB,iBAAVD,QACM,iBAAVC,GACJD,GAAQC,EAIZ,GAAI/N,EAAIkE,QAAQ4J,WAChB9N,EAAIkE,QAAQ6J,IACRD,EAAKK,WAAaJ,EAAKI,UAI3B,GAAInO,EAAIuF,QAAQuI,GAAO,IACvB9N,EAAIuF,QAAQwI,GAAO,IAElBD,IAASC,EACZ,OAAO,KACJD,EAAK5M,QAAU6M,EAAK7M,OACvB,OAAO,MACH,IAAIF,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,MAC7BhB,EAAI6N,IAAIC,EAAK9M,GAAI+M,EAAK/M,WACnB,SAEF,EAGP,OAAO,EAEJ,GAAIhB,EAAIoO,UAAUN,GAAO,IACzB9N,EAAIoO,UAAUL,GAAO,IAEpBD,IAASC,EACZ,OAAO,MAEH,IAAIxM,KAAOuM,EAAM,KACjBC,EAAKM,eAAe9M,GAKvB,OAAO,MAJFvB,EAAI6N,IAAIC,EAAKvM,GAAMwM,EAAKxM,IAC5B,OAAO,MAML,IAAIA,KAAOwM,MACVD,EAAKO,eAAe9M,GACxB,OAAO,SAEF,EAEH,GAAIvB,EAAIwF,OAAOuI,GAAO,KAErB,IAAIxM,KAAOuM,EAAM,KACjBC,EAAKO,IAAI/M,GAKZ,OAAO,MAJFvB,EAAI6N,IAAIC,EAAKvM,GAAMwM,EAAKQ,IAAIhN,IAChC,OAAO,MAMN+E,GAAS,SACbyH,EAAKxN,QAAQ,SAAUiB,EAAOD,GACxBuM,EAAKO,eAAe9M,KACxB+E,GAAS,KAEJA,EAGP,OAAO,EAEJ,GAAItG,EAAIwF,OAAOsI,GAAO,IACtB9N,EAAIoO,UAAUL,GAAO,CAEpBzH,GAAS,KACbwH,EAAKvN,QAAQ,SAAUiB,EAAOD,GACzB+E,IAEEyH,EAAKM,eAAe9M,IAEfvB,EAAI6N,IAAIC,EAAKS,IAAIhN,GAAMwM,EAAKxM,MADrC+E,GAAS,OAKPA,EACJ,OAAO,MAEH,IAAI/E,KAAOwM,MACVD,EAAKQ,IAAI/M,GACb,OAAO,SAEF,EAEH,GAAIvB,EAAIwF,OAAOuI,GAAO,IAEtBD,IAASC,EACZ,OAAO,KACJD,EAAKrN,MAAQsN,EAAKtN,KACrB,OAAO,EAEJ6F,GAAS,SACbwH,EAAKvN,QAAQ,SAAUiB,EAAOD,GACzB+E,IAEEyH,EAAKO,IAAI/M,IAEJvB,EAAI6N,IAAIC,EAAKS,IAAIhN,GAAMwM,EAAKQ,IAAIhN,MADzC+E,GAAS,MAKLA,EAGP,OAAO,EAEJ,GAAItG,EAAI0F,OAAOoI,GAAO,IAEtB9N,EAAI0F,OAAOqI,GAAO,IAEjBD,IAASC,EACZ,OAAO,KACJD,EAAKrN,MAAQsN,EAAKtN,KACrB,OAAO,EACJ6F,GAAS,SACbwH,EAAKvN,QAAQ,SAAUiB,GAClB8E,IAEEyH,EAAKO,IAAI9M,KACb8E,GAAS,MAGLA,EAGP,OAAO,EAGR,OAAOwH,IAASC,GAIlB/N,EAAIwO,IAAM,SAAaV,EAAMC,UACxBD,GAAiC,mBAAjBA,EAAKW,OACjBX,EAAKW,OAAOV,GACXA,GAAiC,mBAAjBA,EAAKU,OACtBV,EAAKU,OAAOX,IAEX9N,EAAI6N,IAAIC,EAAMC,IAGxB/N,EAAI0O,aAAe,SAAsBC,EAAUb,EAAMC,SAClD/N,EAAIqK,UAAUxI,OAAO8M,EAAU,sBAAwB3O,EAAI2K,MAAMmD,GAAQ,IAAMa,EAAW,IAAM3O,EAAI2K,MAAMoD,KAYjH/N,EAAI4O,KAAO,SAAcD,EAAUb,EAAMC,OACpCC,EAAc,CAAC,UAAW,cAEa,GAAvCA,EAAYE,UAAgBJ,SACY,GAAvCE,EAAYE,UAAgBH,IAC/B,OAAeA,EAAPD,IAAgBA,EAAOC,QAE5B,GAAsB,iBAAVD,MACM,iBAAVC,EACX,OAAeA,EAAPD,IAAgBA,EAAOC,QAE5B,GAAI/N,EAAIkE,QAAQ4J,OAChB9N,EAAIkE,QAAQ6J,GAAO,KAClBc,EAAKf,EAAKK,UAAWW,EAAKf,EAAKI,iBACtBW,EAALD,IAAYA,EAAKC,SAGtB,GAAI9O,EAAIuF,QAAQuI,OAChB9N,EAAIuF,QAAQwI,GAAO,IAClBD,IAASC,EACZ,OAAO,MACH,IAAI/M,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,EAAG,IACjCA,GAAK+M,EAAK7M,OACb,OAAO,MACJ6N,EAAM/O,EAAI4O,KAAKD,EAAUb,EAAK9M,GAAI+M,EAAK/M,OACvC+N,EACH,OAAOA,SAEFhB,EAAK7M,OAAS4M,EAAK5M,QAAU,EAAI,OAGrC,CAAA,GAAIlB,EAAI0F,OAAOoI,IAAS9N,EAAIgP,UAAUlB,GAAO,KAC7CmB,GAAU,EACVC,GAAU,KAEVlP,EAAI0F,OAAOqI,OACV/N,EAAI0F,OAAOqI,GACdD,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKO,IAAI9M,KACbyN,GAAU,KAEZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKQ,IAAI9M,KACb0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,OAKjB,IAAIvM,KAJTsM,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKoB,MAAM3N,KACfyN,GAAU,KAEMlB,EAAKoB,UACjBrB,EAAKQ,IAAI9M,GAAQ,CACrB0N,GAAU,cAMT,GAAIlP,EAAIgP,UAAUjB,OAClB/N,EAAI0F,OAAOqI,GAAO,KAChB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKO,IAAI9M,GAAQ,CACrByN,GAAU,QAIZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKqB,MAAM3N,KACf0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,GAAO,KACxB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKoB,MAAM3N,GAAQ,CACvByN,GAAU,YAIP,IAAIzN,KAASuM,EAAKoB,UACjBrB,EAAKqB,MAAM3N,GAAQ,CACvB0N,GAAU,eAOblP,EAAI0O,aAAaC,EAAUb,EAAMC,UAE9BkB,EACCC,EACI,KAEA,EAGJA,GACK,EAED,EAITlP,EAAI0O,aAAaC,EAAUb,EAAMC,KAInC/N,EAAIoP,IAAM,SAAatB,EAAMC,OACxBC,EAAc,CAAC,UAAW,aAE1BF,GAAiC,mBAAjBA,EAAKuB,OACxB,OAAOvB,EAAKuB,OAAOtB,GACf,IAA2C,GAAvCC,EAAYE,UAAgBJ,SACO,GAAvCE,EAAYE,UAAgBH,IAC/B,OAAOD,EAAOC,OAEX,GAAsB,iBAAVD,MACM,iBAAVC,EACX,OAAOD,EAAOC,OAEX,GAAI/N,EAAIkE,QAAQ4J,OAChB9N,EAAIkE,QAAQ6J,GACf,OAAOD,EAAKK,UAAYJ,EAAKI,eAE1B,GAAInO,EAAIuF,QAAQuI,OAChB9N,EAAIuF,QAAQwI,GAAO,IAClBD,IAASC,EACZ,OAAO,MACH,IAAI/M,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,EAAG,IACjCA,GAAK+M,EAAK7M,OACb,OAAO,MACClB,EAAI6N,IAAIC,EAAK9M,GAAI+M,EAAK/M,IAE9B,OAAOhB,EAAIoP,IAAItB,EAAK9M,GAAI+M,EAAK/M,WAExB8M,EAAK5M,OAAS6M,EAAK7M,aAIvB,GAAIlB,EAAI0F,OAAOoI,GAAO,IACtB9N,EAAI0F,OAAOqI,OACV/N,EAAI0F,OAAOqI,GACdD,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKO,IAAI9M,KACbyN,SAAU,KAEZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKQ,IAAI9M,KACb0N,SAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,OAKjB,IAAIvM,KAJTsM,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKoB,MAAM3N,KACfyN,SAAU,KAEMlB,EAAKoB,UACjBrB,EAAKQ,IAAI9M,GAAQ,CACrB0N,SAAU,cAMT,GAAIlP,EAAIgP,UAAUjB,OAClB/N,EAAI0F,OAAOqI,GAAO,KAChB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKO,IAAI9M,GAAQ,CACrByN,SAAU,QAIZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKqB,MAAM3N,KACf0N,SAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,GAAO,KACxB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKoB,MAAM3N,GAAQ,CACvByN,SAAU,YAIP,IAAIzN,KAASuM,EAAKoB,UACjBrB,EAAKqB,MAAM3N,GAAQ,CACvB0N,SAAU,eAOblP,EAAI0O,aAAaC,SAAUb,EAAMC,UAE9BkB,QACCC,QACI,KAEA,EAGJA,SACK,EAED,EAGVlP,EAAI0O,aAAa,IAAKZ,EAAMC,IAI7B/N,EAAIsP,IAAM,SAAaxB,EAAMC,OACxBC,EAAc,CAAC,UAAW,aAE1BF,GAAiC,mBAAjBA,EAAKyB,OACxB,OAAOzB,EAAKyB,OAAOxB,OACuB,GAAvCC,EAAYE,UAAgBJ,SACY,GAAvCE,EAAYE,UAAgBH,IAC/B,OAAOD,GAAQC,OAEZ,GAAsB,iBAAVD,MACM,iBAAVC,EACX,OAAOD,GAAQC,OAEZ,GAAI/N,EAAIkE,QAAQ4J,OAChB9N,EAAIkE,QAAQ6J,GACf,OAAOD,EAAKK,WAAaJ,EAAKI,eAE3B,GAAInO,EAAIuF,QAAQuI,OAChB9N,EAAIuF,QAAQwI,GAAO,IAClBD,IAASC,EACZ,OAAO,MACH,IAAI/M,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,EAAG,IACjCA,GAAK+M,EAAK7M,OACb,OAAO,MACClB,EAAI6N,IAAIC,EAAK9M,GAAI+M,EAAK/M,IAE9B,OAAOhB,EAAIoP,IAAItB,EAAK9M,GAAI+M,EAAK/M,WAExB8M,EAAK5M,QAAU6M,EAAK7M,aAIxB,GAAIlB,EAAI0F,OAAOoI,IAAS9N,EAAIgP,UAAUlB,GAAO,KAC7CmB,GAAU,EACVC,GAAU,KAEVlP,EAAI0F,OAAOqI,OACV/N,EAAI0F,OAAOqI,GACdD,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKO,IAAI9M,KACbyN,GAAU,KAEZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKQ,IAAI9M,KACb0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,OAKjB,IAAIvM,KAJTsM,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKoB,MAAM3N,KACfyN,GAAU,KAEMlB,EAAKoB,UACjBrB,EAAKQ,IAAI9M,GAAQ,CACrB0N,GAAU,cAMT,GAAIlP,EAAIgP,UAAUjB,OAClB/N,EAAI0F,OAAOqI,GAAO,KAChB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKO,IAAI9M,GAAQ,CACrByN,GAAU,QAIZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKqB,MAAM3N,KACf0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,GAAO,KACxB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKoB,MAAM3N,GAAQ,CACvByN,GAAU,YAIP,IAAIzN,KAASuM,EAAKoB,UACjBrB,EAAKqB,MAAM3N,GAAQ,CACvB0N,GAAU,eAOblP,EAAI0O,aAAaC,SAAUb,EAAMC,UAE9BkB,EACCC,EACI,KAEA,EAGJA,GACK,EAED,EAGVlP,EAAI0O,aAAa,KAAMZ,EAAMC,IAI9B/N,EAAIwP,IAAM,SAAa1B,EAAMC,OACxBC,EAAc,CAAC,UAAW,aAE1BF,GAAiC,mBAAjBA,EAAK2B,OACxB,OAAO3B,EAAK2B,OAAO1B,OACuB,GAAvCC,EAAYE,UAAgBJ,SACY,GAAvCE,EAAYE,UAAgBH,IAC/B,OAAcA,EAAPD,OAEJ,GAAsB,iBAAVA,MACM,iBAAVC,EACX,OAAcA,EAAPD,OAEJ,GAAI9N,EAAIkE,QAAQ4J,OAChB9N,EAAIkE,QAAQ6J,GACf,OAAOD,EAAKK,UAAYJ,EAAKI,eAE1B,GAAInO,EAAIuF,QAAQuI,OAChB9N,EAAIuF,QAAQwI,GAAO,IAClBD,IAASC,EACZ,OAAO,MACH,IAAI/M,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,EAAG,IACjCA,GAAK+M,EAAK7M,OACb,OAAO,MACClB,EAAI6N,IAAIC,EAAK9M,GAAI+M,EAAK/M,IAE9B,OAAOhB,EAAIwP,IAAI1B,EAAK9M,GAAI+M,EAAK/M,WAExB8M,EAAK5M,OAAS6M,EAAK7M,aAIvB,GAAIlB,EAAI0F,OAAOoI,IAAS9N,EAAIgP,UAAUlB,GAAO,KAC7CmB,GAAU,EACVC,GAAU,KAEVlP,EAAI0F,OAAOqI,OACV/N,EAAI0F,OAAOqI,GACdD,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKO,IAAI9M,KACbyN,GAAU,KAEZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKQ,IAAI9M,KACb0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,OAKjB,IAAIvM,KAJTsM,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKoB,MAAM3N,KACfyN,GAAU,KAEMlB,EAAKoB,UACjBrB,EAAKQ,IAAI9M,GAAQ,CACrB0N,GAAU,cAMT,GAAIlP,EAAIgP,UAAUjB,OAClB/N,EAAI0F,OAAOqI,GAAO,KAChB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKO,IAAI9M,GAAQ,CACrByN,GAAU,QAIZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKqB,MAAM3N,KACf0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,GAAO,KACxB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKoB,MAAM3N,GAAQ,CACvByN,GAAU,YAIP,IAAIzN,KAASuM,EAAKoB,UACjBrB,EAAKqB,MAAM3N,GAAQ,CACvB0N,GAAU,eAOblP,EAAI0O,aAAaC,SAAUb,EAAMC,UAE9BkB,EACCC,EACI,KAEA,EAGJA,GACK,EAED,EAGVlP,EAAI0O,aAAa,IAAKZ,EAAMC,IAI7B/N,EAAI0P,IAAM,SAAa5B,EAAMC,OACxBC,EAAc,CAAC,UAAW,aAE1BF,GAAiC,mBAAjBA,EAAK6B,OACxB,OAAO7B,EAAK6B,OAAO5B,GACf,IAA2C,GAAvCC,EAAYE,UAAgBJ,SACO,GAAvCE,EAAYE,UAAgBH,IAC/B,OAAeA,GAARD,OAEJ,GAAsB,iBAAVA,MACM,iBAAVC,EACX,OAAeA,GAARD,OAEJ,GAAI9N,EAAIkE,QAAQ4J,OAChB9N,EAAIkE,QAAQ6J,GACf,OAAOD,EAAKK,WAAaJ,EAAKI,eAE3B,GAAInO,EAAIuF,QAAQuI,OAChB9N,EAAIuF,QAAQwI,GAAO,IAClBD,IAASC,EACZ,OAAO,MACH,IAAI/M,EAAI,EAAGA,EAAI8M,EAAK5M,SAAUF,EAAG,IACjCA,GAAK+M,EAAK7M,OACb,OAAO,MACClB,EAAI6N,IAAIC,EAAK9M,GAAI+M,EAAK/M,IAE9B,OAAOhB,EAAIwP,IAAI1B,EAAK9M,GAAI+M,EAAK/M,WAExB8M,EAAK5M,QAAU6M,EAAK7M,aAIxB,GAAIlB,EAAI0F,OAAOoI,IAAS9N,EAAIgP,UAAUlB,GAAO,KAC7CmB,GAAU,EACVC,GAAU,KAEVlP,EAAI0F,OAAOqI,OACV/N,EAAI0F,OAAOqI,GACdD,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKO,IAAI9M,KACbyN,GAAU,KAEZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKQ,IAAI9M,KACb0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,OAKjB,IAAIvM,KAJTsM,EAAKvN,QAAQ,SAAUiB,GACjBuM,EAAKoB,MAAM3N,KACfyN,GAAU,KAEMlB,EAAKoB,UACjBrB,EAAKQ,IAAI9M,GAAQ,CACrB0N,GAAU,cAMT,GAAIlP,EAAIgP,UAAUjB,OAClB/N,EAAI0F,OAAOqI,GAAO,KAChB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKO,IAAI9M,GAAQ,CACrByN,GAAU,QAIZlB,EAAKxN,QAAQ,SAAUiB,GACjBsM,EAAKqB,MAAM3N,KACf0N,GAAU,UAGR,GAAIlP,EAAIgP,UAAUjB,GAAO,KACxB,IAAIvM,KAASsM,EAAKqB,UACjBpB,EAAKoB,MAAM3N,GAAQ,CACvByN,GAAU,YAIP,IAAIzN,KAASuM,EAAKoB,UACjBrB,EAAKqB,MAAM3N,GAAQ,CACvB0N,GAAU,eAOblP,EAAI0O,aAAaC,SAAUb,EAAMC,UAE9BkB,EACCC,EACI,KAEA,EAGJA,GACK,EAED,EAGVlP,EAAI0O,aAAa,KAAMZ,EAAMC,IAI9B/N,EAAImN,MAAQ,SAAelL,MACL,iBAATA,GAAqBjC,EAAIuF,QAAQtD,SACrC,CACN0B,MAAO,EACPwF,KAAM,kBACDxH,KAAKgC,MAAQ1B,EAAIf,OACb,CAAEM,MAAOS,EAAIN,KAAKgC,SAAUyF,MAAM,GAElC,CAAEA,MAAM,KAId,GAAIpJ,EAAI4P,QAAQ3N,GACpB,OAAOA,EACH,GAAY,OAARA,GAA0C,mBAAlBA,EAAI4N,SACpC,OAAO5N,EAAI4N,WACP,GAAI7P,EAAIwF,OAAOvD,GAAM,KACrB6N,EAAO,UACX7N,EAAI1B,QAAQ,SAAUiB,EAAOD,GAC5BuO,EAAKxM,KAAK/B,KAEJ,CACNoC,MAAO,EACPwF,KAAM,kBACDxH,KAAKgC,OAASmM,EAAK5O,OACf,CAAEkI,MAAM,GACT,CAAE5H,MAAOsO,EAAKnO,KAAKgC,SAAUyF,MAAM,KAIxC,GAAIpJ,EAAI0F,OAAOzD,GAAM,KACrB8N,EAAS,UACb9N,EAAI1B,QAAQ,SAAUiB,EAAOD,GAC5BwO,EAAOzM,KAAK9B,KAEN,CACNmC,MAAO,EACPwF,KAAM,kBACDxH,KAAKgC,OAASoM,EAAO7O,OACjB,CAAEkI,MAAM,GACT,CAAE5H,MAAOuO,EAAOpO,KAAKgC,SAAUyF,MAAM,KAI1C,GAAIpJ,EAAIgP,UAAU/M,UACfjC,EAAImN,MAAMlL,EAAIkN,OAEjB,GAAInP,EAAIoO,UAAUnM,GAAM,CACxB6N,EAAO,OACN,IAAIvO,KAAOU,EACf6N,EAAKxM,KAAK/B,SACJ,CACNoC,MAAO,EACPwF,KAAM,kBACDxH,KAAKgC,OAASmM,EAAK5O,OACf,CAAEkI,MAAM,GACT,CAAE5H,MAAOsO,EAAKnO,KAAKgC,SAAUyF,MAAM,WAIvCpJ,EAAIqK,UAAUxI,OAAO,OAAQ7B,EAAI2K,MAAM1I,GAAO,4BAGrDjC,EAAI4D,UAAY,SAAmBoM,EAAKC,WACnC3J,EAAS,GACT4J,GAAS,EAAOC,GAAS,EAEpBnP,EAAI,EAAGA,EAAIgP,EAAI9O,SAAUF,EAAG,IAE3B,MADLmF,EAAI6J,EAAIhP,QAEXmP,GAAS,EACLD,EACH,WAEG,GAAS,KAAL/J,IACR+J,GAAS,EACLC,GACH,UAKCC,EAASF,IAAWC,EAAU,IAAM,QAE/BnP,EAAI,EAAGA,EAAIgP,EAAI9O,SAAUF,EAAG,KAChCmF,SAAAA,EAAI6J,EAAIhP,QAEN,IACJsF,GAAW8J,GAASjK,EAAK,MAAQA,YAE7B,IACJG,GAAW8J,GAASjK,EAAK,MAAQA,YAE7B,KACJG,GAAU,iBAEN,KACJA,GAAU,gBAEN,KACJA,GAAU,gBAEN,KACJA,GAAU,wBAIN+J,EADAC,EAAON,EAAIO,WAAWvP,GAgBzBsF,GADc,KAZd+J,EADGC,EAAO,GACD,EACDA,EAAO,IACN,EACAL,GAAU,oyHAAoyHO,KAAKrK,GAEpzHmK,GAAQ,IACP,EACDA,GAAQ,MACP,EAEA,EANA,GASCnK,EACS,IAAXkK,EACE,MAAQrQ,EAAIyQ,MAAMH,EAAKzF,SAAS,IAAK,IAAK,GACjC,IAAXwF,EACE,MAAQrQ,EAAIyQ,MAAMH,EAAKzF,SAAS,IAAK,IAAK,GAE1C,MAAQ7K,EAAIyQ,MAAMH,EAAKzF,SAAS,IAAK,IAAK,WAIjDuF,EAAQ9J,EAAS8J,GAGzBpQ,EAAI0Q,WAAa,SAAoBzO,EAAKgO,OACrCU,EAAO1O,EAAIkC,cACXyM,EAAQ3O,EAAImC,WAAa,EACzByM,EAAM5O,EAAIoC,UACVyM,EAAO7O,EAAIqC,WACXyM,EAAS9O,EAAIsC,aACbyM,EAAS/O,EAAIuC,aACbyM,EAAKhP,EAAIwC,kBACT6B,EAAS,KAAOqK,EAAO,IAAM3Q,EAAIyQ,MAAMG,EAAM/F,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMI,EAAIhG,WAAY,IAAK,UAExGiG,GAAQC,GAAUC,GAAUC,KAC/B3K,GAAU,IAAMtG,EAAIyQ,MAAMK,EAAKjG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMM,EAAOlG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMO,EAAOnG,WAAY,IAAK,GACtIoG,IACH3K,GAAU,IAAMtG,EAAIyQ,MAAMQ,EAAGpG,WAAY,IAAK,GAAK,QAErDvE,GAAU,KAKXtG,EAAIkR,UAAY,SAAmBjP,EAAKgO,OACnCkB,EAAI,GACRA,EAAE7N,KAAK,SAEHtC,EAAI,SACRiB,EAAI1B,QAAQ,SAAUiB,EAAOD,GACxBP,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAIoR,eAAe7P,EAAK0O,IAC/BkB,EAAE7N,KAAK,MACP6N,EAAE7N,KAAKtD,EAAIoR,eAAe5P,EAAOyO,MAGlCkB,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,KAGfvD,EAAIqR,WAAa,SAAoBpP,EAAKgO,OACrCkB,EAAI,GACRA,EAAE7N,KAAK,SACF,IAAItC,EAAI,EAAGA,EAAIiB,EAAIf,SAAUF,EACvB,IAANA,GACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAIoR,eAAenP,EAAIjB,GAAIiP,WAEnCkB,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,KAGfvD,EAAIsR,UAAY,SAAmBrP,EAAKgO,OACnCkB,EAAI,MACRA,EAAE7N,KAAK,KACFrB,EAAIxB,KAEJ,KACAO,EAAI,EACRiB,EAAI1B,QAAQ,SAAUiB,EAAOD,GACxBP,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAIoR,eAAe5P,EAAOyO,WANlCkB,EAAE7N,KAAK,YASR6N,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,KAGfvD,EAAIuR,aAAe,SAAsBtP,EAAKgO,OACzCkB,EAAI,GACRA,EAAE7N,KAAK,SACHtC,EAAI,MACH,IAAIO,KAAOU,EACVA,EAAIoM,eAAe9M,KAEpBP,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAIoR,eAAe7P,EAAK0O,IAC/BkB,EAAE7N,KAAK,MACP6N,EAAE7N,KAAKtD,EAAIoR,eAAenP,EAAIV,GAAM0O,YAErCkB,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,KAGfvD,EAAIoR,eAAiB,SAAwBnP,EAAKgO,UACrC,OAARhO,EACI,QACS,IAARA,EACD,SACS,IAARA,EACD,OACkB,iBAATA,EACTjC,EAAI4D,UAAU3B,EAAKgO,GACD,iBAAThO,EACT,GAAKA,EACa,mBAATA,EACZA,EAAI8J,WAAa9J,EAAID,KACjB,cAAgBC,EAAI8J,WAAa9J,EAAID,MAAQ,IAE7C,uBACAhC,EAAIkE,QAAQjC,GACbjC,EAAI0Q,WAAWzO,EAAKgO,QACF,IAAThO,EACT,cACkB,WAAjB+C,EAAQ/C,IAA+C,mBAAlBA,EAAIuP,SAC1CvP,EAAIuP,WACHxR,EAAIuF,QAAQtD,GACbjC,EAAIqR,WAAWpP,EAAKgO,GACnBjQ,EAAIwF,OAAOvD,GACZjC,EAAIkR,UAAUjP,EAAKgO,GAClBjQ,EAAI0F,OAAOzD,GACZjC,EAAIsR,UAAUrP,EAAKgO,GAClBjQ,EAAIoO,UAAUnM,GACfjC,EAAIuR,aAAatP,EAAKgO,GACvB,KAIRjQ,EAAI6G,MAAQ,SAAe5E,UACnBjC,EAAIoR,eAAenP,GAAK,IAGhCjC,EAAIyR,OAAS,SAAgBxP,UACrBjC,EAAIoR,eAAenP,GAAK,IAGhCjC,EAAI0R,UAAY,SAAmBzP,OAC9B0O,EAAO1O,EAAIkC,cACXyM,EAAQ3O,EAAImC,WAAa,EACzByM,EAAM5O,EAAIoC,UACVyM,EAAO7O,EAAIqC,WACXyM,EAAS9O,EAAIsC,aACbyM,EAAS/O,EAAIuC,aACbyM,EAAKhP,EAAIwC,kBAET6B,EAASqK,EAAO,IAAM3Q,EAAIyQ,MAAMG,EAAM/F,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMI,EAAIhG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMK,EAAKjG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMM,EAAOlG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMO,EAAOnG,WAAY,IAAK,UACtOoG,IACH3K,GAAU,IAAMtG,EAAIyQ,MAAMQ,EAAGpG,WAAY,IAAK,GAAK,OAC7CvE,GAGRtG,EAAI2R,KAAO,SAAc1P,eACH,IAATA,EACJ,GACS,OAARA,EACD,IACS,IAARA,EACD,SACS,IAARA,EACD,OACkB,iBAATA,EACTA,EACkB,iBAATA,EACTA,EAAI4I,WACH7K,EAAIkE,QAAQjC,GACbjC,EAAI0R,UAAUzP,GACbjC,EAAIuF,QAAQtD,GACbjC,EAAIqR,WAAWpP,GACdjC,EAAI0F,OAAOzD,GACZjC,EAAIsR,UAAUrP,GACbjC,EAAIwF,OAAOvD,GACZjC,EAAIkR,UAAUjP,GACI,WAAjB+C,EAAQ/C,IAA8C,mBAAjBA,EAAI2P,QAC1C3P,EAAI2P,UACc,WAAjB5M,EAAQ/C,IAA+C,mBAAlBA,EAAIuP,SAC1CvP,EAAIuP,WACHxR,EAAIoO,UAAUnM,GACfjC,EAAIuR,aAAatP,GAClB,KAIRjC,EAAI6R,MAAQ,SAAe5P,MACtB,MAAQA,IAAgD,IAARA,GAAyB,IAARA,GAAqB,KAARA,EACjF,OAAO,KAEH+C,EAAQ/C,GAA6C,mBAAlBA,EAAI6P,SAC1C,OAAO7P,EAAI6P,cACR9R,EAAIuF,QAAQtD,GACf,OAAsB,IAAfA,EAAIf,OACP,GAAIlB,EAAIwF,OAAOvD,IAAQjC,EAAI0F,OAAOzD,GACtC,OAAmB,GAAZA,EAAIxB,KACP,GAAIT,EAAIoO,UAAUnM,GAAM,KACvB,IAAIV,KAAOU,KACVA,EAAIoM,eAAe9M,UAEjB,SAED,SAED,GAKTvB,EAAI+R,KAAO,SAAc9P,EAAK+P,OACzB1L,KACS,OAAT0L,EAAe,IACG,iBAAT/P,IAAsBjC,EAAIiS,OAAOD,GAC5C,MAAMhS,EAAIqK,UAAUxI,OAAO,QAAS,6CAEZ,QADzByE,EAASe,SAASpF,EAAK+P,IACZnH,WACV,MAAM7K,EAAIqK,UAAUxI,OAAO,QAAS,oCAC9ByE,KAGa,iBAARrE,EAAkB,IAEJ,QADzBqE,EAASe,SAASpF,IACP4I,WACV,MAAM7K,EAAIqK,UAAUxI,OAAO,QAAS,oCAC9ByE,EAEH,GAAoB,iBAARrE,EAChB,OAAOwB,KAAKyO,MAAMjQ,GACd,IAAY,IAARA,EACR,OAAO,EACH,IAAY,IAARA,EACR,OAAO,QACFjC,EAAIqK,UAAUxI,OAAO,QAAS,gDAKtC7B,EAAImS,OAAS,SAAgBlQ,MACP,iBAATA,EACX,OAAO0E,WAAW1E,GACd,GAAqB,iBAATA,EAChB,OAAOA,EACH,IAAY,IAARA,EACR,OAAO,EACH,IAAY,IAARA,EACR,OAAO,QACFjC,EAAIqK,UAAUxI,OAAO,UAAW,kDAIvC7B,EAAIoS,MAAQ,SAAenQ,WACtBiL,EAAOlN,EAAImN,MAAMlL,GAEjBqE,EAAS,KACH,KACL9E,EAAQ0L,EAAK/D,UACb3H,EAAM4H,KACT,OAAO9C,EACRA,EAAOhD,KAAK9B,EAAMA,SAKpBxB,EAAIqS,KAAO,SAAcpQ,WACpBiL,EAAOlN,EAAImN,MAAMlL,GAEjBqE,EAASrG,EAAMU,SAAW,IAAIC,IAAQZ,EAAI4B,KAAKC,WACzC,KACLL,EAAQ0L,EAAK/D,UACb3H,EAAM4H,KACT,OAAO9C,EACRA,EAAOxE,IAAIN,EAAMA,SAKnBxB,EAAIsS,KAAO,SAAcC,MACC,iBAAbA,GAAyBvS,EAAIuF,QAAQgN,GAChD,OAAOA,EAASrR,OACZ,GAAIlB,EAAIwF,OAAO+M,IAAavS,EAAI0F,OAAO6M,GAC3C,OAAOA,EAAS9R,KACZ,GAAIT,EAAIoO,UAAUmE,GAAW,KAC7BvR,EAAI,MACH,IAAIO,KAAOgR,IACbvR,SACIA,QAEFhB,EAAIqK,UAAUxI,OAAO,MAAO,mBAAqB7B,EAAI2K,MAAM4H,GAAY,mBAG9EvS,EAAI2K,MAAQ,SAAe1I,UACd,OAARA,EACI,QACS,IAARA,IAAyB,IAARA,EAClB,YACkB,IAATA,EACT,YACkB,iBAATA,EACT,MACkB,iBAATA,EACTwB,KAAKC,MAAMzB,IAAQA,EAAM,MAAQ,QAChCjC,EAAIuF,QAAQtD,GACb,OACCjC,EAAI0F,OAAOzD,GACZ,MACCjC,EAAIkE,QAAQjC,GACb,YAC2B,IAAlBA,EAAIuQ,SACbvQ,EAAIuQ,SACHxS,EAAI0E,aAAazC,GAClB,YACCjC,EAAIyF,QAAQxD,GACb,OACCjC,EAAIyS,YAAYxQ,GACjB,WACCjC,EAAI0S,YAAYzQ,GACjB,WACD,MAKRjC,EAAI2S,KAAO,SAAcC,MACC,iBAAbA,EAAuB,KAC7B,IAAI5R,EAAI,EAAGA,EAAI4R,EAAS1R,SAAUF,KAClB,OAAhB4R,EAAS5R,GACZ,OAAO,SAEF,MAGF,IAAIkM,EAAOlN,EAAImN,MAAMyF,KAAc,KACnCxF,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,OAAO,KACJpJ,EAAI6R,MAAMzE,EAAK5L,OAClB,OAAO,IAMXxB,EAAI6S,KAAO,SAAcD,MACC,iBAAbA,EAAuB,KAC7B,IAAI5R,EAAI,EAAGA,EAAI4R,EAAS1R,SAAUF,KAClB,OAAhB4R,EAAS5R,GACZ,OAAO,SAEF,MAGF,IAAIkM,EAAOlN,EAAImN,MAAMyF,KAAc,KACnCxF,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,OAAO,MACHpJ,EAAI6R,MAAMzE,EAAK5L,OACnB,OAAO,IAMXxB,EAAI8S,aAAe,SAAsB7Q,eAChB,IAATA,GAKhBjC,EAAI+S,WAAa,SAAoB9Q,eACZ,IAATA,GAIhBjC,EAAIgT,QAAU,SAAiB/Q,UACf,OAARA,GAIRjC,EAAIiT,QAAU,SAAiBhR,SACP,kBAARA,GAIhBjC,EAAIiS,OAAS,SAAgBhQ,SACJ,iBAARA,GAAqBwB,KAAKC,MAAMzB,IAAQA,GAIzDjC,EAAIkT,SAAW,SAAkBjR,SACR,iBAARA,GAAqBwB,KAAKC,MAAMzB,IAAQA,GAIzDjC,EAAImT,OAAS,SAAgBlR,SACL,iBAARA,GAIhBjC,EAAIkE,QAAU,SAAiBjC,SACgB,iBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,IAIvCjC,EAAI6D,SAAW,SAAkB5B,UAChB,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAI4H,QAIrG5H,EAAI0E,aAAe,SAAsBzC,UACxB,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAIyI,YAIrGzI,EAAI8E,cAAgB,SAAuB7C,UAC3B,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAI6I,aAIpG7I,EAAIyS,YAAc,SAAqBxQ,SACQ,mBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,KAA+C,iBAAjBA,EAAIuQ,UAAgD,wBAAjBvQ,EAAIuQ,WAI5GxS,EAAI0S,YAAc,SAAqBzQ,SACd,mBAATA,GAA+D,mBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,KAA+C,iBAAjBA,EAAIuQ,UAAgD,wBAAjBvQ,EAAIuQ,WAI5IxS,EAAIuF,QAAU,SAAiBtD,SACgB,kBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,IAIvCjC,EAAI0F,OAAS,SAAgBzD,SACkB,gBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,IAIvCjC,EAAIsT,aAAe,SAAsBrR,UACzB,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAIuT,QAGpGvT,EAAIgP,UAAY,SAAmB/M,UACnB,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA0C,mBAAbA,EAAIgD,KAAuBhD,EAAIgD,IAAIjF,EAAI4B,OAIpG5B,EAAI4P,QAAU,SAAiB3N,UACf,OAARA,GAAiC,WAAjB+C,EAAQ/C,IAA2C,mBAAdA,EAAIkH,MAIjEnJ,EAAIoO,UAAY,SAAmBnM,SACY,mBAAvCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,SAAuD,IAAlBA,EAAIuQ,UAIhFxS,EAAIwF,OAAS,SAAgBvD,WACxBhC,EAAMG,WACM,OAAR6B,GAAiC,WAAjB+C,EAAQ/C,IAAgD,WAA3B+C,EAAQ/C,EAAIR,YAA2BQ,EAAIR,YAAcpB,IAAIC,YAKnHN,EAAIyF,QAAU,SAAiBxD,UACvBjC,EAAIoO,UAAUnM,IAAQjC,EAAIwF,OAAOvD,IAKzCjC,EAAIwT,YAAc,SAAqBxD,EAAKyD,WACvCnN,EAAS,GACA,EAANmN,IAAWA,EACjBnN,GAAU0J,SACJ1J,GAGRtG,EAAI0T,aAAe,SAAsBC,EAAMF,WAC1CnN,EAAS,GACA,EAANmN,IAAWA,MACZ,IAAIzS,EAAI,EAAGA,EAAI2S,EAAKzS,SAAUF,EAClCsF,EAAOhD,KAAKqQ,EAAK3S,WACZsF,GAGRtG,EAAI4T,UAAY,SAAmB5D,WAC9B1J,EAAS,GACJtF,EAAI,EAAGA,EAAIgP,EAAI9O,SAAUF,EAAG,KAChCmF,EAAI6J,EAAIhP,UACJmF,OACF,KACJG,GAAU,gBAEN,KACJA,GAAU,gBAEN,KACJA,GAAU,gBAEN,KACJA,GAAU,iBAEN,IACJA,GAAU,wBAGNgK,EAAON,EAAIO,WAAWvP,GAEzBsF,GADW,IAARgK,GAAcA,EAAO,IACdnK,EAEA,MAAQnG,EAAIyQ,MAAMH,EAAKzF,SAAS,IAAK,IAAK,UAIjD,IAAMvE,EAAS,KAIvBtG,EAAI6T,QAAU,SAAiB5R,MAClB,OAARA,EACH,MAAO,OACH,QAAqB,IAATA,EAChB,MAAO,eACH,IAAY,IAARA,EACR,MAAO,QACH,IAAY,IAARA,EACR,MAAO,OACH,GAAqB,iBAATA,EAChB,OAAOjC,EAAI4T,UAAU3R,GACjB,GAAqB,iBAATA,QACT,GAAKA,EAER,GAAIjC,EAAIuF,QAAQtD,GAAM,EACtBkP,EAAI,IACN7N,KAAK,SACF,IAAItC,EAAI,EAAGA,EAAIiB,EAAIf,SAAUF,EACxB,GAALA,GACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAI6T,QAAQ5R,EAAIjB,YAExBmQ,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,IAEV,GAAIvD,EAAIwF,OAAOvD,GAAM,EACrBkP,EAAI,IACN7N,KAAK,KACHtC,EAAI,SACRiB,EAAI1B,QAAQ,SAAUiB,EAAOD,GACxBP,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAI6T,QAAQtS,IACnB4P,EAAE7N,KAAK,MACP6N,EAAE7N,KAAKtD,EAAI6T,QAAQrS,MAEpB2P,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,IAEV,GAAIvD,EAAIoO,UAAUnM,GAAM,KACxBkP,GAAAA,EAAI,IACN7N,KAAK,KACHtC,EAAI,MACH,IAAIO,KAAOU,EACXjB,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAI6T,QAAQtS,IACnB4P,EAAE7N,KAAK,MACP6N,EAAE7N,KAAKtD,EAAI6T,QAAQ5R,EAAIV,YAExB4P,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,IAEV,GAAIvD,EAAIkE,QAAQjC,SACb,YAAcA,EAAIkC,cAAgB,KAAOlC,EAAImC,WAAa,KAAOnC,EAAIoC,UAAY,KAAOpC,EAAIqC,WAAa,KAAOrC,EAAIsC,aAAe,KAAOtC,EAAIuC,aAAe,KAAOvC,EAAIwC,kBAAoB,IAE/L,GAAIzE,EAAI0E,aAAazC,SAClB,wBAA0BA,EAAI0C,KAAO,KAAO1C,EAAI2C,QAAU,KAAO3C,EAAI4C,aAAe,IAEvF,GAAI7E,EAAI8E,cAAc7C,SACnB,yBAA2BA,EAAI8C,OAAS,IAE3C,GAAI/E,EAAI6D,SAAS5B,SACd,oBAAsBA,EAAI4F,GAAK,KAAO5F,EAAI6F,GAAK,KAAO7F,EAAI8F,GAAK,KAAO9F,EAAI+F,GAAK,IAElF,GAAIhI,EAAIyS,YAAYxQ,SACjB,sBAAwBjC,EAAI6G,MAAM5E,EAAIE,SAAW,UAEnDnC,EAAIqK,UAAUxI,OAAO,WAAY,4CAIxC7B,EAAI8T,UAAY,SAAmBC,MAElCA,EAAS/T,EAAIgU,OAAOD,EAAQ,MACxBE,KAAKC,MAAQD,KAAKC,KAAKC,MAC1B,OAAOF,KAAKC,KAAKC,MAAMJ,MACpB/T,EAAIqJ,aAAamH,KAAKuD,EAAOK,QAAQpU,EAAIsJ,cAAe,KAAK8K,QAAQpU,EAAIuJ,cAAe,KAAK6K,QAAQpU,EAAIwJ,cAAe,KAC3H,OAAQ,IAAI6K,SAAS,UAAYN,EAAzB,SACH/T,EAAIqK,UAAUxI,OAAO,aAAc,iBAI1C7B,EAAIsU,SAAW,SAAkBrS,UACzBhC,EAAMkC,MAAMF,IAIpBjC,EAAIuU,WAAa,SAAoBR,UAC7B9T,EAAMwC,MAAMsR,IAGpB/T,EAAIwU,aAAe,SAAsBvS,EAAKwS,EAAKC,WAiM9CC,EAhMe,CAClBC,GAAI,CACH3D,GAAI,CAAC,MAAO,MAAO,MAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACvF4D,GAAI,CAAC,SAAU,UAAW,OAAa,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACrHC,GAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzCC,GAAI,CAAC,UAAW,SAAU,WAAY,WAAY,aAAc,UAAW,WAC3EC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELC,GAAI,CACHlE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACnHC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC/CC,GAAI,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACvEC,GAAI,WACJC,GAAI,WACJC,GAAI,4BAELE,GAAI,CACHnE,GAAI,CAAC,QAAS,QAAc,OAAQ,QAAS,MAAO,OAAQ,QAAS,OAAa,QAAS,OAAQ,OAAQ,QAC3G4D,GAAI,CAAC,UAAW,UAAgB,OAAQ,QAAS,MAAO,OAAQ,UAAW,OAAa,YAAa,UAAW,WAAY,YAC5HC,GAAI,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QACrDC,GAAI,CAAC,WAAY,QAAS,QAAS,WAAY,QAAS,WAAY,UACpEC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELG,GAAI,CACHpE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,QAAS,UAAW,QAAS,QAAS,OAAQ,QAAS,QAAS,SAAU,aAAc,UAAW,YAAa,aACrHC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAY,MAAO,MAAO,OACpDC,GAAI,CAAC,UAAW,QAAS,SAAU,YAAkB,SAAU,UAAW,UAC1EC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELI,GAAI,CACHrE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,UAAW,WAAY,QAAS,SAAU,SAAU,SAAU,SAAU,SAAU,YAAa,UAAW,WAAY,YAC3HC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC/CC,GAAI,CAAC,WAAY,SAAe,UAAgB,YAAkB,UAAgB,UAAgB,UAClGC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELK,GAAI,CACHtE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,SAAU,UAAW,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACjHC,GAAI,CAAC,MAAY,MAAO,MAAO,MAAO,MAAO,MAAO,OACpDC,GAAI,CAAC,SAAe,SAAU,UAAW,SAAU,UAAW,SAAU,UACxEC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELM,GAAI,CACHvE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,UAAW,WAAY,OAAQ,QAAS,MAAO,OAAQ,OAAQ,UAAW,YAAa,UAAW,WAAY,YACnHC,GAAI,CAAC,MAAY,MAAY,MAAO,MAAO,MAAO,MAAO,OACzDC,GAAI,CAAC,SAAe,SAAe,SAAU,SAAU,UAAW,SAAU,UAC5EC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELO,GAAI,CACHxE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,WAAY,YAAa,UAAW,WAAY,YACrHC,GAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzCC,GAAI,CAAC,SAAU,UAAW,UAAW,WAAY,YAAa,UAAW,YACzEC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELQ,GAAI,CACHzE,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,UAAW,YAAa,QAAc,QAAS,OAAQ,QAAS,QAAS,SAAU,WAAY,UAAW,WAAY,YAC3HC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC/CC,GAAI,CAAC,UAAW,UAAW,QAAc,SAAU,SAAU,QAAS,UACtEC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELS,GAAI,CACH1E,GAAI,CAAC,MAAO,MAAY,MAAY,MAAO,MAAY,MAAY,MAAY,MAAO,MAAiB,MAAiB,MAAO,OAC/H4D,GAAI,CAAC,QAAS,OAAa,SAAe,QAAS,SAAe,SAAe,WAAiB,QAAS,OAAuB,QAAmB,WAAY,YACjKC,GAAI,CAAC,KAAM,KAAM,KAAW,KAAM,KAAW,KAAW,MACxDC,GAAI,CAAC,SAAe,UAAqB,QAAmB,SAAe,UAAgB,QAAc,UACzGC,GAAI,WACJC,GAAI,WACJC,GAAI,0BAELU,GAAI,CACH3E,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAY,MAAY,MAAY,MAAO,MAAO,MAAO,MAAO,OACjG4D,GAAI,CAAC,SAAe,UAAgB,QAAS,QAAc,MAAY,MAAY,MAAY,SAAU,YAAa,UAAgB,WAAY,YAClJC,GAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAW,KAAM,MAC9CC,GAAI,CAAC,SAAe,WAAY,SAAU,SAAU,UAAgB,SAAU,UAC9EC,GAAI,WACJC,GAAI,WACJC,GAAI,0BAELW,GAAI,CACH5E,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAY,MAAO,OACvF4D,GAAI,CAAC,UAAgB,OAAQ,SAAU,WAAiB,MAAO,WAAY,SAAU,WAAiB,WAAiB,cAAoB,WAAY,YACvJC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAY,MAAO,MAAY,OACzDC,GAAI,CAAC,YAAa,eAAqB,SAAU,QAAc,WAAY,SAAe,UAC1FC,GAAI,WACJC,GAAI,WACJC,GAAI,0BAELY,GAAI,CACH7E,GAAI,CAAC,MAAO,MAAO,MAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACvF4D,GAAI,CAAC,WAAiB,UAAgB,SAAe,UAAW,UAAW,SAAU,SAAU,UAAW,QAAS,WAAY,UAAW,YAC1IC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAY,MAAO,OACpDC,GAAI,CAAC,WAAY,cAAe,SAAU,UAAW,WAAiB,QAAS,UAC/EC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELa,GAAI,CACH9E,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACvP4D,GAAI,CAAC,SAAwC,UAA8C,OAA4B,QAAkC,MAAsB,MAAsB,MAAsB,SAAwC,YAA0D,UAA8C,WAAoD,YAC/ZC,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACzIC,GAAI,CAAC,SAAwC,YAA0D,SAAwC,QAAkC,WAAoD,QAAkC,UACvQC,GAAI,YACJC,GAAI,WACJC,GAAI,2BAELc,GAAI,CACH/E,GAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAClF4D,GAAI,CAAC,WAAY,YAAa,SAAU,UAAW,MAAO,QAAS,QAAS,SAAU,aAAc,YAAa,YAAa,aAC9HC,GAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzCC,GAAI,CAAC,WAAiB,OAAQ,QAAc,WAAY,MAAO,SAAU,WACzEC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELe,GAAI,CACHhF,GAAI,CAAC,MAAO,OAAQ,OAAa,MAAY,MAAY,MAAY,MAAY,MAAO,QAAS,MAAO,MAAO,OAC/G4D,GAAI,CAAC,SAAe,UAAgB,UAAgB,UAAgB,QAAc,SAAe,SAAe,YAAa,aAAc,UAAgB,WAAY,YACvKC,GAAI,CAAC,IAAK,IAAK,IAAK,MAAO,KAAM,IAAK,OACtCC,GAAI,CAAC,WAAiB,QAAmB,OAAQ,SAAU,YAA4B,SAAe,WACtGC,GAAI,WACJC,GAAI,WACJC,GAAI,6BAELgB,GAAI,CACHjF,GAAI,CAAC,MAAO,MAAY,MAAO,MAAO,MAAO,MAAO,MAAO,MAAY,MAAO,MAAO,MAAO,OAC5F4D,GAAI,CAAC,OAAQ,QAAc,OAAQ,QAAS,QAAc,UAAW,SAAU,UAAgB,QAAc,OAAQ,QAAc,UACnIC,GAAI,CAAC,MAAO,MAAO,MAAO,MAAiB,MAAY,MAAO,OAC9DC,GAAI,CAAC,QAAS,YAAa,OAAa,WAAsB,WAAiB,OAAQ,aACvFC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELiB,GAAI,CACHlF,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACvP4D,GAAI,CAAC,SAAwC,UAA8C,OAA4B,SAAwC,MAAsB,OAA4B,OAA4B,SAAwC,WAAoD,UAA8C,SAAwC,WAC/ZC,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACzIC,GAAI,CAAC,cAAsE,cAAsE,UAA8C,QAAkC,UAA8C,UAA8C,WAC7TC,GAAI,WACJC,GAAI,WACJC,GAAI,wBAELkB,GAAI,CACHnF,GAAI,CAAC,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,OACzI4D,GAAI,CAAC,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,KAAgB,MAAsB,OAC3LC,GAAI,CAAC,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,KACjEC,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACzIC,GAAI,WACJC,GAAI,YACJC,GAAI,yBAELmB,GAAI,CACHpF,GAAI,CAAC,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,OACzI4D,GAAI,CAAC,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,MAAY,MAAY,OAChIC,GAAI,CAAC,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,KACjEC,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACzIC,GAAI,aACJC,GAAI,cACJC,GAAI,kCAELoB,GAAI,CACHrF,GAAI,CAAC,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,MAAY,OACzI4D,GAAI,CAAC,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,KAAW,MAAY,MAAY,OAChIC,GAAI,CAAC,IAAU,IAAU,IAAU,IAAU,IAAU,IAAU,KACjEC,GAAI,CAAC,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,MAAsB,OACzIC,GAAI,WACJC,GAAI,YACJC,GAAI,uBAIyBR,GAI3BpO,EAAS,GACTiQ,GAAS,EACJvV,EAAI,EAAGA,EAAIyT,EAAIvT,SAAUF,EAAG,KAChCmF,EAAIsO,EAAIzT,MACRuV,EAAQ,QACHpQ,OACF,IACJA,EAAIwO,EAAYG,GAAG7S,EAAIuU,oBAEnB,IACJrQ,EAAIwO,EAAYI,GAAG9S,EAAIuU,oBAEnB,IACJrQ,EAAIwO,EAAY1D,GAAGhP,EAAImC,sBAEnB,IACJ+B,EAAIwO,EAAYE,GAAG5S,EAAImC,sBAEnB,IACJ+B,EAAInG,EAAIyW,QAAQxU,EAAK0S,EAAYO,GAAIR,aAEjC,IACJvO,EAAInG,EAAIyQ,MAAMxO,EAAIoC,UAAW,IAAK,aAE9B,IACJ8B,EAAInG,EAAIyQ,MAAMxO,EAAIwC,kBAAmB,IAAK,GAAK,gBAE3C,IACJ0B,EAAInG,EAAIyQ,MAAMxO,EAAIqC,WAAY,IAAK,aAE/B,IACJ6B,EAAInG,EAAIyQ,OAAQxO,EAAIqC,WAAa,GAAK,GAAM,EAAG,IAAK,aAEhD,IACJ6B,EAAInG,EAAIyQ,MAAMzQ,EAAI0W,SAASzU,GAAM,IAAK,aAElC,IACJkE,EAAInG,EAAIyQ,MAAMxO,EAAImC,WAAa,EAAG,IAAK,aAEnC,IACJ+B,EAAInG,EAAIyQ,MAAMxO,EAAIsC,aAAc,IAAK,aAEjC,IACJ4B,EAAIlE,EAAIqC,WAAa,GAAK,KAAO,eAE7B,IACJ6B,EAAInG,EAAIyQ,MAAMxO,EAAIuC,aAAc,IAAK,aAEjC,IACJ2B,EAAInG,EAAIyQ,MAAMzQ,EAAI2W,MAAM1U,EAAK,GAAI,IAAK,aAElC,IACJkE,EAAIlE,EAAIuU,mBAEJ,IACJrQ,EAAInG,EAAIyQ,MAAMzQ,EAAI2W,MAAM1U,EAAK,GAAI,IAAK,aAElC,IACJkE,EAAInG,EAAIyW,QAAQxU,EAAK0S,EAAYK,GAAIN,aAEjC,IACJvO,EAAInG,EAAIyW,QAAQxU,EAAK0S,EAAYM,GAAIP,aAEjC,IACJvO,GAAKlE,EAAIkC,cAAgB,KAAK0G,qBAE1B,IACJ1E,EAAIlE,EAAIkC,cAAc0G,qBAElB,QAIA,IAEJ1E,EAAI,GAGNG,EAAOhD,KAAK6C,GACZoQ,GAAS,MAGA,KAALpQ,EACHoQ,GAAS,EAETjQ,EAAOhD,KAAK6C,UAGRG,EAAO/C,KAAK,KAGpBvD,EAAI4W,YAAc,SAAqB3U,EAAKwS,EAAKC,OAC5CmC,EAAOpC,EAGPqC,EAAO,IACPC,EAAQ,IACRC,EAAO,IACPC,GAAY,EACZC,EAAe,EACf1T,EAAO,OAGP,aAAagN,KAAKqG,KACrBrT,EAAOqT,EAAKtQ,UAAUsQ,EAAK3V,OAAS,GACpC2V,EAAOA,EAAKtQ,UAAU,EAAGsQ,EAAK3V,OAAS,IAIpC,OAAOsP,KAAKqG,GAAO,KAClBM,EAAkB,OAAOC,KAAKP,GAClCA,EAAOA,EAAKzC,QAAQ,OAAQ,IACxB,KAAK5D,KAAK2G,KACbJ,EAAQ,IACRD,EAAO,KAERI,EAAe7P,SAAS8P,MAIrB,KAAK3G,KAAKqG,KACbI,GAAY,EACZJ,EAAOA,EAAKtQ,UAAU,EAAGsQ,EAAK3V,OAAS,IAIpC,SAASsP,KAAKqG,GAAO,IACZ,KAARrT,EACH,MAAMxD,EAAIqN,WAAWxL,OAAO,gDAC7BmV,EAAOH,EAAKtQ,UAAUsQ,EAAK3V,OAAS,GACpC2V,EAAOA,EAAKtQ,UAAU,EAAGsQ,EAAK3V,OAAS,MAIrB,GAAf2V,EAAK3V,OACR,MAAMlB,EAAIqN,WAAWxL,OAAO,iCAAmC7B,EAAI6G,MAAM4N,IACrE,GAAmB,GAAfoC,EAAK3V,OAAa,KACtB,UAAUsP,KAAKqG,GAKlB,MAAM7W,EAAIqN,WAAWxL,OAAO,iCAAmC7B,EAAI6G,MAAM4N,IAJzEsC,EAAQF,EAAK,GACbC,EAAOD,EAAK,QAKT,GAAmB,GAAfA,EAAK3V,OAAa,KACtB,WAAWsP,KAAKqG,GAGnB,MAAM7W,EAAIqN,WAAWxL,OAAO,iCAAmC7B,EAAI6G,MAAM4N,IAFzEsC,EAAQF,MAWNnM,EALA2M,EAAMpV,EAAM,SAEZoV,IACHpV,GAAOA,GAGAuB,OACF,IACJkH,EAASzI,EAAI4I,SAAS,aAElB,OACAwM,GAAa,MAANpV,EACV,MAAMjC,EAAIqN,WAAWxL,OAAO,oCAC7B6I,EAASnD,OAAOC,aAAavF,aAEzB,IACJyI,EAASzI,EAAI4I,qBAET,IACJH,EAASzI,EAAI4I,SAAS,aAElB,IACJH,EAASzI,EAAI4I,SAAS,cAElB,IACJH,EAASzI,EAAI4I,SAAS,IAAIyM,wBAEtB,IAEJ5M,EAASzI,EAAI4I,cAKD,MAAVkM,GACCM,GAAgB,MAATL,MACRE,GACCD,GAAuB,MAATzT,GAAyB,MAATA,GAAyB,MAATA,GAAyB,MAATA,IACjE0T,GAAgB,GAEbxM,EAAOxJ,OAASgW,IACnBxM,EAAS1K,EAAIwT,YAAYsD,EAAMI,EAAexM,EAAOxJ,QAAUwJ,IAE5DuM,GAAuB,MAATzT,GAAyB,MAATA,GAAyB,MAATA,GAAyB,MAATA,IACjEkH,EAAS,IAAMlH,EAAOkH,GAEnB2M,EACH3M,EAAS,IAAMA,EACC,KAARsM,IACRtM,EAASsM,EAAOtM,YAGbuM,GAAsB,KAARzT,GAAuB,KAARA,GAAuB,KAARA,GAAuB,KAARA,IAC9DkH,EAAS,IAAMlH,EAAOkH,GACnB2M,EACH3M,EAAS,IAAMA,EACC,KAARsM,IACRtM,EAASsM,EAAOtM,GACbA,EAAOxJ,OAASgW,KACN,KAATH,EACHrM,GAAkB1K,EAAIwT,YAAYsD,EAAMI,EAAexM,EAAOxJ,aAC1D,GAAa,KAAT6V,EACRrM,EAAS1K,EAAIwT,YAAYsD,EAAMI,EAAexM,EAAOxJ,QAAUwJ,WAG3D6M,EAAML,EAAexM,EAAOxJ,OAC5BsW,EAAY/T,KAAKyO,MAAMqF,EAAM,GAC7BE,EAAWF,EAAMC,EACrB9M,EAAS1K,EAAIwT,YAAYsD,EAAMU,GAAa9M,EAAS1K,EAAIwT,YAAYsD,EAAMW,UAIvE/M,GAIR1K,EAAIyW,QAAU,SAAiBxU,EAAKwS,EAAKC,MACpC,MAAQA,EACXA,EAAO,SACH,KACAgD,EAAe,CAAE9C,GAAI,KAAMO,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,KAAMC,GAAI,WAE7L,IAAxBoB,EADZhD,EAAOA,EAAKiD,qBAGyB,IAAxBD,EADZhD,EAAOA,EAAKkD,MAAM,KAAK,MAEtBlD,EAAO,aAGN1U,EAAIkE,QAAQjC,GACRjC,EAAIwU,aAAavS,EAAKwS,EAAKC,GAC1B1U,EAAIiS,OAAOhQ,GACZjC,EAAI4W,YAAY3U,EAAKwS,EAAKC,IACjB,IAARzS,EACDjC,EAAI4W,YAAY,EAAGnC,EAAKC,IACf,IAARzS,EACDjC,EAAI4W,YAAY,EAAGnC,EAAKC,QAD3B,GAIN1U,EAAIyQ,MAAQ,SAAesD,EAAQwD,EAAKM,OACf,iBAAZ9D,IACXA,EAASA,EAAOlJ,YACVkJ,EAAO7S,OAAS2W,GACtB9D,EAASwD,EAAMxD,SACTA,GAGR/T,EAAI8X,MAAQ,SAAe/D,EAAQwD,EAAKM,OACf,iBAAZ9D,IACXA,EAASA,EAAOlJ,YACVkJ,EAAO7S,OAAS2W,GACtB9D,GAAkBwD,SACZxD,GAGR/T,EAAI4J,MAAQ,CACXD,cAAe,KACfrE,OAAQ,EACRuE,QAAS,EACT5E,IAAK,SAAazB,UACb7B,OAAS6B,GAEc,OAAvB7B,KAAKgI,eAEFhI,KAAKgI,cAAc1E,IAAIzB,IAG/BuU,UAAW,SAAmB9V,UAChB,IACA,OAARA,GAAwD,oBAAxCmR,OAAO9S,UAAUuK,SAASwI,KAAKpR,SAA6D,IAAvBA,EAAI0H,cAC5F,OAAO,KACJ1H,IAAQN,KACX,OAAO,EACRM,EAAMA,EAAI0H,gBAKZsE,OAAQ,SAAgB+J,UAChBrW,OAASqW,GAKjBvJ,OAAQ,SAAgBuJ,UACfrW,KAAKsM,OAAO+J,IAOrBlG,SAAU,kBACF,IAIT9R,EAAIiY,UAAYjY,EAAIkK,SACnBlK,EAAI4J,MACJ,CACC/H,OAAQ,eACHsJ,EAAYnL,EAAI8C,OAAOnB,MAC3BwJ,EAAUG,KAAO,GACjBH,EAAU+M,SAAW,GACrB/M,EAAUgN,QAAU,aAGhBC,GAAc,EACdC,EAHJlN,EAAUmN,UAAY,KAIbtX,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,EAAG,KACtCuX,EAAUtX,UAAUD,GACpBoX,GACHjN,EAAUG,KAAKhI,KAAK,CAAEtB,KAAMqW,EAAaG,aAAcD,IAEvDH,IADAjN,EAAU+M,SAASG,IAAe,IAIS,MAAvCE,EAAQE,OAAOF,EAAQrX,OAAS,IACnCmX,EAAcE,EAAQE,OAAO,EAAGF,EAAQrX,OAAS,GACjDkX,GAAc,GAEmB,OAAzBG,EAAQE,OAAO,EAAG,GAC1BtN,EAAUmN,UAAYC,EAAQE,OAAO,GACJ,MAAzBF,EAAQE,OAAO,EAAG,GAC1BtN,EAAUgN,QAAUI,EAAQE,OAAO,IAEnCtN,EAAUG,KAAKhI,KAAK,CAAEtB,KAAMuW,IAC5BpN,EAAU+M,SAASK,IAAW,UAI1BpN,GAIRQ,UAAW,SAAmB3J,EAAMsJ,EAAMC,WACrCC,EAAY,GACZkN,EAAmB,OAAT1W,EAAgBA,EAAO,MAAQ,GAEpChB,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,EAAG,KACtC2X,EAAMhX,KAAK2J,KAAKtK,MAChBA,EAAIsK,EAAKpK,OAAQ,IAChBqK,EAAO8C,eAAesK,EAAI3W,MAC7B,MAAMhC,EAAIyL,cAAc5J,OAAO6W,EAAU,YAAc1Y,EAAI6G,MAAM8R,EAAI3W,MAAQ,cAAgBhB,EAAI,8BAClGwK,EAAUlI,KAAKgI,EAAKtK,YAGhBuK,EAAO8C,eAAesK,EAAI3W,MAC7BwJ,EAAUlI,KAAKiI,EAAOoN,EAAI3W,WACtB,KACA2W,EAAItK,eAAe,gBAGtB,MAAMrO,EAAIyL,cAAc5J,OAAO,YAAc6W,EAAU,YAAc1Y,EAAI6G,MAAM8R,EAAI3W,MAAQ,cAAgBhB,EAAI,aAF/GwK,EAAUlI,KAAKqV,EAAIH,kBAQF,OAAjB7W,KAAKwW,YAEJ7M,EAAKpK,OAASS,KAAK2J,KAAKpK,OAAQ,KAC/B0X,EAAkB,OAAT5W,EAAgB,WAAaA,EAAO,mBAC3ChC,EAAIyL,cAAc5J,OAAO+W,EAAS,YAAcjX,KAAK2J,KAAKpK,OAAS,wBAA8C,GAApBS,KAAK2J,KAAKpK,OAAc,IAAM,IAAM,KAAOoK,EAAKpK,OAAS,gBAK7JsK,EAAUlI,KAAKgI,EAAKpG,MAAMvD,KAAK2J,KAAKpK,YAId,OAAnBS,KAAK2W,eAEH,IAAI/W,KAAOgK,MACV5J,KAAKuW,SAAS3W,SACL,OAATS,EACGhC,EAAIyL,cAAc5J,OAAO,qBAAuB7B,EAAI6G,MAAMtF,GAAO,oBAEjEvB,EAAIyL,cAAc5J,OAAOG,EAAO,wCAA0ChC,EAAI6G,MAAMtF,QAIzF,KAEA+W,EAAY,OACX,IAAI/W,KAAOgK,EACV5J,KAAKuW,SAAS3W,KAClB+W,EAAU/W,GAAOgK,EAAOhK,IAE1BiK,EAAUlI,KAAKgV,UAGT9M,GAIRE,WAAY,SAAoB1J,EAAMsJ,EAAMC,GAC3CD,EAAO3J,KAAKgK,UAAU3J,EAAMsJ,EAAMC,OAE9BvK,EADA6X,EAAY,OAEX7X,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,EACnC6X,EAAUlX,KAAK2J,KAAKtK,GAAGgB,MAAQsJ,EAAKtK,UAChB,OAAjBW,KAAKwW,UACRU,EAAUlX,KAAKwW,SAAW7M,EAAKtK,MACT,OAAnBW,KAAK2W,YACRO,EAAUlX,KAAK2W,WAAahN,EAAKtK,MAC3B6X,GAGRrH,SAAU,iBACF,cAAgB7P,KAAKkJ,WAAa,KAG1C+G,QAAS,kBACDjQ,KAAKkJ,YAGbA,SAAU,mBACLsG,EAAI,GACCnQ,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,EAAG,KACtC2X,EAAMhX,KAAK2J,KAAKtK,GAEhB2X,EAAItK,eAAe,gBACtB8C,EAAE7N,KAAKqV,EAAI3W,KAAO,IAAMhC,EAAI6G,MAAM8R,EAAIH,eAEtCrH,EAAE7N,KAAKqV,EAAI3W,aAEQ,OAAjBL,KAAKwW,SACRhH,EAAE7N,KAAK,IAAM3B,KAAKwW,SACI,OAAnBxW,KAAK2W,WACRnH,EAAE7N,KAAK,KAAO3B,KAAK2W,WACb,IAAMnH,EAAE5N,KAAK,MAAQ,OAM/BvD,EAAI8Y,OAAS,SAAgB3N,EAAW4N,EAAS9N,eAC7B,IAAPA,IACXA,EAAI8N,EACJA,EAAU,IAEPA,EAAQ/W,OACXiJ,EAAEc,UAAYgN,EAAQ/W,MACnBhC,EAAIuF,QAAQ4F,KACfA,EAAYnL,EAAIiY,UAAUpW,OAAOgK,MAAM7L,EAAIiY,UAAW9M,IACvDF,EAAEe,eAAiBb,EACnBF,EAAEgB,iBAAmB8M,EAAQ1N,cAAe,EAC5CJ,EAAEiB,kBAAoB6M,EAAQ3N,eAAgB,EAEvCH,GAGRjL,EAAIgZ,QAAUhZ,EAAIkK,SACjBlK,EAAI4J,MACJ,CACC/H,OAAQ,SAAgBoX,GACnBA,MAAAA,IACHA,EAAO,QACJjO,EAAUhL,EAAI8C,OAAOnB,aACzBqJ,EAAQiO,KAAOA,EACfjO,EAAQkO,QAAU,GAClBlO,EAAQmO,QAAU,GACXnO,GAMRoO,YAAa,eACRpO,EAAUhL,EAAI8C,OAAOnB,aACzBqJ,EAAQiO,KAAOjZ,EAAIyJ,aAAa9H,KAAKsX,MAC9BjO,GAIRqO,WAAY,SAAoBjX,OAC3B4I,EAAUhL,EAAI8C,OAAOnB,aACV,OAAXS,IACH4I,EAAQkO,QAAUvX,KAAKuX,QAAQhU,QAC/B8F,EAAQkO,QAAQ5V,KAAKlB,IAEf4I,GAIRsO,cAAe,eACVtO,EAAUhL,EAAI8C,OAAOnB,aACzBqJ,EAAQmO,QAAU,GACXnO,GAGRuO,MAAO,SAAeN,UACdjZ,EAAI8C,OAAOnB,OAGnB+I,OAAQ,SAAgBlJ,QAClB2X,QAAQ7V,KAAK9B,IAGnBgY,UAAW,kBACH7X,KAAKwX,QAAQ5V,KAAK,KAG1BgL,IAAK,SAAavM,UACVL,KAAKsX,KAAKjX,IAGlBZ,IAAK,SAAaY,EAAMR,QAClByX,KAAKjX,GAAQR,KAOrBxB,EAAIyZ,UAAYzZ,EAAIkK,SACnBlK,EAAI4J,MACJ,CACC4I,SAAU,sBACD,KAETkH,YAAa,SAAqBC,UACzBA,OACF,eACGhY,KAAKmJ,yBASjB9K,EAAI4Z,kBAAoB5Z,EAAIkK,SAASlK,EAAIyZ,UAAW,IAGpDzZ,EAAI6Z,gBAAkB7Z,EAAIkK,SACzBlK,EAAI4Z,kBACJ,CACCpH,SAAU,sBAEV3Q,OAAQ,SAAgByE,OACnBwT,EAAY9Z,EAAI8C,OAAOnB,aAC3BmY,EAAUxT,OAASA,EACZwT,KAKV9Z,EAAI+Z,eAAiB/Z,EAAIkK,SACxBlK,EAAI4Z,kBACJ,CACCpH,SAAU,uBAIZxS,EAAIga,kBAAoBha,EAAIkK,SAC3BlK,EAAI4Z,kBACJ,CACCpH,SAAU,0BAKZxS,EAAIia,YAAcja,EAAIkK,SACrBlK,EAAIyZ,UACJ,CACCjH,SAAU,oBAIZxS,EAAIka,oBAAsBla,EAAIkK,SAC7BlK,EAAIia,YACJ,CACCzH,SAAU,0BAEV3H,SAAU,iBACF,sBAKV7K,EAAIqK,UAAYrK,EAAIkK,SACnBlK,EAAIyZ,UACJ,CACCjH,SAAU,gBAEV3Q,OAAQ,SAAgBsY,EAAWC,OAC9BN,EAAY9Z,EAAI8C,OAAOnB,aAC3BmY,EAAUK,UAAYA,EACtBL,EAAUM,QAAUA,EACbN,GAERjP,SAAU,kBACFlJ,KAAKyY,WAKfpa,EAAIqN,WAAarN,EAAIkK,SACpBlK,EAAIyZ,UACJ,CACCjH,SAAU,iBAEV3Q,OAAQ,SAAgBuY,OACnBN,EAAY9Z,EAAI8C,OAAOnB,aAC3BmY,EAAUM,QAAUA,EACbN,GAERjP,SAAU,kBACFlJ,KAAKyY,WAKfpa,EAAIyL,cAAgBzL,EAAIkK,SACvBlK,EAAIyZ,UACJ,CACCjH,SAAU,oBAEV3Q,OAAQ,SAAgBuY,OACnBN,EAAY9Z,EAAI8C,OAAOnB,aAC3BmY,EAAUM,QAAUA,EACbN,GAERjP,SAAU,kBACFlJ,KAAKyY,WAMfpa,EAAIqa,cAAgBra,EAAIkK,SACvBlK,EAAIyZ,UACJ,CACCjH,SAAU,oBAEV3Q,OAAQ,SAAgByY,EAAUxP,OAC7BgP,EAAY9Z,EAAI8C,OAAOnB,aAC3BmY,EAAUQ,SAAWA,EACrBR,EAAUhP,MAAQA,EACXgP,GAGRS,gBAAiB,SAAUC,OACtBhN,EAAM,GACsB,OAA5BgN,EAASC,eACZjN,EAAIlK,KAAK,sBAETkK,EAAIlK,KAAK,wBACNoX,GAAQ,EACO,MAAZF,GACFE,EACHA,GAAQ,EAERlN,EAAIlK,KAAK,QACVkK,EAAIlK,KAAuB,OAAlBkX,EAASxY,KAAgBhC,EAAI6G,MAAM2T,EAASxY,MAAQ,aAC7DwY,EAAWA,EAASC,sBAEdjN,EAAIjK,KAAK,KAGjBoX,UAAW,kBACN3a,EAAI4a,IAAI7C,UAAUpW,KAAK2Y,UACnB3Y,KAAK2Y,SAASE,SAEd7Y,KAAK2Y,SAASO,IAAIL,UAG3BM,UAAW,cACN9a,EAAI4a,IAAI7C,UAAUpW,KAAK2Y,UAC1B,OAAO3Y,KAAK2Y,SAAS1U,QAEjBiV,EAAMlZ,KAAK2Y,SAASO,WACZ,OAARA,EACIlZ,KAAK2Y,SAAS1U,IAEdiV,EAAIjV,KAIdmV,UAAW,kBACHpZ,KAAK2Y,SAAS1U,KAGtBiF,SAAU,mBACL2P,EAAW7Y,KAAKgZ,YAChBK,EAAiBrZ,KAAK4Y,gBAAgBC,GACtCS,EAAWtZ,KAAKmZ,YAChBI,EAAWvZ,KAAKoZ,YAEhBnC,EAAS4B,EAASW,OAAO5U,UAAU0U,EAAS9V,MAAO+V,EAAS/V,OAC5DmL,EAAOkK,EAASW,OAAO5U,UAAU2U,EAAS/V,MAAO+V,EAAS9V,MAC1DgW,EAASZ,EAASW,OAAO5U,UAAU2U,EAAS9V,KAAM6V,EAAS7V,MAI3DiW,GAHJzC,EAAS5Y,EAAI6G,MAAM+R,GAAQ1T,MAAM,GAAI,KACrCoL,EAAOtQ,EAAI6G,MAAMyJ,GAAMpL,MAAM,GAAI,KACjCkW,EAASpb,EAAI6G,MAAMuU,GAAQlW,MAAM,GAAI,IAEjCoW,EAAYtb,EAAIwT,YAAY,IAAUoF,EAAO1X,QAAUlB,EAAIwT,YAAY,IAAKlD,EAAKpP,QAGjFqa,EAAS,EAAGC,EAAQ,EACfxa,EAAI,EAAGA,EAAIka,EAAS/V,QAASnE,EACV,OAAvBwZ,EAASW,OAAOna,MACjBua,EACFC,EAAQ,KAGNA,SAGJ5V,IAAM,UAAYjE,KAAK2Y,SAAS1U,IAAIT,MAAQ,IAAMxD,KAAK2Y,SAAS1U,IAAIR,KAAO,UAAYmW,EAAS,SAAWC,EAEpGR,EAAiB,KAAOpV,IAAM,KAAOyV,EAAO,KAAOC,GAG3D5B,YAAa,SAAqBC,UACzBA,OACF,eACGhY,KAAKmJ,UACR,kBACGnJ,KAAK2Y,aACR,kBACG3Y,KAAKgZ,cACR,kBACGhZ,KAAKmZ,cACR,kBACGnZ,KAAKoZ,6BAUjB/a,EAAIyb,IAAMzb,EAAIkK,SACblK,EAAI4J,MACJ,CACC/H,OAAQ,SAAgB+D,OACnB8V,EAAM1b,EAAI8C,OAAOnB,aACrB+Z,EAAI9V,IAAMA,EACH8V,GAER9J,QAAS,eACJpE,EAAM,eACLmE,KAAKnE,GACHxN,EAAIuN,cAAcC,IAE1BgE,SAAU,eACLhE,EAAM,eACL3G,MAAM2G,GACJxN,EAAIuN,cAAcC,IAE1BmO,aAAc,SAAsB3Q,cAE3BrJ,KAAKia,MAAM5Q,GAEnB,MAAOP,SACDzK,EAAI4Z,kBAAkB7B,UAAUtN,IAASzK,EAAIqa,cAActC,UAAUtN,KACzEA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGRoR,iBAAkB,SAA0B7Q,EAASxJ,cAE5CG,KAAKma,UAAU9Q,EAASxJ,GAEhC,MAAOiJ,SACDzK,EAAIqa,cAActC,UAAUtN,KAChCA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGRqR,UAAW,SAAmB9Q,EAASxJ,SAChCxB,EAAIka,qBAEX6B,oBAAqB,SAA6B/Q,EAAS2D,EAAUnN,cAE5DG,KAAKqa,aAAahR,EAAS2D,EAAUnN,GAE7C,MAAOiJ,SACDzK,EAAIqa,cAActC,UAAUtN,KAChCA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGRuR,aAAc,SAAsBhR,EAAS2D,EAAUnN,SAChDxB,EAAIka,qBAEXrT,MAAO,SAAe2G,KAEtBmE,KAAM,SAAcnE,KAEpBnI,UAAW,SAAmBhD,OACxB,IAAIrB,EAAI,EAAGA,EAAIW,KAAKsa,YAAY/a,SAAUF,EAC9CqB,EAAQE,KAAKZ,KAAKA,KAAKsa,YAAYjb,MAErCgI,UAAW,SAAmBrD,OACxB,IAAI3E,EAAI,EAAGA,EAAIW,KAAKsa,YAAY/a,SAAUF,OACzCW,KAAKsa,YAAYjb,IAAM2E,EAAQ9C,QAEtCqZ,YAAa,SAAqBvC,EAAUnY,SACrCxB,EAAIqK,UAAUxI,OAAO,SAAU,wBAGtCoa,YAAa,CAAC,SAIhBjc,EAAImc,QAAUnc,EAAIkK,SACjBlK,EAAIyb,IACJ,CACC5Z,OAAQ,SAAgB2Y,EAAU5U,OAC7ByV,EAAOrb,EAAIyb,IAAI5Z,OAAOwR,KAAK1R,KAAMiE,UACrCyV,EAAKb,SAAWA,EACTa,GAERY,YAAajc,EAAIyb,IAAIQ,YAAY3O,OAAO,CAAC,aACzC8O,MAAO,kBACCza,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,OAEhEwW,MAAO,SAAe5Q,GACrBA,EAAQN,OAAO/I,KAAKya,UAErBzK,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,SACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,WAEzBvV,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,aACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,UACxB5O,EAAIlK,KAAK,QAKZtD,EAAIqc,UAAYrc,EAAIkK,SACnBlK,EAAImc,QACJ,CACCta,OAAQ,SAAgB2Y,EAAU5U,EAAKyV,OAClCjZ,EAASpC,EAAImc,QAAQta,OAAOwR,KAAK1R,KAAM6Y,EAAU5U,UACrDxD,EAAOka,UAAUjB,GACVjZ,GAERka,UAAW,SAAmBjB,QACE,IAAnB1Z,KAAK6Y,SAEf7Y,KAAK0Z,KADO,OAATA,EACS1Z,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,MAExDiW,EAGb1Z,KAAK0Z,KAAO,MAEde,MAAO,kBACY,OAAdza,KAAK0Z,KACD1Z,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,MAExDzD,KAAK0Z,MAEdO,MAAO,SAAe5Q,OAChB,IAAIhK,EAAI,EAAGA,EAAIgK,EAAQkO,QAAQhY,SAAUF,EAC7CgK,EAAQN,OAAOM,EAAQkO,QAAQlY,IAChCgK,EAAQN,OAAO/I,KAAKya,UAErB/W,UAAW,SAAmBhD,GAC7BrC,EAAImc,QAAQ9W,UAAUgO,KAAK1R,KAAMU,GAE7BV,KAAK0Z,OAAS1Z,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,MACzE/C,EAAQE,KAAK,MAEbF,EAAQE,KAAKZ,KAAK0Z,OAEpBrS,UAAW,SAAmBrD,GAC7B3F,EAAImc,QAAQnT,UAAUqK,KAAK1R,KAAMgE,QAE5B2W,UAAU3W,EAAQ9C,SAExB8O,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,WACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,WAEzBvV,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,eACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,UACxB5O,EAAIlK,KAAK,QAKZtD,EAAIuc,WAAavc,EAAIkK,SACpBlK,EAAImc,QACJ,CACCxK,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,YACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,WAEzBvV,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKya,UACxB5O,EAAIlK,KAAK,QAKZtD,EAAI4a,IAAM5a,EAAIkK,SACblK,EAAIyb,IACJ,CACC5Z,OAAQ,SAAgB2Y,EAAUK,EAAK2B,EAAQC,OAC1CC,EAAO1c,EAAIyb,IAAI5Z,OAAOwR,KAAK1R,KAAM6a,UACrCE,EAAKlC,SAAWA,EAChBkC,EAAK7B,IAAMA,EACX6B,EAAKD,QAAUA,EACfC,EAAKJ,YACEI,GAERJ,UAAW,gBACqB,IAAnB3a,KAAK6Y,eACXa,KAAO1Z,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,WAC/DkL,KAAO3O,KAAK6Y,SAASW,OAAO5U,UAAU5E,KAAK8a,QAAQtX,MAAOxD,KAAK8a,QAAQrX,aAGvEiW,KAAO,UACP/K,KAAO,OAGdjL,UAAW,SAAmBhD,GAC7BrC,EAAIyb,IAAIpW,UAAUgO,KAAK1R,KAAMU,GAC7BA,EAAQE,KAAKZ,KAAK6Y,UAClBnY,EAAQE,KAAKZ,KAAKkZ,KAClBxY,EAAQE,KAAKZ,KAAK8a,UAEnBzT,UAAW,SAAmBrD,GAC7B3F,EAAImc,QAAQnT,UAAUqK,KAAK1R,KAAMgE,QAC5B6U,SAAW7U,EAAQ9C,YACnBgY,IAAMlV,EAAQ9C,YACd4Z,QAAU9W,EAAQ9C,YAElByZ,eAKRtc,EAAI2c,QAAU3c,EAAIkK,SACjBlK,EAAIyb,IACJ,CACC5Z,OAAQ,SAAgBgZ,EAAKjV,OACxB0K,EAAOtQ,EAAIyb,IAAI5Z,OAAOwR,KAAK1R,KAAMiE,UACrC0K,EAAKuK,IAAMA,EACJvK,GAER2L,YAAajc,EAAIyb,IAAIQ,YAAY3O,OAAO,CAAC,QACzCqE,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK3B,KAAKkZ,IAAIM,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,MAAMgP,QAAQ,SAAU,SAKvFpU,EAAI4c,SAAW5c,EAAIkK,SAClBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKpE,OAC7Bqb,EAAW7c,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAClDiX,EAASrb,MAAQA,EACVqb,GAERZ,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,UAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,oBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKH,QACxBgM,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,UACdrJ,KAAKH,SAKfxB,EAAI8c,YAAc9c,EAAIkK,SACrBlK,EAAI2c,QACJ,CACCI,kBAAmB,SAA2B/R,EAAS1E,cAE9C3E,KAAKqb,WAAWhS,EAAS1E,GAEjC,MAAOmE,SACDzK,EAAI4Z,kBAAkB7B,UAAUtN,IAASzK,EAAIqa,cAActC,UAAUtN,KACzEA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGRoR,iBAAkB,SAA0B7Q,EAAS1E,cAE5C3E,KAAKma,UAAU9Q,EAAS1E,GAEhC,MAAOmE,SACDzK,EAAI4Z,kBAAkB7B,UAAUtN,IAASzK,EAAIqa,cAActC,UAAUtN,KACzEA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGRwS,kBAAmB,SAA2BjS,EAAS1E,cAE9C3E,KAAKub,WAAWlS,EAAS1E,GAEjC,MAAOmE,SACDzK,EAAI4Z,kBAAkB7B,UAAUtN,IAASzK,EAAIqa,cAActC,UAAUtN,KACzEA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,IAGR0S,kBAAmB,SAA2BnS,EAASM,EAAMC,cAEpD5J,KAAKyb,WAAWpS,EAASM,EAAMC,GAEvC,MAAOd,SACDzK,EAAI4Z,kBAAkB7B,UAAUtN,IAASzK,EAAIqa,cAActC,UAAUtN,KACzEA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,IAChCA,MAMVzK,EAAIqd,WAAard,EAAIkK,SACpBlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKpE,OAC7B8b,EAAUtd,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACrD0X,EAAQ9b,MAAQA,EACT8b,GAERrB,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,UACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,sBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKH,QACxBgM,EAAIlK,KAAK,MAEV0Z,WAAY,SAAoBhS,EAAS1E,OACpC9E,EAAQG,KAAKH,MAAMma,aAAa3Q,GACpC1E,EAAOhD,KAAK9B,IAEbsa,UAAW,SAAmB9Q,EAAS1E,OAClC9E,EAAQG,KAAKH,MAAMma,aAAa3Q,GACpC1E,EAAOxE,IAAIN,MAMdxB,EAAIud,iBAAmBvd,EAAIkK,SAC1BlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKpE,OAC7Bgc,EAAgBxd,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC3D4X,EAAchc,MAAQA,EACfgc,GAERvB,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,UACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,4BACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKH,QACxBgM,EAAIlK,KAAK,MAEV0Z,WAAY,SAAoBhS,EAAS1E,WACpC9E,EAAQG,KAAKH,MAAMma,aAAa3Q,GAC3BkC,EAAOlN,EAAImN,MAAM3L,KAAW,KAChC4L,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACD9C,EAAOhD,KAAK8J,EAAK5L,SAGnBsa,UAAW,SAAmB9Q,EAAS1E,WAClC9E,EAAQG,KAAKH,MAAMma,aAAa3Q,GAC3BkC,EAAOlN,EAAImN,MAAM3L,KAAW,KAChC4L,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACD9C,EAAOxE,IAAIsL,EAAK5L,WAMpBxB,EAAIyd,YAAczd,EAAIkK,SACrBlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKrE,EAAKC,OAClCkc,EAAW1d,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACtD8X,EAASnc,IAAMA,EACfmc,EAASlc,MAAQA,EACVkc,GAERzB,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,MAAO,UACxDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,qBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKJ,MACxBiM,EAAIlK,KAAK,WACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKH,QACxBgM,EAAIlK,KAAK,MAEV4Z,WAAY,SAAoBlS,EAAS1E,OACpC/E,EAAMI,KAAKJ,IAAIoa,aAAa3Q,GAC5BxJ,EAAQG,KAAKH,MAAMma,aAAa3Q,GACpC/K,EAAMqB,QAAQgF,EAAQ/E,EAAKC,MAK9BxB,EAAI2d,kBAAoB3d,EAAIkK,SAC3BlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,OAC7BwQ,EAAiB5d,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC5DgY,EAAexQ,KAAOA,EACfwQ,GAER3B,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,SACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,4BACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKyL,OACxBI,EAAIlK,KAAK,MAEV4Z,WAAY,SAAoBlS,EAAS1E,OACpC8G,EAAOzL,KAAKyL,KAAKuO,aAAa3Q,MAC9BhL,EAAIuF,QAAQ6H,OACV,IAAIpM,EAAI,EAAGA,EAAIoM,EAAKlM,SAAUF,EAAG,KAChChB,EAAIuF,QAAQ6H,EAAKpM,KAAyB,GAAlBoM,EAAKpM,GAAGE,OACpC,MAAMlB,EAAIyL,cAAc5J,OAAO,gDAC5BN,EAAM6L,EAAKpM,GAAG,GAAIQ,EAAQ4L,EAAKpM,GAAG,GACtCf,EAAMqB,QAAQgF,EAAQ/E,EAAKC,QAGxB,GAAIxB,EAAIwF,OAAO4H,GACnBA,EAAK7M,QAAQ,SAAUiB,EAAOD,GAC7BtB,EAAMqB,QAAQgF,EAAQ/E,EAAKC,UAGxB,GAAIxB,EAAIoO,UAAUhB,OACjB,IAAI7L,KAAO6L,EACfnN,EAAMqB,QAAQgF,EAAQ/E,EAAK6L,EAAK7L,OAMrCvB,EAAI6d,UAAY7d,EAAIkK,SACnBlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKpE,OAC7BmX,EAAM3Y,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjD+S,EAAInX,MAAQA,EACLmX,GAERsD,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,UACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,0BACJ9B,MAAMqF,MAAM2G,GACjBA,EAAIlK,KAAK,MAEV8Z,WAAY,SAAoBpS,EAASM,EAAMC,OAC1C/J,EAAQG,KAAKH,MAAMma,aAAa3Q,GACpCM,EAAKhI,KAAK9B,MAKbxB,EAAI8d,cAAgB9d,EAAIkK,SACvBlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAK5D,EAAMR,OACnCmX,EAAM3Y,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjD+S,EAAI3W,KAAOA,EACX2W,EAAInX,MAAQA,EACLmX,GAERsD,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,OAAQ,UACzDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,wBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKK,OACxBwL,EAAIlK,KAAK,gBACJ9B,MAAMqF,MAAM2G,GACjBA,EAAIlK,KAAK,MAEV8Z,WAAY,SAAoBpS,EAASM,EAAMC,MAC1CA,EAAO8C,eAAe1M,KAAKK,MAC9B,MAAMhC,EAAIyL,cAAc5J,OAAO,8BAAgCF,KAAKK,UACjER,EAAQG,KAAKH,MAAMma,aAAa3Q,GACpCO,EAAO5J,KAAKK,MAAQR,KAKvBxB,EAAI+d,iBAAmB/d,EAAIkK,SAC1BlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,OAC7BuL,EAAM3Y,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjD+S,EAAIvL,KAAOA,EACJuL,GAERsD,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,SACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gCACJ8J,KAAKvG,MAAM2G,GAChBA,EAAIlK,KAAK,MAEV8Z,WAAY,SAAoBpS,EAASM,EAAMC,OAC1C6B,EAAOzL,KAAKyL,KAAKuO,aAAa3Q,GAClCM,EAAKhI,KAAKuI,MAAMP,EAAM8B,MAKzBpN,EAAIge,iBAAmBhe,EAAIkK,SAC1BlK,EAAI8c,YACJ,CACCjb,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,OAC7BuL,EAAM3Y,EAAI8c,YAAYjb,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjD+S,EAAIvL,KAAOA,EACJuL,GAERsD,YAAajc,EAAI8c,YAAYb,YAAY3O,OAAO,CAAC,SACjDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gCACJ8J,KAAKvG,MAAM2G,GAChBA,EAAIlK,KAAK,MAEV8Z,WAAY,SAAoBpS,EAASM,EAAMC,OAC1C6B,EAAOzL,KAAKyL,KAAKuO,aAAa3Q,MAC9BhL,EAAIuF,QAAQ6H,OACV,IAAIpM,EAAI,EAAGA,EAAIoM,EAAKlM,SAAUF,EAAG,KAChChB,EAAIuF,QAAQ6H,EAAKpM,KAAyB,GAAlBoM,EAAKpM,GAAGE,OACpC,MAAMlB,EAAIyL,cAAc5J,OAAO,gDAC5BN,EAAM6L,EAAKpM,GAAG,GAAIQ,EAAQ4L,EAAKpM,GAAG,MAClCuK,EAAO8C,eAAe9M,GACzB,MAAMvB,EAAIyL,cAAc5J,OAAO,8BAAgCN,GAChEgK,EAAOhK,GAAOC,OAGX,GAAIxB,EAAIwF,OAAO4H,GACnBA,EAAK7M,QAAQ,SAAUiB,EAAOD,MACzBgK,EAAO8C,eAAe9M,GACzB,MAAMvB,EAAIyL,cAAc5J,OAAO,8BAAgCN,GAChEgK,EAAOhK,GAAOC,SAGX,GAAIxB,EAAIoO,UAAUhB,OACjB,IAAI7L,KAAO6L,EAAM,IACjB7B,EAAO8C,eAAe9M,GACzB,MAAMvB,EAAIyL,cAAc5J,OAAO,8BAAgCN,GAChEgK,EAAOhK,GAAO6L,EAAK7L,OAOxBvB,EAAIie,QAAUje,EAAIkK,SACjBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,OACxB+N,EAAO3T,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC9C+N,EAAKxE,MAAQ,GACNwE,GAERsI,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,UAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACJ,IAAItC,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,EACxCwM,EAAIlK,KAAK,UACJ6L,MAAMnO,GAAG6F,MAAM2G,GAErBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjB1E,EAAS,GACJtF,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,OACnCmO,MAAMnO,GAAG+b,kBAAkB/R,EAAS1E,UACnCA,KAKVtG,EAAIke,YAAcle,EAAIkK,SACrBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,EAAM+Q,EAASC,EAAWC,OACvDC,EAAWte,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAClD0Y,EAASlR,KAAOA,EAChBkR,EAASH,QAAUA,EACnBG,EAASF,UAAYA,EACrBE,EAASD,UAAYA,EACdC,GAERrC,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,OAAQ,UAAW,YAAa,cAC7EzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAK,eACJ8J,KAAKvG,MAAM2G,GAChBA,EAAIlK,KAAK,aACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKwc,UACxB3Q,EAAIlK,KAAK,oBACJ8a,UAAUvX,MAAM2G,GACH,OAAd6Q,YACH7Q,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,IAEtBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjBoT,EAAYzc,KAAKyc,UAAUzC,aAAa3Q,GAExCuT,EAAevT,EAAQoO,cAEvB9S,EAAS,GACJ4G,EAAOlN,EAAImN,MAAMiR,KAAe,KACpChR,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,cACGoV,EAAWxe,EAAI+M,WAAWpL,KAAKwc,QAAS/Q,EAAK5L,OACxCR,EAAI,EAAGA,EAAIwd,EAAStd,SAAUF,EACtCwd,EAASxd,GAAG,GAAG6a,iBAAiB0C,EAAcC,EAASxd,GAAG,KACpC,OAAnBW,KAAK0c,WAAsBre,EAAI6R,MAAMlQ,KAAK0c,UAAU1C,aAAa4C,MACpEjY,EAAOhD,KAAK3B,KAAKyL,KAAKuO,aAAa4C,WAE9BjY,KAKVtG,EAAIye,QAAUze,EAAIkK,SACjBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,OACxB8Y,EAAO1e,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC9C8Y,EAAKvP,MAAQ,GACNuP,GAERzC,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,UAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACJ,IAAItC,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,EACxCwM,EAAIlK,KAAK,UACJ6L,MAAMnO,GAAG,GAAG6F,MAAM2G,GACvBA,EAAIlK,KAAK,UACJ6L,MAAMnO,GAAG,GAAG6F,MAAM2G,GAExBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjB1E,EAASrG,EAAMoB,YACVL,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,OACnCmO,MAAMnO,GAAGic,kBAAkBjS,EAAS1E,UACnCA,KAKVtG,EAAI2e,YAAc3e,EAAIkK,SACrBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKrE,EAAKC,EAAO2c,EAASC,EAAWC,OAC7DC,EAAWte,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAClD0Y,EAAS/c,IAAMA,EACf+c,EAAS9c,MAAQA,EACjB8c,EAASH,QAAUA,EACnBG,EAASF,UAAYA,EACrBE,EAASD,UAAYA,EACdC,GAERrC,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,MAAO,QAAS,UAAW,YAAa,cACrFzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAK,cACJ/B,IAAIsF,MAAM2G,GACfA,EAAIlK,KAAK,gBACJ9B,MAAMqF,MAAM2G,GACjBA,EAAIlK,KAAK,kBACJ6a,QAAQtX,MAAM2G,GACnBA,EAAIlK,KAAK,oBACJ8a,UAAUvX,MAAM2G,GACH,OAAd6Q,YACH7Q,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,IAEtBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjBoT,EAAYzc,KAAKyc,UAAUzC,aAAa3Q,GAExCuT,EAAevT,EAAQoO,cAEvB9S,EAASrG,EAAMoB,YAEV6L,EAAOlN,EAAImN,MAAMiR,KAAe,KACpChR,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,cACGoV,EAAWxe,EAAI+M,WAAWpL,KAAKwc,QAAS/Q,EAAK5L,OACxCR,EAAI,EAAGA,EAAIwd,EAAStd,SAAUF,EACtCwd,EAASxd,GAAG,GAAG6a,iBAAiB0C,EAAcC,EAASxd,GAAG,OACpC,OAAnBW,KAAK0c,WAAsBre,EAAI6R,MAAMlQ,KAAK0c,UAAU1C,aAAa4C,IAAgB,KAChFhd,EAAMI,KAAKJ,IAAIoa,aAAa4C,GAC5B/c,EAAQG,KAAKH,MAAMma,aAAa4C,GACpCte,EAAMqB,QAAQgF,EAAQ/E,EAAKC,WAItB8E,KAKVtG,EAAI4e,OAAS5e,EAAIkK,SAChBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,OACxBxE,EAAMpB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC7CxE,EAAI+N,MAAQ,GACL/N,GAER6a,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,UAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,eACJ,IAAItC,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,EACxCwM,EAAIlK,KAAK,UACJ6L,MAAMnO,GAAG,GAAG6F,MAAM2G,GACvBA,EAAIlK,KAAK,UACJ6L,MAAMnO,GAAG,GAAG6F,MAAM2G,GAExBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjB1E,EAASrG,EAAMU,SAAW,IAAIC,IAAQZ,EAAI4B,KAAKC,SAE1Cb,EAAI,EAAGA,EAAIW,KAAKwN,MAAMjO,SAAUF,OACnCmO,MAAMnO,GAAG6a,iBAAiB7Q,EAAS1E,UAElCA,KAKVtG,EAAI6e,WAAa7e,EAAIkK,SACpBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,EAAM+Q,EAASC,EAAWC,OACvDS,EAAU9e,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjDkZ,EAAQ1R,KAAOA,EACf0R,EAAQV,UAAYA,EACpBU,EAAQT,UAAYA,EACbS,GAER7C,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,OAAQ,UAAW,YAAa,cAC7EzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,eACTkK,EAAIlK,KAAK,eACJ8J,KAAKvG,MAAM2G,GAChBA,EAAIlK,KAAK,kBACJ6a,QAAQtX,MAAM2G,GACnBA,EAAIlK,KAAK,oBACJ8a,UAAUvX,MAAM2G,GACH,OAAd6Q,YACH7Q,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,IAEtBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjBoT,EAAYzc,KAAKyc,UAAUzC,aAAa3Q,GAExCuT,EAAevT,EAAQoO,cAEvB9S,EAASrG,EAAMU,SAAW,IAAIC,IAAQZ,EAAI4B,KAAKC,SAC1CqL,EAAOlN,EAAImN,MAAMiR,KAAe,KACpChR,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,cACGoV,EAAWxe,EAAI+M,WAAWpL,KAAKwc,QAAS/Q,EAAK5L,OACxCR,EAAI,EAAGA,EAAIwd,EAAStd,SAAUF,EACtCwd,EAASxd,GAAG,GAAG6a,iBAAiB0C,EAAcC,EAASxd,GAAG,KACpC,OAAnBW,KAAK0c,WAAsBre,EAAI6R,MAAMlQ,KAAK0c,UAAU1C,aAAa4C,MACpEjY,EAAOxE,IAAIH,KAAKyL,KAAKuO,aAAa4C,WAG7BjY,KAKVtG,EAAI+e,WAAa/e,EAAIkK,SACpBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKwH,EAAM+Q,EAASC,EAAWC,OACvDW,EAAShf,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAChDoZ,EAAO5R,KAAOA,EACd4R,EAAOb,QAAUA,EACjBa,EAAOZ,UAAYA,EACnBY,EAAOX,UAAYA,EACZW,GAER/C,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,OAAQ,UAAW,YAAa,cAC7EzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,eACTkK,EAAIlK,KAAK,eACJ8J,KAAKvG,MAAM2G,GAChBA,EAAIlK,KAAK,kBACJ6a,QAAQtX,MAAM2G,GACnBA,EAAIlK,KAAK,oBACJ8a,UAAUvX,MAAM2G,GACE,OAAnB7L,KAAK0c,YACR7Q,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,IAEtBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OACjBoT,EAAYzc,KAAKyc,UAAUzC,aAAa3Q,GACxCkC,EAAOlN,EAAImN,MAAMiR,GAEjBG,EAAevT,EAAQoO,cAEvBlQ,EAAOvH,WAEE,CACZwH,KAAM,kBACQ,KACRiE,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,OAAOgE,UACJoR,EAAWxe,EAAI+M,WAAW7D,EAAKiV,QAAS/Q,EAAK5L,OACxCR,EAAI,EAAGA,EAAIwd,EAAStd,SAAUF,EACtCwd,EAASxd,GAAG,GAAG6a,iBAAiB0C,EAAcC,EAASxd,GAAG,OACpC,OAAnBkI,EAAKmV,WAAsBre,EAAI6R,MAAM3I,EAAKmV,UAAU1C,aAAa4C,UAE7D,CAAE/c,MADG0H,EAAKkE,KAAKuO,aAAa4C,GACZnV,MAAM,SAWpCpJ,EAAIif,OAASjf,EAAIkK,SAChBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAK5D,OAC7Bkd,EAAWlf,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAClDsZ,EAASld,KAAOA,EACTkd,GAERjD,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,SAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,iBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKK,OACxBwL,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,UACdrJ,KAAKwd,KAAKnU,EAASrJ,KAAKK,OAEhC8Z,UAAW,SAAmB9Q,EAASxJ,QACjC6Q,KAAKrH,EAASrJ,KAAKK,KAAMR,IAE/Bwa,aAAc,SAAsBhR,EAAS2D,EAAUnN,QACjD4d,QAAQpU,EAAS2D,EAAUhN,KAAKK,KAAMR,IAE5C2d,KAAM,SAAcnU,EAAShJ,OACxBsE,EAAS0E,EAAQuD,IAAIvM,eACD,IAAZsE,IACXA,EAAStG,EAAIqf,UAAUrd,IACjBsE,GAER+L,KAAM,SAAcrH,EAAShJ,EAAMR,GAClCwJ,EAAQ5J,IAAIY,EAAMR,IAEnB4d,QAAS,SAAiBpU,EAAS2D,EAAU3M,EAAMR,OAC9CyL,EAAW0B,EAAS2Q,KAAKtU,EAAQuD,IAAIvM,GAAOR,GAChDwJ,EAAQ5J,IAAIY,EAAMiL,MAKrBjN,EAAIuf,SAAWvf,EAAIkK,SAClBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAK3D,OAC7Bud,EAAQxf,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC/C4Z,EAAMvd,IAAMA,EACLud,GAERvD,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,QAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK8d,UACdjS,EAAIlK,KAAK,cACJrB,IAAI4E,MAAM2G,GACfA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OACjB/I,EAAMN,KAAKM,IAAI0Z,aAAa3Q,UACzBrJ,KAAK+d,IAAIzd,MAMnBjC,EAAI2f,OAAS3f,EAAIkK,SAChBlK,EAAIuf,SACJ,CACCG,IAAK,SAAazd,UACL,OAARA,GAAyC,mBAAjBA,EAAI2d,QACxB3d,EAAI2d,WACJ3d,KAMXjC,EAAI6f,UAAY7f,EAAIkK,SACnBlK,EAAIuf,SACJ,CACCG,IAAK,SAAazd,UACTA,EAAM,KAMjBjC,EAAI8f,OAAS9f,EAAIkK,SAChBlK,EAAIuf,SACJ,CACCG,IAAK,SAAazd,UACTjC,EAAI6R,MAAM5P,MAMrBjC,EAAI+f,MAAQ/f,EAAIkK,SACflK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKoa,EAAOC,EAASC,OAC7CC,EAASngB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAChDua,EAAOH,MAAQA,EACfG,EAAOF,QAAUA,EACjBE,EAAOD,QAAUA,EACVC,GAERlE,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,QAAS,UAAW,YACjEzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK8d,UACdjS,EAAIlK,KAAK,GACTkK,EAAIlK,KAAK,eACJ0c,MAAMnZ,MAAM2G,GACjBA,EAAIlK,KAAK,GACTkK,EAAIlK,KAAK,iBACJ2c,QAAQpZ,MAAM2G,GACnBA,EAAIlK,KAAK,GACTkK,EAAIlK,KAAK,iBACJ4c,QAAQrZ,MAAM2G,GACnBA,EAAIlK,MAAM,GACVkK,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OAEjBoV,EAAYze,KAAKse,QAAQtE,aAAa3Q,UACtChL,EAAI6R,MAAMuO,GACJze,KAAKqe,MAAMrE,aAAa3Q,GAExBrJ,KAAKue,QAAQvE,aAAa3Q,MAMvChL,EAAIqgB,UAAYrgB,EAAIkK,SACnBlK,EAAIuf,SACJ,CACC3D,MAAO,SAAe5Q,OACjB1E,EAAS3E,KAAKM,IAAI0Z,aAAa3Q,SAC7BhL,EAAI6Z,gBAAgBhY,OAAOyE,IAElCqL,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,gBACJrB,IAAI0P,KAAKnE,MAKjBxN,EAAIsgB,SAAWtgB,EAAIkK,SAClBlK,EAAIuf,SACJ,CACC3D,MAAO,SAAe5Q,OACjB/I,EAAMN,KAAKM,IAAI0Z,aAAa3Q,GAC5BN,EAAS1K,EAAI2R,KAAK1P,GACtB+I,EAAQN,OAAOA,IAEhBiH,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,eACJrB,IAAI0P,KAAKnE,MAKjBxN,EAAIugB,UAAYvgB,EAAIkK,SACnBlK,EAAIuf,SACJ,CACC3D,MAAO,SAAe5Q,OACjB/I,EAAMN,KAAKM,IAAI0Z,aAAa3Q,GAC5BN,EAAS1K,EAAIwgB,WAAWve,GAC5B+I,EAAQN,OAAOA,IAEhBiH,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,gBACJrB,IAAI0P,KAAKnE,MAKjBxN,EAAIygB,UAAYzgB,EAAIkK,SACnBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKkI,EAAMC,OACnC2S,EAAS1gB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAChD8a,EAAO5S,KAAOA,EACd4S,EAAO3S,KAAOA,EACP2S,GAERzE,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,OAAQ,SACrDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK6B,MACdgK,EAAIlK,KAAK,eACJwK,KAAKjH,MAAM2G,GAChBA,EAAIlK,KAAK,eACJyK,KAAKlH,MAAM2G,GAChBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OACjB8C,EAAOnM,KAAKmM,KAAK6N,aAAa3Q,GAC9B+C,EAAOpM,KAAKoM,KAAK4N,aAAa3Q,UAC3BrJ,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAI2gB,QAAU3gB,EAAIkK,SACjBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UACVpM,KAAKwd,KAAKrR,EAAMC,IAG9B+N,UAAW,SAAmB9Q,EAASxJ,OAClCsM,EAAOnM,KAAKmM,KAAK6N,aAAa3Q,GAC9B+C,EAAOpM,KAAKoM,KAAK4N,aAAa3Q,QAC7BqH,KAAKvE,EAAMC,EAAMvM,IAEvBwa,aAAc,SAAsBhR,EAAS2D,EAAUnN,OAClDsM,EAAOnM,KAAKmM,KAAK6N,aAAa3Q,GAC9B+C,EAAOpM,KAAKoM,KAAK4N,aAAa3Q,QAC7BoU,QAAQzQ,EAAUb,EAAMC,EAAMvM,IAEpC2d,KAAM,SAAcf,EAAW7c,MACH,iBAAf6c,GAA2Bpe,EAAIuF,QAAQ6Y,GAAY,IACzC,WAAjBpZ,EAAQzD,IAA0C,mBAAbA,EAAI0D,KAAuB1D,EAAI0D,IAAIjF,EAAIkF,OAAQ,KACnFC,EAAQ5D,EAAI4D,MAAOC,EAAO7D,EAAI6D,YAC9B,MAAQD,IACXA,EAAQ,GACL,MAAQC,IACXA,EAAOgZ,EAAUld,QACXkd,EAAUlZ,MAAMC,EAAOC,UAI1B7D,EAAM,IACTA,GAAO6c,EAAUld,QACXkd,EAAU7c,GAGd,GAAI6c,GAAgD,mBAA3BA,EAAUwC,mBAChCxC,EAAUwC,YAAYrf,GACzB,GAAIvB,EAAIwF,OAAO4Y,GACnB,OAAOA,EAAU7P,IAAIhN,GACjB,GAAkD,oBAA9C6R,OAAO9S,UAAUuK,SAASwI,KAAK+K,GACvC,OAAOA,EAAU7c,GAEjB,MAAMvB,EAAIqK,UAAUxI,OAAO,KAAM7B,EAAI2K,MAAMyT,GAAa,iCAE1D/L,KAAM,SAAc+L,EAAW7c,EAAKC,MAC/BxB,EAAIuF,QAAQ6Y,MACM,WAAjBpZ,EAAQzD,IAA0C,mBAAbA,EAAI0D,KAAuB1D,EAAI0D,IAAIjF,EAAIkF,OAAQ,KACnFC,EAAQ5D,EAAI4D,MAAOC,EAAO7D,EAAI6D,KACpB,OAAVD,EACHA,EAAQ,EACAA,EAAQ,IAChBA,GAASiZ,EAAUld,QAChBiE,EAAQ,EACXA,EAAQ,EACAA,EAAQiZ,EAAUld,SAC1BiE,EAAQiZ,EAAUld,QACN,OAATkE,EACHA,EAAOgZ,EAAUld,OACTkE,EAAO,IACfA,GAAQgZ,EAAUld,QACfkE,EAAO,EACVA,EAAO,EACCA,EAAOgZ,EAAUld,SACzBkE,EAAOgZ,EAAUld,QACdkE,EAAOD,IACVC,EAAOD,GACRiZ,EAAUyC,OAAO1b,EAAOC,EAAOD,OAC1B,IAAI+H,EAAOlN,EAAImN,MAAM3L,KAAW,KAChC4L,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACDgV,EAAUyC,OAAO1b,IAAS,EAAGiI,EAAK5L,aAK/BD,EAAM,IACTA,GAAO6c,EAAUld,QAClBkd,EAAU7c,GAAOC,OAGd,GAAI4c,GAAgD,mBAA3BA,EAAUlC,YACvCkC,EAAUlC,YAAY3a,EAAKC,QACvB,GAAIxB,EAAIwF,OAAO4Y,GACnBA,EAAUhd,IAAIG,EAAKC,OACf,CAAA,GAAkD,oBAA9C4R,OAAO9S,UAAUuK,SAASwI,KAAK+K,GAGvC,MAAMpe,EAAI8gB,sBAAsBjf,OAAOuc,GAFvCA,EAAU7c,GAAOC,IAInB4d,QAAS,SAAiBzQ,EAAUyP,EAAW7c,EAAKC,QAC9C6Q,KAAK+L,EAAW7c,EAAKoN,EAAS2Q,KAAK3d,KAAKwd,KAAKf,EAAW7c,GAAMC,OAMtExB,EAAI+gB,MAAQ/gB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChBD,IAASC,KAMnB/N,EAAIghB,SAAWhhB,EAAIkK,SAClBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChBD,IAASC,KAMnB/N,EAAIihB,MAAQjhB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAI6N,IAAIC,EAAMC,MAMxB/N,EAAIkhB,MAAQlhB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAIwO,IAAIV,EAAMC,MAMxB/N,EAAImhB,MAAQnhB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAIoP,IAAItB,EAAMC,MAMxB/N,EAAIohB,MAAQphB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAIsP,IAAIxB,EAAMC,MAMxB/N,EAAIqhB,MAAQrhB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAIwP,IAAI1B,EAAMC,MAMxB/N,EAAIshB,MAAQthB,EAAIkK,SACflK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UAChB/N,EAAI0P,IAAI5B,EAAMC,MAMxB/N,EAAIuhB,YAAcvhB,EAAIkK,SACrBlK,EAAIygB,UACJ,CACCf,IAAK,SAAazd,EAAKmc,MACD,iBAATnc,GAA4C,iBAAfmc,SACL,IAA5BA,EAAUlQ,QAAQjM,GAErB,GAAIjC,EAAIuF,QAAQ6Y,UACe,IAA5BA,EAAUlQ,QAAQjM,GAErB,GAAImc,GAAiD,mBAA5BA,EAAUoD,oBAChCpD,EAAUoD,aAAavf,GAC1B,GAAIjC,EAAIwF,OAAO4Y,IAAcpe,EAAI0F,OAAO0Y,GAC5C,OAAOA,EAAU9P,IAAIrM,GACjB,GAAIjC,EAAIoO,UAAUgQ,GAAY,KAC7B,IAAI7c,KAAO6c,KACX7c,IAAQU,EACX,OAAO,SAEF,EAEH,GAAIjC,EAAI6D,SAASua,UACdA,EAAUvW,KAAO5F,GAAOmc,EAAUtW,KAAO7F,GAAOmc,EAAUrW,KAAO9F,GAAOmc,EAAUpW,KAAO/F,QAE3FjC,EAAIqK,UAAUxI,OAAO,KAAM7B,EAAI2K,MAAMyT,GAAa,8BAM3Dpe,EAAIyhB,eAAiBzhB,EAAIkK,SACxBlK,EAAIygB,UACJ,CACCf,IAAK,SAAazd,EAAKmc,UACdpe,EAAIuhB,YAAY7B,IAAIzd,EAAKmc,MAMpCpe,EAAI0hB,OAAS1hB,EAAIkK,SAChBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,MACnBD,GAAkC,mBAAlBA,EAAK6T,QACxB,OAAO7T,EAAK6T,QAAQ5T,GAChB,GAAIA,GAAmC,mBAAnBA,EAAK6T,SAC7B,OAAO7T,EAAK6T,SAAS9T,MACT,OAATA,GAA0B,OAATC,EACpB,MAAM/N,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,KAAKmM,MAAQ,MAAQ9N,EAAI2K,MAAMhJ,KAAKoM,MAAQ,wBACnF/N,EAAIuF,QAAQuI,IAAS9N,EAAIuF,QAAQwI,GAAO,KACvCzH,EAAS,UACbtG,EAAI6hB,QAAQvb,EAAQwH,GACpB9N,EAAI6hB,QAAQvb,EAAQyH,GACbzH,EAGP,OAAOwH,EAAOC,GAEhBuR,KAAM,SAAcxR,EAAMC,UACrB/N,EAAIuF,QAAQuI,IAAS9N,EAAIuF,QAAQwI,IACpC/N,EAAI6hB,QAAQ/T,EAAMC,GACXD,GAGAnM,KAAK+d,IAAI5R,EAAMC,MAM1B/N,EAAI8hB,OAAS9hB,EAAIkK,SAChBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,MACnBD,GAAkC,mBAAlBA,EAAKiU,QACxB,OAAOjU,EAAKiU,QAAQhU,GAChB,GAAIA,GAAmC,mBAAnBA,EAAKiU,SAC7B,OAAOjU,EAAKiU,SAASlU,GACjB,GAAI9N,EAAIkE,QAAQ4J,IAAS9N,EAAIkE,QAAQ6J,GACzC,OAAOpM,KAAKsgB,UAAUnU,EAAMC,MAChB,OAATD,GAA0B,OAATC,EACpB,MAAM/N,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,KAAKmM,MAAQ,MAAQ9N,EAAI2K,MAAMhJ,KAAKoM,MAAQ,4BAChFD,EAAOC,GAEfkU,UAAW,SAAmBnU,EAAMC,OAC/BmU,EAAepU,EAAPC,KAERmU,EAAM,KACLC,EAAIrU,EACRA,EAAOC,EACPA,EAAOoU,UAIJC,EAAQtU,EAAK3J,cACbke,EAAWriB,EAAI0W,SAAS5I,GACxBwU,EAAQvU,EAAK5J,cACboe,EAAWviB,EAAI0W,SAAS3I,GAExByU,EAAW,EAEAF,EAARF,GACNI,GAAYxiB,EAAI0W,SAAS1W,EAAIyiB,MAAMH,EAAO,GAAI,OAC5CA,EAEHE,GAAYH,EAAWE,MAEnBG,EAAS5U,EAAKxJ,WACdqe,EAAW7U,EAAKvJ,aAChBqe,EAAW9U,EAAKtJ,aAChBqe,EAAS9U,EAAKzJ,WACdwe,EAAW/U,EAAKxJ,aAGhBwe,EAAeH,EAFJ7U,EAAKvJ,aAEsB,IAAOme,EAAWG,EAAY,IAAMJ,EAASG,IAEnFG,EAAmBlV,EAAKrJ,kBAAoBsJ,EAAKtJ,yBAEjDyd,IACHM,GAAYA,EACZO,GAAeA,EACfC,GAAoBA,GAEdhjB,EAAIyI,UAAU5G,OAAO2gB,EAAUO,EAAa,IAAOC,IAE3D1D,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAIijB,OAASjjB,EAAIkK,SAChBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,MACnBD,GAAkC,mBAAlBA,EAAKoV,QACxB,OAAOpV,EAAKoV,QAAQnV,GAChB,GAAIA,GAAmC,mBAAnBA,EAAKoV,SAC7B,OAAOpV,EAAKoV,SAASrV,MACT,OAATA,GAA0B,OAATC,EACpB,MAAM/N,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMmD,GAAQ,MAAQ9N,EAAI2K,MAAMoD,GAAQ,kBACxE,GAAI/N,EAAIiS,OAAOnE,IAAS9N,EAAIiT,QAAQnF,GAAO,IACzB,iBAAVC,EAAoB,IAC3BD,EAAO,EACV,MAAM9N,EAAIqN,WAAWxL,OAAO,8CACtB7B,EAAIwT,YAAYzF,EAAMD,GAEzB,GAAI9N,EAAIuF,QAAQwI,GAAO,IACvBD,EAAO,EACV,MAAM9N,EAAIqN,WAAWxL,OAAO,8CACtB7B,EAAI0T,aAAa3F,EAAMD,SAG3B,GAAI9N,EAAIiS,OAAOlE,IAAS/N,EAAIiT,QAAQlF,GAAO,IACzB,iBAAVD,EAAoB,IAC3BC,EAAO,EACV,MAAM/N,EAAIqN,WAAWxL,OAAO,8CACtB7B,EAAIwT,YAAY1F,EAAMC,GAEzB,GAAI/N,EAAIuF,QAAQuI,GAAO,IACvBC,EAAO,EACV,MAAM/N,EAAIqN,WAAWxL,OAAO,8CACtB7B,EAAI0T,aAAa5F,EAAMC,WAGzBD,EAAOC,GAEfuR,KAAM,SAAcxR,EAAMC,MACrB/N,EAAIuF,QAAQuI,IAAS9N,EAAIiS,OAAOlE,GAAO,IAC/B,EAAPA,UACC/M,EAAI,EACJoiB,EAAatV,EAAK5M,OAAS6M,EACxBD,EAAK5M,OAASkiB,GACpBtV,EAAKxK,KAAKwK,EAAK9M,WAGhB8M,EAAK+S,OAAO,EAAG/S,EAAK5M,eACd4M,EAGP,OAAOnM,KAAK+d,IAAI5R,EAAMC,MAM1B/N,EAAIqjB,YAAcrjB,EAAIkK,SACrBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,MACnBD,GAAuC,mBAAvBA,EAAKwV,aACxB,OAAOxV,EAAKwV,aAAavV,GACrB,GAAIA,GAAwC,mBAAxBA,EAAKwV,cAC7B,OAAOxV,EAAKwV,cAAczV,MACd,OAATA,GAA0B,OAATC,EACpB,MAAM/N,EAAIqK,UAAUxI,OAAO,KAAM7B,EAAI2K,MAAMmD,GAAQ,OAAS9N,EAAI2K,MAAMoD,GAAQ,yBACxEtK,KAAKyO,MAAMpE,EAAOC,IAE1BuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAIwjB,WAAaxjB,EAAIkK,SACpBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,MACnBD,GAAsC,mBAAtBA,EAAK2V,YACxB,OAAO3V,EAAK2V,YAAY1V,GACpB,GAAIA,GAAuC,mBAAvBA,EAAK2V,aAC7B,OAAO3V,EAAK2V,aAAa5V,MACb,OAATA,GAA0B,OAATC,EACpB,MAAM/N,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMmD,GAAQ,MAAQ9N,EAAI2K,MAAMoD,GAAQ,yBACtED,EAAOC,GAEfuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAI2jB,OAAS3jB,EAAIkK,SAChBlK,EAAIygB,UACJ,CAECf,IAAK,SAAa5R,EAAMC,OACnB6V,EAAMngB,KAAKyO,MAAMpE,EAAOC,GACxB8V,EAAM/V,EAAO8V,EAAM7V,SAEX,IAAR8V,IAAe9V,EAAO,GAAW,EAAN8V,GAAoB,EAAP9V,GAAY8V,EAAM,KAC7DA,GAAO9V,IACL6V,GAEI9V,EAAO8V,EAAM7V,GAErBuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAI8jB,aAAe9jB,EAAIkK,SACtBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,OACV,IAATA,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACJA,EAAO,EACV,OAAO/N,EAAI+jB,cAAcrE,IAAI5R,GAAOC,QACxB,IAATD,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACDC,KACND,GAAQ,SACFA,GAERwR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAI+jB,cAAgB/jB,EAAIkK,SACvBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,OACV,IAATA,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACJA,EAAO,EACV,OAAO/N,EAAI8jB,aAAapE,IAAI5R,GAAOC,QACvB,IAATD,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACDC,KACND,GAAQ,SACFrK,KAAKyO,MAAMpE,IAEnBwR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAIgkB,UAAYhkB,EAAIkK,SACnBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UACV,IAATA,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACDD,EAAOC,GAEfuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAIikB,UAAYjkB,EAAIkK,SACnBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UACV,IAATA,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACDD,EAAOC,GAEfuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAMzB/N,EAAIkkB,SAAWlkB,EAAIkK,SAClBlK,EAAIygB,UACJ,CACCf,IAAK,SAAa5R,EAAMC,UACV,IAATA,EACHA,EAAO,GACU,IAATA,IACRA,EAAO,GACDD,EAAOC,GAEfuR,KAAM,SAAcxR,EAAMC,UAClBpM,KAAK+d,IAAI5R,EAAMC,MAKzB/N,EAAImkB,OAASnkB,EAAIkK,SAChBlK,EAAIygB,UACJ,CACC7E,MAAO,SAAe5Q,OACjB8C,EAAOnM,KAAKmM,KAAK6N,aAAa3Q,UAC7BhL,EAAI6R,MAAM/D,GAEJnM,KAAKoM,KAAK4N,aAAa3Q,GAD1B8C,KAOX9N,EAAIokB,MAAQpkB,EAAIkK,SACflK,EAAIygB,UACJ,CACC7E,MAAO,SAAe5Q,OACjB8C,EAAOnM,KAAKmM,KAAK6N,aAAa3Q,UAC9BhL,EAAI6R,MAAM/D,GACNA,EACGnM,KAAKoM,KAAK4N,aAAa3Q,MAMrChL,EAAIqkB,QAAUrkB,EAAIkK,SACjBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAK3D,EAAK0X,OAClC2K,EAAOtkB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC9C0e,EAAKriB,IAAMA,EACXqiB,EAAK3K,SAAWA,EACT2K,GAERrI,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,MAAO,aACpDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,YACTkK,EAAIlK,KAAK,cACJrB,IAAI4E,MAAM2G,GACfA,EAAIlK,KAAK,cACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKgY,WACxBnM,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OACjB/I,EAAMN,KAAKM,IAAI0Z,aAAa3Q,UACnBrJ,KAAKwd,KAAKld,EAAKN,KAAKgY,WAGlCmC,UAAW,SAAmB9Q,EAASxJ,OAClCS,EAAMN,KAAKM,IAAI0Z,aAAa3Q,QAC3BqH,KAAKpQ,EAAKN,KAAKgY,SAAUnY,IAE/Bwa,aAAc,SAAsBhR,EAAS2D,EAAUnN,OAClDS,EAAMN,KAAKM,IAAI0Z,aAAa3Q,QAC3BoU,QAAQzQ,EAAU1M,EAAKN,KAAKgY,SAAUnY,IAE5C2d,KAAM,SAAcoF,EAAQ5K,MACH,iBAAZ4K,SACH5K,OACF,eACG3Z,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAe0L,EAAKrf,EAAOsf,UAAczkB,EAAI0kB,OAAOH,EAAQC,EAAKrf,EAAOsf,SAC7H,cACGzkB,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAc0L,EAAKrf,EAAOsf,UAAczkB,EAAI2kB,MAAMJ,EAAQC,EAAKrf,EAAOsf,SAC3H,eACGzkB,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAe0L,EAAKrf,EAAOsf,UAAczkB,EAAI4kB,OAAOL,EAAQC,EAAKrf,EAAOsf,SAC7H,iBACGzkB,EAAI8Y,OAAO,CAAC,MAAO,MAAO,SAAU,MAAO,SAAiB+L,EAAKC,EAAMC,UAAgB/kB,EAAIglB,SAAST,EAAQM,EAAKC,EAAMC,SAC1H,eACG/kB,EAAI8Y,OAAO,CAAC,SAAU,MAAO,SAAe3R,UAAgBnH,EAAIgU,OAAOuQ,EAAQpd,SAClF,gBACGnH,EAAI8Y,OAAO,CAAC,SAAU,MAAO,SAAgB3R,UAAgBnH,EAAIilB,QAAQV,EAAQpd,SACpF,gBACGnH,EAAI8Y,OAAO,CAAC,SAAU,MAAO,SAAgB3R,UAAgBnH,EAAIklB,QAAQX,EAAQpd,SACpF,eACGnH,EAAI8Y,OAAO,CAAC,OAAQ,KAAM,SAAU,MAAO,SAAeqM,EAAKJ,UAAgB/kB,EAAIolB,OAAOb,EAAQY,EAAKJ,SAC1G,gBACG/kB,EAAI8Y,OAAO,CAAC,OAAQ,KAAM,SAAU,MAAO,SAAgBqM,EAAKJ,UAAgB/kB,EAAIqlB,QAAQd,EAAQY,EAAKJ,SAC5G,oBACG/kB,EAAI8Y,OAAO,CAAC,aAAa,GAAQ,SAAoBwM,UAAmBtlB,EAAIulB,YAAYhB,EAAQe,SACnG,eACGtlB,EAAI8Y,OAAO,GAAI,kBAA0ByL,EAAO5M,oBACnD,eACG3X,EAAI8Y,OAAO,GAAI,kBAA0ByL,EAAOjN,oBACnD,oBACGtX,EAAI8Y,OAAO,GAAI,kBAA+B9Y,EAAIwlB,YAAYjB,SACjE,cACGvkB,EAAI8Y,OAAO,CAAC,YAAa,SAAclG,UAAmB5S,EAAIylB,MAAMlB,EAAQ3R,SAC/E,oBACG5S,EAAI8Y,OAAO,CAAC,UAAW,SAAoBF,UAAiB5Y,EAAI0lB,YAAYnB,EAAQ3L,SACvF,kBACG5Y,EAAI8Y,OAAO,CAAC,UAAW,SAAkBsC,UAAiBpb,EAAI2lB,UAAUpB,EAAQnJ,yBAKrF,GAAIpb,EAAIuF,QAAQgf,UACZ5K,OACF,gBACG3Z,EAAI8Y,OAAO,CAAC,UAAW,SAAgB3J,UAAgBnP,EAAI6hB,QAAQ0C,EAAQpV,SAC9E,gBACGnP,EAAI8Y,OAAO,CAAC,MAAO,UAAW,SAAgBlT,EAAKuJ,UAAgBnP,EAAI4lB,QAAQrB,EAAQ3e,EAAKuJ,SAC/F,aACGnP,EAAI8Y,OAAO,CAAC,QAAS,GAAI,SAAalT,UAAc5F,EAAI6lB,KAAKtB,EAAQ3e,SACxE,eACG5F,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAe0L,EAAKrf,EAAOsf,UAAczkB,EAAI0kB,OAAOH,EAAQC,EAAKrf,EAAOsf,SAC7H,cACGzkB,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAc0L,EAAKrf,EAAOsf,UAAczkB,EAAI2kB,MAAMJ,EAAQC,EAAKrf,EAAOsf,SAC3H,eACGzkB,EAAI8Y,OAAO,CAAC,MAAO,SAAU,KAAM,OAAQ,MAAO,SAAe0L,EAAKrf,EAAOsf,UAAczkB,EAAI4kB,OAAOL,EAAQC,EAAKrf,EAAOsf,yBAK/H,GAAIzkB,EAAIkE,QAAQqgB,UACZ5K,OACF,iBACG3Z,EAAI8Y,OAAO,GAAI,kBAA4B9Y,EAAI8lB,SAASvB,SAC3D,cACGvkB,EAAI8Y,OAAO,CAAC,gBAAiB,MAAO,SAAciN,UAAuB/lB,EAAI2W,MAAM4N,EAAQwB,SAC9F,aACG/lB,EAAI8Y,OAAO,GAAI,kBAAwByL,EAAOlgB,gBACjD,eACGrE,EAAI8Y,OAAO,GAAI,kBAA0ByL,EAAOngB,WAAa,QAChE,cACGpE,EAAI8Y,OAAO,GAAI,kBAAyByL,EAAOpgB,oBAClD,cACGnE,EAAI8Y,OAAO,GAAI,kBAAyByL,EAAOjgB,iBAClD,gBACGtE,EAAI8Y,OAAO,GAAI,kBAA2ByL,EAAOhgB,mBACpD,gBACGvE,EAAI8Y,OAAO,GAAI,kBAA2ByL,EAAO/f,mBACpD,qBACGxE,EAAI8Y,OAAO,GAAI,kBAA2D,IAA3ByL,EAAO9f,wBACzD,oBACGzE,EAAI8Y,OAAO,GAAI,kBAA+B9Y,EAAIgmB,YAAYzB,SACjE,mBACGvkB,EAAI8Y,OAAO,GAAI,kBAA8B9Y,EAAIimB,WAAW1B,SAC/D,iBACGvkB,EAAI8Y,OAAO,GAAI,kBAA4B9Y,EAAI0W,SAAS6N,yBAK7D,GAAIvkB,EAAIwF,OAAO+e,UACX5K,OACF,aACG3Z,EAAI8Y,OAAO,CAAC,MAAO,WAAY,MAAO,SAAavX,EAAK2kB,UAAmBlmB,EAAImf,KAAKoF,EAAQhjB,EAAK2kB,SACpG,eACGlmB,EAAI8Y,OAAO,GAAI,kBAA0B9Y,EAAImmB,OAAO5B,SACvD,gBACGvkB,EAAI8Y,OAAO,GAAI,kBAA2B9Y,EAAIomB,QAAQ7B,SACzD,gBACGvkB,EAAI8Y,OAAO,CAAC,SAAU,YAAa,SAAgBd,EAAOzM,UAAiBvL,EAAIqmB,QAAQ9B,EAAQvM,EAAOzM,SACzG,eACGvL,EAAI8Y,OAAO,GAAI,kBAA0B9Y,EAAIsmB,OAAO/B,oBAEpDA,EAAOhW,IAAIoL,QAGhB,GAAI3Z,EAAI0F,OAAO6e,UACX5K,OACF,aACG3Z,EAAI8Y,OAAO,CAAC,UAAW,SAAa3J,OAAc,IAAInO,EAAI,EAAGA,EAAImO,EAAMjO,SAAUF,EAAKujB,EAAOziB,IAAIqN,EAAMnO,UAC1G,eACGhB,EAAI8Y,OAAO,GAAI,kBAA0B9Y,EAAIsmB,OAAO/B,yBAKzD,GAA+C,oBAA3CnR,OAAO9S,UAAUuK,SAASwI,KAAKkR,UAC/B5K,OACF,aACG3Z,EAAI8Y,OAAO,CAAC,MAAO,WAAY,MAAO,SAAavX,EAAK2kB,UAAmBlmB,EAAImf,KAAKoF,EAAQhjB,EAAK2kB,SACpG,eACGlmB,EAAI8Y,OAAO,GAAI,kBAA0B9Y,EAAImmB,OAAO5B,SACvD,gBACGvkB,EAAI8Y,OAAO,GAAI,kBAA2B9Y,EAAIomB,QAAQ7B,SACzD,gBACGvkB,EAAI8Y,OAAO,CAAC,SAAU,YAAa,SAAgBd,EAAOzM,UAAiBvL,EAAIqmB,QAAQ9B,EAAQvM,EAAOzM,SACzG,eACGvL,EAAI8Y,OAAO,GAAI,kBAA0B9Y,EAAIsmB,OAAO/B,iBAEvDje,KAKoB,mBAHvBA,EADGie,GAA0C,mBAAxBA,EAAO7K,YACnB6K,EAAO7K,YAAYC,GAEnB4K,EAAO5K,IAEhB,OAAOrT,MACJigB,EAAa,kBACTjgB,EAAOuF,MAAM0Y,EAAQtjB,mBAE7BslB,EAAWxa,UAAYzF,EAAOyF,WAAazF,EAAOtE,KAClDukB,EAAWva,eAAiB1F,EAAO0F,eACnCua,EAAWta,iBAAmB3F,EAAO2F,iBACrCsa,EAAWra,kBAAoB5F,EAAO4F,kBAC/Bqa,QAGJvmB,EAAIqK,UAAUxI,OAAO,MAAO7B,EAAI2K,MAAM4Z,GAAU,uCAEvDlS,KAAM,SAAckS,EAAQ5K,EAAUnY,MACb,WAApBwD,EAAQuf,IAAwD,mBAAxBA,EAAOiC,YAClDjC,EAAOiC,YAAY7M,EAAUnY,QACzB,GAAIxB,EAAIwF,OAAO+e,GACnBA,EAAOnjB,IAAIuY,EAAUnY,OACjB,CAAA,IAAIxB,EAAIoO,UAAUmW,GAGtB,MAAMvkB,EAAIqK,UAAUxI,OAAO,MAAO7B,EAAI2K,MAAM4Z,GAAU,sCAFtDA,EAAO5K,GAAYnY,IAIrB4d,QAAS,SAAiBzQ,EAAU4V,EAAQ5K,EAAUnY,OACjDilB,EAAW9kB,KAAKwd,KAAKoF,EAAQ5K,GAC7B1M,EAAW0B,EAAS2Q,KAAKmH,EAAUjlB,QAClC6Q,KAAKkS,EAAQ5K,EAAU1M,MAK/BjN,EAAI0mB,QAAU1mB,EAAIkK,SACjBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAK3D,EAAKqJ,OAClC+H,EAAOrT,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC9CyN,EAAKpR,IAAMA,EACXoR,EAAK/H,KAAOA,EACL+H,GAER4I,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,MAAO,SACpDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,YACTkK,EAAIlK,KAAK,cACJrB,IAAI4E,MAAM2G,OACV,IAAIxM,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,EAAG,KACtC2X,EAAMhX,KAAK2J,KAAKtK,GACpBwM,EAAIlK,KAAK,KACTqV,EAAI9R,MAAM2G,GAEXA,EAAIlK,KAAK,MAEVqjB,UAAW,SAAmB3b,WACzBM,EAAO,GAAIC,EAAS,GACfvK,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,OAClCsK,KAAKtK,GAAGmc,kBAAkBnS,EAASM,EAAMC,SACxC,CAAED,KAAMA,EAAMC,OAAQA,IAE9BoQ,aAAc,SAAsB3Q,cAE3BrJ,KAAKia,MAAM5Q,GAEnB,MAAOP,SACNA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,KAIvCmR,MAAO,SAAe5Q,OACjB/I,EAAMN,KAAKM,IAAI0Z,aAAa3Q,GAC5BM,EAAO3J,KAAKglB,UAAU3b,UACbhL,EAAI8M,MAAM9B,EAAS/I,EAAKqJ,EAAKA,KAAMA,EAAKC,WAMxDvL,EAAI4mB,UAAY5mB,EAAIkK,SACnBlK,EAAI0mB,QACJ,CACC7kB,OAAQ,SAAgBgZ,EAAKjV,EAAK3D,EAAKqJ,OAClCub,EAAS7mB,EAAI0mB,QAAQ7kB,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,EAAK3D,EAAKqJ,UAC1Dub,EAAOzkB,OAAS,KACTykB,GAER5K,YAAajc,EAAI0mB,QAAQzK,YAAY3O,OAAO,CAAC,WAC7CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,cACTkK,EAAIlK,KAAK,YACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKS,SACxBoL,EAAIlK,KAAK,cACJrB,IAAI4E,MAAM2G,GACfA,EAAIlK,KAAK,OACJ,IAAItC,EAAI,EAAGA,EAAIW,KAAK2J,KAAKpK,SAAUF,EAAG,KACtCgB,EAAOL,KAAK2J,KAAKtK,GAAG,GACpB2X,EAAMhX,KAAK2J,KAAKtK,GAAG,GACvBwM,EAAIlK,KAAK,KACI,OAATtB,IAEc,MAATA,EACRwL,EAAIlK,KAAK,KACQ,OAATtB,EACRwL,EAAIlK,KAAK,MAETkK,EAAIlK,KAAKtB,EAAO,MACjB2W,EAAI9R,MAAM2G,GACVA,EAAIlK,KAAK,GAEVkK,EAAIlK,MAAM,GACVkK,EAAIlK,KAAK,MAEVqO,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,WACTkK,EAAIlK,KAAK3B,KAAKkZ,IAAIM,OAAO5U,UAAU5E,KAAKiE,IAAIT,MAAOxD,KAAKiE,IAAIR,MAAMgP,QAAQ,SAAU,MAChE,OAAhBzS,KAAKS,SACRoL,EAAIlK,KAAK,iBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKS,OAAOga,YAGjCT,aAAc,SAAsB3Q,OAC/BuT,EAAevT,EAAQqO,WAA2B,OAAhB1X,KAAKS,OAAkBT,KAAKS,OAAOga,QAAU,MAC/Ena,EAAMN,KAAKM,IAAI0Z,aAAa4C,GAC5BjT,EAAO3J,KAAKglB,UAAUpI,cAGZve,EAAIyM,YAAY8R,EAActc,EAAKqJ,EAAKA,KAAMA,EAAKC,QAGjE,MAAOd,SACNA,EAAMzK,EAAIqa,cAAcxY,OAAOF,KAAM8I,OAQzCzK,EAAIkF,MAAQlF,EAAIkK,SACflK,EAAI4J,MACJ,CACC/H,OAAQ,SAAgBsD,EAAOC,OAC1BF,EAAQlF,EAAI8C,OAAOnB,aACvBuD,EAAMC,MAAQA,EACdD,EAAME,KAAOA,EACNF,GAERsM,SAAU,iBACF,SAAWxR,EAAI6G,MAAMlF,KAAKwD,OAAS,KAAOnF,EAAI6G,MAAMlF,KAAKyD,MAAQ,OAO3EpF,EAAI8mB,SAAW9mB,EAAIkK,SAClBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKmhB,EAAQC,OACrC9hB,EAAQlF,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC/CV,EAAM6hB,OAASA,EACf7hB,EAAM8hB,OAASA,EACR9hB,GAER+W,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,SAAU,WACvDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,aACW,OAAhB3B,KAAKolB,SACRvZ,EAAIlK,KAAK,iBACJyjB,OAAOlgB,MAAM2G,IAEC,OAAhB7L,KAAKqlB,SACRxZ,EAAIlK,KAAK,iBACJ0jB,OAAOngB,MAAM2G,IAEnBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,OACjB+b,EAAyB,OAAhBplB,KAAKolB,OAAkBplB,KAAKolB,OAAOpL,aAAa3Q,GAAW,KACpEgc,EAAyB,OAAhBrlB,KAAKqlB,OAAkBrlB,KAAKqlB,OAAOrL,aAAa3Q,GAAW,YACjEhL,EAAIkF,MAAMrD,OAAOklB,EAAQC,MAMnChnB,EAAIinB,UAAYjnB,EAAIkK,SACnBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,EAAKoH,EAAQxL,OACrC0lB,EAAYlnB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACnDshB,EAAUla,OAASA,EACnBka,EAAU1lB,MAAQA,EACX0lB,GAERjL,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,SAAU,UACvDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK8d,UACdjS,EAAIlK,KAAK,YACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKqL,SACxBQ,EAAIlK,KAAK,gBACJ9B,MAAMqF,MAAM2G,GACjBA,EAAIlK,KAAK,MAEVsY,MAAO,SAAe5Q,WACjBxJ,EAAQG,KAAKH,MAAMma,aAAa3Q,GAChCmE,EAAQnP,EAAI+M,WAAWpL,KAAKqL,OAAQxL,GAC/BR,EAAI,EAAGA,EAAImO,EAAMjO,SAAUF,EAAG,KAClCoM,EAAO+B,EAAMnO,GACjBoM,EAAK,GAAGyO,iBAAiB7Q,EAASoC,EAAK,QAM3CpN,EAAImnB,aAAennB,EAAIkK,SACtBlK,EAAIinB,UACJ,CACCrL,MAAO,SAAe5Q,WACjBxJ,EAAQG,KAAKH,MAAMma,aAAa3Q,GAChCmE,EAAQnP,EAAI+M,WAAWpL,KAAKqL,OAAQxL,GAC/BR,EAAI,EAAGA,EAAImO,EAAMjO,SAAUF,EAAG,KAClCoM,EAAO+B,EAAMnO,GACjBoM,EAAK,GAAG2O,oBAAoB/Q,EAASrJ,KAAKylB,UAAWha,EAAK,QAM9DpN,EAAIqnB,UAAYrnB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAI0hB,SAEhE1hB,EAAIsnB,UAAYtnB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAI8hB,SAEhE9hB,EAAIunB,UAAYvnB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIijB,SAEhEjjB,EAAIwnB,cAAgBxnB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIwjB,aAEpExjB,EAAIynB,eAAiBznB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIqjB,cAErErjB,EAAI0nB,UAAY1nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAI2jB,SAEhE3jB,EAAI2nB,gBAAkB3nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAI8jB,eAEtE9jB,EAAI4nB,iBAAmB5nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAI+jB,gBAEvE/jB,EAAI6nB,aAAe7nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIgkB,YAEnEhkB,EAAI8nB,aAAe9nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIikB,YAEnEjkB,EAAI+nB,YAAc/nB,EAAIkK,SAASlK,EAAImnB,aAAc,CAAEC,UAAWpnB,EAAIkkB,WAElElkB,EAAIgoB,SAAWhoB,EAAIkK,SAClBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,OACxBqiB,EAAQjoB,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC/CqiB,EAAMC,OAAS,KACfD,EAAME,QAAU,GACTF,GAERhM,YAAajc,EAAI2c,QAAQV,YAAY3O,OAAO,CAAC,SAAU,YACvDsO,MAAO,SAAe5Q,OAChB,IAAIhK,EAAI,EAAGA,EAAIW,KAAKwmB,QAAQjnB,SAAUF,OACrCmnB,QAAQnnB,GAAG2a,aAAa3Q,IAE/B2G,KAAM,SAAcnE,MACf7L,KAAKwmB,QAAQjnB,WACX,IAAIF,EAAI,EAAGA,EAAIW,KAAKwmB,QAAQjnB,SAAUF,OACrCmnB,QAAQnnB,GAAG2Q,KAAKnE,GACrBA,EAAIlK,KAAK,QAIVkK,EAAIlK,KAAK,QACTkK,EAAIlK,KAAK,MAMbtD,EAAIooB,YAAcpoB,EAAIkK,SACrBlK,EAAIgoB,SACJ,CACCnmB,OAAQ,SAAgBgZ,EAAKjV,EAAKuY,EAASC,OACtCiK,EAAOroB,EAAIgoB,SAASnmB,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAC/CyiB,EAAKlK,QAAUA,EACfkK,EAAKjK,UAAYA,EACViK,GAERpM,YAAajc,EAAIgoB,SAAS/L,YAAY3O,OAAO,CAAC,UAAW,cACzDzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAK,aACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKwc,UACxB3Q,EAAIlK,KAAK,oBACJ8a,UAAUvX,MAAM2G,GACrBA,EAAIlK,KAAK,MAEVglB,aAAc,SAAsB9a,EAAK2Q,MACpCne,EAAIuF,QAAQ4Y,GAAU,CACzB3Q,EAAIlK,KAAK,SACJ,IAAItC,EAAI,EAAGA,EAAImd,EAAQjd,SAAUF,EACjCA,GACHwM,EAAIlK,KAAK,WACLglB,aAAa9a,EAAK2Q,EAAQnd,IAEV,GAAlBmd,EAAQjd,QACXsM,EAAIlK,KAAK,KACVkK,EAAIlK,KAAK,UAGT6a,EAAQxM,KAAKnE,IAEfoO,MAAO,SAAe5Q,WACjBoT,EAAYzc,KAAKyc,UAAUzC,aAAa3Q,GAEnCkC,EAAOlN,EAAImN,MAAMiR,KAAe,KACpC5c,EAAQ0L,EAAK/D,UACb3H,EAAM4H,KACT,cACGoV,EAAWxe,EAAI+M,WAAWpL,KAAKwc,QAAS3c,EAAMA,OACzCR,EAAI,EAAGA,EAAIwd,EAAStd,SAAUF,EACtCwd,EAASxd,GAAG,GAAG6a,iBAAiB7Q,EAASwT,EAASxd,GAAG,QAIrDhB,EAAIgoB,SAASpM,MAAMvI,KAAK1R,KAAMqJ,GAE/B,MAAOP,MACFA,IAAQzK,EAAI+Z,eACf,MACI,GAAItP,IAAQzK,EAAIga,kBAGpB,MAAMvP,KAIVkH,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,aACJglB,aAAa9a,EAAK7L,KAAKwc,SAC5B3Q,EAAIlK,KAAK,aACJ8a,UAAUzM,KAAKnE,GACpBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,MAKbtD,EAAIuoB,cAAgBvoB,EAAIkK,SACvBlK,EAAIgoB,YAEHnmB,OAAQ,SAAgBgZ,EAAKjV,EAAKyY,OAC7BmK,EAASxoB,EAAIgoB,SAASnmB,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACjD4iB,EAAOnK,UAAYA,EACZmK,GAERvM,YAAajc,EAAIgoB,SAAS/L,YAAY3O,OAAO,CAAC,cAC9CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,aACTkK,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,GACrBA,EAAIlK,KAAK,MAEVqO,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,UACR3B,KAAKyc,UAAUvX,MAAM2G,GACtBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,IAEXsY,MAAO,SAAe5Q,UACR,KACRyd,EAAO9mB,KAAK0c,UAAU1C,aAAa3Q,OAClChL,EAAI6R,MAAM4W,GACd,UAIAzoB,EAAIgoB,SAASpM,MAAMvI,KAAK1R,KAAMqJ,GAE/B,MAAOP,MACFA,IAAQzK,EAAI+Z,eACf,MACI,GAAItP,IAAQzK,EAAIga,kBAGpB,MAAMvP,aAIJ,SAAc+C,GACnBA,EAAIlK,KAAK,UACTtD,EAAIyb,IAAI9J,KAAK0B,KAAK1R,KAAM6L,GACxBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,MAKbtD,EAAI0oB,SAAW1oB,EAAIkK,SAClBlK,EAAI2c,QACJ,CACCf,MAAO,SAAe5Q,SACfhL,EAAI+Z,gBAEXpI,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,SACTkK,EAAIlK,KAAK,IAEVuD,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,iBAKZtD,EAAI2oB,YAAc3oB,EAAIkK,SACrBlK,EAAI2c,QACJ,CACCf,MAAO,SAAe5Q,SACfhL,EAAIga,mBAEXrI,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,YACTkK,EAAIlK,KAAK,IAEVuD,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,oBAKZtD,EAAI4oB,aAAe5oB,EAAIkK,SACtBlK,EAAIgoB,SACJ,CACCpM,MAAO,SAAe5Q,OAChB,IAAIhK,EAAI,EAAGA,EAAIW,KAAKwmB,QAAQjnB,SAAUF,EAAG,KACzCinB,EAAQtmB,KAAKwmB,QAAQnnB,MACXinB,EAAMY,SAAS7d,GAChB,CACZid,EAAMtM,aAAa3Q,cAQxBhL,EAAI8oB,oBAAsB9oB,EAAIkK,SAC7BlK,EAAIgoB,SACJ,CACCnmB,OAAQ,SAAgBgZ,EAAKjV,EAAKyY,OAC7B4J,EAAQjoB,EAAIgoB,SAASnmB,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UAChDqiB,EAAM5J,UAAYA,EACX4J,GAERhM,YAAajc,EAAIgoB,SAAS/L,YAAY3O,OAAO,CAAC,cAC9CzG,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK8d,UACdjS,EAAIlK,KAAK,oBACJ+a,UAAUxX,MAAM2G,GACrBA,EAAIlK,KAAK,MAEVqO,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK3B,KAAKonB,UACdvb,EAAIlK,KAAK,UACJ+a,UAAU1M,KAAKnE,GACpBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,IAEXulB,SAAU,SAAkB7d,OACvByd,EAAO9mB,KAAK0c,UAAU1C,aAAa3Q,UAC1BhL,EAAI6R,MAAM4W,MAM1BzoB,EAAIgpB,WAAahpB,EAAIkK,SAASlK,EAAI8oB,oBAAqB,CAAEC,SAAU,OAEnE/oB,EAAIipB,aAAejpB,EAAIkK,SAASlK,EAAI8oB,oBAAqB,CAAEC,SAAU,YAErE/oB,EAAIkpB,aAAelpB,EAAIkK,SACtBlK,EAAIgoB,YAEHnhB,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,YACTkK,EAAIlK,KAAK,MAEVqO,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,SACRkK,EAAIlK,KAAK,GACVtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,IAEXulB,SAAU,SAAkB7d,UACpB,WAEF,SAAcwC,GACnBA,EAAIlK,KAAK,SACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,MAKbtD,EAAImpB,SAAWnpB,EAAIkK,SAClBlK,EAAIgoB,SACJ,CACCnmB,OAAQ,SAAgBgZ,EAAKjV,EAAKuV,EAAQnZ,EAAMonB,EAAYC,EAAYC,EAAUne,OAC7EqP,EAAWxa,EAAIgoB,SAASnmB,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACnD4U,EAASW,OAASA,EAClBX,EAASxY,KAAOA,EAChBwY,EAAS4O,WAAaA,EACtB5O,EAAS6O,WAAaA,EACtB7O,EAAS8O,SAAWA,EACpB9O,EAAS+O,OAAS,KAClB/O,EAASrP,UAAYA,EACrBqP,EAASgP,YAAc,KACvBhP,EAASiP,MAAQ,KACjBjP,EAASnO,mBAAqBlB,EAC9BqP,EAAS9N,qBAAuBvB,EAChCqP,EAASC,eAAiB,KACnBD,GAERnV,UAAW,SAAmBhD,OACzB8I,KACJ9I,EAAQE,KAAKvC,EAAIE,SACjBmC,EAAQE,KAAKZ,KAAKK,MAClBK,EAAQE,KAAKZ,KAAKwZ,QAClB9Y,EAAQE,KAAKZ,KAAKynB,YAClB/mB,EAAQE,KAAKZ,KAAK0nB,YAClBhnB,EAAQE,KAAKZ,KAAK2nB,UAClBjnB,EAAQE,KAAKZ,KAAK4nB,QAClBlnB,EAAQE,KAAKZ,KAAK8Y,gBACK,OAAnB9Y,KAAKwJ,WAAsBnL,EAAI0pB,aAAa3R,UAAUpW,KAAKwJ,WAC9DA,EAAYxJ,KAAKwJ,cACb,CACJA,EAAY,OACP,IAAInK,EAAI,EAAGA,EAAIW,KAAKwJ,UAAUG,KAAKpK,SAAUF,EAAG,KAChD2X,EAAMhX,KAAKwJ,UAAUG,KAAKtK,QACI,IAAtB2X,EAAIH,aACfrN,EAAU7H,KAAKqV,EAAI3W,MAEnBmJ,EAAU7H,KAAKqV,EAAI3W,KAAO,IAAK2W,EAAIH,cAEN,OAA3B7W,KAAKwJ,UAAUgN,SAClBhN,EAAU7H,KAAK,IAAM3B,KAAKwJ,UAAUgN,SACJ,OAA7BxW,KAAKwJ,UAAUmN,WAClBnN,EAAU7H,KAAK,KAAO3B,KAAKwJ,UAAUmN,WAEvCjW,EAAQE,KAAK4I,GACbnL,EAAIgoB,SAAS3iB,UAAUgO,KAAK1R,KAAMU,IAEnC2G,UAAW,SAAmBrD,OAEzBwF,EADAjL,EAAUyF,EAAQ9C,UAGN,OAAZ3C,EACH,MAAMF,EAAIqN,WAAWxL,OAAO,sFAEzB3B,IAAYF,EAAIE,QACnB,MAAMF,EAAIqN,WAAWxL,OAAO,6BAA+B7B,EAAIE,QAAU,SAAWA,QAChF8B,KAAO2D,EAAQ9C,YACfsY,OAASxV,EAAQ9C,YACjBumB,WAAazjB,EAAQ9C,YACrBwmB,WAAa1jB,EAAQ9C,YACrBymB,SAAW3jB,EAAQ9C,YACnB0mB,OAAS5jB,EAAQ9C,YACjB4X,eAAiB9U,EAAQ9C,OAC9BsI,EAAYxF,EAAQ9C,OAChB7C,EAAIuF,QAAQ4F,KACfA,EAAYnL,EAAIiY,UAAUpW,OAAOgK,MAAM7L,EAAIiY,UAAW9M,SAClDA,UAAYA,OACZkB,mBAAqBlB,OACrBuB,qBAAuBvB,EAC5BnL,EAAIgoB,SAAShf,UAAUqK,KAAK1R,KAAMgE,IAEnClD,MAAO,SAAesR,UACd9T,EAAMwC,MAAMsR,IAEpB6H,MAAO,SAAe5Q,OACjBG,EAAY,KACO,OAAnBxJ,KAAKwJ,YACRA,EAAYxJ,KAAKwJ,UAAUwQ,aAAa3Q,QACrC2e,EAAU3pB,EAAI4pB,gBAAgB/nB,OAAOF,KAAMwJ,EAAWH,EAAQiO,MAClEjO,EAAQ5J,IAAIO,KAAKK,KAAM2nB,IAExB9iB,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,aACS,OAAd3B,KAAKK,OACRwL,EAAIlK,KAAK,UACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKK,QAEzBwL,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAKynB,aACA,OAApBznB,KAAK0nB,aACR7b,EAAIlK,KAAK,gBACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAK0nB,cAEH,OAAlB1nB,KAAK2nB,WACR9b,EAAIlK,KAAK,cACTkK,EAAIlK,KAAKtD,EAAI6G,MAAMlF,KAAK2nB,YAEzB9b,EAAIlK,KAAK,MAEVqO,KAAM,SAAcnE,GACnBA,EAAIlK,KAAK,QACTkK,EAAIlK,KAAK3B,KAAKK,KAAOL,KAAKK,KAAO,WACjCwL,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK,GACTtD,EAAIgoB,SAASrW,KAAK0B,KAAK1R,KAAM6L,GAC7BA,EAAIlK,MAAM,IAEXgJ,sBAAsB,EACtBC,uBAAuB,EACvBI,wBAAwB,EACxBC,yBAAyB,EACzBid,aAAc,SAAsB7e,EAASiO,OACxCsF,EAAevT,EAAQuO,QAC3BgF,EAAatF,KAAOA,MAEnBjZ,EAAIgoB,SAASpM,MAAMvI,KAAK1R,KAAM4c,GAE/B,MAAO9T,OACDzK,EAAI6Z,gBAAgB9B,UAAUtN,GAClC,MAAMA,IAGToC,WAAY,SAAoB7B,EAASiO,QACnC4Q,aAAa7e,EAASiO,IAE5B4N,OAAQ,SAAgB7b,EAASiO,QAC3B4Q,aAAa7e,EAASiO,IAE5B6Q,cAAe,SAAuB9e,EAASiO,OAC1CsF,EAAevT,EAAQsO,4BACtBuQ,aAAatL,EAActF,GACzBsF,EAAa/E,aAErBuQ,QAAS,SAAiB9Q,GACzBA,EAAOA,GAAQ,OACXjO,EAAUhL,EAAIgZ,QAAQnX,gBACH,OAAnBF,KAAKwJ,YACR8N,EAAOtX,KAAKwJ,UAAUO,WAAW/J,KAAKK,KAAM,GAAIiX,IAC1CtX,KAAKmoB,cAAc9e,EAASiO,IAEpC+Q,IAAK,kBACkB,MAAfroB,KAAK4nB,OAAiB5nB,KAAKwZ,OAAO5U,UAAU5E,KAAK4nB,OAAOpkB,MAAOxD,KAAK4nB,OAAOnkB,MAAQ,MAE3FsU,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,aACGhY,KAAKkZ,QACR,gBACGlZ,KAAKumB,WACR,iBACGvmB,KAAKwmB,YACR,gBACGxmB,KAAKwZ,WACR,cACGxZ,KAAKK,SACR,oBACGL,KAAKynB,eACR,oBACGznB,KAAK0nB,eACR,kBACG1nB,KAAK2nB,aACR,aACG3nB,KAAKqoB,UACR,mBACGroB,KAAKwJ,cACR,wBACGxJ,KAAK8Y,mBACR,gBACGza,EAAI8Y,OAAOnX,KAAKwJ,UAAW,CAAEC,cAAc,EAAMC,aAAa,GAAQ,SAAgBL,EAASiO,GAAQ/P,EAAK2gB,aAAa7e,EAASiO,SACrI,iBACGjZ,EAAI8Y,OAAOnX,KAAKwJ,UAAW,CAAEC,cAAc,EAAMC,aAAa,GAAQ,SAAiBL,EAASiO,UAAe/P,EAAK4gB,cAAc9e,EAASiO,sBAKrJgR,WAAY,SAAoBjf,EAASiO,OACpCsF,EAAevT,EAAQuO,QAC3BgF,EAAatF,KAAOA,MAEnBjZ,EAAIgoB,SAASpM,MAAMvI,KAAK1R,KAAM4c,GAE/B,MAAO9T,MACFzK,EAAI6Z,gBAAgB9B,UAAUtN,GACjC,OAAOA,EAAInE,OAEX,MAAMmE,SAED,MAER4I,KAAM,SAAc4F,GACnBA,EAAOA,GAAQ,OACXjO,EAAUhL,EAAIgZ,QAAQnX,gBACH,OAAnBF,KAAKwJ,YACR8N,EAAOtX,KAAKwJ,UAAUO,WAAW/J,KAAKK,KAAM,GAAIiX,IAC1CtX,KAAKsoB,WAAWjf,EAASiO,IAEjCzM,SAAU,SAAkBxB,EAASiO,UAC7BtX,KAAKsoB,WAAWjf,EAASiO,IAEjCzG,SAAU,iBAIZxS,EAAI0pB,aAAe1pB,EAAIkK,SACtBlK,EAAI2c,QACJ,CACC9a,OAAQ,SAAgBgZ,EAAKjV,OACxBuF,EAAYnL,EAAI2c,QAAQ9a,OAAOwR,KAAK1R,KAAMkZ,EAAKjV,UACnDuF,EAAU+e,OAAS,GACZ/e,GAER9F,UAAW,SAAmBhD,GAC7BrC,EAAI2c,QAAQtX,UAAUgO,KAAK1R,KAAMU,WAE7BE,EAAO,GAEFvB,EAAI,EAAGA,EAAIW,KAAKuoB,OAAOhpB,SAAUF,EAAG,KACxCmpB,EAAQxoB,KAAKuoB,OAAOlpB,GACP,OAAbmpB,EAAM,GACT5nB,EAAKe,KAAK6mB,EAAM,IAEhB5nB,EAAKe,KAAK6mB,GAEZ9nB,EAAQE,KAAKA,IAEdyG,UAAW,SAAmBrD,GAC7B3F,EAAIyb,IAAIzS,UAAUqK,KAAK1R,KAAMgE,OACzBpD,EAAOoD,EAAQ9C,YACdqnB,OAAS,OACT,IAAIlpB,EAAI,EAAGA,EAAIuB,EAAKrB,SAAUF,EAAG,KACjCmpB,EAAQ5nB,EAAKvB,GACM,iBAAXmpB,EACXxoB,KAAKuoB,OAAO5mB,KAAK,CAAC6mB,EAAO,OAEzBxoB,KAAKuoB,OAAO5mB,KAAK6mB,KAGpBvO,MAAO,SAAe5Q,WACjBM,EAAO,GACFtK,EAAI,EAAGA,EAAIW,KAAKuoB,OAAOhpB,SAAUF,EAAG,KACxCmpB,EAAQxoB,KAAKuoB,OAAOlpB,GACP,OAAbmpB,EAAM,GACT7e,EAAKhI,KAAK6mB,EAAM,KAEhB7e,EAAKhI,KAAK6mB,EAAM,GAAK,KACrB7e,EAAKhI,KAAK6mB,EAAM,GAAGxO,aAAa3Q,YAG3BhL,EAAIiY,UAAUpW,OAAOgK,MAAM7L,EAAIiY,UAAW3M,IAElDzE,MAAO,SAAe2G,GACrBA,EAAIlK,KAAK,KACTkK,EAAIlK,KAAK3B,KAAK8d,UACdjS,EAAIlK,KAAK,iBACJ4mB,OAAOrjB,MAAM2G,GAClBA,EAAIlK,KAAK,QAKZtD,EAAI4pB,gBAAkB5pB,EAAIkK,SACzBlK,EAAI4J,MACJ,CACC/H,OAAQ,SAAgB2Y,EAAUrP,EAAW8N,OACxC0Q,EAAU3pB,EAAI8C,OAAOnB,aACzBgoB,EAAQnP,SAAWA,EACnBmP,EAAQxe,UAAYA,EACpBwe,EAAQ1Q,KAAOA,EACf0Q,EAAQtd,mBAAqBlB,EAC7Bwe,EAAQjd,qBAAuBvB,EAE/Bwe,EAAQ3nB,KAAOwY,EAASxY,KACxB2nB,EAAQ9O,IAAML,EAASK,IACvB8O,EAAQzB,OAAS1N,EAAS0N,OAC1ByB,EAAQxO,OAASX,EAASW,OAC1BwO,EAAQN,WAAa7O,EAAS6O,WAC9BM,EAAQL,SAAW9O,EAAS8O,SAC5BK,EAAQJ,OAAS/O,EAAS+O,OAC1BI,EAAQxB,QAAU3N,EAAS2N,QACpBwB,GAERrd,sBAAsB,EACtBC,uBAAuB,EACvBI,wBAAwB,EACxBC,yBAAyB,EACzBC,WAAY,SAAoB7B,EAASiO,QACnCuB,SAASqP,aAAa7e,EAAShL,EAAIgK,eAAerI,KAAKsX,KAAMA,KAEnE4N,OAAQ,SAAgB7b,EAASiO,QAC3BuB,SAASqP,aAAa7e,EAAShL,EAAIgK,eAAerI,KAAKsX,KAAMA,KAEnEzM,SAAU,SAAkBxB,EAASiO,UAC7BtX,KAAK6Y,SAASyP,WAAWjf,EAAShL,EAAIgK,eAAerI,KAAKsX,KAAMA,KAExE4Q,aAAc,SAAsB7e,EAASiO,QACvCuB,SAASqP,aAAa7e,EAAShL,EAAIgK,eAAerI,KAAKsX,KAAMA,KAEnE6Q,cAAe,SAAuB9e,EAASiO,UACvCtX,KAAK6Y,SAASsP,cAAc9e,EAAShL,EAAIgK,eAAerI,KAAKsX,KAAMA,KAE3ES,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,gBACG3Z,EAAI8Y,OAAOnX,KAAKwJ,UAAW,CAAEC,cAAc,EAAMC,aAAa,GAAQ,SAAgBL,EAASiO,GAAQ/P,EAAK2gB,aAAa7e,EAASiO,SACrI,iBACGjZ,EAAI8Y,OAAOnX,KAAKwJ,UAAW,CAAEC,cAAc,EAAMC,aAAa,GAAQ,SAAiBL,EAASiO,UAAe/P,EAAK4gB,cAAc9e,EAASiO,SAC9I,mBACGtX,KAAKwJ,yBAELxJ,KAAK6Y,SAASd,YAAYC,KAGpCnH,SAAU,wBAKZxS,EAAIoqB,KAAO,SAActmB,EAAGC,EAAGC,EAAGC,UAC1BtC,KAAKiG,MAAM/F,OAAO,IAAMiC,EAAG,IAAMC,EAAG,IAAMC,EAAG,IAAMC,IAI3DjE,EAAIwgB,WAAa,SAAoBve,UAMpCA,GADAA,GADAA,GADAA,GADAA,GADAA,EAAMjC,EAAI2R,KAAK1P,IACLmS,QAAQ,KAAM,UACdA,QAAQ,KAAM,SACdA,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,WAKzBpU,EAAIqqB,KAAO,SAAcpoB,UACZ,OAARA,EACI,IACkB,iBAATA,IAChBA,EAAMjC,EAAI6G,MAAM5E,KACS,IAAtBA,EAAIiM,QAAQ,OAAqC,IAAtBjM,EAAIiM,QAAQ,OAAsC,IAAvBjM,EAAIiM,QAAQ,QACrEjM,EAAM,IAAMA,EAAImS,QAAQ,KAAM,MAAQ,KAChCnS,IAIRjC,EAAIsqB,KAAO,SAActpB,MACN,iBAANA,EACX,MAAMhB,EAAIqK,UAAUxI,OAAO,QAAS,gCAC9B0F,OAAOC,aAAaxG,IAI5BhB,EAAIuqB,KAAO,SAAcpkB,MACN,iBAANA,GAA8B,GAAZA,EAAEjF,OAC/B,MAAMlB,EAAIqK,UAAUxI,OAAO,QAAS,8CAC9BsE,EAAEoK,WAAW,IAIrBvQ,EAAIwqB,KAAO,SAAcC,MACD,iBAAXA,EACX,MAAMzqB,EAAIqK,UAAUxI,OAAO,QAAS,gCACjC4oB,EAAS,EACL,MAAQA,EAAO5f,SAAS,IAAI4N,OAAO,GAEnC,KAAOgS,EAAO5f,SAAS,KAIhC7K,EAAI0qB,KAAO,SAAcD,MACD,iBAAXA,EACX,MAAMzqB,EAAIqK,UAAUxI,OAAO,QAAS,gCACjC4oB,EAAS,EACL,MAAQA,EAAO5f,SAAS,GAAG4N,OAAO,GAElC,KAAOgS,EAAO5f,SAAS,IAIhC7K,EAAI2qB,KAAO,SAAcF,MACD,iBAAXA,EACX,MAAMzqB,EAAIqK,UAAUxI,OAAO,QAAS,gCACjC4oB,EAAS,EACL,MAAQA,EAAO5f,SAAS,GAAG4N,OAAO,GAElC,KAAOgS,EAAO5f,SAAS,IAIhC7K,EAAI4qB,KAAO,SAAc3oB,MACN,GAAdA,EAAIf,OACP,MAAMlB,EAAIyL,cAAc5J,OAAO,+CACT,GAAdI,EAAIf,SACZe,EAAMA,EAAI,YAEPqE,EADA4G,EAAOlN,EAAImN,MAAMlL,GAEjByY,GAAQ,IACC,KACRtN,EAAOF,EAAK/D,UACZiE,EAAKhE,KAAM,IACVsR,EACH,MAAM1a,EAAIqN,WAAWxL,OAAO,+CACtByE,GAEJoU,GAAUtN,EAAK5L,MAAQ8E,KAC1BA,EAAS8G,EAAK5L,OACfkZ,GAAQ,IAKV1a,EAAI6qB,KAAO,SAAc5oB,MACN,GAAdA,EAAIf,OACP,MAAMlB,EAAIyL,cAAc5J,OAAO,+CACT,GAAdI,EAAIf,SACZe,EAAMA,EAAI,YAEPqE,EADA4G,EAAOlN,EAAImN,MAAMlL,GAEjByY,GAAQ,IACC,KACRtN,EAAOF,EAAK/D,UACZiE,EAAKhE,KAAM,IACVsR,EACH,MAAM1a,EAAIqN,WAAWxL,OAAO,+CACtByE,GAEJoU,GAAUtN,EAAK5L,MAAQ8E,KAC1BA,EAAS8G,EAAK5L,OACfkZ,GAAQ,IAKV1a,EAAI8qB,KAAO,SAAclY,EAAUzN,QACX,IAAXA,IACXA,EAAQ,OAEJ,IAAI+H,EAAOlN,EAAImN,MAAMyF,KAAc,KACnCxF,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACDjE,GAASiI,EAAK5L,aAER2D,GAIRnF,EAAI+qB,OAAS,SAAgBnY,EAAU4F,QACR,IAAlBA,IACXA,EAAe,UAEZpL,EAAOpN,EAAImN,MAAMyF,GAAUzJ,cACxBiE,EAAKhE,KAAOoP,EAAepL,EAAK5L,OAIxCxB,EAAIgrB,MAAQ,SAAepY,EAAU4F,QACN,IAAlBA,IACXA,EAAe,cAEZhX,EAAQgX,EAEHtL,EAAOlN,EAAImN,MAAMyF,KAAc,KACnCxF,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACD5H,EAAQ4L,EAAK5L,aAEPA,GAIRxB,EAAIirB,QAAU,SAAiBjgB,EAAS4H,EAAUrR,EAAK2pB,OAClDC,KACQ,OAAR5pB,SAGF4pB,EADGD,EACG,SAAajnB,EAAGD,UACbhE,EAAI4O,KAAK,MAAO3K,EAAGD,IAItB,SAAaC,EAAGD,UACdhE,EAAI4O,KAAK,MAAO3K,EAAGD,KAGxBsC,EAAStG,EAAIoS,MAAMQ,IAChBwY,KAAKD,GACL7kB,UAGH8kB,EAAO,GAEFpqB,EAAI,EAAGkM,EAAOlN,EAAImN,MAAMyF,MAAe5R,EAAG,KAC9CoM,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,UACGiiB,EAAWrrB,EAAI8M,MAAM9B,EAASzJ,EAAK,CAAC6L,EAAK5L,OAAQ,IACrD4pB,EAAK9nB,KAAK,CAAC+nB,EAAUrqB,EAAGoM,EAAK5L,QAE9B2pB,EAAM,SAAaG,EAAIC,OAClBxc,EAAM/O,EAAI4O,KAAK,MAAO0c,EAAG,GAAIC,EAAG,WAChCxc,IAEJA,EAAM/O,EAAI4O,KAAK0c,EAAG,GAAIC,EAAG,KADjBL,GAAWnc,EAAMA,GAK1Bqc,EAAKA,KAAKD,OAEN7kB,EAAS,OACJtF,EAAI,EAAGA,EAAIoqB,EAAKlqB,SAAUF,EAClCsF,EAAOhD,KAAK8nB,EAAKpqB,GAAG,WAEdsF,GAKTtG,EAAIwrB,OAAS,SAAgBlgB,OACxBnG,EAAOC,EAAMqmB,EAoBbC,KAnBApgB,EAAKpK,OAAS,EACjB,MAAMlB,EAAIyL,cAAc5J,OAAO,qCAC3B,GAAkB,EAAdyJ,EAAKpK,OACb,MAAMlB,EAAIyL,cAAc5J,OAAO,mDAAqDyJ,EAAKpK,OAAS,aAC3E,GAAfoK,EAAKpK,QAEbkE,EAAOkG,EADPnG,EAAQ,GAERsmB,EAAO,GAEgB,GAAfngB,EAAKpK,QACbiE,EAAQmG,EAAK,GACblG,EAAOkG,EAAK,GACZmgB,EAAO,GAEgB,GAAfngB,EAAKpK,SACbiE,EAAQmG,EAAK,GACblG,EAAOkG,EAAK,GACZmgB,EAAOngB,EAAK,IAGA,IAATmgB,EACH,MAAMzrB,EAAIqN,WAAWxL,OAAO,yCAG5B8pB,QAFe,EAAPF,GACRC,EAAQvmB,EACEC,IAGVsmB,EAAQtmB,EACED,OAEPjE,EAAUwqB,EAAQC,QAAWloB,KAAKyO,OAAOyZ,QAAUD,EAAQ,GAAKjoB,KAAKmoB,IAAIH,IAAS,EAAI,QAEnF,CACN9nB,MAAO,EACPwF,KAAM,kBACDxH,KAAKgC,OAASzC,EACV,CAAEkI,MAAM,GACT,CAAE5H,MAAO2D,EAASxD,KAAKgC,QAAW8nB,EAAMriB,MAAM,MAMxDpJ,EAAI6rB,OAAS,SAAgBvgB,OACxBsH,EAAUzN,EAAOC,EAAMqmB,KACvBngB,EAAKpK,OAAS,EACjB,MAAMlB,EAAIyL,cAAc5J,OAAO,qCAC3B,GAAkB,EAAdyJ,EAAKpK,OACb,MAAMlB,EAAIyL,cAAc5J,OAAO,mDAAqDyJ,EAAKpK,OAAS,aAC3E,GAAfoK,EAAKpK,QACb0R,EAAWtH,EAAK,GAChBnG,EAAQ,EACRC,EAAOkG,EAAK,GACZmgB,EAAO,GAEgB,GAAfngB,EAAKpK,QACb0R,EAAWtH,EAAK,GAChBnG,EAAoB,OAAZmG,EAAK,GAAcA,EAAK,GAAK,EACrClG,EAAOkG,EAAK,GACZmgB,EAAO,GAEgB,GAAfngB,EAAKpK,SACb0R,EAAWtH,EAAK,GAChBnG,EAAoB,OAAZmG,EAAK,GAAcA,EAAK,GAAK,EACrClG,EAAOkG,EAAK,GACZmgB,EAAmB,OAAZngB,EAAK,GAAcA,EAAK,GAAK,GAEjCnG,EAAQ,EACX,MAAMnF,EAAIqN,WAAWxL,OAAO,6CACzBuD,EAAO,EACV,MAAMpF,EAAIqN,WAAWxL,OAAO,4CACzB4pB,GAAQ,EACX,MAAMzrB,EAAIqN,WAAWxL,OAAO,4CAEzBsH,EAAOhE,EAAO4f,EAAQ,EACtB7X,EAAOlN,EAAImN,MAAMyF,SACd,CACNzJ,KAAM,mBACD7C,EACGye,EAAQ5b,GAAM,KACpB7C,EAAS4G,EAAK/D,QACHC,KACV,OAAO9C,IACNye,SAEU,OAAT3f,GAA0BA,GAAT2f,EACb,CAAE3b,MAAM,KAChB9C,EAAS4G,EAAK/D,QACHC,SAET2b,EACF5b,GAAQsiB,EACK,OAATrmB,GAAwBA,EAAP+D,IACpBA,EAAO/D,IAJAkB,MAWXtG,EAAI8rB,UAAY,SAAmB/X,UAC3BgY,mBAAmBhY,IAI3B/T,EAAIgsB,YAAc,SAAqBjY,UAC/BkY,mBAAmBlY,IAI3B/T,EAAIksB,UAAY,SAAmB3Z,SACT,iBAAbA,GAA0BvS,EAAIuF,QAAQgN,KACjDA,EAAWvS,EAAIoS,MAAMG,IACf,CACN5O,MAAO4O,EAASrR,OAAS,EACzBiI,KAAM,kBACgB,GAAdxH,KAAKgC,MAAa,CAAEnC,MAAO+Q,EAAS5Q,KAAKgC,SAAUyF,MAAM,GAAU,CAAEA,MAAM,MAMrFpJ,EAAImsB,QAAU,kBACN1oB,KAAK2oB,UAIbpsB,EAAIqsB,WAAa,SAAoB/gB,OAChCnG,EAAOC,EAAMqmB,KACbngB,EAAKpK,OAAS,EACjB,MAAMlB,EAAIyL,cAAc5J,OAAO,yCAC3B,GAAkB,EAAdyJ,EAAKpK,OACb,MAAMlB,EAAIyL,cAAc5J,OAAO,uDAAyDyJ,EAAKpK,OAAS,UAC/E,GAAfoK,EAAKpK,QAEbkE,EAAOkG,EADPnG,EAAQ,GAERsmB,EAAO,GAEgB,GAAfngB,EAAKpK,QACbiE,EAAQmG,EAAK,GACblG,EAAOkG,EAAK,GACZmgB,EAAO,GAEgB,GAAfngB,EAAKpK,SACbiE,EAAQmG,EAAK,GACblG,EAAOkG,EAAK,GACZmgB,EAAOngB,EAAK,QAMTghB,EAJAC,EAAQnnB,EAAOD,EAEf3D,EAAQiC,KAAK2oB,YAGN,EAAPX,EACHa,EAAI7oB,KAAKyO,OAAOqa,EAAQd,EAAO,GAAKA,OAChC,CAAA,KAAIA,EAAO,GAGf,MAAMzrB,EAAIqN,WAAWxL,OAAO,6CAF5ByqB,EAAI7oB,KAAKyO,OAAOqa,EAAQd,EAAO,GAAKA,UAG9BtmB,EAAQsmB,EAAOhoB,KAAKyO,MAAM1Q,EAAQ8qB,IAI1CtsB,EAAIwsB,YAAc,SAAqBja,OAClCka,EAAUzsB,EAAI6D,SAAS0O,MACD,iBAAdA,IAA2BvS,EAAIuF,QAAQgN,KAAcka,EAChE,MAAMzsB,EAAIqK,UAAUxI,OAAO,iDACxB4qB,IACHla,EAAWvS,EAAIoS,MAAMG,IACfA,EAAS9O,KAAKyO,MAAMzO,KAAK2oB,SAAW7Z,EAASrR,UAIrDlB,EAAI0sB,OAAS,SAAgBC,EAAGC,WACP,IAAZA,IACXA,EAAS,GACNA,EAAQ,KACPC,EAAappB,KAAKqpB,IAAI,GAAIF,UACvBnpB,KAAKC,MAAMipB,EAAIE,GAAcA,EAGpC,OAAOppB,KAAKC,MAAMipB,IAKpB3sB,EAAI+sB,KAAO,SAAchZ,UACjBiZ,IAAIjZ,IAIZ/T,EAAIitB,WAAa,SAAoBra,EAAUzN,eACvB,IAAXA,IACXA,EAAQ,GAEF,CACN+H,KAAMlN,EAAImN,MAAMyF,GAChBjP,MAAOwB,EACPgE,KAAM,eACDiE,EAAOzL,KAAKuL,KAAK/D,cACdiE,EAAKhE,KAAOgE,EAAO,CAAE5L,MAAO,CAACG,KAAKgC,QAASyJ,EAAK5L,OAAQ4H,MAAM,MAMxEpJ,EAAIktB,SAAW,SAAkBta,OAC5B1F,EAAOlN,EAAImN,MAAMyF,GACjBua,GAAU,QACP,CACNhkB,KAAM,eACDiE,EAAOF,EAAK/D,OACZ7C,EAAS8G,EAAKhE,KAAOgE,EAAO,CAAE5L,MAAO,CAAC2rB,EAAS/f,EAAK5L,OAAQ4H,MAAM,UACtE+jB,GAAU,EACH7mB,KAMVtG,EAAIotB,QAAU,SAAiBxa,OAC1B1F,EAAOlN,EAAImN,MAAMyF,GACjBya,EAAWngB,EAAK/D,aACb,CACNA,KAAM,cACDkkB,EAASjkB,KACZ,OAAOikB,MACJjgB,EAAOF,EAAK/D,OACZ7C,EAAS,CAAE9E,MAAO,CAAC4L,EAAKhE,KAAMikB,EAAS7rB,OAAQ4H,MAAM,UACzDikB,EAAWjgB,EACJ9G,KAMVtG,EAAIstB,aAAe,SAAsB1a,OACpC1F,EAAOlN,EAAImN,MAAMyF,GACjBua,GAAU,EACVE,EAAWngB,EAAK/D,aACb,CACNA,KAAM,cACDkkB,EAASjkB,KACZ,OAAOikB,MACJjgB,EAAOF,EAAK/D,OACZ7C,EAAS,CAAE9E,MAAO,CAAC2rB,EAAS/f,EAAKhE,KAAMikB,EAAS7rB,OAAQ4H,MAAM,UAClEikB,EAAWjgB,EACX+f,GAAU,EACH7mB,KAMVtG,EAAIutB,QAAU,SAAiB3a,EAAUzN,OACpC+H,EAAOlN,EAAImN,MAAMyF,GACjB5R,EAAImE,EACJgoB,GAAU,EACVE,EAAWngB,EAAK/D,aACb,CACNA,KAAM,cACDkkB,EAASjkB,KACZ,OAAOikB,MACJjgB,EAAOF,EAAK/D,OACZ7C,EAAS,CAAE9E,MAAO,CAACR,IAAKmsB,EAAS/f,EAAKhE,KAAMikB,EAAS7rB,OAAQ4H,MAAM,UACvEikB,EAAWjgB,EACX+f,GAAU,EACH7mB,KAMVtG,EAAIwtB,KAAO,SAAcC,MAEpBA,EAAUvsB,OAAQ,SACjBwsB,EAAQ,GACH1sB,EAAI,EAAGA,EAAIysB,EAAUvsB,SAAUF,EACvC0sB,EAAMpqB,KAAKtD,EAAImN,MAAMsgB,EAAUzsB,WAEzB,CACNmI,KAAM,mBACDgG,EAAQ,GACHnO,EAAI,EAAGA,EAAI0sB,EAAMxsB,SAAUF,EAAG,KAClCoM,EAAOsgB,EAAM1sB,GAAGmI,UAChBiE,EAAKhE,KACR,OAAOgE,EACR+B,EAAM7L,KAAK8J,EAAK5L,aAEV,CAAEA,MAAO2N,EAAO/F,MAAM,WAKxB,CACND,KAAM,iBACE,CAAEC,MAAM,MAOnBpJ,EAAI2tB,KAAO,SAAclD,UACT,OAAXA,GAA+C,mBAApBA,EAAOmD,QAC9BnD,EAAOmD,UACRnqB,KAAKmoB,IAAInB,IAIjBzqB,EAAIyiB,MAAQ,SAAe9R,EAAMC,EAAOC,EAAKC,EAAMC,EAAQC,EAAQ6c,eAC5C,IAAV/c,IACXA,EAAO,QAEgB,IAAZC,IACXA,EAAS,QAEc,IAAZC,IACXA,EAAS,QAEmB,IAAjB6c,IACXA,EAAc,GAER,IAAI5lB,KAAK0I,EAAMC,EAAQ,EAAGC,EAAKC,EAAMC,EAAQC,EAAQ6c,EAAc,MAI3E7tB,EAAI8tB,WAAa,SAAoBnpB,EAAMC,EAASC,UAC5ClD,KAAK8G,UAAU5G,OAAO8C,EAAMC,EAASC,IAI7C7E,EAAI+tB,YAAc,SAAqBhpB,UAC/BpD,KAAKkH,WAAWhH,OAAOkD,IAI/B/E,EAAIguB,KAAO,SAAcC,EAAGC,EAAGtjB,EAAG3G,OAY7BkqB,EAAIC,EAXJC,EAAK,SAAUF,EAAIC,EAAIE,UAC1BA,GAAY,GACF,EAAI,EACNH,GAAMC,EAAKD,GAAMG,EAAM,EACtBA,EAAM,GACPF,EACCE,EAAM,EAAI,EACXH,GAAMC,EAAKD,IAAO,EAAI,EAAIG,GAAO,EAClCH,eAIW,IAAPlqB,IACXA,EAAI,GACK,IAAN2G,EACI5K,EAAIoqB,KAAK8D,EAAGA,EAAGA,EAAGjqB,IAK1BkqB,EAAK,EAAMD,GAHVE,EADGF,GAAK,GACHA,GAAK,EAAMtjB,GAEXsjB,EAAItjB,EAAKsjB,EAAItjB,GAEZ5K,EAAIoqB,KAAKiE,EAAGF,EAAIC,EAAIH,EAAI,EAAI,GAAII,EAAGF,EAAIC,EAAIH,GAAII,EAAGF,EAAIC,EAAIH,EAAI,EAAI,GAAIhqB,KAI9EjE,EAAIuuB,KAAO,SAAcN,EAAGrjB,EAAGuG,EAAGlN,MACvB,IAAN2G,EACH,OAAO5K,EAAIoqB,KAAKjZ,EAAGA,EAAGA,EAAGlN,OACtBjD,EAAIyC,KAAKyO,MAAU,EAAJ+b,GACfhjB,EAAS,EAAJgjB,EAAWjtB,EAChBwtB,EAAIrd,GAAK,EAAMvG,GACf6jB,EAAItd,GAAK,EAAMvG,EAAIK,GACnBkX,EAAIhR,GAAK,EAAMvG,GAAK,EAAMK,WACtBjK,EAAI,QACN,SACGhB,EAAIoqB,KAAKjZ,EAAGgR,EAAGqM,EAAGvqB,QACrB,SACGjE,EAAIoqB,KAAKqE,EAAGtd,EAAGqd,EAAGvqB,QACrB,SACGjE,EAAIoqB,KAAKoE,EAAGrd,EAAGgR,EAAGle,QACrB,SACGjE,EAAIoqB,KAAKoE,EAAGC,EAAGtd,EAAGlN,QACrB,SACGjE,EAAIoqB,KAAKjI,EAAGqM,EAAGrd,EAAGlN,QACrB,SACGjE,EAAIoqB,KAAKjZ,EAAGqd,EAAGC,EAAGxqB,KAK5BjE,EAAImf,KAAO,SAAcf,EAAW7c,EAAKmtB,MACpC1uB,EAAIwF,OAAO4Y,UACVA,EAAU9P,IAAI/M,GACV6c,EAAU7P,IAAIhN,GACfmtB,EAEH,GAAI1uB,EAAIoO,UAAUgQ,GAAY,KAC9B9X,EAAS8X,EAAU7c,eACC,IAAZ+E,EACJooB,EACDpoB,QAEFtG,EAAIqK,UAAUxI,OAAO,QAAS,0BAIrC7B,EAAI2uB,IAAM,kBACF,IAAI1mB,MAIZjI,EAAI4uB,OAAS,eACRD,EAAM,IAAI1mB,YAEP,IAAIA,KAAK0mB,EAAIE,iBAAkBF,EAAIG,cAAeH,EAAII,aAAcJ,EAAIK,cAAeL,EAAIM,gBAAiBN,EAAIO,gBAAiBP,EAAIQ,uBAG7InvB,EAAIqf,UAAY,CACflT,KAAMnM,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,QAAUhC,EAAI6G,OAChDoJ,MAAOjQ,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,SAAWhC,EAAIyR,QAClDzB,IAAKhQ,EAAI8Y,OAAO,CAAC,OAAQ,IAAK,CAAE9W,KAAM,OAAShC,EAAI2R,MACnDyd,IAAKpvB,EAAI8Y,OAAO,CAAC,OAAQ,EAAG,QAAS,MAAO,CAAE9W,KAAM,OAAShC,EAAI+R,MACjEsd,MAAOrvB,EAAI8Y,OAAO,CAAC,OAAQ,GAAM,CAAE9W,KAAM,SAAWhC,EAAImS,QACxDwB,KAAM3T,EAAI8Y,OAAO,CAAC,YAAa,IAAK,CAAE9W,KAAM,QAAUhC,EAAIoS,OAC1DhR,IAAKpB,EAAI8Y,OAAO,CAAC,YAAa,IAAK,CAAE9W,KAAM,OAAShC,EAAIqS,MACxDid,KAAMtvB,EAAI8Y,OAAO,CAAC,QAAQ,GAAQ,CAAE9W,KAAM,QAAUhC,EAAI6R,OACxDgG,IAAK7X,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,OAAShC,EAAIsS,MACnD9O,KAAMxD,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,QAAUhC,EAAI2K,OAChD4kB,OAAQvvB,EAAI8Y,OAAO,CAAC,MAAO,MAAO,QAAS,MAAO,CAAE9W,KAAM,UAAYhC,EAAIyW,SAC1E+Y,IAAKxvB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,OAAShC,EAAI2S,MACnD8c,IAAKzvB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,OAAShC,EAAI6S,MACnD6c,IAAK1vB,EAAI8Y,OAAO,CAAC,cAAe,CAAE9W,KAAM,OAAShC,EAAIwtB,MACrDmC,YAAa3vB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,eAAiBhC,EAAI8S,cAC9D8c,UAAW5vB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,aAAehC,EAAI+S,YAC1D8c,OAAQ7vB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAIgT,SACpD8c,OAAQ9vB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAIiT,SACpD8c,MAAO/vB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,SAAWhC,EAAIiS,QAClD+d,QAAShwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,WAAahC,EAAIkT,UACtD+c,MAAOjwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,SAAWhC,EAAImT,QAClD+c,OAAQlwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAIkE,SACpDuoB,QAASzsB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,WAAahC,EAAI6D,UACtDssB,YAAanwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,eAAiBhC,EAAI0E,cAC9D0rB,aAAcpwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,gBAAkBhC,EAAI8E,eAChEurB,WAAYrwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,cAAgBhC,EAAIyS,aAC5D6d,WAAYtwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,cAAgBhC,EAAI0S,aAC5D6d,OAAQvwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAIuF,SACpDirB,MAAOxwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,SAAW/B,EAAMU,SAAWX,EAAI0F,OAAS1F,EAAIgP,WAChFyhB,OAAQzwB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAIyF,SACpDirB,YAAa1wB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,eAAiBhC,EAAIsT,cAC9Dqd,OAAQ3wB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,UAAYhC,EAAI6T,SACpD+c,SAAU5wB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,YAAchC,EAAI8T,WAC3D+c,QAAS7wB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,WAAahC,EAAIsU,UACtDwc,UAAW9wB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,aAAehC,EAAIuU,YAC7Doa,IAAK3uB,EAAI8Y,OAAO,GAAI9Y,EAAI2uB,KACxBC,OAAQ5uB,EAAI8Y,OAAO,GAAI9Y,EAAI4uB,QAC3BmC,UAAW/wB,EAAI8Y,OAAO,CAAC,WAAY,SAAU,GAAI,CAAE9W,KAAM,aAAehC,EAAIitB,YAC5EE,QAASntB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,WAAahC,EAAIktB,UAC3D8D,OAAQhxB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,UAAYhC,EAAIotB,SACzD6D,YAAajxB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,eAAiBhC,EAAIstB,cACnE4D,OAAQlxB,EAAI8Y,OAAO,CAAC,WAAY,SAAU,GAAI,CAAE9W,KAAM,UAAYhC,EAAIutB,SACtE3B,IAAK5rB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,OAAShC,EAAI2tB,MACjDwD,KAAMnxB,EAAI8Y,OAAO,CAAC,OAAQ,QAAS,MAAO,QAAS,EAAG,UAAW,EAAG,UAAW,EAAG,eAAgB,GAAI,CAAE9W,KAAM,QAAUhC,EAAIyiB,OAC5H2O,UAAWpxB,EAAI8Y,OAAO,CAAC,QAAS,EAAG,WAAY,EAAG,gBAAiB,GAAI,CAAE9W,KAAM,aAAehC,EAAI8tB,YAClGuD,WAAYrxB,EAAI8Y,OAAO,CAAC,UAAW,GAAI,CAAE9W,KAAM,cAAgBhC,EAAI+tB,aACnEuD,IAAKtxB,EAAI8Y,OAAO,CAAC,IAAK,IAAK,IAAK,KAAM,GAAM,CAAE9W,KAAM,OAAShC,EAAIoqB,MACjEmH,IAAKvxB,EAAI8Y,OAAO,CAAC,IAAK,IAAK,IAAK,KAAM,GAAM,CAAE9W,KAAM,OAAShC,EAAIguB,MACjEwD,IAAKxxB,EAAI8Y,OAAO,CAAC,IAAK,IAAK,IAAK,KAAM,GAAM,CAAE9W,KAAM,OAAShC,EAAIuuB,MACjEkD,UAAWzxB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,aAAehC,EAAIwgB,YAC1DkR,IAAK1xB,EAAI8Y,OAAO,CAAC,OAAQ,CAAE9W,KAAM,OAAShC,EAAIqqB,MAC9CsH,IAAK3xB,EAAI8Y,OAAO,CAAC,KAAM,CAAE9W,KAAM,OAAShC,EAAIsqB,MAC5CsH,IAAK5xB,EAAI8Y,OAAO,CAAC,KAAM,CAAE9W,KAAM,OAAShC,EAAIuqB,MAC5CsH,IAAK7xB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,OAAShC,EAAIwqB,MACjDsH,IAAK9xB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,OAAShC,EAAI0qB,MACjDqH,IAAK/xB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,OAAShC,EAAI2qB,MACjDqH,IAAKhyB,EAAI8Y,OAAO,CAAC,QAAS,CAAE9W,KAAM,OAAShC,EAAI4qB,MAC/CqH,IAAKjyB,EAAI8Y,OAAO,CAAC,QAAS,CAAE9W,KAAM,OAAShC,EAAI6qB,MAC/CqH,IAAKlyB,EAAI8Y,OAAO,CAAC,WAAY,SAAU,GAAI,CAAE9W,KAAM,OAAShC,EAAI8qB,MAChEpQ,MAAO1a,EAAI8Y,OAAO,CAAC,WAAY,WAAY,MAAO,CAAE9W,KAAM,SAAWhC,EAAI+qB,QACzEoH,KAAMnyB,EAAI8Y,OAAO,CAAC,WAAY,WAAY,MAAO,CAAE9W,KAAM,QAAUhC,EAAIgrB,OACvEoH,OAAQpyB,EAAI8Y,OAAO,CAAC,WAAY,OAAQ,KAAM,YAAY,GAAQ,CAAE9W,KAAM,SAAUoJ,cAAc,GAAQpL,EAAIirB,SAC9GoH,MAAOryB,EAAI8Y,OAAO,CAAC,SAAU,CAAE9W,KAAM,SAAWhC,EAAIwrB,QACpDtmB,MAAOlF,EAAI8Y,OAAO,CAAC,SAAU,CAAE9W,KAAM,SAAWhC,EAAI6rB,QACpDyG,SAAUtyB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,YAAchC,EAAI8rB,WAC3DyG,WAAYvyB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,cAAgBhC,EAAIgsB,aAC/DwG,SAAUxyB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,YAAchC,EAAIksB,WAC7DE,OAAQpsB,EAAI8Y,OAAO,GAAI,CAAE9W,KAAM,UAAYhC,EAAImsB,SAC/CsG,UAAWzyB,EAAI8Y,OAAO,CAAC,SAAU,CAAE9W,KAAM,aAAehC,EAAIqsB,YAC5DqG,WAAY1yB,EAAI8Y,OAAO,CAAC,YAAa,CAAE9W,KAAM,cAAgBhC,EAAIwsB,aACjE9oB,MAAO1D,EAAI8Y,OAAO,CAAC,IAAK,SAAU,GAAI,CAAE9W,KAAM,SAAWhC,EAAI0sB,QAC7DM,IAAKhtB,EAAI8Y,OAAO,CAAC,UAAW,CAAE9W,KAAM,OAAShC,EAAI+sB,OAIlD/sB,EAAIglB,SAAW,SAAkBjR,EAAQ8Q,EAAKC,EAAMC,GACrC,OAAVA,IACHA,EAAQhR,EAAO7S,gBAEZoF,EAAS,GACNyN,EAAO7S,QAAQ,KACjB0E,EAAMmO,EAAO7F,QAAQ2W,OACZ,IAATjf,IAAemf,IAAS,CAC3Bze,EAAOhD,KAAKyQ,SAGbzN,EAAOhD,KAAKyQ,EAAO0E,OAAO,EAAG7S,IAC7BU,EAAOhD,KAAKwhB,GACZ/Q,EAASA,EAAO0E,OAAO7S,EAAMif,EAAI3jB,eAE3BoF,EAAO/C,KAAK,KAGpBvD,EAAIgU,OAAS,SAAgBD,EAAQ5M,MACtB,OAAVA,EACHA,EAAQ,eACJ,GAAuB,iBAAXA,EAChB,MAAMnH,EAAIqK,UAAUxI,OAAO,UAAW,qCAEhCkS,GAAsC,GAA5B5M,EAAM+G,QAAQ6F,EAAO,KACrCA,EAASA,EAAO0E,OAAO,QACjB1E,GAAsD,GAA5C5M,EAAM+G,QAAQ6F,EAAOA,EAAO7S,OAAS,KACrD6S,EAASA,EAAO0E,OAAO,EAAG1E,EAAO7S,OAAS,UACpC6S,GAGR/T,EAAIilB,QAAU,SAAiBlR,EAAQ5M,MACxB,OAAVA,EACHA,EAAQ,eACJ,GAAuB,iBAAXA,EAChB,MAAMnH,EAAIqK,UAAUxI,OAAO,WAAY,sCAEjCkS,GAAsC,GAA5B5M,EAAM+G,QAAQ6F,EAAO,KACrCA,EAASA,EAAO0E,OAAO,UACjB1E,GAGR/T,EAAIklB,QAAU,SAAiBnR,EAAQ5M,MACxB,OAAVA,EACHA,EAAQ,eACJ,GAAuB,iBAAXA,EAChB,MAAMnH,EAAIqK,UAAUxI,OAAO,WAAY,sCAEjCkS,GAAsD,GAA5C5M,EAAM+G,QAAQ6F,EAAOA,EAAO7S,OAAS,KACrD6S,EAASA,EAAO0E,OAAO,EAAG1E,EAAO7S,OAAS,UACpC6S,GAGR/T,EAAIolB,OAAS,SAAgBrR,EAAQoR,EAAKJ,MAC7B,OAARI,GAAiC,iBAATA,EAC3B,MAAMnlB,EAAIqK,UAAUxI,OAAO,UAAW,gCAEzB,OAAVkjB,EAAgB,KACfze,EAASyN,EAAO6D,MAAc,OAARuN,EAAeA,EAAM,qBACnC,OAARA,IACC7e,EAAOpF,SAAWoF,EAAO,GAAGpF,QAC/BoF,EAAOua,OAAO,EAAG,GACdva,EAAOpF,SAAWoF,EAAOA,EAAOpF,OAAS,GAAGA,QAC/CoF,EAAOua,QAAQ,IAEVva,KAGK,OAAR6e,EAAc,KACb7e,EAAS,GACNyN,EAAO7S,QAAQ,KACjB0E,EAAMmO,EAAO7F,QAAQiX,OACZ,IAATvf,IAAemf,IAAS,CAC3Bze,EAAOhD,KAAKyQ,SAGbzN,EAAOhD,KAAKyQ,EAAO0E,OAAO,EAAG7S,IAC7BmO,EAASA,EAAO0E,OAAO7S,EAAMuf,EAAIjkB,eAE3BoF,MAGHA,EAAS,GACNyN,EAAO7S,QAAQ,KAEjByxB,EADJ5e,EAAS/T,EAAIilB,QAAQlR,EAAQ,OAK5B4e,EAHI5N,IAGGhR,EAAO6D,MAAM,aAAc,GAAG,GAF9B7D,GAGC7S,QACRoF,EAAOhD,KAAKqvB,GACb5e,EAASA,EAAO0E,OAAOka,EAAKzxB,eAEtBoF,GAKVtG,EAAIqlB,QAAU,SAAiBtR,EAAQoR,EAAKJ,MAC/B,OAARI,GAAiC,iBAATA,EAC3B,MAAMnlB,EAAIqK,UAAUxI,OAAO,WAAY,oDAE1B,OAAVkjB,EAAgB,KACfze,EAASyN,EAAO6D,MAAc,OAARuN,EAAeA,EAAM,qBACnC,OAARA,IACC7e,EAAOpF,SAAWoF,EAAO,GAAGpF,QAC/BoF,EAAOua,OAAO,EAAG,GACdva,EAAOpF,SAAWoF,EAAOA,EAAOpF,OAAS,GAAGA,QAC/CoF,EAAOua,QAAQ,IAEVva,KAGK,OAAR6e,EAAc,KACb7e,EAAS,GACNyN,EAAO7S,QAAQ,KACjB0E,EAAMmO,EAAO6e,YAAYzN,OAChB,IAATvf,IAAemf,IAAS,CAC3Bze,EAAOsF,QAAQmI,SAGhBzN,EAAOsF,QAAQmI,EAAO0E,OAAO7S,EAAMuf,EAAIjkB,SACvC6S,EAASA,EAAO0E,OAAO,EAAG7S,UAEpBU,MAGHA,EAAS,GACNyN,EAAO7S,QAAQ,KAEjByxB,EADJ5e,EAAS/T,EAAIklB,QAAQnR,EAAQ,KAAM,OAMlC4e,EAJI5N,KAGJ4N,EAAO5e,EAAO6D,MAAM,eACR+a,EAAKzxB,OAAS,GAHnB6S,GAKC7S,QACRoF,EAAOsF,QAAQ+mB,GAChB5e,EAASA,EAAO0E,OAAO,EAAG1E,EAAO7S,OAASyxB,EAAKzxB,eAEzCoF,GAKVtG,EAAIulB,YAAc,SAAqBxR,EAAQuR,WAEzCnf,EAaDG,EAAS,GAAIpF,EAAS6S,EAAO7S,OAExB0E,EAAM,EAAGitB,EAAW,IAAM,IACvB3xB,GAAP0E,SACCitB,GAAYjtB,GACfU,EAAOhD,KAAKyQ,EAAOxN,UAAUssB,IACvBvsB,MAEJwsB,QArBA3sB,EACM,QADNA,EAAI4N,EAAOnO,KACQ,MAALO,GAAsB,MAALA,GAAsB,KAALA,GAAsB,KAALA,GAAsB,KAALA,GAAsB,KAALA,GAAsB,UAALA,GAAsB,UAALA,EACjI,EACE,OAANA,EACCP,GAAO1E,EAAS,EACZ,EACgB,OAApB6S,EAAOnO,EAAM,GACT,EACD,EAED,MAYFktB,EAEA,KACAC,EAASntB,GAAO0f,EAAWwN,EAAa,GAC5CxsB,EAAOhD,KAAKyQ,EAAOxN,UAAUssB,EAAUE,IAEvCF,EADAjtB,GAAOktB,QAJLltB,IAUL5F,EAAI0kB,OAAS,SAAgBziB,EAAKuiB,EAAKrf,EAAOsf,MACzCtf,EAAQ,IACXA,GAASlD,EAAIf,QACA,OAAViE,IACHA,EAAQ,GAELsf,EAAM,IACTA,GAAOxiB,EAAIf,QACA,OAARujB,IACHA,EAAMxiB,EAAIf,QAEClB,EAAImT,OAAOlR,KAETuiB,EAAItjB,OAAQ,IACrBujB,EAAM,GAAKtf,EAAQlD,EAAIf,QAAkBujB,EAARtf,EACpC,OAAO,MACJmB,EAASme,EAAMtf,EAAQ,SACvBmB,EAASrE,EAAIf,OAAS,IACzBoF,EAASrE,EAAIf,OAAS,GAChBoF,EAGRnB,EAAQnF,EAAIsK,OAAOnF,EAAOlD,EAAIf,QAC9BujB,EAAMzkB,EAAIsK,OAAOma,EAAKxiB,EAAIf,YAEtB6jB,EAAQ,KACR/kB,EAAIuF,QAAQtD,GAAM,KAChB,IAAIjB,EAAImE,EAAOnE,EAAIyjB,IAAOzjB,EAC1BhB,EAAI6N,IAAI5L,EAAIjB,GAAIwjB,MACjBO,SAEGA,UAIHiO,EAAY7tB,GAIG,IADlB6tB,EAAY/wB,EAAIiM,QAAQsW,EAAKwO,OAGzBA,EAAYxO,EAAItjB,OAASujB,MAE3BM,EACFiO,GAAaxO,EAAItjB,cAEX6jB,GAIT/kB,EAAI2kB,MAAQ,SAAe1iB,EAAKuiB,EAAKrf,EAAOsf,GACvCtf,EAAQ,IACXA,GAASlD,EAAIf,QACA,OAAViE,IACHA,EAAQ,GACLsf,EAAM,IACTA,GAAOxiB,EAAIf,QACA,OAARujB,IACHA,EAAMxiB,EAAIf,QACXiE,EAAQnF,EAAIsK,OAAOnF,EAAOlD,EAAIf,QAC9BujB,EAAMzkB,EAAIsK,OAAOma,EAAKxiB,EAAIf,QAEZ,IAAViE,GAAesf,IAAQxiB,EAAIf,SAE7Be,EADmB,iBAARA,EACLA,EAAIsE,UAAUpB,EAAOsf,GAErBxiB,EAAIiD,MAAMC,EAAOsf,QAErBne,EAASrE,EAAIiM,QAAQsW,UACT,IAAZle,IACHA,GAAUnB,GACJmB,GAGRtG,EAAI4kB,OAAS,SAAgB3iB,EAAKuiB,EAAKrf,EAAOsf,GACzCtf,EAAQ,IACXA,GAASlD,EAAIf,QACA,OAAViE,IACHA,EAAQ,GACLsf,EAAM,IACTA,GAAOxiB,EAAIf,QACA,OAARujB,IACHA,EAAMxiB,EAAIf,QACXiE,EAAQnF,EAAIsK,OAAOnF,EAAOlD,EAAIf,QAC9BujB,EAAMzkB,EAAIsK,OAAOma,EAAKxiB,EAAIf,QAEZ,IAAViE,GAAesf,IAAQxiB,EAAIf,SAE7Be,EADmB,iBAARA,EACLA,EAAIsE,UAAUpB,EAAOsf,GAErBxiB,EAAIiD,MAAMC,EAAOsf,QAErBne,EAASrE,EAAI2wB,YAAYpO,UACb,IAAZle,IACHA,GAAUnB,GACJmB,GAGRtG,EAAIwlB,YAAc,SAAqBvjB,MAClB,iBAARA,EACX,MAAMjC,EAAIqK,UAAUxI,OAAO,eAAgB,yCAExCI,EAAIf,SACPe,EAAMA,EAAI,GAAGqV,cAAgBrV,EAAIiD,MAAM,GAAGyS,eACpC1V,GAGRjC,EAAImmB,OAAS,SAAgBlkB,MACxBjC,EAAIwF,OAAOvD,GAAM,KAChBqE,EAAS,UACbrE,EAAI1B,QAAQ,SAAUiB,EAAOD,GAC5B+E,EAAOhD,KAAK,CAAC/B,EAAKC,MAEZ8E,EAEH,GAAItG,EAAIoO,UAAUnM,GAAM,CACxBqE,EAAS,OACR,IAAI/E,KAAOU,EACfqE,EAAOhD,KAAK,CAAC/B,EAAKU,EAAIV,YAChB+E,QAEFtG,EAAIqK,UAAUxI,OAAO,UAAW,4BAGvC7B,EAAIomB,QAAU,SAAiBnkB,MAC1BjC,EAAIwF,OAAOvD,GAAM,KAChBqE,EAAS,UACbrE,EAAI1B,QAAQ,SAAUiB,EAAOD,GAC5B+E,EAAOhD,KAAK9B,KAEN8E,EAEH,GAAItG,EAAIoO,UAAUnM,GAAM,CACxBqE,EAAS,OACR,IAAI/E,KAAOU,EACfqE,EAAOhD,KAAKrB,EAAIV,WACV+E,QAEFtG,EAAIqK,UAAUxI,OAAO,WAAY,6BAGxC7B,EAAIylB,MAAQ,SAAeN,EAAKvS,WAC3BqgB,EAAa,GACR/lB,EAAOlN,EAAImN,MAAMyF,KAAc,KACnCxF,EAAOF,EAAK/D,UACZiE,EAAKhE,KACR,MACD6pB,EAAW3vB,KAAK8J,EAAK5L,cAEfyxB,EAAW1vB,KAAK4hB,IAGxBnlB,EAAI0lB,YAAc,SAAqB3R,EAAQ6E,MACtB,iBAAZA,EACX,MAAM5Y,EAAIqK,UAAUxI,OAAO,eAAgB,+CAErCkS,EAAO0E,OAAO,EAAGG,EAAO1X,UAAY0X,GAG5C5Y,EAAI2lB,UAAY,SAAmB5R,EAAQqH,MAClB,iBAAZA,EACX,MAAMpb,EAAIqK,UAAUxI,OAAO,aAAc,6CAEnCkS,EAAO0E,OAAO1E,EAAO7S,OAASka,EAAOla,UAAYka,GAGzDpb,EAAIimB,WAAa,SAAoBhkB,OAC/BjC,EAAIkE,QAAQjC,GAChB,MAAMjC,EAAIqK,UAAUxI,OAAO,cAAe,mCAEvCyE,EAASrE,EAAIkC,cAAgB,IAAMnE,EAAIyQ,OAAOxO,EAAImC,WAAa,GAAGyG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMxO,EAAIoC,UAAUwG,WAAY,IAAK,GACvIiG,EAAO7O,EAAIqC,WACXyM,EAAS9O,EAAIsC,aACbyM,EAAS/O,EAAIuC,aACbyM,EAAKhP,EAAIwC,yBACTqM,GAAQC,GAAUC,GAAUC,KAC/B3K,GAAU,IAAMtG,EAAIyQ,MAAMK,EAAKjG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMM,EAAOlG,WAAY,IAAK,GAAK,IAAM7K,EAAIyQ,MAAMO,EAAOnG,WAAY,IAAK,GACtIoG,IACH3K,GAAU,IAAMtG,EAAIyQ,MAAMQ,EAAGpG,WAAY,IAAK,GAAK,QAE9CvE,GAGRtG,EAAIgmB,YAAc,SAAqB/jB,SACpB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAG1CjC,EAAI8lB,SAAS7jB,IAAQ,KAAOjC,EAAIyQ,MAAMxO,EAAIoC,UAAW,IAAK,GAAK,IAFlE,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEIpC,EAAImC,YAAc,IAAMnC,EAAIkC,cAAgB,IAAMnE,EAAIyQ,MAAMxO,EAAIqC,WAAY,IAAK,GAAK,IAAMtE,EAAIyQ,MAAMxO,EAAIsC,aAAc,IAAK,GAAK,IAAMvE,EAAIyQ,MAAMxO,EAAIuC,aAAc,IAAK,GAAK,QAGjRxE,EAAI8lB,SAAW,SAAkB7jB,OAC5BixB,EAAIjxB,EAAIuU,gBACL0c,EAAIA,EAAI,EAAI,GAGpBlzB,EAAI2W,MAAQ,SAAe1U,EAAK8jB,GACV,OAAjBA,EACHA,EAAe,EAEfA,GAAgB,MAEboN,EAAUnzB,EAAI0W,SAASzU,GAAO,EAE9BmxB,EADO,IAAInrB,KAAKhG,EAAIkC,cAAe,EAAG,GACnBqS,eACjB4c,EAAc,IACnBA,EAAc,GAERA,GAAerN,KACnBoN,EACmB,KAAfC,IACLA,EAAc,UAET3vB,KAAKyO,MAAMihB,EAAU,IAG7BnzB,EAAIqzB,QAAU,SAAiBpxB,UAC2B,IAAlD,IAAIgG,KAAKhG,EAAIkC,cAAe,EAAG,IAAIC,YAG3CpE,EAAI0W,SAAW,SAAkBzU,OAC5BqxB,EAAOtzB,EAAIqzB,QAAQpxB,GAAO,EAAI,EAC9B4O,EAAM5O,EAAIoC,iBACNpC,EAAImC,iBACN,SACGyM,OACH,SACG,GAAKA,OACR,SACG,GAAUyiB,EAAOziB,OACpB,SACG,GAAUyiB,EAAO,GAAKziB,OACzB,SACG,GAAUyiB,EAAO,GAAK,GAAKziB,OAC9B,SACG,GAAUyiB,EAAO,GAAK,GAAK,GAAKziB,OACnC,SACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAKziB,OACxC,SACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAK,GAAKziB,OAC7C,SACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAK,GAAK,GAAKziB,OAClD,SACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAKziB,OACvD,UACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAKziB,OAC5D,UACG,GAAUyiB,EAAO,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAKziB,IAIxE7Q,EAAI6hB,QAAU,SAAiB5f,EAAKkN,OAC9B,IAAInO,EAAI,EAAGA,EAAImO,EAAMjO,SAAUF,EACnCiB,EAAIqB,KAAK6L,EAAMnO,WACT,MAGRhB,EAAI4lB,QAAU,SAAiB3jB,EAAK2D,EAAKuJ,GACpCvJ,EAAM,IACTA,GAAO3D,EAAIf,YAEP,IAAIF,EAAI,EAAGA,EAAImO,EAAMjO,SAAUF,EACnCiB,EAAI4e,OAAOjb,IAAO,EAAGuJ,EAAMnO,WACrB,MAGRhB,EAAI6lB,KAAO,SAAc5jB,EAAK2D,GACzBA,EAAM,IACTA,GAAO3D,EAAIf,YAERoF,EAASrE,EAAI2D,UACjB3D,EAAI4e,OAAOjb,EAAK,GACTU,GAGRtG,EAAIqmB,QAAU,SAAiBpkB,EAAKsxB,EAAQhoB,OACtCvL,EAAIyF,QAAQxD,GAChB,MAAMjC,EAAIqK,UAAUxI,OAAO,WAAY,gCACnC,IAAIb,EAAI,EAAGA,EAAIuyB,EAAOryB,SAAUF,EAAG,KACnCgX,EAAQub,EAAOvyB,MACfhB,EAAIwF,OAAOwS,GACdA,EAAMzX,QAAQ,SAAUiB,EAAOD,GAC9BtB,EAAMqB,QAAQW,EAAKV,EAAKC,UAGrB,GAAIxB,EAAIoO,UAAU4J,OACjB,IAAIzW,KAAOyW,EACf/X,EAAMqB,QAAQW,EAAKV,EAAKyW,EAAMzW,QAE3B,CAAA,IAAIvB,EAAIuF,QAAQyS,GAQpB,MAAMhY,EAAIqK,UAAUxI,OAAO,WAAY,gEAPlC,IAAI+L,EAAI,EAAGA,EAAIoK,EAAM9W,SAAU0M,EAAG,KACjC5N,EAAIuF,QAAQyS,EAAMpK,KAA2B,GAAnBoK,EAAMpK,GAAG1M,OACvC,MAAMlB,EAAIqK,UAAUxI,OAAO,WAAY,4DACxC5B,EAAMqB,QAAQW,EAAK+V,EAAMpK,GAAG,GAAIoK,EAAMpK,GAAG,UAMvC,IAAIrM,KAAOgK,EACftL,EAAMqB,QAAQW,EAAKV,EAAKgK,EAAOhK,WACzB,MAGRvB,EAAIsmB,OAAS,SAAgBrkB,MACxBjC,EAAIwF,OAAOvD,GACdA,EAAIuxB,aACA,GAAIxzB,EAAI0F,OAAOzD,GACnBA,EAAIuxB,YACA,CAAA,IAAIxzB,EAAIoO,UAAUnM,GAKtB,MAAMjC,EAAIqK,UAAUxI,OAAO,UAAW,sCAJjC,IAAIN,KAAOU,SACRA,EAAIV,UAIN,MAGRvB,EAAI4H,MAAQ5H,EAAIkK,SACflK,EAAI4J,MACJ,CACC4I,SAAU,YAEV3Q,OAAQ,SAAgBiC,EAAGC,EAAGC,EAAGC,OAC5BkC,EAAInG,EAAI8C,OAAOnB,aACnBwE,EAAE0B,QAAoB,IAAP/D,EAAqBA,EAAI,EACxCqC,EAAE2B,QAAoB,IAAP/D,EAAqBA,EAAI,EACxCoC,EAAE4B,QAAoB,IAAP/D,EAAqBA,EAAI,EACxCmC,EAAE6B,QAAoB,IAAP/D,EAAqBA,EAAI,IACjCkC,GAGRqL,SAAU,eACL1N,EAAI9D,EAAIyQ,MAAM9O,KAAKkG,GAAGgD,SAAS,IAAK,IAAK,GACzC9G,EAAI/D,EAAIyQ,MAAM9O,KAAKmG,GAAG+C,SAAS,IAAK,IAAK,GACzC7G,EAAIhE,EAAIyQ,MAAM9O,KAAKoG,GAAG8C,SAAS,IAAK,IAAK,GACzC5G,EAAIjE,EAAIyQ,MAAM9O,KAAKqG,GAAG6C,SAAS,IAAK,IAAK,UAC7B,MAAZlJ,KAAKqG,GACJlE,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,GAC1D,IAAMH,EAAE,GAAKC,EAAE,GAAKC,EAAE,GAAKC,EAAE,GAE7B,IAAMH,EAAIC,EAAIC,EAAIC,EAGtBH,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,GACzC,IAAMF,EAAE,GAAKC,EAAE,GAAKC,EAAE,GAEtB,IAAMF,EAAIC,EAAIC,GAIxB4N,QAAS,cACQ,MAAZjQ,KAAKqG,SACD,QAAUrG,KAAKkG,GAAK,KAAOlG,KAAKmG,GAAK,KAAOnG,KAAKoG,GAAK,KAAQpG,KAAKqG,GAAK,IAAO,QAGlFlE,EAAI9D,EAAIyQ,MAAM9O,KAAKkG,GAAGgD,SAAS,IAAK,IAAK,GACzC9G,EAAI/D,EAAIyQ,MAAM9O,KAAKmG,GAAG+C,SAAS,IAAK,IAAK,GACzC7G,EAAIhE,EAAIyQ,MAAM9O,KAAKoG,GAAG8C,SAAS,IAAK,IAAK,GACrC7K,EAAIyQ,MAAM9O,KAAKqG,GAAG6C,SAAS,IAAK,IAAK,UACzC/G,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,IAAMC,EAAE,KAAOA,EAAE,GACzC,IAAMF,EAAE,GAAKC,EAAE,GAAKC,EAAE,GAEtB,IAAMF,EAAIC,EAAIC,GAIxB6L,SAAU,iBACF,CACN5N,IAAKN,KACLgC,MAAO,EACPwF,KAAM,kBACa,GAAdxH,KAAKgC,SACNhC,KAAKgC,MACA,CAAEnC,MAAOG,KAAKM,IAAI4F,GAAIuB,MAAM,IAEb,GAAdzH,KAAKgC,SACXhC,KAAKgC,MACA,CAAEnC,MAAOG,KAAKM,IAAI6F,GAAIsB,MAAM,IAEb,GAAdzH,KAAKgC,SACXhC,KAAKgC,MACA,CAAEnC,MAAOG,KAAKM,IAAI8F,GAAIqB,MAAM,IAEb,GAAdzH,KAAKgC,SACXhC,KAAKgC,MACA,CAAEnC,MAAOG,KAAKM,IAAI+F,GAAIoB,MAAM,IAG5B,CAAEA,MAAM,MAKnBsQ,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,WACG3Z,EAAI8Y,OAAO,GAAI,kBAAsB5P,EAAKrB,SAC7C,WACG7H,EAAI8Y,OAAO,GAAI,kBAAsB5P,EAAKpB,SAC7C,WACG9H,EAAI8Y,OAAO,GAAI,kBAAsB5P,EAAKnB,SAC7C,WACG/H,EAAI8Y,OAAO,GAAI,kBAAsB5P,EAAKlB,SAC7C,aACGhI,EAAI8Y,OAAO,GAAI,kBAAwB5P,EAAKuqB,YAC/C,aACGzzB,EAAI8Y,OAAO,GAAI,kBAAwB5P,EAAKqoB,YAC/C,cACGvxB,EAAI8Y,OAAO,GAAI,kBAAyB5P,EAAKwqB,aAChD,aACG1zB,EAAI8Y,OAAO,GAAI,kBAAwB5P,EAAKsoB,YAC/C,cACGxxB,EAAI8Y,OAAO,GAAI,kBAAyB5P,EAAKyqB,aAChD,eACG3zB,EAAI8Y,OAAO,CAAC,KAAM,SAAe7U,UAAYiF,EAAK0qB,MAAM3vB,SAC3D,iBACGjE,EAAI8Y,OAAO,CAAC,OAAQ,SAAiB2a,UAAcvqB,EAAK2qB,QAAQJ,SACnE,gBACGzzB,EAAI8Y,OAAO,CAAC,OAAQ,SAAgB2a,UAAcvqB,EAAK4qB,OAAOL,SACjE,gBACGzzB,EAAI8Y,OAAO,CAAC,OAAQ,SAAgB2a,UAAcvqB,EAAK6qB,OAAON,sBAMxE7S,YAAa,SAAqBrf,UAE7BA,EAAM,IACTA,GAAO,GACAA,QACF,SACGI,KAAKkG,QACR,SACGlG,KAAKmG,QACR,SACGnG,KAAKoG,QACR,SACGpG,KAAKqG,oBAMfiG,OAAQ,SAAgB+J,WACnBhY,EAAI6D,SAASmU,KACTrW,KAAKkG,IAAMmQ,EAAMnQ,IAAMlG,KAAKmG,IAAMkQ,EAAMlQ,IAAMnG,KAAKoG,IAAMiQ,EAAMjQ,IAAMpG,KAAKqG,IAAMgQ,EAAMhQ,KAI/FlE,EAAG9D,EAAI8Y,OAAO,GAAI,kBAAsBnX,KAAKkG,KAE7C9D,EAAG/D,EAAI8Y,OAAO,GAAI,kBAAsBnX,KAAKmG,KAE7C9D,EAAGhE,EAAI8Y,OAAO,GAAI,kBAAsBnX,KAAKoG,KAE7C9D,EAAGjE,EAAI8Y,OAAO,GAAI,kBAAsBnX,KAAKqG,KAE7CyrB,IAAKzzB,EAAI8Y,OAAO,GAAI,kBAAwBnX,KAAK4vB,MAAM,KAEvDA,IAAKvxB,EAAI8Y,OAAO,GACf,eAMQoV,EACH8F,EAAIC,EAAIC,EANRpwB,EAAInC,KAAKkG,GAAK,IACd9D,EAAIpC,KAAKmG,GAAK,IACd9D,EAAIrC,KAAKoG,GAAK,IACdosB,EAAO1wB,KAAKwuB,IAAInuB,EAAGC,EAAGC,GACtBowB,EAAO3wB,KAAKuuB,IAAIluB,EAAGC,EAAGC,UAI1BkqB,GAAKkG,EAAOD,GAAQ,EAChBC,GAAQD,EACJ,CAAC,EAAKjG,EAAG,IAKjB8F,GAAMG,EAAOrwB,IAAMqwB,EAAOC,GAC1BH,GAAME,EAAOpwB,IAAMowB,EAAOC,GAC1BF,GAAMC,EAAOnwB,IAAMmwB,EAAOC,GAQnB,EAPHtwB,GAAKqwB,EACJD,EAAKD,EACDlwB,GAAKowB,EACT,EAAMH,EAAKE,EAEX,EAAMD,EAAKD,GACP,EAAO,EACL9F,EAdPA,GAAK,IACHiG,EAAOC,IAASD,EAAOC,IAEvBD,EAAOC,IAAS,EAAMD,EAAOC,OAerCV,KAAM1zB,EAAI8Y,OAAO,GAChB,kBACWnX,KAAK4vB,MACJjkB,OAAO3L,KAAKqG,GAAK,OAI9BwpB,IAAKxxB,EAAI8Y,OAAO,GACf,eACKhV,EAAInC,KAAKkG,GAAK,IACd9D,EAAIpC,KAAKmG,GAAK,IACd9D,EAAIrC,KAAKoG,GAAK,IACdosB,EAAO1wB,KAAKwuB,IAAInuB,EAAGC,EAAGC,GACtBowB,EAAO3wB,KAAKuuB,IAAIluB,EAAGC,EAAGC,MAEtBowB,GAAQD,EACX,MAAO,CAAC,EAAK,EAFNA,OAIJH,GAAMG,EAAOrwB,IAAMqwB,EAAOC,GAC1BH,GAAME,EAAOpwB,IAAMowB,EAAOC,GAC1BF,GAAMC,EAAOnwB,IAAMmwB,EAAOC,SASvB,EAPHtwB,GAAKqwB,EACJD,EAAKD,EACDlwB,GAAKowB,EACT,EAAMH,EAAKE,EAEX,EAAMD,EAAKD,GACP,EAAO,GAXPG,EAAOC,GAAQD,EAHhBA,KAmBVR,KAAM3zB,EAAI8Y,OAAO,GAChB,kBACWnX,KAAK6vB,MACJlkB,OAAO3L,KAAKqG,GAAK,OAI9B4rB,MAAO5zB,EAAI8Y,OAAO,CAAC,KAClB,SAAe7U,MACK,iBAAPA,EACX,MAAMjE,EAAIqK,UAAUxI,OAAO,UAAW,oCAChC7B,EAAI4H,MAAM/F,OAAOF,KAAKkG,GAAIlG,KAAKmG,GAAInG,KAAKoG,GAAI9D,KAIrD4vB,QAAS7zB,EAAI8Y,OAAO,CAAC,OACpB,SAAiB2a,MACK,iBAATA,EACX,MAAMzzB,EAAIqK,UAAUxI,OAAO,UAAW,iCACnC6xB,EAAO/xB,KAAK+xB,cACT1zB,EAAIguB,KAAK0F,EAAK,GAAID,EAAKC,EAAK,GAAIA,EAAK,QAMhD1zB,EAAIyI,UAAYzI,EAAIkK,SACnBlK,EAAI4J,MACJ,CACC4I,SAAU,gBAEV3Q,OAAQ,SAAgB8C,EAAMC,EAASC,OAClCwvB,EAAKr0B,EAAI8C,OAAOnB,WACE,IAAVgD,IACXA,EAAO,QACiB,IAAbC,IACXA,EAAU,QACmB,IAAlBC,IACXA,EAAe,OAEZyvB,EAAqB7wB,KAAKyO,MAAiC,KAAnB,MAAPvN,EAAeC,GAAqBC,GAEzEA,EAAe7E,EAAI2jB,OAAOjE,IAAI4U,EAAoB,SAC9CC,EAAgB9wB,KAAKyO,MAAMoiB,EAAqB,YACpD1vB,EAAU5E,EAAI2jB,OAAOjE,IAAI6U,EAAe,OACxC5vB,EAAOlB,KAAKyO,MAAMqiB,EAAgB,OAC9B3vB,EAAU,IACbA,GAAW,QACTD,GAGH0vB,EAAGzrB,cAAgB/D,EACnBwvB,EAAG1rB,SAAW/D,EACdyvB,EAAG3rB,MAAQ/D,EAEJ0vB,GAGR7iB,SAAU,kBACJ7P,KAAKiH,cAQH,aAAejH,KAAK+G,MAAQ,KAAO/G,KAAKgH,SAAW,KAAOhH,KAAKiH,cAAgB,IAPhFjH,KAAKgH,SAKH,aAAehH,KAAK+G,MAAQ,KAAO/G,KAAKgH,SAAW,IAJpDhH,KAAK+G,MAEH,aAAe/G,KAAK+G,MAAQ,IAD3B,eAQXkJ,QAAS,eACJT,EAAI,GACJxP,KAAK+G,QACRyI,EAAE7N,KAAK3B,KAAK+G,MAAQ,SACA,IAAhB/G,KAAK+G,OAA+B,IAAf/G,KAAK+G,OAC7ByI,EAAE7N,KAAK,KACR6N,EAAE7N,KAAK,WAEJsB,EAAUjD,KAAKgH,SAAW,GAC1B6rB,EAAU/wB,KAAKyO,MAAMvQ,KAAKgH,SAAW,IACrC8rB,EAAQhxB,KAAKyO,MAAMsiB,EAAU,WACjCA,GAAoB,GAEpBrjB,EAAE7N,KAAK,GAAKmxB,GACZtjB,EAAE7N,KAAK,KACP6N,EAAE7N,KAAKtD,EAAIyQ,MAAM+jB,EAAQ3pB,WAAY,IAAK,IAC1CsG,EAAE7N,KAAK,KACP6N,EAAE7N,KAAKtD,EAAIyQ,MAAM7L,EAAQiG,WAAY,IAAK,IACtClJ,KAAKiH,gBACRuI,EAAE7N,KAAK,KACP6N,EAAE7N,KAAKtD,EAAIyQ,MAAM9O,KAAKiH,cAAciC,WAAY,IAAK,KAE/CsG,EAAE5N,KAAK,KAGfuO,SAAU,kBACa,IAAfnQ,KAAK+G,OAAiC,IAAlB/G,KAAKgH,UAAyC,IAAvBhH,KAAKiH,eAGxDglB,QAAS,kBACDjsB,KAAK+G,MAAQ,EAAI1I,EAAIyI,UAAU5G,QAAQF,KAAK+G,OAAQ/G,KAAKgH,UAAWhH,KAAKiH,eAAiBjH,MAGlGsM,OAAQ,SAAgB+J,WACnBhY,EAAI0E,aAAasT,KACZrW,KAAK+G,QAAUsP,EAAMtP,OAAW/G,KAAKgH,WAAaqP,EAAMrP,UAAchH,KAAKiH,gBAAkBoP,EAAMpP,gBAI7GyG,OAAQ,SAAgB2I,MACnBhY,EAAI0E,aAAasT,UAChBrW,KAAK+G,OAASsP,EAAMtP,MAChB/G,KAAK+G,MAAQsP,EAAMtP,MACvB/G,KAAKgH,UAAYqP,EAAMrP,SACnBhH,KAAKgH,SAAWqP,EAAMrP,SACvBhH,KAAKiH,cAAgBoP,EAAMpP,cAEnC5I,EAAI0O,aAAa,IAAK/M,KAAMqW,IAG7BzI,OAAQ,SAAgByI,MACnBhY,EAAI0E,aAAasT,UAChBrW,KAAK+G,OAASsP,EAAMtP,MAChB/G,KAAK+G,MAAQsP,EAAMtP,MACvB/G,KAAKgH,UAAYqP,EAAMrP,SACnBhH,KAAKgH,SAAWqP,EAAMrP,SACvBhH,KAAKiH,eAAiBoP,EAAMpP,cAEpC5I,EAAI0O,aAAa,KAAM/M,KAAMqW,IAG9BvI,OAAQ,SAAgBuI,MACnBhY,EAAI0E,aAAasT,UAChBrW,KAAK+G,OAASsP,EAAMtP,MAChB/G,KAAK+G,MAAQsP,EAAMtP,MACvB/G,KAAKgH,UAAYqP,EAAMrP,SACnBhH,KAAKgH,SAAWqP,EAAMrP,SACvBhH,KAAKiH,cAAgBoP,EAAMpP,cAEnC5I,EAAI0O,aAAa,IAAK/M,KAAMqW,IAG7BrI,OAAQ,SAAgBqI,MACnBhY,EAAI0E,aAAasT,UAChBrW,KAAK+G,OAASsP,EAAMtP,MAChB/G,KAAK+G,MAAQsP,EAAMtP,MACvB/G,KAAKgH,UAAYqP,EAAMrP,SACnBhH,KAAKgH,SAAWqP,EAAMrP,SACvBhH,KAAKiH,eAAiBoP,EAAMpP,cAEpC5I,EAAI0O,aAAa,KAAM/M,KAAMqW,IAG9B4H,QAAS,kBACD5f,EAAIyI,UAAU5G,QAAQF,KAAK+G,OAAQ/G,KAAKgH,UAAWhH,KAAKiH,gBAGhE8rB,KAAM,SAAcvD,EAAMxsB,EAAMC,EAASC,OACpC8L,EAAOwgB,EAAKhtB,cACZyM,EAAQugB,EAAK/sB,WACbyM,EAAMsgB,EAAK9sB,UAAYM,EACvBmM,EAAOqgB,EAAK7sB,WACZyM,EAASogB,EAAK5sB,aACdyM,EAASmgB,EAAK3sB,aAAeI,EAC7B+vB,EAAcxD,EAAK1sB,kBAAoBI,EAAe,WACnD,IAAIoD,KAAK0I,EAAMC,EAAOC,EAAKC,EAAMC,EAAQC,EAAQ2jB,IAGzDhT,QAAS,SAAiB3J,MACrBhY,EAAI0E,aAAasT,GACpB,OAAOhY,EAAIyI,UAAU5G,OAAOF,KAAK+G,MAAQsP,EAAMtP,MAAO/G,KAAKgH,SAAWqP,EAAMrP,SAAUhH,KAAKiH,cAAgBoP,EAAMpP,eAC7G,GAAI5I,EAAIkE,QAAQ8T,GACpB,OAAOrW,KAAK+yB,KAAK1c,EAAOrW,KAAK+G,MAAO/G,KAAKgH,SAAUhH,KAAKiH,qBACnD5I,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9E4J,SAAU,SAAkB5J,MACvBhY,EAAIkE,QAAQ8T,GACf,OAAOrW,KAAK+yB,KAAK1c,EAAOrW,KAAK+G,MAAO/G,KAAKgH,SAAUhH,KAAKiH,qBACnD5I,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9E+J,QAAS,SAAiB/J,MACrBhY,EAAI0E,aAAasT,GACpB,OAAOhY,EAAIyI,UAAU5G,OAAOF,KAAK+G,MAAQsP,EAAMtP,MAAO/G,KAAKgH,SAAWqP,EAAMrP,SAAUhH,KAAKiH,cAAgBoP,EAAMpP,qBAC5G5I,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9EgK,SAAU,SAAkBhK,MACvBhY,EAAIkE,QAAQ8T,GACf,OAAOrW,KAAK+yB,KAAK1c,GAAQrW,KAAK+G,OAAQ/G,KAAKgH,UAAWhH,KAAKiH,qBACtD5I,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9EkL,QAAS,SAAiBlL,MACF,iBAAXA,SACJhY,EAAIyI,UAAU5G,OAAOF,KAAK+G,MAAQsP,EAAOrW,KAAKgH,SAAWqP,EAAOrW,KAAKiH,cAAgBoP,SAEvFhY,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9EmL,SAAU,SAAkBnL,MACJ,iBAAXA,SACJhY,EAAIyI,UAAU5G,OAAOF,KAAK+G,MAAQsP,EAAOrW,KAAKgH,SAAWqP,EAAOrW,KAAKiH,cAAgBoP,SAEvFhY,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9EyL,YAAa,SAAqBzL,MACV,iBAAXA,SACJhY,EAAIyI,UAAU5G,OAAOF,KAAK+G,MAAQsP,EAAOrW,KAAKgH,SAAWqP,EAAOrW,KAAKiH,cAAgBoP,GAExF,GAAIhY,EAAI0E,aAAasT,GAAQ,KAC7B4c,EAAUjzB,KAAK+G,MACfmsB,EAAa7c,EAAMtP,MACnBosB,EAAanzB,KAAKgH,UAAYqP,EAAMrP,SACpCosB,EAAkBpzB,KAAKiH,eAAiBoP,EAAMpP,qBAC9CksB,GAAcC,KACjBH,EAAoB,MAAVA,EAAkBjzB,KAAKgH,SACjCksB,EAA0B,MAAbA,EAAqB7c,EAAMrP,SACpCosB,IACHH,EAAoB,IAAVA,EAAoBjzB,KAAKiH,cACnCisB,EAA0B,IAAbA,EAAuB7c,EAAMpP,gBAGrCgsB,EAAUC,QAEZ70B,EAAIqK,UAAUxI,OAAO,IAAK7B,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,mBAG9E0B,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,cACG3Z,EAAI8Y,OAAO,GAAI,kBAAyB5P,EAAKR,YAChD,iBACG1I,EAAI8Y,OAAO,GAAI,kBAA4B5P,EAAKP,eACnD,sBACG3I,EAAI8Y,OAAO,GAAI,kBAAiC5P,EAAKN,iCAM/DjE,KAAM,kBACEhD,KAAK+G,OAGb9D,QAAS,kBACDjD,KAAKgH,UAGb9D,aAAc,kBACNlD,KAAKiH,iBAKf5I,EAAI6I,WAAa7I,EAAIkK,SACpBlK,EAAI4J,MACJ,CACC4I,SAAU,iBAEV3Q,OAAQ,SAAgBkD,OACnBiwB,EAAKh1B,EAAI8C,OAAOnB,aACpBqzB,EAAGlsB,aAA8B,IAAZ/D,EAA0BA,EAAS,EACjDiwB,GAGRxjB,SAAU,kBACJ7P,KAAKmH,QAEH,cAAgBnH,KAAKmH,QAAU,IAD9B,gBAIT8I,QAAS,kBACJjQ,KAAKmH,SACc,IAAlBnH,KAAKmH,SAAmC,IAAjBnH,KAAKmH,QACxBnH,KAAKmH,QAAU,UAChBnH,KAAKmH,QAAU,SAEhB,YAGRgJ,SAAU,kBACe,IAAjBnQ,KAAKmH,SAGb8kB,QAAS,kBACDjsB,KAAKmH,QAAU,EAAI9I,EAAI6I,WAAWhH,QAAQF,KAAKmH,SAAWnH,MAGlEsM,OAAQ,SAAgB+J,WACnBhY,EAAI8E,cAAckT,IACdrW,KAAKmH,UAAYkP,EAAMlP,SAIhCuG,OAAQ,SAAgB2I,MACnBhY,EAAI8E,cAAckT,GACrB,OAAOrW,KAAKmH,QAAUkP,EAAMlP,QAC7B9I,EAAI0O,aAAa,IAAK/M,KAAMqW,IAG7BzI,OAAQ,SAAgByI,MACnBhY,EAAI8E,cAAckT,GACrB,OAAOrW,KAAKmH,SAAWkP,EAAMlP,QAC9B9I,EAAI0O,aAAa,KAAM/M,KAAMqW,IAG9BvI,OAAQ,SAAgBuI,MACnBhY,EAAI8E,cAAckT,GACrB,OAAOrW,KAAKmH,QAAUkP,EAAMlP,QAC7B9I,EAAI0O,aAAa,IAAK/M,KAAMqW,IAG7BrI,OAAQ,SAAgBqI,MACnBhY,EAAI8E,cAAckT,GACrB,OAAOrW,KAAKmH,SAAWkP,EAAMlP,QAC9B9I,EAAI0O,aAAa,KAAM/M,KAAMqW,IAG9B4H,QAAS,kBACD5f,EAAI6I,WAAWhH,QAAQF,KAAKmH,UAGpC4rB,KAAM,SAAcvD,EAAMpsB,WACrB4L,EAAOwgB,EAAKhtB,cACZyM,EAAQugB,EAAK/sB,WAAaW,EAC1B8L,EAAMsgB,EAAK9sB,UACXyM,EAAOqgB,EAAK7sB,WACZyM,EAASogB,EAAK5sB,aACdyM,EAASmgB,EAAK3sB,aACdmwB,EAAcxD,EAAK1sB,oBAEV,KAERwwB,EAAc,IAAIhtB,KAAK0I,EAAMC,EAAO,EAAGE,EAAMC,EAAQC,EAAQ2jB,GAAavwB,WAC1EkC,EAAS,IAAI2B,KAAK0I,EAAMC,EAAOC,EAAKC,EAAMC,EAAQC,EAAQ2jB,MAC1DruB,EAAOlC,aAAe6wB,EACzB,OAAO3uB,IACNuK,IAIJ8Q,QAAS,SAAiB3J,MACrBhY,EAAI8E,cAAckT,GACrB,OAAOhY,EAAI6I,WAAWhH,OAAOF,KAAKmH,QAAUkP,EAAMlP,SAC9C,GAAI9I,EAAIkE,QAAQ8T,GACpB,OAAOrW,KAAK+yB,KAAK1c,EAAOrW,KAAKmH,eACxB9I,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpD4J,SAAU,SAAkB5J,MACvBhY,EAAIkE,QAAQ8T,GACf,OAAOrW,KAAK+yB,KAAK1c,EAAOrW,KAAKmH,eACxB9I,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpD+J,QAAS,SAAiB/J,MACrBhY,EAAI8E,cAAckT,GACrB,OAAOhY,EAAI6I,WAAWhH,OAAOF,KAAKmH,QAAUkP,EAAMlP,eAC7C9I,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpDgK,SAAU,SAAkBhK,MACvBhY,EAAIkE,QAAQ8T,GACf,OAAOrW,KAAK+yB,KAAK1c,GAAQrW,KAAKmH,eACzB9I,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpDkL,QAAS,SAAiBlL,MACF,iBAAXA,EACX,OAAOhY,EAAI6I,WAAWhH,OAAOF,KAAKmH,QAAUrF,KAAKyO,MAAM8F,UAClDhY,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpDmL,SAAU,SAAkBnL,MACJ,iBAAXA,EACX,OAAOhY,EAAI6I,WAAWhH,OAAOF,KAAKmH,QAAUrF,KAAKyO,MAAM8F,UAClDhY,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpDsL,aAAc,SAAsBtL,MACZ,iBAAXA,EACX,OAAOhY,EAAI6I,WAAWhH,OAAO4B,KAAKyO,MAAMvQ,KAAKmH,QAAUkP,IACnD,GAAIhY,EAAI8E,cAAckT,GAC1B,OAAOvU,KAAKyO,MAAMvQ,KAAKmH,QAAUkP,EAAMlP,eAClC9I,EAAI2K,MAAMhJ,MAAQ,OAAS3B,EAAI2K,MAAMqN,GAAS,kBAGrDyL,YAAa,SAAqBzL,MAC7BhY,EAAI8E,cAAckT,GACrB,OAAOrW,KAAKmH,QAAUkP,EAAMlP,cACvB9I,EAAI2K,MAAMhJ,MAAQ,MAAQ3B,EAAI2K,MAAMqN,GAAS,kBAGpD0B,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,gBACG3Z,EAAI8Y,OAAO,GAAI,kBAA2B5P,EAAKJ,2BAMzD/D,OAAQ,kBACApD,KAAKmH,WAMf9I,EAAI4B,KAAO5B,EAAIkK,SACdlK,EAAI4J,MACJ,CACC4I,SAAU,WAEV3Q,OAAQ,eACHT,EAAMpB,EAAI8C,OAAOnB,aACrBP,EAAI+N,MAAQ,GACZ/N,EAAIU,IAAI+J,MAAMzK,EAAKH,WACZG,GAGRU,IAAK,eACC,IAAId,EAAI,EAAGA,EAAIC,UAAUC,SAAUF,OAClCmO,MAAMlO,UAAUD,KAAM,GAI7B0Y,YAAa,SAAqBC,OAC7BzQ,EAAOvH,YACHgY,OACF,aACG3Z,EAAI8Y,OAAO,CAAC,UAAW,SAAa3J,GAASjG,EAAKpH,IAAI+J,MAAM3C,EAAMiG,sBAM5EqS,aAAc,SAAsBpU,UAC5BzL,KAAKwN,MAAM/B,KAAS,GAG5B0E,SAAU,eACJ,IAAI1E,KAAQzL,KAAKwN,SAChBxN,KAAKwN,MAAMd,eAAejB,UAExB,SAED,GAGRoE,SAAU,eACLL,EAAI,GACRA,EAAE7N,KAAK,SACHtC,EAAI,MACH,IAAIoM,KAAQzL,KAAKwN,MAChBxN,KAAKwN,MAAMd,eAAejB,KAE3BpM,KACHmQ,EAAE7N,KAAK,MACR6N,EAAE7N,KAAKtD,EAAI6G,MAAMuG,YAEbpM,GACJmQ,EAAE7N,KAAK,KACR6N,EAAE7N,KAAK,KACA6N,EAAE5N,KAAK,KAGf0K,OAAQ,SAAU+J,MAGbhY,EAAI0F,OAAOsS,GAAQ,KAClB+M,EAAQ,MACP,IAAI3X,KAAQzL,KAAKwN,MAAO,KACvB6I,EAAM1J,IAAIlB,GACd,OAAO,IAEN2X,SAEI/M,EAAMvX,MAAQskB,EAEjB,GAAI/kB,EAAIgP,UAAUgJ,GAAQ,CAC1B+M,EAAQ,MACP,IAAI3X,KAAQzL,KAAKwN,MAAO,KACvB6I,EAAM5K,GACV,OAAO,IAEN2X,MAGE,IAAI3X,KAAQ4K,EAAM7I,QACpB4V,SACa,GAATA,EAGP,OAAO,GAGTxV,OAAQ,SAAUyI,MAGbhY,EAAI0F,OAAOsS,GAAQ,KAEjB,IAAI5K,KAAQzL,KAAKwN,UAChB6I,EAAM1J,IAAIlB,GACd,OAAO,SAEF,EAEH,GAAIpN,EAAIgP,UAAUgJ,GAAQ,KAEzB,IAAI5K,KAAQzL,KAAKwN,UAChB6I,EAAM7I,MAAM/B,GAChB,OAAO,SAEF,EAGPpN,EAAI0O,aAAa,IAAK/M,KAAMqW,IAG9BrI,OAAQ,SAAUqI,MAGbhY,EAAI0F,OAAOsS,GAAQ,KAClB1R,GAAS,SACb0R,EAAMzX,QAAQ,SAAUiB,GAClBG,KAAKwN,MAAM3N,KACf8E,GAAS,KAEJA,EAEH,GAAItG,EAAIgP,UAAUgJ,GAAQ,KAEzB,IAAI5K,KAAQ4K,EAAM7I,UACjBxN,KAAKwN,MAAM/B,GACf,OAAO,SAEF,EAGPpN,EAAI0O,aAAa,KAAM/M,KAAMqW,MAsFjC,IAjFA,IAAIkd,EAAU,CACb,UACA,YACA,aACA,MACA,WACA,aACA,mBACA,cACA,oBACA,YACA,gBACA,mBACA,mBACA,UACA,cACA,UACA,cACA,SACA,aACA,aACA,SACA,SACA,SACA,YACA,QACA,YACA,WACA,YACA,UACA,QACA,WACA,QACA,QACA,QACA,QACA,QACA,QACA,iBACA,cACA,SACA,SACA,SACA,cACA,aACA,SACA,eACA,gBACA,YACA,YACA,WACA,SACA,QACA,WACA,UACA,UACA,YACA,YACA,YACA,YACA,YACA,gBACA,iBACA,YACA,kBACA,mBACA,eACA,eACA,cACA,cACA,gBACA,WACA,cACA,eACA,aACA,eACA,eACA,eACA,YAGQl0B,EAAI,EAAGA,EAAIk0B,EAAQh0B,SAAUF,EAAG,KACpCgB,EAAOkzB,EAAQl0B,GACfkB,EAAYF,EAC+B,QAA3CE,EAAUuW,OAAOvW,EAAUhB,OAAS,KACvCgB,EAAYA,EAAUuW,OAAO,EAAGvW,EAAUhB,OAAS,IACpDgB,EAAYA,EAAUyV,kBAClB4M,EAASvkB,EAAIgC,GACjBuiB,EAAO9E,SAAWzd,EAClBuiB,EAAO/gB,KAAOtB,EACdjC,EAAM8B,SAAS,sBAAwBG,EAAWqiB,GC5kPtB,mBAAX3kB,QAAyBA,OAAOC,IAChB,gCAAXC,qBAAAA,UAAuBA,OAAOC,YAEjDo1B,EAAK,GAGTA,EAAGC,KAAOp1B,EAAIkK,SACblK,EAAI4J,MACJ,CACC/H,OAAQ,kBACA7B,EAAI8C,OAAOnB,OAGnB0D,UAAW,SAAmBhD,OACxB,IAAIrB,EAAI,EAAGA,EAAIW,KAAKsa,YAAY/a,SAAUF,EAC9CqB,EAAQE,KAAKZ,KAAK0zB,eAAe1zB,KAAKsa,YAAYjb,MAGpDq0B,eAAgB,SAAwBrzB,UAChCL,KAAKK,IAGbgH,UAAW,SAAmBrD,OACxB,IAAI3E,EAAI,EAAGkM,EAAOvH,EAAQsD,iBAAmBjI,EAAG,KAChDs0B,EAAWpoB,EAAK/D,UAChBmsB,EAASlsB,KACZ,MACGpI,EAAIW,KAAKsa,YAAY/a,QACxBS,KAAK4zB,eAAe5zB,KAAKsa,YAAYjb,GAAIs0B,EAAS9zB,YAE7CR,EAAIW,KAAKsa,YAAY/a,SAAUF,OAChCw0B,qBAAqB7zB,KAAKsa,YAAYjb,KAI7Cu0B,eAAgB,SAAwBvzB,EAAMR,QACxCQ,GAAQR,GAGdg0B,qBAAsB,SAA8BxzB,QAC9CA,GAAQ,QAKhBmzB,EAAGM,QAAUz1B,EAAIkK,SAChBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,UAAW,WAAY,OAAQ,eAAgB,qBAAsB,iBAEnFzK,SAAU,iBACF,uBAAyBxR,EAAI6G,MAAMlF,KAAKzB,SAAW,KAI3Dw1B,QAAS,SAAiBC,EAAMC,OAC3BC,EAAQ,SAAelJ,UAAKA,EAAIlpB,KAAKqyB,IAAInJ,IAAeA,GACxDoJ,EAAQ,SAAepJ,UAAKA,EAAIlpB,KAAKuyB,IAAIrJ,IAAeA,GACxDsJ,EAAUxyB,KAAKyyB,GAAK,IAEpBC,EAAO,EAAI,cAEXC,EAAOT,EAAKU,IAAMJ,EAClBK,EAAQX,EAAKY,KAAON,EACpBO,EAAOZ,EAAKS,IAAMJ,EAElBvsB,GAAK0sB,EAAOI,GAAQ,EACpBC,GAAKL,EAAOI,GAAQ,EACpBtI,GAAKoI,EAHGV,EAAKW,KAAON,GAGE,EACtBS,EAAIb,EAAMY,GAAKV,EAAM7H,GAAK6H,EAAMrsB,GAAKmsB,EAAM3H,GAC3CyI,EAAIZ,EAAMU,GAAKV,EAAM7H,GAAK2H,EAAMnsB,GAAKmsB,EAAM3H,GAC3C0I,EAAInzB,KAAKozB,KAAKpzB,KAAKqzB,KAAKJ,EAAIC,IAC5BI,EAAI,EAAIH,EAbC,SAcTI,EAAIvzB,KAAKqzB,KAAKJ,EAAIC,GAAKC,EAEvBK,GAAM,EAAID,EAAI,IAAM,EAAIN,UACpBK,GAAK,EAAIZ,IAFP,EAAIa,EAAI,IAAM,EAAIL,IAECd,EAAMnsB,GAAKqsB,EAAMU,GAAKN,EAAOc,EAAKlB,EAAMrsB,GAAKmsB,EAAMY,OAMnFtB,EAAG+B,aAAel3B,EAAIkK,SACrBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,YAAa,OAAQ,QAAS,WAE5CzK,SAAU,iBACF,yBAA2BxR,EAAI6G,MAAMlF,KAAK6B,MAAQ,UAAYxD,EAAI6G,MAAMlF,KAAKw1B,OAAS,OAKhGhC,EAAGiC,IAAMp3B,EAAIkK,SACZirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,UAAW,OAAQ,cAAe,WAAY,YAAa,YAAa,YAAa,QAAS,WAAY,UAAW,cAAe,eAAgB,aAAc,SAAU,QAAS,6BAEzMob,OAAQ,SAAUtnB,UACVpO,KAAK21B,QAAQC,MAAM3R,QAAQjkB,KAAMoO,IAGzCyB,SAAU,iBACF,cAAgBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,SAAWx3B,EAAI6G,MAAMlF,KAAKK,MAAQ,OAKjFmzB,EAAGsC,KAAOz3B,EAAIkK,SACbirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,OAAQ,MAAO,QAAS,QAAS,SAAU,QAAS,OAExEzK,SAAU,iBACF,eAAiBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,SAAWx3B,EAAI6G,MAAMlF,KAAKK,MAAQ,OAKlFmzB,EAAGuC,WAAa13B,EAAIkK,SACnBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,aAAc,MAAO,QAEzCzK,SAAU,iBACF,qBAAuBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,eAAiBx3B,EAAI6G,MAAMlF,KAAKg2B,YAAc,OAKpGxC,EAAGyC,OAAS53B,EAAIkK,SACfirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,MAAO,YAAa,YAAa,YAAa,YAAa,cAAe,SAAU,cAAe,YAEvH4b,OAAQ,kBACAl2B,KAAKm2B,IAAIR,QAAQC,MAAMQ,QAAQp2B,OAGvCq2B,OAAQ,SAAUjoB,UACVpO,KAAKm2B,IAAIR,QAAQC,MAAMlR,QAAQ1kB,KAAMoO,IAG7CyB,SAAU,iBACF,iBAAmBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,KAGhDS,OAAQ,SAAgBA,OAClB,IAAIN,KAAcM,EAAQ,KAC1BC,EAAcD,EAAON,MACrB33B,EAAI6R,MAAMqmB,KACRv2B,KAAKw2B,OAAO5pB,IAAIopB,GAAYM,OAAOC,GACvC,OAAO,SAGH,GAGR7C,eAAgB,SAAwBrzB,SAC1B,WAATA,EACIL,KAAKy2B,cAELz2B,KAAKK,IAGduzB,eAAgB,SAAwBvzB,EAAMR,GAChC,WAATQ,QACEo2B,cAAgB52B,OAChB4kB,QAAU,UACViS,QAAU,MAGf12B,KAAKK,GAAQR,KAKjB4R,OAAOklB,eAAenD,EAAGyC,OAAQ,SAAU,CAC1CrpB,IAAK,cACiB,OAAjB5M,KAAKykB,QAAkB,MACrBA,QAAUnmB,EAAMG,SAAW,IAAIC,IAAQ,OACxC6I,EAAOvH,UACNm2B,IAAIS,SAASh4B,QAAQ,SAAUi4B,EAAShB,OACxCiB,EAAavvB,EAAKkvB,cAAc7pB,IAAIiqB,EAAQb,iBACpB,IAAhBc,IACXA,EAAa,MACdvvB,EAAKkd,QAAQhlB,IAAIo2B,EAAIiB,YAGhB92B,KAAKykB,WAIdhT,OAAOklB,eAAenD,EAAGyC,OAAQ,SAAU,CAC1CrpB,IAAK,cACiB,OAAjB5M,KAAK02B,QAAkB,MACrBA,QAAUp4B,EAAMG,SAAW,IAAIC,IAAQ,OACxC6I,EAAOvH,UACNoO,OAAOxP,QAAQ,SAAUiB,EAAOg2B,OAChCkB,EAAQvD,EAAGwD,MAAM92B,OAAOqH,EAAK4uB,IAAIS,SAAShqB,IAAIipB,GAAKtuB,EAAK4uB,IAAKt2B,GACjE0H,EAAKmvB,QAAQj3B,IAAIo2B,EAAIkB,YAGhB/2B,KAAK02B,WAIdlD,EAAGyD,QAAU54B,EAAIkK,SAChBirB,EAAGC,KACH,CACC5xB,KAAM,KACNq1B,QAAS,KACT5c,YAAa,CAAC,KAAM,aAAc,QAAS,MAAO,QAAS,WAAY,QAAS,UAAW,oBAAqB,qBAEhHzK,SAAU,iBACF,OAAS7P,KAAK6Q,SAAW,OAASxS,EAAI6G,MAAMlF,KAAK61B,IAAM,eAAiBx3B,EAAI6G,MAAMlF,KAAKg2B,YAAc,KAG7GhH,OAAQ,SAAUnvB,UACVA,GAGRs3B,WAAY,SAAoBt3B,EAAOy2B,KAQvCA,OAAQ,SAAgBz2B,EAAOy2B,UACvB,KAKV9C,EAAG4D,YAAc/4B,EAAIkK,SACpBirB,EAAGyD,QACH,CACCp1B,KAAM,OACNgP,SAAU,cAGVylB,OAAQ,SAAgBz2B,EAAOy2B,eACzBa,WAAWt3B,EAAOy2B,GACC,WAApBA,EAAOtpB,UACHspB,EAAOz2B,QAAUA,KAO5B2zB,EAAG6D,WAAah5B,EAAIkK,SACnBirB,EAAGyD,QACH,CACCp1B,KAAM,MACNgP,SAAU,aAGVylB,OAAQ,SAAgBz2B,EAAOy2B,eACzBa,WAAWt3B,EAAOy2B,GACC,WAApBA,EAAOtpB,UACHspB,EAAOz2B,QAAUA,KAO5B2zB,EAAG8D,cAAgBj5B,EAAIkK,SACtBirB,EAAGyD,QACH,CACCp1B,KAAM,SACNgP,SAAU,gBAGVylB,OAAQ,SAAgBz2B,EAAOy2B,eACzBa,WAAWt3B,EAAOy2B,GACC,WAApBA,EAAOtpB,SACHspB,EAAOz2B,QAAUA,EACI,UAApBy2B,EAAOtpB,WACD,OAAVnN,KAEwB,OAApBy2B,EAAOiB,UAAqBjB,EAAOiB,UAAY13B,KAA+B,OAApBy2B,EAAOkB,UAAqB33B,EAAQy2B,EAAOkB,eAQjHhE,EAAGiE,cAAgBp5B,EAAIkK,SACtBirB,EAAGyD,QACH,CACCp1B,KAAM,SAENmtB,OAAQ,SAAUnvB,UACVA,GAGRy2B,OAAQ,SAAgBz2B,EAAOy2B,eACzBa,WAAWt3B,EAAOy2B,GACC,WAApBA,EAAOtpB,SACHspB,EAAOz2B,QAAUA,EACI,aAApBy2B,EAAOtpB,SACM,OAAjBspB,EAAOz2B,OAA4B,OAAVA,EACrBy2B,EAAOz2B,QAAUA,EAE0C,GAA3DA,EAAMmW,cAAczJ,QAAQ+pB,EAAOz2B,MAAMmW,oBAJ7C,KAURwd,EAAGkE,YAAcr5B,EAAIkK,SACpBirB,EAAGiE,cACH,CACCP,QAAS,OACTrmB,SAAU,gBAIZ2iB,EAAGmE,aAAet5B,EAAIkK,SACrBirB,EAAGiE,cACH,CACCP,QAAS,QACTrmB,SAAU,iBAIZ2iB,EAAGoE,WAAav5B,EAAIkK,SACnBirB,EAAGiE,cACH,CACCP,QAAS,MACTrmB,SAAU,eAIZ2iB,EAAGqE,WAAax5B,EAAIkK,SACnBirB,EAAGiE,cACH,CACCP,QAAS,QAIX1D,EAAGsE,gBAAkBz5B,EAAIkK,SACxBirB,EAAGiE,cACH,CACCP,QAAS,aAIX1D,EAAGuE,gBAAkB15B,EAAIkK,SACxBirB,EAAGiE,cACH,CACCP,QAAS,WACTrmB,SAAU,oBAIZ2iB,EAAGwE,YAAc35B,EAAIkK,SACpBirB,EAAGyD,QACH,CACCp1B,KAAM,OACNq1B,QAAS,OACTrmB,SAAU,cAEVme,OAAQ,SAAUnvB,UACbA,aAAiByG,OACpBzG,YAAWA,EAAM2C,0BAAiB3C,EAAM4C,WAAa,cAAK5C,EAAM6C,sBAAa7C,EAAM8C,uBAAc9C,EAAM+C,yBAAgB/C,EAAMgD,eAEvHhD,GAGRo4B,aAAc,SAAsBC,SAGlB,QAFjBA,EAAWA,GAAYl4B,KAAKm2B,IAAI+B,UAGxB,WAEA,YAIT5B,OAAQ,SAAgBz2B,EAAOy2B,QACzBa,WAAWt3B,EAAOy2B,OAEnB6B,EAAc7B,EAAOz2B,YAC0B,iBAA/C4R,OAAO9S,UAAUuK,SAASwI,KAAKymB,KAClCA,EAAc95B,EAAIyW,QAAQqjB,EAAan4B,KAAKi4B,eAAgBj4B,KAAKm2B,IAAI+B,WACxD,OAAVr4B,IACHA,EAAQxB,EAAIyW,QAAQjV,EAAOG,KAAKi4B,eAAgBj4B,KAAKm2B,IAAI+B,WAElC,WAApB5B,EAAOtpB,SACHmrB,IAAgBt4B,EACK,aAApBy2B,EAAOtpB,WACK,OAAhBmrB,GAAkC,OAAVt4B,EACpBs4B,IAAgBt4B,EAE0C,GAA1DA,EAAMmW,cAAczJ,QAAQ4rB,EAAYniB,mBAQpDwd,EAAG4E,sBAAwB/5B,EAAIkK,SAC9BirB,EAAGwE,YACH,CACCd,QAAS,iBACTrmB,SAAU,wBAEVonB,aAAc,SAAsBC,SAGlB,QAFjBA,EAAWA,GAAYl4B,KAAKm2B,IAAI+B,UAGxB,iBAEA,oBAKX1E,EAAG6E,sBAAwBh6B,EAAIkK,SAC9BirB,EAAGwE,YACH,CACCd,QAAS,iBACTrmB,SAAU,uBAEVonB,aAAc,SAAsBC,SAGlB,QAFjBA,EAAWA,GAAYl4B,KAAKm2B,IAAI+B,UAGxB,oBAEA,uBAKX1E,EAAG8E,cAAgBj6B,EAAIkK,SACtBirB,EAAGyD,QACH,CACCp1B,KAAM,SACNyY,YAAakZ,EAAGyD,QAAQ3c,YAAY3O,OAAO,CAAC,eAI5C2qB,OAAQ,SAAgBz2B,EAAOy2B,UACP,OAAnBt2B,KAAKu4B,UACgB,WAApBjC,EAAOtpB,WACI,OAAVnN,EACqB,OAAjBy2B,EAAOz2B,MAEPA,EAAMD,MAAQ02B,EAAOz2B,OAMhB,OAAVA,GAAmC,OAAjBy2B,EAAOz2B,MACrBA,IAAUy2B,EAAOz2B,MAEjBA,EAAMy2B,OAAOA,MAMzB9C,EAAGgF,oBAAsBn6B,EAAIkK,SAC5BirB,EAAG8E,cACH,CACCpB,QAAS,SACTrmB,SAAU,wBAIZ2iB,EAAGiF,mBAAqBp6B,EAAIkK,SAC3BirB,EAAG8E,cACH,CACCpB,QAAS,QACTrmB,SAAU,uBAIZ2iB,EAAGkF,oBAAsBr6B,EAAIkK,SAC5BirB,EAAG8E,cACH,CACCpB,QAAS,SACTrmB,SAAU,wBAIZ2iB,EAAGmF,iBAAmBt6B,EAAIkK,SACzBirB,EAAGyD,QACH,CACCp1B,KAAM,YACNyY,YAAakZ,EAAGyD,QAAQ3c,YAAY3O,OAAO,CAAC,YAAa,mBAGzD2qB,OAAQ,SAAgBz2B,EAAOy2B,UAChB,OAAVz2B,GAAmC,OAAjBy2B,EAAOz2B,MACrBA,IAAUy2B,EAAOz2B,MAEjBA,EAAMy2B,OAAOA,MAKxB9C,EAAGoF,uBAAyBv6B,EAAIkK,SAC/BirB,EAAGmF,iBACH,CACCzB,QAAS,SACTrmB,SAAU,2BAIZ2iB,EAAGqF,sBAAwBx6B,EAAIkK,SAC9BirB,EAAGmF,iBACH,CACCzB,QAAS,QACTrmB,SAAU,0BAIZ2iB,EAAGsF,uBAAyBz6B,EAAIkK,SAC/BirB,EAAGmF,iBACH,CACCzB,QAAS,SACTrmB,SAAU,2BAIZ2iB,EAAGuF,sBAAwB16B,EAAIkK,SAC9BirB,EAAG8E,cACH,CACCz2B,KAAM,iBAINy0B,OAAQ,SAAgBz2B,EAAOy2B,MACN,WAApBA,EAAOtpB,SAqBV,OAAO,KApBgB,OAAnBhN,KAAKu4B,UAAoB,KACvB,IAAIl5B,EAAI,EAAGA,EAAIQ,EAAMN,SAAUF,KAC/BQ,EAAMR,GAAGO,MAAQ02B,EAAOz2B,MAC3B,OAAO,SAEF,KAGc,OAAjBy2B,EAAOz2B,MACV,OAAwB,IAAjBA,EAAMN,WAEJF,EAAI,EAAGA,EAAIQ,EAAMN,SAAUF,KAC/BQ,EAAMR,GAAGi3B,OAAOA,EAAOz2B,OAC1B,OAAO,SAEF,KAUb2zB,EAAGwF,4BAA8B36B,EAAIkK,SACpCirB,EAAGuF,sBACH,CACC7B,QAAS,SACTrmB,SAAU,gCAIZ2iB,EAAGyF,8BAAgC56B,EAAIkK,SACtCirB,EAAGuF,sBACH,CACC7B,QAAS,WACTrmB,SAAU,kCAIZ2iB,EAAG0F,yBAA2B76B,EAAIkK,SACjCirB,EAAGmF,iBACH,CACC92B,KAAM,oBAGNy0B,OAAQ,SAAgBz2B,EAAOy2B,MACN,WAApBA,EAAOtpB,SAYV,OAAO,KAXc,OAAjBspB,EAAOz2B,MACV,OAAwB,IAAjBA,EAAMN,WAER,IAAIF,EAAI,EAAGA,EAAIQ,EAAMN,SAAUF,KAC/BQ,EAAMR,GAAGi3B,OAAOA,EAAOz2B,OAC1B,OAAO,SAEF,KASZ2zB,EAAG2F,+BAAiC96B,EAAIkK,SACvCirB,EAAG0F,yBACH,CACChC,QAAS,SACTrmB,SAAU,mCAIZ2iB,EAAG4F,iCAAmC/6B,EAAIkK,SACzCirB,EAAG0F,yBACH,CACChC,QAAS,WACTrmB,SAAU,qCAIZ2iB,EAAG6F,WAAah7B,EAAIkK,SACnBirB,EAAGyD,QACH,CACCp1B,KAAM,MAGNmtB,OAAQ,SAAUnvB,UACb2zB,EAAG8F,IAAIljB,UAAUvW,KACpBA,YAAWA,EAAM60B,iBAAQ70B,EAAM+0B,kBAAS/0B,EAAM05B,OACxC15B,GAGRgR,SAAU,eAIZ2iB,EAAGgG,YAAcn7B,EAAIkK,SACpBirB,EAAGyD,QACH,CACCp1B,KAAM,OACNgP,SAAU,gBAIZ2iB,EAAGiG,cAAgBp7B,EAAIkK,SACtBirB,EAAGyD,QACH,CACCp1B,KAAM,SACNgP,SAAU,kBAIZ2iB,EAAGwD,MAAQ34B,EAAIkK,SACdirB,EAAGC,KACH,CACCvzB,OAAQ,SAAgB22B,EAAS6C,EAAQ75B,OACpCk3B,EAAQvD,EAAGC,KAAKvzB,OAAOwR,KAAK1R,aAChC+2B,EAAMF,QAAUA,EAChBE,EAAM2C,OAASA,EACf3C,EAAMl3B,MAAQA,EACPk3B,GAGRT,OAAQ,SAAgB6B,UAChBn4B,KAAK62B,QAAQP,OAAOt2B,KAAKH,MAAOs4B,IAGxCtoB,SAAU,iBACF,gBAKV2jB,EAAGmG,WAAat7B,EAAIkK,SACnBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,MAAO,SAErBzK,SAAU,iBACF,sBAAwBxR,EAAI6G,MAAMlF,KAAKJ,KAAO,UAAYvB,EAAI6G,MAAMlF,KAAK45B,OAAS,OAK5FpG,EAAGqG,KAAOx7B,EAAIkK,SACbirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,MAAO,KAAM,SAAU,YAAa,UAAW,WAAY,QAAS,WAAY,cAAe,cAAe,YAE5HzK,SAAU,iBACF,eAAiBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,cAAgBx3B,EAAI6G,MAAMlF,KAAK85B,WAAa,aAAez7B,EAAI6G,MAAMlF,KAAK+5B,UAAY,UAAY17B,EAAI6G,MAAMlF,KAAKg6B,OAAS,OAK1KxG,EAAGyG,KAAO57B,EAAIkK,SACbirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,MAAO,WAAY,WAAY,QAAS,UAE5DzK,SAAU,iBACF,eAAiBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,QAAUx3B,EAAI6G,MAAMlF,KAAKk6B,KAAO,aAAe77B,EAAI6G,MAAMlF,KAAKm6B,UAAY,OAK1H3G,EAAG8F,IAAMj7B,EAAIkK,SACZirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,MAAO,OAAQ,QAE7BzK,SAAU,iBACF,eAAiBxR,EAAI6G,MAAMlF,KAAK00B,KAAO,SAAWr2B,EAAI6G,MAAMlF,KAAK40B,MAAQ,SAAWv2B,EAAI6G,MAAMlF,KAAKu5B,MAAQ,OAKrH/F,EAAG4G,WAAa/7B,EAAIkK,SACnBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,SAAU,QAAS,UAEvCzK,SAAU,iBACF,OAAS7P,KAAK6Q,SAAW,OAASxS,EAAI6G,MAAMlF,KAAK61B,IAAM,UAAYx3B,EAAI6G,MAAMlF,KAAK45B,OAAS,OAKrGpG,EAAG6G,eAAiBh8B,EAAIkK,SACvBirB,EAAG4G,WACH,CACCv4B,KAAM,iBACNgP,SAAU,iBACVyJ,YAAakZ,EAAG4G,WAAW9f,YAAY3O,OAAO,CAAC,YAIjD6nB,EAAG8G,cAAgBj8B,EAAIkK,SACtBirB,EAAG4G,WACH,CACCv4B,KAAM,gBACNgP,SAAU,gBACVyJ,YAAakZ,EAAG4G,WAAW9f,YAAY3O,OAAO,CAAC,YAIjD6nB,EAAG+G,eAAiBl8B,EAAIkK,SACvBirB,EAAG4G,WACH,CACCv4B,KAAM,iBACNgP,SAAU,iBACVyJ,YAAakZ,EAAG4G,WAAW9f,YAAY3O,OAAO,CAAC,YAIjD6nB,EAAGgH,gBAAkBn8B,EAAIkK,SACxBirB,EAAG4G,WACH,CACCv4B,KAAM,kBACNgP,SAAU,kBACVyJ,YAAakZ,EAAG4G,WAAW9f,YAAY3O,OAAO,CAAC,WAAY,QAAS,QAAS,SAAU,YAIzF6nB,EAAGiH,eAAiBp8B,EAAIkK,SACvBirB,EAAG4G,WACH,CACCv4B,KAAM,iBACNgP,SAAU,iBACVyJ,YAAakZ,EAAG4G,WAAW9f,YAAY3O,OAAO,CAAC,UAC/C+nB,eAAgB,SAAwBrzB,SAC1B,UAATA,EACIhC,EAAI6T,QAAQlS,KAAKH,OAEjBG,KAAKK,IAGduzB,eAAgB,SAAwBvzB,EAAMR,GAChC,UAATQ,EACHL,KAAKH,MAAQxB,EAAI8T,UAAUtS,GAE3BG,KAAKK,GAAQR,KAKjB2zB,EAAGkH,aAAer8B,EAAIkK,SACrBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,QAEpBzK,SAAU,iBACF,uBAAyBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,SAAWx3B,EAAI6G,MAAMlF,KAAKK,MAAQ,OAK1FmzB,EAAGmH,SAAWt8B,EAAIkK,SACjBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,aAAc,OAAQ,QAAS,SAAU,WAAY,QAEzEzK,SAAU,mBACLL,EAAI,GACJorB,EAAW56B,KACK,OAAb46B,GACNprB,EAAE0P,OAAO,EAAG,EAAG0b,EAAS5E,YACxB4E,EAAWA,EAASC,aAEd,mBAAqBx8B,EAAI6G,MAAMlF,KAAK61B,IAAM,mBAAqBx3B,EAAI6G,MAAMsK,EAAE5N,KAAK,MAAQ,IAAavD,EAAI6G,MAAMlF,KAAKK,MAAQ,OAKtImzB,EAAGsH,QAAUz8B,EAAIkK,SAChBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,aAAc,OAAQ,MAAO,QAEjDzK,SAAU,iBACF,kBAAoBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,eAAiBx3B,EAAI6G,MAAMlF,KAAKg2B,YAAc,OAKjGxC,EAAGuH,aAAe18B,EAAIkK,SACrBirB,EAAGC,KACH,CACCnZ,YAAa,CAAC,KAAM,MAAO,aAAc,cAAe,SAExDzK,SAAU,iBACF,uBAAyBxR,EAAI6G,MAAMlF,KAAK61B,IAAM,eAAiBx3B,EAAI6G,MAAMlF,KAAKg2B,YAAc,OAwDtG,IAnDA,IAAIzC,EAAU,CACb,UACA,MACA,OACA,aACA,SACA,cACA,aACA,gBACA,cACA,eACA,aACA,aACA,kBACA,kBACA,cACA,wBACA,wBACA,gBACA,sBACA,qBACA,sBACA,mBACA,yBACA,wBACA,yBACA,wBACA,8BACA,gCACA,2BACA,iCACA,mCACA,aACA,cACA,gBACA,QACA,aACA,OACA,OACA,MACA,iBACA,gBACA,iBACA,kBACA,iBACA,eACA,WACA,UACA,gBAGQl0B,EAAI,EAAGA,EAAIk0B,EAAQh0B,SAAUF,EAAG,KACpCgB,EAAOkzB,EAAQl0B,GACfujB,EAAS4Q,EAAGnzB,GAChB/B,EAAM8B,SAAS,uBAAyBC,EAAK2V,cAAe4M,kYC50BpC,6CAMjBsX,6OAKCl6B,cAAmBk6B,UAAU,oHAGpBtoB,uMAYWopB,2BAEjBh7B,KAAKi7B,yCACRf,EAAK,kCAETl6B,iBAEJk7B,kFAOW,gGAODC,0KAGHC,cAA4BC,qLAYxBz6B,0HAWPg2B,sBACD,yEAKUT,WAAavpB,OAAmCoiB,mBAEpD,4KAQF,oDAGQsM,mEAMXluB,OAASyoB,qCAERA,4EAIG,qEASH0F,kDAIGC,wCAEA5pB,gFAIF,2NAMH7Q"} \ No newline at end of file diff --git a/dist/umd/modules/livingapi.d.ts b/dist/umd/modules/livingapi.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/umd/modules/livingapi.js b/dist/umd/modules/livingapi.js deleted file mode 100644 index 844e68a..0000000 --- a/dist/umd/modules/livingapi.js +++ /dev/null @@ -1,990 +0,0 @@ -(function(root){ - - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - let la = {}; - - let ul4, ul4on; - - if (commonjs) { - ul4 = require('./ul4.js').ul4; - ul4on = require('./ul4').ul4on; - module.exports = la; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - root.livingapi = la; - } - la.Base = ul4._inherit( - ul4.Proto, - { - create: function() - { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - return this[name]; - }, - - ul4onload: function ul4onload(decoder) - { - for (var i = 0, iter = decoder.loadcontent();; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - if (i < this._ul4onattrs.length) - this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); - } - for (; i < this._ul4onattrs.length; ++i) - { - this._setDefaultUL4ONAttr(this._ul4onattrs[i]); - } - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - this[name] = value; - }, - - _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) - { - this[name] = null; - } - } - ); - - la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() - { - return ""; - }, - - // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) - geodist: function geodist(geo1, geo2) - { - var sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; - var sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; - var deg2rad = Math.PI/180; // Conversion factor degree -> radians - var radius = 6378.137; // Equatorial radius of earth in km - var flat = 1/298.257223563; // Earth flattening - - var lat1 = geo1.lat * deg2rad; - var long1 = geo1.long * deg2rad; - var lat2 = geo2.lat * deg2rad; - var long2 = geo2.long * deg2rad; - var F = (lat1 + lat2)/2; - var G = (lat1 - lat2)/2; - var l = (long1 - long2)/2; - var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); - var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); - var w = Math.atan(Math.sqrt(S/C)); - var D = 2 * w * radius; - var T = Math.sqrt(S*C)/w; - var H1 = (3*T-1)/(2*C); - var H2 = (3*T+1)/(2*S); - var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); - return s; - } - } - ); - - la.FlashMessage = ul4._inherit( - la.Base, - { - _ul4onattrs: ["timestamp", "type", "title", "message"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.App = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], - - insert: function (values) - { - return this.globals.Login._insert(this, values); - }, - - __repr__: function repr() - { - return ""; - } - } - ); - - la.View = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.DataSource = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "app", "apps"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.Record = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], - - delete: function () - { - return this.app.globals.Login._delete(this); - }, - - update: function (values) - { - return this.app.globals.Login._update(this, values); - }, - - __repr__: function repr() - { - return ""; - }, - - search: function search(search) - { - for (var identifier in search) - { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) - { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } - } - return true; - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "values") - return this._sparsevalues; - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "values") - { - this._sparsevalues = value; - this._values = null; - this._fields = null; - } - else - this[name] = value; - } - } - ); - - Object.defineProperty(la.Record, "values", { - get: function() - { - if (this._values === null) - { - this._values = ul4on._havemap ? new Map() : {}; - var self = this; - this.app.controls.forEach(function(control, id){ - var fieldvalue = self._sparsevalues.get(control.identifier); - if (typeof(fieldvalue) === "undefined") - fieldvalue = null; - self._values.set(id, fieldvalue); - }); - } - return this._values; - } - }); - - Object.defineProperty(la.Record, "fields", { - get: function() - { - if (this._fields === null) - { - this._fields = ul4on._havemap ? new Map() : {}; - var self = this; - this.values.forEach(function(value, id){ - var field = la.Field.create(self.app.controls.get(id), self.app, value); - self._fields.set(id, field); - }); - } - return this._fields; - } - }); - - la.Control = ul4._inherit( - la.Base, - { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], - - __repr__: function repr() - { - return ""; - }, - - asjson: function(value) - { - return value; - }, - - _logsearch: function _logsearch(value, search) - { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, - - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) - { - return false; - } - } - ); - - la.BoolControl = ul4._inherit( - la.Control, - { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } - } - ); - - la.IntControl = ul4._inherit( - la.Control, - { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } - } - ); - - la.NumberControl = ul4._inherit( - la.Control, - { - type: "number", - __type__: "NumberControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "range") - { - if (value === null) - return false; - return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); - } - else - return false; - } - } - ); - - la.StringControl = ul4._inherit( - la.Control, - { - type: "string", - - asjson: function (value) - { - return value; - }, - - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") - { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; - } - } - } - ); - - la.TextControl = ul4._inherit( - la.StringControl, - { - subtype: "text", - __type__: "TextControl" - } - ); - - la.EmailControl = ul4._inherit( - la.StringControl, - { - subtype: "email", - __type__: "EmailControl" - } - ); - - la.URLControl = ul4._inherit( - la.StringControl, - { - subtype: "url", - __type__: "URLControl" - } - ); - - la.TelControl = ul4._inherit( - la.StringControl, - { - subtype: "tel" - } - ); - - la.PasswordControl = ul4._inherit( - la.StringControl, - { - subtype: "password" - } - ); - - la.TextAreaControl = ul4._inherit( - la.StringControl, - { - subtype: "textarea", - __type__: "TextAreaControl" - } - ); - - la.DateControl = ul4._inherit( - la.Control, - { - type: "date", - subtype: "date", - __type__: "DateControl", - - asjson: function (value) - { - if (value instanceof Date){ - value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, - - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) - { - this._logsearch(value, search); - - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); - - if (search.operator === "equals") - return searchvalue === value; - else if (search.operator === "contains") - { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } - else - return false; - } - } - ); - - la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M"; - else - return "%m/%d/%Y %H:%M"; - } - } - ); - - la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } - } - ); - - la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), - - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (this.lookupapp === null) - { - if (search.operator === "equals") - { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } - else - return false; - } - else - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } - } - ); - - la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } - ); - - la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } - ); - - la.LookupChoiceControl = ul4._inherit( - la.LookupControl, - { - subtype: "choice", - __type__: "LookupChoiceControl" - } - ); - - la.AppLookupControl = ul4._inherit( - la.Control, - { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } - ); - - la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } - ); - - la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "radio", - __type__: "AppLookupRadioControl" - } - ); - - la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "choice", - __type__: "AppLookupChoiceControl" - } - ); - - la.MultipleLookupControl = ul4._inherit( - la.LookupControl, - { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (this.lookupapp === null) - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].key === search.value) - return true; - } - return false; - } - else - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - } - else - return false; - } - } - ); - - la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "select", - __type__: "MultipleLookupSelectControl" - } - ); - - la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" - } - ); - - la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, - { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - else - return false; - } - } - ); - - la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } - ); - - la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } - ); - - la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", - - - asjson: function(value) - { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - }, - - __type__: "GeoControl" - } - ); - - la.FileControl = ul4._inherit( - la.Control, - { - type: "file", - __type__: "FileControl" - } - ); - - la.ButtonControl = ul4._inherit( - la.Control, - { - type: "button", - __type__: "ButtonControl" - } - ); - - la.Field = ul4._inherit( - la.Base, - { - create: function create(control, record, value) - { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, - - search: function search(searchvalue) - { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() - { - return ""; - } - } - ); - - la.LookupItem = ul4._inherit( - la.Base, - { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.User = ul4._inherit( - la.Base, - { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.File = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.Geo = ul4._inherit( - la.Base, - { - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.Attachment = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.NoteAttachment = ul4._inherit( - la.Attachment, - { - type: "noteattachment", - __type__: "NoteAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.URLAttachment = ul4._inherit( - la.Attachment, - { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.FileAttachment = ul4._inherit( - la.Attachment, - { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.ImageAttachment = ul4._inherit( - la.Attachment, - { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) - } - ); - - la.JSONAttachment = ul4._inherit( - la.Attachment, - { - type: "jsonattachment", - __type__: "JSONAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "value") - return ul4._asjson(this.value); - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "value") - this.value = ul4._fromjson(value); - else - this[name] = value - } - } - ); - - la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.Category = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], - - __repr__: function repr() - { - var v = []; - var category = this; - while (category !== null) - { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } - } - ); - - la.KeyView = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], - - __repr__: function repr() - { - return ""; - } - } - ); - - la.AppParameter = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], - - __repr__: function repr() - { - return ""; - } - } - ); - - var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "AppLookupControl", - "AppLookupSelectControl", - "AppLookupRadioControl", - "AppLookupChoiceControl", - "MultipleLookupControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "MultipleAppLookupControl", - "MultipleAppLookupSelectControl", - "MultipleAppLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); - } - - })(this); \ No newline at end of file diff --git a/dist/umd/modules/ul4.js b/dist/umd/modules/ul4.js deleted file mode 100644 index cad6ec8..0000000 --- a/dist/umd/modules/ul4.js +++ /dev/null @@ -1,8804 +0,0 @@ -/*! - * UL4/UL4ON JavaScript Library - * http://www.livinglogic.de/Python/ul4c/ - * http://www.livinglogic.de/Python/ul4on/ - * - * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany - * Copyright 2011-2017 by Walter Dörwald - * - * All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/*jslint vars: true */ - -(function(undefined){ - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - var root = this, ul4 = {}, ul4on = {}; - - root.ul4 = ul4; - - root.ul4on = ul4on; - - - if (commonjs) { - module.exports.ul4 = ul4; - module.exports.ul4on = ul4on; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - } - - ul4.version = "41"; - - // - // UL4ON - // - - ul4on._registry = {}; - - ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); - - ul4on._havemapconstructor = false; - - if (ul4on._havemap) - { - try - { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) - { - } - } - - ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); - - ul4on._havesetconstructor = false; - - if (ul4on._haveset) - { - try - { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) - { - } - } - - // Function used for making maps, when the Map constructor doesn't work - ul4on._makemap = function _makemap() - { - var map = new Map(); - - for (var i = 0; i < arguments.length; ++i) - { - var argument = arguments[i]; - map.set(argument[0], argument[1]); - } - return map; - }; - - // Function that creates en empty Map (if supported) or an empty object - ul4on._emptymap = function _emptymap() - { - return ul4on._havemap ? new Map() : {}; - }; - - // Function that adds a (key, value) item to an object (or map) - if (ul4on._havemap) - { - ul4on._setmap = function _setmap(map, key, value) - { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else - map[key] = value; - }; - } - else - { - ul4on._setmap = function _setmap(map, key, value) - { - map[key] = value; - }; - } - - // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) - if (ul4on._haveset) - { - ul4on._makeset = function _makeset() - { - var set = this._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - else - { - ul4on._makeset = function _makeset() - { - var set = ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - - // Register the object ``obj`` under the name ``name`` with the UL4ON machinery - ul4on.register = function register(name, obj) - { - obj.ul4onname = name; - ul4on._registry[name] = function(){return obj.create();}; - }, - - // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) - { - var encoder = ul4on.Encoder.create(indent); - encoder.dump(obj); - return encoder.finish(); - }, - - // Load an object from the string ``data``. - // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) - { - var decoder = ul4on.Decoder.create(data, registry); - return decoder.load(); - }, - - // Helper "class" for encoding - ul4on.Encoder = { - // Create a new Encoder object - create: function create(indent) - { - var encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line) - { - var i, oldindent; - - if (this.indent !== null) - { - for (i = 0; i < this._level; ++i) - this.data.push(this.indent); - } - else - { - if (this.data.length) - this.data.push(" "); - } - this.data.push(line); - - if (arguments.length > 1) - { - oldindent = this.indent; - this.indent = null; - for (i = 1; i < arguments.length; ++i) - this.dump(arguments[i]); - this.indent = oldindent; - } - - if (this.indent !== null) - this.data.push("\n"); - }, - - // Return the complete string written to the buffer - finish: function finish() - { - return this.data.join(""); - }, - - dump: function dump(obj) - { - if (obj === null) - this._line("n"); - else if (typeof(obj) == "boolean") - this._line(obj ? "bT" : "bF"); - else if (typeof(obj) == "number") - { - var type = (Math.round(obj) == obj) ? "i" : "f"; - this._line(type + obj); - } - else if (typeof(obj) == "string") - { - var index = this._strings2index[obj]; - if (typeof(index) !== "undefined") - { - this._line("^" + index); - } - else - { - this._strings2index[obj] = this._backrefs++; - this._line("S" + ul4._str_repr(obj)); - } - } - else if (ul4._iscolor(obj)) - this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); - else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); - else if (ul4._istimedelta(obj)) - this._line("t", obj.days(), obj.seconds(), obj.microseconds()); - else if (ul4._ismonthdelta(obj)) - this._line("m", obj.months()); - else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) - this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) - { - if (obj.__id__) - { - var index = this._ids2index[obj.__id__]; - if (typeof(index) != "undefined") - { - this._line("^" + index); - return; - } - } - if (obj.__id__) - this._ids2index[obj.__id__] = this._backrefs++; - this._line("O", obj.ul4onname); - ++this._level; - obj.ul4ondump(this); - --this._level; - this._line(")"); - } - else if (ul4._islist(obj)) - { - this._line("l"); - ++this._level; - for (var i in obj) - this.dump(obj[i]); - --this._level; - this._line("]"); - } - else if (ul4._ismap(obj)) - { - this._line("e"); - ++this._level; - obj.forEach(function(value, key) { - this.dump(key); - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else if (ul4._isdict(obj)) - { - this._line("d"); - ++this._level; - for (var key in obj) - { - this.dump(key); - this.dump(obj[key]); - } - --this._level; - this._line("}"); - } - else if (ul4._isset(obj)) - { - this._line("y"); - ++this._level; - obj.forEach(function(value) { - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else - throw "can't handle object"; - } - }; - - // Helper "class" for decoding - ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) - { - var decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof(registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, - - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() - { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, - - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() - { - var re_white = /\s/; - - for (;;) - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - var c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; - } - }, - - // Read ``size`` characters from the buffer - read: function read(size) - { - if (this.pos+size > this.length) - size = this.length-this.pos; - var result = this.data.substring(this.pos, this.pos+size); - this.pos += size; - return result; - }, - - // "unread" one character - backup: function backup() - { - --this.pos; - }, - - // Read a number from the buffer - readnumber: function readnumber() - { - var re_digits = /[-+0123456789.eE]/, value = ""; - for (;;) - { - var c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else - { - var result = parseFloat(value); - if (result == NaN) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; - } - } - }, - - _beginfakeloading: function _beginfakeloading() - { - var oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, - - _endfakeloading: function _endfakeloading(oldpos, value) - { - this.backrefs[oldpos] = value; - }, - - _readescape: function _readescape(escapechar, length) - { - var chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - var codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, - - // Load the next object from the buffer - load: function load() - { - var typecode = this.readblackchar(); - var result; - switch (typecode) - { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - var delimiter = this.readblackchar(); - for (;;) - { - var c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") - { - var c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); - else - result.push("\\" + c2); - } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load()/1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - var key = this.load(); - var value = this.load(); - ul4on._setmap(result, key, value); - } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - var oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - var name = this.load(); - var proto; - if (this.registry !== null) - { - proto = this.registry[name]; - if (typeof(proto) === "undefined") - proto = ul4on._registry[name]; - } - else - proto = ul4on._registry[name]; - if (typeof(proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; - } - }, - - // Return an iterator for loading the content of a object - loadcontent: function load(loadcontent) - { - let self = this; - return { - next: function() - { - let typecode = self.readblackchar(); - self.backup(); - if (typecode == ")") - return {done: true}; - else - return {done: false, value: self.load()}; - } - }; - } - }; - - - // - // UL4 - // - - // REs for parsing JSON - ul4._rvalidchars = /^[\],:{}\s]*$/; - ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - - /// Helper functions - - // Crockford style object creation - ul4._simpleclone = function _simpleclone(obj) - { - function F(){}; - F.prototype = obj; - var result = new F(); - return result; - }; - - // Crockford style object creation + prototype chain + object ids - ul4._clone = function _clone(obj) - { - var result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; - }; - - // Adds attributes from on object to another and returns it - ul4._extend = function _extend(obj, attrs) - { - for (var name in attrs) - obj[name] = attrs[name]; - return obj; - }; - - // Clone an object via ``_simpleclone`` and extend it - ul4._simpleinherit = function _simpleinherit(baseobj, attrs) - { - return ul4._extend(ul4._simpleclone(baseobj), attrs); - }; - - // Clone an object via ``_clone`` and extend it - ul4._inherit = function _inherit(baseobj, attrs) - { - return ul4._extend(ul4._clone(baseobj), attrs); - }; - - // Convert a map to an object - ul4._map2object = function _map2object(obj) - { - if (ul4._ismap(obj)) - { - var newobj = {}; - obj.forEach(function(value, key){ - if (typeof(key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; - }; - - // Clip a number to the range [0;max) - ul4._bound = function _bound(value, upper) - { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; - }; - - // Create a pretty stacktrace from an exception - ul4._stacktrace = function _stacktrace(exc) - { - var output = ul4._type(exc); - var s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; - }; - - // Call a function ``f`` with UL4 argument handling - ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) - { - var finalargs; - if (needsobject) - { - if (signature === null) - { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; - } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else - { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); - }; - - ul4._callfunction = function _callfunction(context, f, args, kwargs) - { - var name = f._ul4_name || f.name; - if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); - } - - ul4._callobject = function _callobject(context, obj, args, kwargs) - { - if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); - } - - ul4._callrender = function _callrender(context, obj, args, kwargs) - { - if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); - } - - ul4._call = function _call(context, f, args, kwargs) - { - if (typeof(f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof(f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); - } - - ul4._unpackvar = function _unpackvar(lvalue, value) - { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else - { - var newvalue = []; - var iter = ul4._iter(value); - - for (var i = 0;;++i) - { - var item = iter.next(); - - if (item.done) - { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else - { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } - }; - - ul4._formatsource = function _formatsource(out) - { - var finalout = []; - var level = 0, needlf = false; - for (var i = 0; i < out.length; ++i) - { - if (typeof(out[i]) === "number") - { - level += out[i]; - needlf = true; - } - else - { - if (needlf) - { - finalout.push("\n"); - for (var j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; - } - finalout.push(out[i]); - } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); - }; - - // Compare ``obj1`` and ``obj2`` if they have the same value - ul4._eq = function _eq(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof(obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 == obj2 - else - return false; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); - else - return false; - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } - else - return false; - } - else if (ul4._isobject(obj1)) - { - if (ul4._isobject(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.hasOwnProperty(key)) - { - if (!ul4._eq(obj1[key], obj2[key])) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.has(key)) - { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - var result = true; - obj2.forEach(function(value, key){ - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; - } - else - return false; - } - else if (ul4._ismap(obj1)) - { - if (ul4._isobject(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; - } - }); - if (!result) - return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.has(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2.get(key))) - result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) - { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - var result = true; - obj1.forEach(function(value){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(value)) - result = false; - } - }); - return result; - } - else - return false; - } - else - return obj1 === obj2; - }; - - // Compare ``obj1`` and ``obj2`` if they don't have the same value - ul4._ne = function _ne(obj1, obj2) - { - if (obj1 && typeof(obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof(obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); - } - - ul4._unorderable = function _unorderable(operator, obj1, obj2) - { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); - }; - - // Return: - // -1 when ``obj1 < obj2``, - // 0 when ``obj1 == obj2``, - // 1 when ``obj1 > obj2``, - // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) - // raise TypeError if objects are uncomparable - // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= - // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - - ul4._cmp = function _cmp(operator, obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - { - var v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); - } - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return 0; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return 1; - var res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; - } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); - } - - // Return whether ``obj1 < obj2`` - ul4._lt = function _lt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 < obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length < obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) - { - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); - }; - - // Return whether ``obj1 <= obj2`` - ul4._le = function _le(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length <= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); - }; - - // Return whether ``obj1 > obj2`` - ul4._gt = function _gt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 > obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length > obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); - }; - - // Return whether ``obj1 >= obj2`` - ul4._ge = function _ge(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length >= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); - }; - - // Return an iterator for ``obj`` - ul4._iter = function _iter(obj) - { - if (typeof(obj) === "string" || ul4._islist(obj)) - { - return { - index: 0, - next: function() - { - if (this.index < obj.length) - return {value: obj[this.index++], done: false}; - else - return {done: true}; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof(obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) - { - var keys = []; - obj.forEach(function(value, key){ - keys.push(key); - }); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - else if (ul4._isset(obj)) - { - var values = []; - obj.forEach(function(value, key){ - values.push(value); - }); - return { - index: 0, - next: function() - { - if (this.index >= values.length) - return {done: true}; - return {value: values[this.index++], done: false}; - } - }; - } - else if (ul4._isul4set(obj)) - { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) - { - var keys = []; - for (var key in obj) - keys.push(key); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); - }; - - ul4._str_repr = function _str_repr(str, ascii) - { - var result = ""; - var squote = false, dquote = false; - - for (var i = 0; i "; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof(obj) === "undefined") - return ""; - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; - }; - - // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` - ul4._repr = function _repr(obj) - { - return ul4._repr_internal(obj, false); - } - - ul4._ascii = function _ascii(obj) - { - return ul4._repr_internal(obj, true); - } - - ul4._date_str = function _date_str(obj) - { - var year = obj.getFullYear(); - var month = obj.getMonth()+1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - - var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; - }; - - ul4._str = function _str(obj) - { - if (typeof(obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof(obj) === "string") - return obj; - else if (typeof(obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") - return obj.__str__(); - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; - }; - - // Convert ``obj`` to bool, according to its "truth value" - ul4._bool = function _bool(obj) - { - if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else - { - if (typeof(obj) === "object", typeof(obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) - { - for (var key in obj) - { - if (!obj.hasOwnProperty(key)) - continue; - return true; - } - return false; - } - return true; - } - }; - - // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) - ul4._int = function _int(obj, base) - { - var result; - if (base !== null) - { - if (typeof(obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else - { - if (typeof(obj) == "string") - { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else if (typeof(obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } - }; - - // Convert ``obj`` to a float - ul4._float = function _float(obj) - { - if (typeof(obj) === "string") - return parseFloat(obj); - else if (typeof(obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); - }; - - // Convert ``obj`` to a list - ul4._list = function _list(obj) - { - var iter = ul4._iter(obj); - - var result = []; - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } - }; - - // Convert ``obj`` to a set - ul4._set = function _set(obj) - { - var iter = ul4._iter(obj); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } - }; - - // Return the length of ``sequence`` - ul4._len = function _len(sequence) - { - if (typeof(sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) - { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); - }; - - ul4._type = function _type(obj) - { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof(obj) === "undefined") - return "undefined"; - else if (typeof(obj) === "string") - return "str"; - else if (typeof(obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof(obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; - }; - - - // Return whether any of the items in ``iterable`` are true - ul4._any = function _any(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } - }; - - // Return whether all of the items in ``iterable`` are true - ul4._all = function _all(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } - }; - - // Check if ``obj`` is undefined - ul4._isundefined = function _isundefined(obj) - { - return typeof(obj) === "undefined"; - }; - - - // Check if ``obj`` is *not* undefined - ul4._isdefined = function _isdefined(obj) - { - return typeof(obj) !== "undefined"; - }; - - // Check if ``obj`` is ``None`` - ul4._isnone = function _isnone(obj) - { - return obj === null; - }; - - // Check if ``obj`` is a boolean - ul4._isbool = function _isbool(obj) - { - return typeof(obj) == "boolean"; - }; - - // Check if ``obj`` is a int - ul4._isint = function _isint(obj) - { - return (typeof(obj) == "number") && Math.round(obj) == obj; - }; - - // Check if ``obj`` is a float - ul4._isfloat = function _isfloat(obj) - { - return (typeof(obj) == "number") && Math.round(obj) != obj; - }; - - // Check if ``obj`` is a string - ul4._isstr = function _isstr(obj) - { - return typeof(obj) == "string"; - }; - - // Check if ``obj`` is a date - ul4._isdate = function _isdate(obj) - { - return Object.prototype.toString.call(obj) == "[object Date]"; - }; - - // Check if ``obj`` is a color - ul4._iscolor = function _iscolor(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); - }; - - // Check if ``obj`` is a timedelta object - ul4._istimedelta = function _istimedelta(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); - }; - - // Check if ``obj`` is a monthdelta object - ul4._ismonthdelta = function _ismonthdelta(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); - }; - - // Check if ``obj`` is a template - ul4._istemplate = function _istemplate(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); - }; - - // Check if ``obj`` is a function - ul4._isfunction = function _isfunction(obj) - { - return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); - }; - - // Check if ``obj`` is a list - ul4._islist = function _islist(obj) - { - return Object.prototype.toString.call(obj) == "[object Array]"; - }; - - // Check if ``obj`` is a set - ul4._isset = function _isset(obj) - { - return Object.prototype.toString.call(obj) == "[object Set]"; - }; - - // Check if ``obj`` is an exception (at least a UL4 exception) - ul4._isexception = function _isexception(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); - }; - - ul4._isul4set = function _isul4set(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); - }; - - // Check if ``obj`` is an iterator - ul4._isiter = function _isiter(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; - }; - - // Check if ``obj`` is a JS object - ul4._isobject = function _isobject(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; - }; - - // Check if ``obj`` is a map - ul4._ismap = function _ismap(obj) - { - if (ul4on._havemap) - return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - return false; - }; - - // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) - ul4._isdict = function _isdict(obj) - { - return ul4._isobject(obj) || ul4._ismap(obj); - }; - - - // Repeat string ``str`` ``rep`` times - ul4._str_repeat = function _str_repeat(str, rep) - { - var result = ""; - for (; rep>0; --rep) - result += str; - return result; - }; - - ul4._list_repeat = function _list_repeat(list, rep) - { - var result = []; - for (; rep>0; --rep) - for (var i = 0; i < list.length; ++i) - result.push(list[i]); - return result; - }; - - ul4._str_json = function _str_json(str) - { - var result = ""; - for (var i = 0; i < str.length; ++i) - { - var c = str[i]; - switch (c) - { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - default: - var code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; - }; - - // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) - ul4._asjson = function _asjson(obj) - { - if (obj === null) - return "null"; - else if (typeof(obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof(obj) === "string") - return ul4._str_json(obj); - else if (typeof(obj) === "number") - { - return "" + obj; - } - else if (ul4._islist(obj)) - { - var v = []; - v.push("["); - for (var i = 0; i < obj.length; ++i) - { - if (i != 0) - v.push(", "); - v.push(ul4._asjson(obj[i])); - } - v.push("]"); - return v.join(""); - } - else if (ul4._ismap(obj)) - { - var v = []; - v.push("{"); - var i = 0; - obj.forEach(function(value, key){ - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); - v.push("}"); - return v.join(""); - } - else if (ul4._isobject(obj)) - { - var v = []; - v.push("{"); - var i = 0; - for (var key in obj) - { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(obj[key])); - } - v.push("}"); - return v.join(""); - } - else if (ul4._isdate(obj)) - { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) - { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) - { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) - { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) - { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); - }; - - // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object - ul4._fromjson = function _fromjson(string) - { - // The following is from jQuery's parseJSON function - string = ul4._strip(string, null); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); - }; - - // Encodes ``obj`` in the UL4 Object Notation format - ul4._asul4on = function _asul4on(obj) - { - return ul4on.dumps(obj); - }; - - // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object - ul4._fromul4on = function _fromul4on(string) - { - return ul4on.loads(string); - }; - - ul4._format_date = function _format_date(obj, fmt, lang) - { - var translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - var translation = translations[lang]; - - var firstday; - - var result = []; - var inspec = false; - for (var i = 0; i < fmt.length; ++i) - { - var c = fmt[i]; - if (inspec) - { - switch (c) - { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth()+1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; - } - result.push(c); - inspec = false; - } - else - { - if (c == "%") - inspec = true; - else - result.push(c); - } - } - return result.join(""); - }; - - ul4._format_int = function _format_int(obj, fmt, lang) - { - var work = fmt; - - // Defaults - var fill = ' '; - var align = '>'; // '<', '>', '=' or '^' - var sign = '-'; // '+', '-' or ' ' - var alternate = false; - var minimumwidth = 0; - var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) - { - type = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract minimum width - if (/\d+$/.test(work)) - { - var minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) - { - align = '='; - fill = '0'; - } - minimumwidth = parseInt(minimumwidthStr); - } - - // Alternate form? - if (/#$/.test(work)) - { - alternate = true; - work = work.substring(0, work.length-1); - } - - // Determine sign - if (/[+ -]$/.test(work)) - { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) - { - if (/[<>=^]$/.test(work)) - { - align = work[1]; - fill = work[0]; - } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) - { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - - // Basic number formatting - var neg = obj < 0; - - if (neg) - obj = -obj; - - var output; - switch (type) - { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } - - // The rest of the formatting - if (align === '=') - { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; - - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; - - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else - { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) - { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth-output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - else // if (align == '^') - { - var pad = minimumwidth - output.length; - var padBefore = Math.floor(pad/2); - var padAfter = pad-padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } - } - } - return output; - }; - - // Format ``obj`` using the format string ``fmt`` in the language ``lang`` - ul4._format = function _format(obj, fmt, lang) - { - if (typeof(lang) === "undefined" || lang === null) - lang = "en"; - else - { - var translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; - lang = lang.toLowerCase(); - if (typeof(translations[lang]) === "undefined") - { - lang = lang.split(/_/)[0]; - if (typeof(translations[lang]) === "undefined") - lang = "en"; - } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); - }; - - ul4._lpad = function _lpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; - }; - - ul4._rpad = function _rpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; - }; - - ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) - { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - - isprotoof: function isprotoof(obj) - { - while (true) - { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; - } - }, - - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) - { - return this === other; - }, - - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) - { - return !this.__eq__(other); - }, - - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` - - __bool__: function __bool__() - { - return true; - } - }; - - ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create() - { - var signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - var nextDefault = false; - var lastArgname = null; - for (var i = 0; i < arguments.length; ++i) - { - var argName = arguments[i]; - if (nextDefault) - { - signature.args.push({name: lastArgname, defaultValue: argName}); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else - { - if (argName.substr(argName.length-1) === "=") - { - lastArgname = argName.substr(0, argName.length-1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else - { - signature.args.push({name: argName}); - signature.argNames[argName] = true; - } - } - } - return signature; - }, - - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) - { - var finalargs = []; - var decname = name !== null ? name + "() " : ""; - - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - if (i < args.length) - { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else - { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else - { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } - } - } - - // Do we accept additional positional arguments? - if (this.remargs === null) - { - // No, but we have them -> complain - if (args.length > this.args.length) - { - var prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else - { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } - - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) - { - // No => complain about unknown ones - for (var key in kwargs) - { - if (!this.argNames[key]) - { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else - { - // Yes => Put the unknown ones into an object and add that to the arguments array - var remkwargs = {}; - for (var key in kwargs) - { - if (!this.argNames[key]) - remkwargs[key] = kwargs[key]; - } - finalargs.push(remkwargs); - } - - return finalargs; - }, - - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) - { - args = this.bindArray(name, args, kwargs); - var argObject = {}; - var i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, - - __repr__: function __repr__() - { - return ""; - }, - - __str__: function __str__() - { - return this.toString(); - }, - - toString: function toString() - { - var v = []; - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); - } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; - } - } - ); - - // Adds name and signature to a function/method and makes the method callable in templates - ul4.expose = function expose(signature, options, f) - { - if (typeof(f) === "undefined") - { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; - }; - - ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) - { - if (vars === null || typeof(vars) === "undefined") - vars = {}; - var context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, - - /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. - * This is used by the various comprehensions to avoid leaking loop variables. - */ - inheritvars: function inheritvars() - { - var context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); - return context; - }, - - /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) - { - var context = ul4._clone(this); - if (indent !== null) - { - context.indents = this.indents.slice(); - context.indents.push(indent); - } - return context; - }, - - /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() - { - var context = ul4._clone(this); - context._output = []; - return context; - }, - - clone: function clone(vars) - { - return ul4._clone(this); - }, - - output: function output(value) - { - this._output.push(value); - }, - - getoutput: function getoutput() - { - return this._output.join(""); - }, - - get: function get(name) - { - return this.vars[name]; - }, - - set: function set(name, value) - { - this.vars[name] = value; - } - } - ); - - /// Exceptions - - ul4.Exception = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Exception", - "cause": null, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - default: - return undefined; - } - } - } - ); - - // Exceptions used internally by UL4 for flow control - ul4.InternalException = ul4._inherit(ul4.Exception, {}); - - // Control flow exceptions - ul4.ReturnException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ReturnException", - - create: function create(result) - { - var exception = ul4._clone(this); - exception.result = result; - return exception; - } - } - ); - - ul4.BreakException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.BreakException" - } - ); - - ul4.ContinueException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ContinueException" - } - ); - - // Real exceptions raised by various parts of UL4 - ul4.SyntaxError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.SyntaxError" - } - ); - - ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, - { - __type__: "ul4.LValueRequiredError", - - toString: function toString() - { - return "lvalue required!"; - } - } - ); - - ul4.TypeError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.TypeError", - - create: function create(operation, message) - { - var exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ValueError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ValueError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ArgumentError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ArgumentError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - /// Exception that wraps other exceptions while they bubble up the stack - ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", - - create: function create(location, cause) - { - var exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, - - _templateprefix: function(template) - { - var out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - var first = true; - while (template != null) - { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; - } - return out.join(""); - }, - - _template: function _template() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else - { - var tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; - } - }, - - _innerpos: function _innerpos() - { - return this.location.pos; - }, - - toString: function toString() - { - var template = this._template(); - var templateprefix = this._templateprefix(template); - var outerpos = this._outerpos(); - var innerpos = this._innerpos(); - - var prefix = template.source.substring(outerpos.start, innerpos.start); - var code = template.source.substring(innerpos.start, innerpos.stop); - var suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - var text = prefix + code + suffix; - var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - var lineno = 1, colno = 1; - for (var i = 0; i < innerpos.start; ++i) - { - if (template.source[i] === "\n") - { - ++lineno; - colno = 1; - } - else - ++colno; - } - - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - return templateprefix + ": " + pos + "\n" + text + "\n" + underline; - }, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - return undefined; - } - } - } - ); - - - /// Classes for the syntax tree - ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) - { - var ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() - { - var out = []; - this._str(out); - return ul4._formatsource(out); - }, - __repr__: function __repr__() - { - var out = []; - this._repr(out); - return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, value) - { - try - { - return this._eval_set(context, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_set: function _eval_set(context, value) - { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) - { - try - { - return this._eval_modify(context, operator, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_modify: function _eval_modify(context, operator, value) - { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) - { - }, - _str: function _str(out) - { - }, - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) - { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } - ); - - ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) - { - var text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() - { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) - { - context.output(this._text()); - }, - _str: function _str(out) - { - out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) - { - var indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) - { - if (typeof(this.template) !== "undefined") - { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() - { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); - else - return this.text; - }, - _eval: function _eval(context) - { - for (var i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) - encoder.dump(null); - else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) - { - out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.LineEndAST = ul4._inherit( - ul4.TextAST, - { - _str: function _str(out) - { - out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) - { - var tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() - { - if (typeof(this.template) !== "undefined") - { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else - { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } - ); - - ul4.CodeAST = ul4._inherit( - ul4.AST, - { - create: function create(tag, pos) - { - var code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) - { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - } - } - ); - - ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) - { - var constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this.value; - } - } - ); - - ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, - { - _handle_eval_list: function _handle_eval_list(context, result) - { - try - { - return this._eval_list(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, result) - { - try - { - return this._eval_set(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) - { - try - { - return this._eval_dict(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) - { - try - { - return this._eval_call(context, args, kwargs); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - result.push(value); - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - result.add(value); - } - } - ); - - - ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.push(item.value); - } - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.add(item.value); - } - } - } - ); - - ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) - { - var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var key = this.key._handle_eval(context); - var value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); - } - } - ); - - ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - ul4on._setmap(result, key, value); - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - ul4on._setmap(result, key, item[key]); - } - } - } - ); - - ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var value = this.value._handle_eval(context); - args.push(value); - } - } - ); - - ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - var value = this.value._handle_eval(context); - kwargs[this.name] = value; - } - } - ); - - ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - args.push.apply(args, item); - } - } - ); - - ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - { - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = item[key]; - } - } - } - } - ); - - ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = []; - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); - return result; - } - } - ); - - ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = []; - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.push(this.item._handle_eval(localcontext)); - } - return result; - } - } - ); - - ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._emptymap(); - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); - return result; - } - } - ); - - ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._emptymap(); - - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - { - var key = this.key._handle_eval(localcontext); - var value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); - } - } - - return result; - } - } - ); - - ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); - - return result; - } - } - ); - - ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); - } - - return result; - } - } - ); - - ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - var iter = ul4._iter(container); - - var localcontext = context.inheritvars(); - - var self = this; - - var result = { - next: function(){ - while (true) - { - var item = iter.next(); - if (item.done) - return item; - var varitems = ul4._unpackvar(self.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) - { - var value = self.item._handle_eval(localcontext); - return {value: value, done: false}; - } - } - } - }; - - return result; - } - } - ); - - ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) - { - var variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) - { - this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) - { - var result = context.get(name); - if (typeof(result) === "undefined") - result = ul4.functions[name]; - return result; - }, - _set: function _set(context, name, value) - { - context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) - { - var newvalue = operator._ido(context.get(name), value) - context.set(name, newvalue); - } - } - ); - - ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) - { - var unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" obj="); - this.obj._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - return this._do(obj); - } - } - ); - - // Negation - ul4.NegAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - if (obj !== null && typeof(obj.__neg__) === "function") - return obj.__neg__(); - return -obj; - } - } - ); - - // Bitwise not - ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return -obj-1; - } - } - ); - - // Not - ul4.NotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return !ul4._bool(obj); - } - } - ); - - // If expression - ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) - { - var ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(+1); - out.push("objif="); - this.objif._repr(out); - out.push(0); - out.push("objcond="); - this.objcond._repr(out); - out.push(0); - out.push("objelse="); - this.objelse._repr(out); - out.push(-1); - out.push(">"); - }, - _eval: function _eval(context) - { - var result; - var condvalue = this.objcond._handle_eval(context); - if (ul4._bool(condvalue)) - result = this.objif._handle_eval(context); - else - result = this.objelse._handle_eval(context); - return result; - } - } - ); - - ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) - { - out.push("return "); - this.obj._str(out); - } - } - ); - - ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._str(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("print "); - this.obj._str(out); - } - } - ); - - ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._xmlescape(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("printx "); - this.obj._str(out); - } - } - ); - - ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) - { - var binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.type); - out.push(" obj1="); - this.obj1._repr(out); - out.push(" obj2="); - this.obj2._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - return this._do(obj1, obj2); - } - } - ); - - // Item access and assignment: dict[key], list[index], string[index], color[index] - ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - var result = this._get(obj1, obj2); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) - { - if (typeof(container) === "string" || ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (typeof(start) === "undefined" || start === null) - start = 0; - if (typeof(stop) === "undefined" || stop === null) - stop = container.length; - return container.slice(start, stop); - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - return container[key]; - } - } - else if (container && typeof(container.__getitem__) === "function") // test this before the generic object test - return container.__getitem__(key); - else if (ul4._ismap(container)) - return container.get(key); - else if (Object.prototype.toString.call(container) === "[object Object]") - return container[key]; - else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) - { - if (ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (start === null) - start = 0; - else if (start < 0) - start += container.length; - if (start < 0) - start = 0; - else if (start > container.length) - start = container.length; - if (stop === null) - stop = container.length; - else if (stop < 0) - stop += container.length; - if (stop < 0) - stop = 0; - else if (stop > container.length) - stop = container.length; - if (stop < start) - stop = start; - container.splice(start, stop-start); // Remove old element - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - container.splice(start++, 0, item.value); - } - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - container[key] = value; - } - } - else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test - container.__setitem__(key, value); - else if (ul4._ismap(container)) - container.set(key, value); - else if (Object.prototype.toString.call(container) === "[object Object]") - container[key] = value; - else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) - { - this._set(container, key, operator._ido(this._get(container, key), value)); - } - } - ); - - // Identifty test operator ``is`` - ul4.IsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 === obj2; - } - } - ); - - // Inverted tdentifty test operator ``is not`` - ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 !== obj2; - } - } - ); - - // Comparison operator == - ul4.EQAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._eq(obj1, obj2); - } - } - ); - - // Comparison operator != - ul4.NEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ne(obj1, obj2); - } - } - ); - - // Comparison operator < - ul4.LTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._lt(obj1, obj2); - } - } - ); - - // Comparison operator <= - ul4.LEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._le(obj1, obj2); - } - } - ); - - // Comparison operator > - ul4.GTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._gt(obj1, obj2); - } - } - ); - - // Comparison operator >= - ul4.GEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ge(obj1, obj2); - } - } - ); - - // Containment test: string in string, obj in list, key in dict, value in rgb - ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - if (typeof(obj) === "string" && typeof(container) === "string") - { - return container.indexOf(obj) !== -1; - } - else if (ul4._islist(container)) - { - return container.indexOf(obj) !== -1; - } - else if (container && typeof(container.__contains__) === "function") // test this before the generic object test - return container.__contains__(obj); - else if (ul4._ismap(container) || ul4._isset(container)) - return container.has(obj); - else if (ul4._isobject(container)) - { - for (var key in container) - { - if (key === obj) - return true; - } - return false; - } - else if (ul4._iscolor(container)) - { - return container._r === obj || container._g === obj || container._b === obj || container._a === obj; - } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); - } - } - ); - - // Inverted containment test - ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - return !ul4.ContainsAST._do(obj, container); - } - } - ); - - // Addition: num + num, string + string - ul4.AddAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__add__) === "function") - return obj1.__add__(obj2); - else if (obj2 && typeof(obj2.__radd__) === "function") - return obj2.__radd__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - var result = []; - ul4._append(result, obj1); - ul4._append(result, obj2); - return result; - } - else - return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - ul4._append(obj1, obj2); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Substraction: num - num - ul4.SubAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__sub__) === "function") - return obj1.__sub__(obj2); - else if (obj2 && typeof(obj2.__rsub__) === "function") - return obj2.__rsub__(obj1); - else if (ul4._isdate(obj1) && ul4._isdate(obj2)) - return this._date_sub(obj1, obj2); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); - return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) - { - var swap = (obj2 > obj1); - - if (swap) - { - var t = obj1; - obj1 = obj2; - obj2 = t; - } - // From now on obj1 is > than obj2 - - var year1 = obj1.getFullYear(); - var yearday1 = ul4._yearday(obj1); - var year2 = obj2.getFullYear(); - var yearday2 = ul4._yearday(obj2); - - var diffdays = 0; - - while (year1 > year2) - { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); - ++year2; - } - diffdays += yearday1 - yearday2; - - var hours1 = obj1.getHours(); - var minutes1 = obj1.getMinutes(); - var seconds1 = obj1.getSeconds(); - var hours2 = obj2.getHours(); - var minutes2 = obj2.getMinutes(); - var seconds2 = obj2.getSeconds(); - - var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - - var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - - if (swap) - { - diffdays = -diffdays; - diffseconds = -diffseconds; - diffmilliseconds = -diffmilliseconds; - } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Multiplication: num * num, int * str, str * int, int * list, list * int - ul4.MulAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__mul__) === "function") - return obj1.__mul__(obj2); - else if (obj2 && typeof(obj2.__rmul__) === "function") - return obj2.__rmul__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) - { - if (typeof(obj2) === "string") - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj2, obj1); - } - else if (ul4._islist(obj2)) - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj2, obj1); - } - } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) - { - if (typeof(obj1) === "string") - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj1, obj2); - } - else if (ul4._islist(obj1)) - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj1, obj2); - } - } - return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._isint(obj2)) - { - if (obj2 > 0) - { - var i = 0; - var targetsize = obj1.length * obj2; - while (obj1.length < targetsize) - obj1.push(obj1[i++]) - } - else - obj1.splice(0, obj1.length); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Truncating division - ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__floordiv__) === "function") - return obj1.__floordiv__(obj2); - else if (obj2 && typeof(obj2.__rfloordiv__) === "function") - return obj2.__rfloordiv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); - return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // "Real" division - ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__truediv__) === "function") - return obj1.__truediv__(obj2); - else if (obj2 && typeof(obj2.__rtruediv__) === "function") - return obj2.__rtruediv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); - return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Modulo - ul4.ModAST = ul4._inherit( - ul4.BinaryAST, - { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) - { - var div = Math.floor(obj1 / obj2); - var mod = obj1 - div * obj2; - - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) - { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise left shift - ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 *= 2; - return obj1; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise right shift - ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 /= 2; - return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise and - ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise exclusive or - ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise or - ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - ul4.AndAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (!ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.OrAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) - { - var attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var result = this._get(obj, this.attrname); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj = this.obj._handle_eval(context); - this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj = this.obj._handle_eval(context); - this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) - { - if (typeof(object) === "string") - { - switch (attrname) - { - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - case "replace": - return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count){ return ul4._replace(object, old, new_, count); }); - case "strip": - return ul4.expose(["chars=", null], function strip(chars){ return ul4._strip(object, chars); }); - case "lstrip": - return ul4.expose(["chars=", null], function lstrip(chars){ return ul4._lstrip(object, chars); }); - case "rstrip": - return ul4.expose(["chars=", null], function rstrip(chars){ return ul4._rstrip(object, chars); }); - case "split": - return ul4.expose(["sep=", null, "count=", null], function split(sep, count){ return ul4._split(object, sep, count); }); - case "rsplit": - return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count){ return ul4._rsplit(object, sep, count); }); - case "splitlines": - return ul4.expose(["keepends=", false], function splitlines(keepends){ return ul4._splitlines(object, keepends); }); - case "lower": - return ul4.expose([], function lower(){ return object.toLowerCase(); }); - case "upper": - return ul4.expose([], function upper(){ return object.toUpperCase(); }); - case "capitalize": - return ul4.expose([], function capitalize(){ return ul4._capitalize(object); }); - case "join": - return ul4.expose(["iterable"], function join(iterable){ return ul4._join(object, iterable); }); - case "startswith": - return ul4.expose(["prefix"], function startswith(prefix){ return ul4._startswith(object, prefix); }); - case "endswith": - return ul4.expose(["suffix"], function endswith(suffix){ return ul4._endswith(object, suffix); }); - default: - return undefined; - } - } - else if (ul4._islist(object)) - { - switch (attrname) - { - case "append": - return ul4.expose(["*items"], function append(items){ return ul4._append(object, items); }); - case "insert": - return ul4.expose(["pos", "*items"], function insert(pos, items){ return ul4._insert(object, pos, items); }); - case "pop": - return ul4.expose(["pos=", -1], function pop(pos){ return ul4._pop(object, pos); }); - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - default: - return undefined; - } - } - else if (ul4._isdate(object)) - { - switch (attrname) - { - case "weekday": - return ul4.expose([], function weekday(){ return ul4._weekday(object); }); - case "week": - return ul4.expose(["firstweekday=", null], function week(firstweekday){ return ul4._week(object, firstweekday); }); - case "day": - return ul4.expose([], function day(){ return object.getDate(); }); - case "month": - return ul4.expose([], function month(){ return object.getMonth()+1; }); - case "year": - return ul4.expose([], function year(){ return object.getFullYear(); }); - case "hour": - return ul4.expose([], function hour(){ return object.getHours(); }); - case "minute": - return ul4.expose([], function minute(){ return object.getMinutes(); }); - case "second": - return ul4.expose([], function second(){ return object.getSeconds(); }); - case "microsecond": - return ul4.expose([], function microsecond(){ return object.getMilliseconds() * 1000; }); - case "mimeformat": - return ul4.expose([], function mimeformat(){ return ul4._mimeformat(object); }); - case "isoformat": - return ul4.expose([], function isoformat(){ return ul4._isoformat(object); }); - case "yearday": - return ul4.expose([], function yearday(){ return ul4._yearday(object); }); - default: - return undefined; - } - } - else if (ul4._ismap(object)) - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return object.get(attrname); - } - } - else if (ul4._isset(object)) - { - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ for (var i = 0; i < items.length; ++i) { object.add(items[i]); } } ); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return undefined; - } - } - else if (Object.prototype.toString.call(object) === "[object Object]") - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - var result; - if (object && typeof(object.__getattr__) === "function") // test this before the generic object test - result = object.__getattr__(attrname); - else - result = object[attrname]; - if (typeof(result) !== "function") - return result; - var realresult = function() { - return result.apply(object, arguments); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } - } - throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); - }, - _set: function _set(object, attrname, value) - { - if (typeof(object) === "object" && typeof(object.__setattr__) === "function") - object.__setattr__(attrname, value); - else if (ul4._ismap(object)) - object.set(attrname, value) - else if (ul4._isobject(object)) - object[attrname] = value; - else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) - { - var oldvalue = this._get(object, attrname); - var newvalue = operator._ido(oldvalue, value); - this._set(object, attrname, newvalue); - } - } - ); - - ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) - { - var call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) - { - out.push(""); - }, - _makeargs: function _makeargs(context) - { - var args = [], kwargs = {}; - for (var i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return {args: args, kwargs: kwargs}; - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var args = this._makeargs(context); - var result = ul4._call(context, obj, args.args, args.kwargs); - return result; - } - } - ); - - ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) - { - var render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) - { - out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); - } - }, - _handle_eval: function _handle_eval(context) - { - var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - var obj = this.obj._handle_eval(localcontext); - var args = this._makeargs(localcontext); - - try - { - var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); - return result; - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - // Slice object - ul4.slice = ul4._inherit( - ul4.Proto, - { - create: function create(start, stop) - { - var slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() - { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; - } - } - ); - - - // List/String slice - ul4.SliceAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, index1, index2) - { - var slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); - } - } - ); - - - ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, lvalue, value) - { - var changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" lvalue="); - out.push(ul4._repr(this.lvalue)); - out.push(" value="); - this.value._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_set(context, item[1]); - } - } - } - ); - - ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, - { - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); - } - } - } - ); - - ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); - - ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); - - ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); - - ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); - - ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); - - ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); - - ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); - - ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); - - ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); - - ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); - - ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); - - ul4.BlockAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) - { - if (this.content.length) - { - for (var i = 0; i < this.content.length; ++i) - { - this.content[i]._str(out); - out.push(0); - } - } - else - { - out.push("pass"); - out.push(0); - } - } - } - ); - - ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) - { - var for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str_varname: function _str_varname(out, varname) - { - if (ul4._islist(varname)) - { - out.push("("); - for (var i = 0; i < varname.length; ++i) - { - if (i) - out.push(", "); - this._str_varname(out, varname[i]); - } - if (varname.length == 1) - out.push(","); - out.push(")"); - } - else - varname._str(out); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - for (var iter = ul4._iter(container);;) - { - var value = iter.next(); - if (value.done) - break; - var varitems = ul4._unpackvar(this.varname, value.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("for "); - this._str_varname(out, this.varname); - out.push(" in "); - this.container._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("while "), - this.container._repr(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _eval: function _eval(context) - { - while (true) - { - var cond = this.condition._handle_eval(context); - if (!ul4._bool(cond)) - break; - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("while "); - ul4.AST._str.call(this, out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.BreakAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.BreakException; - }, - _str: function _str(out) - { - out.push("break"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.ContinueException; - }, - _str: function _str(out) - { - out.push("continue"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, - { - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - { - var block = this.content[i]; - var execute = block._execute(context); - if (execute) - { - block._handle_eval(context); - break; - } - } - } - } - ); - - ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" condition="); - this.condition._repr(out); - out.push(">"); - }, - _str: function _str(out) - { - out.push(this._strname); - out.push(" "); - this.condition._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - var cond = this.condition._handle_eval(context); - var result = ul4._bool(cond); - return result; - } - } - ); - - ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); - - ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); - - ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, - { - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("else:"), - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - return true; - }, - _str: function _str(out) - { - out.push("else:"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) - { - var template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) - { - var signature; - encoder.dump(ul4.version); - encoder.dump(this.name); - encoder.dump(this.source); - encoder.dump(this.whitespace); - encoder.dump(this.startdelim); - encoder.dump(this.enddelim); - encoder.dump(this.docpos); - encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) - signature = this.signature; - else - { - signature = []; - for (var i = 0; i < this.signature.args.length; ++i) - { - var arg = this.signature.args[i]; - if (typeof(arg.defaultValue) === "undefined") - signature.push(arg.name); - else - signature.push(arg.name+"=", arg.defaultValue); - } - if (this.signature.remargs !== null) - signature.push("*" + this.signature.remargs); - if (this.signature.remkwargs !== null) - signature.push("**" + this.signature.remkwargs); - } - encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) - { - var version = decoder.load(); - var signature; - - if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); - - if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); - this.name = decoder.load(); - this.source = decoder.load(); - this.whitespace = decoder.load(); - this.startdelim = decoder.load(); - this.enddelim = decoder.load(); - this.docpos = decoder.load(); - this.parenttemplate = decoder.load(); - signature = decoder.load(); - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - this.signature = signature; - this._ul4_callsignature = signature; - this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) - { - return ul4on.loads(string); - }, - _eval: function _eval(context) - { - var signature = null; - if (this.signature !== null) - signature = this.signature._handle_eval(context); - var closure = ul4.TemplateClosure.create(this, signature, context.vars); - context.set(this.name, closure); - }, - _repr: function _repr(out) - { - out.push("") - { - out.push(" enddelim="); - out.push(ul4._repr(this.enddelim)); - } - out.push(">"); - }, - _str: function _str(out) - { - out.push("def "); - out.push(this.name ? this.name : "unnamed"); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (!ul4.ReturnException.isprotoof(exc)) - throw exc; - } - }, - __render__: function __render__(context, vars) - { - this._renderbound(context, vars); - }, - render: function render(context, vars) - { - this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) - { - var localcontext = context.replaceoutput(); - this._renderbound(localcontext, vars); - return localcontext.getoutput(); - }, - renders: function renders(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._rendersbound(context, vars); - }, - doc: function doc() - { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - default: - return undefined; - } - }, - _callbound: function _callbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (ul4.ReturnException.isprotoof(exc)) - return exc.result; - else - throw exc; - } - return null; - }, - call: function call(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) - { - return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } - ); - - ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.CodeAST.ul4ondump.call(this, encoder); - - var dump = []; - - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - dump.push(param[0]); - else - dump.push(param); - } - encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) - { - ul4.AST.ul4onload.call(this, decoder); - var dump = decoder.load(); - this.params = []; - for (var i = 0; i < dump.length; ++i) - { - var param = dump[i]; - if (typeof(param) === "string") - this.params.push([param, null]); - else - this.params.push(param); - } - }, - _eval: function _eval(context) - { - var args = []; - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - args.push(param[0]); - else - { - args.push(param[0] + "="); - args.push(param[1]._handle_eval(context)); - } - } - return ul4.Signature.create.apply(ul4.Signature, args); - }, - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" params="); - this.params._repr(out); - out.push(">"); - } - } - ); - - ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) - { - var closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; - // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) - { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) - { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - case "signature": - return this.signature; - default: - return this.template.__getattr__(attrname); - } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } - ); - - // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` - ul4._rgb = function _rgb(r, g, b, a) - { - return this.Color.create(255*r, 255*g, 255*b, 255*a); - }; - - // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference - ul4._xmlescape = function _xmlescape(obj) - { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; - }; - - // Convert ``obj`` to a string suitable for output into a CSV file - ul4._csv = function _csv(obj) - { - if (obj === null) - return ""; - else if (typeof(obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; - }; - - // Return a string containing one character with the codepoint ``i`` - ul4._chr = function _chr(i) - { - if (typeof(i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); - }; - - // Return the codepoint for the one and only character in the string ``c`` - ul4._ord = function _ord(c) - { - if (typeof(c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); - }; - - // Convert an integer to a hexadecimal string - ul4._hex = function _hex(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); - }; - - // Convert an integer to a octal string - ul4._oct = function _oct(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); - }; - - // Convert an integer to a binary string - ul4._bin = function _bin(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); - }; - - // Return the minimum value - ul4._min = function _min(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; - } - if (first || (item.value < result)) - result = item.value; - first = false; - } - }; - - // Return the maximum value - ul4._max = function _max(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; - } - if (first || (item.value > result)) - result = item.value; - first = false; - } - }; - - // Return the of the values from the iterable starting with ``start`` (default ``0``) - ul4._sum = function _sum(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; - }; - - // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._first = function _first(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; - }; - - // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._last = function _last(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var value = defaultValue; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; - }; - - // Return a sorted version of ``iterable`` - ul4._sorted = function _sorted(context, iterable, key, reverse) - { - var cmp; - if (key === null) - { - // FIXME: stability - if (reverse) - { - cmp = function cmp(a, b) - { - return -ul4._cmp("<=>", a, b); - } - } - else - { - cmp = function cmp(a, b) - { - return ul4._cmp("<=>", a, b); - } - } - var result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else - { - var sort = []; - - for (var i = 0, iter = ul4._iter(iterable);;++i) - { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); - } - cmp = function cmp(s1, s2) - { - var res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; - } - - sort.sort(cmp); - - var result = []; - for (var i = 0; i < sort.length; ++i) - { - result.push(sort[i][2]); - } - return result; - } - }; - - // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` - ul4._range = function _range(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) - { - lower = start; - heigher = stop; - } - else - { - lower = stop; - heigher = start; - } - var length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function() - { - if (this.index >= length) - return {done: true}; - return {value: start + (this.index++) * step, done: false}; - } - }; - }; - - // Return a iterable object returning a slice from the argument - ul4._slice = function _slice(args) - { - var iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) - { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - var next = start, count = 0; - var iter = ul4._iter(iterable); - return { - next: function() { - var result; - while (count < next) - { - result = iter.next(); - if (result.done) - return result; - ++count; - } - if (stop !== null && count >= stop) - return {done: true}; - result = iter.next(); - if (result.done) - return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } - }; - }; - - // ``%`` escape unsafe characters in the string ``string`` - ul4._urlquote = function _urlquote(string) - { - return encodeURIComponent(string); - }; - - // The inverse function of ``urlquote`` - ul4._urlunquote = function _urlunquote(string) - { - return decodeURIComponent(string); - }; - - // Return a reverse iterator over ``sequence`` - ul4._reversed = function _reversed(sequence) - { - if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length-1, - next: function() { - return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; - } - }; - }; - - // Returns a random number in the interval ``[0;1[`` - ul4._random = function _random() - { - return Math.random(); - }; - - // Return a randomly select item from ``range(start, stop, step)`` - ul4._randrange = function _randrange(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var width = stop-start; - - var value = Math.random(); - - var n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step*Math.floor(value * n); - }; - - // Return a random item/char from the list/string ``sequence`` - ul4._randchoice = function _randchoice(sequence) - { - var iscolor = ul4._iscolor(sequence); - if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; - }; - - // Round a number ``x`` to ``digits`` decimal places (may be negative) - ul4._round = function _round(x, digits) - { - if (typeof(digits) === "undefined") - digits = 0; - if (digits) - { - var threshhold = Math.pow(10, digits); - return Math.round(x*threshhold)/threshhold; - } - else - return Math.round(x); - }; - - // Return a hex-encode MD5 hash of the argument - // This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 - ul4._md5 = function _md5(string) - { - return md5(string); - }; - - // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) - ul4._enumerate = function _enumerate(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - return { - iter: ul4._iter(iterable), - index: start, - next: function() { - var item = this.iter.next(); - return item.done ? item : {value: [this.index++, item.value], done: false}; - } - }; - }; - - // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) - ul4._isfirst = function _isfirst(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - return { - next: function() { - var item = iter.next(); - var result = item.done ? item : {value: [isfirst, item.value], done: false}; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) - ul4._islast = function _islast(iterable) - { - var iter = ul4._iter(iterable); - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [item.done, lastitem.value], done: false}; - lastitem = item; - return result; - } - }; - }; - - // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._isfirstlast = function _isfirstlast(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._enumfl = function _enumfl(iterable, start) - { - var iter = ul4._iter(iterable); - var i = start; - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) - ul4._zip = function _zip(iterables) - { - var result; - if (iterables.length) - { - var iters = []; - for (var i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); - - return { - next: function() { - var items = []; - for (var i = 0; i < iters.length; ++i) - { - var item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return {value: items, done: false}; - } - }; - } - else - { - return { - next: function() { - return {done: true}; - } - }; - } - }; - - // Return the absolute value for the number ``number`` - ul4._abs = function _abs(number) - { - if (number !== null && typeof(number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); - }; - - // Return a ``Date`` object from the arguments passed in - ul4._date = function _date(year, month, day, hour, minute, second, microsecond) - { - if (typeof(hour) === "undefined") - hour = 0; - - if (typeof(minute) === "undefined") - minute = 0; - - if (typeof(second) === "undefined") - second = 0; - - if (typeof(microsecond) === "undefined") - microsecond = 0; - - return new Date(year, month-1, day, hour, minute, second, microsecond/1000); - }; - - // Return a ``TimeDelta`` object from the arguments passed in - ul4._timedelta = function _timedelta(days, seconds, microseconds) - { - return this.TimeDelta.create(days, seconds, microseconds); - }; - - // Return a ``MonthDelta`` object from the arguments passed in - ul4._monthdelta = function _monthdelta(months) - { - return this.MonthDelta.create(months); - }; - - // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) - ul4._hls = function _hls(h, l, s, a) - { - var _v = function(m1, m2, hue) - { - hue = hue % 1.0; - if (hue < 1/6) - return m1 + (m2-m1)*hue*6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2/3) - return m1 + (m2-m1)*(2/3-hue)*6.0; - return m1; - }; - - var m1, m2; - if (typeof(a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0+s); - else - m2 = l+s-(l*s); - m1 = 2.0*l - m2; - return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); - }; - - // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) - ul4._hsv = function _hsv(h, s, v, a) - { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - var i = Math.floor(h*6.0); - var f = (h*6.0) - i; - var p = v*(1.0 - s); - var q = v*(1.0 - s*f); - var t = v*(1.0 - s*(1.0-f)); - switch (i%6) - { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } - }; - - // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` - ul4._get = function _get(container, key, defaultvalue) - { - if (ul4._ismap(container)) - { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) - { - var result = container[key]; - if (typeof(result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); - }; - - // Return a ``Date`` object for the current time - ul4.now = function now() - { - return new Date(); - }; - - // Return a ``Date`` object for the current time in UTC - ul4.utcnow = function utcnow() - { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); - }; - - ul4.functions = { - repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), - ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), - str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), - float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), - list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), - set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), - bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), - len: ul4.expose(["sequence"], {name: "len"}, ul4._len), - type: ul4.expose(["obj"], {name: "type"}, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), - any: ul4.expose(["iterable"], {name: "any"}, ul4._any), - all: ul4.expose(["iterable"], {name: "all"}, ul4._all), - zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), - isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), - isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), - isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), - isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), - isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), - isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), - isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), - isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), - iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), - istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), - isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), - islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), - isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), - isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), - asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), - fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), - asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), - fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), - isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), - islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), - isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), - abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), - xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), - csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), - chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), - ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), - hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), - oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), - bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), - min: ul4.expose(["*obj"], {name: "min"}, ul4._min), - max: ul4.expose(["*obj"], {name: "max"}, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), - first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), - last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), - range: ul4.expose(["*args"], {name: "range"}, ul4._range), - slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), - urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), - urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), - reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), - random: ul4.expose([], {name: "random"}, ul4._random), - randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), - randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), - md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) - }; - - // Functions implementing UL4 methods - ul4._replace = function _replace(string, old, new_, count) - { - if (count === null) - count = string.length; - - var result = []; - while (string.length) - { - var pos = string.indexOf(old); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); - }; - - ul4._strip = function _strip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._lstrip = function _lstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; - }; - - ul4._rstrip = function _rstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._split = function _split(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.indexOf(sep); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._lstrip(string, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); - } - return result; - } - } - }; - - ul4._rsplit = function _rsplit(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) - { - result.unshift(string); - break; - } - result.unshift(string.substr(pos+sep.length)); - string = string.substr(0, pos); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._rstrip(string, null, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - { - part = string.split(/[ \n\r\t]+/); - part = part[part.length-1]; - } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length-part.length); - } - return result; - } - } - }; - - ul4._splitlines = function _splitlines(string, keepends) - { - var lookingAtLineEnd = function lookingAtLineEnd() - { - var c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') - { - if (pos == length-1) - return 1; - if (string[pos+1] === '\n') - return 2; - return 1; - } - return 0; - }; - - var result = [], length = string.length; - - for (var pos = 0, startpos = 0;;) - { - if (pos >= length) - { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; - } - var lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else - { - var endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; - } - } - }; - - ul4._count = function _count(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - - var isstr = ul4._isstr(obj); - - if (isstr && !sub.length) - { - if (end < 0 || start > obj.length || start > end) - return 0; - var result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } - - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - var count = 0; - if (ul4._islist(obj)) - { - for (var i = start; i < end; ++i) - { - if (ul4._eq(obj[i], sub)) - ++count; - } - return count; - } - else // string - { - var lastIndex = start; - - for (;;) - { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; - } - return count; - } - }; - - ul4._find = function _find(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._rfind = function _rfind(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._capitalize = function _capitalize(obj) - { - if (typeof(obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; - }; - - ul4._items = function _items(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push([key, obj[key]]); - return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); - }; - - ul4._values = function _values(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push(obj[key]); - return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); - }; - - ul4._join = function _join(sep, iterable) - { - var resultlist = []; - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); - }; - - ul4._startswith = function _startswith(string, prefix) - { - if (typeof(prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; - }; - - ul4._endswith = function _endswith(string, suffix) - { - if (typeof(suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length-suffix.length) === suffix; - }; - - ul4._isoformat = function _isoformat(obj) - { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - if (hour || minute || second || ms) - { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; - }; - - ul4._mimeformat = function _mimeformat(obj) - { - var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; - }; - - ul4._weekday = function _weekday(obj) - { - var d = obj.getDay(); - return d ? d-1 : 6; - }; - - ul4._week = function _week(obj, firstweekday) - { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - var yearday = ul4._yearday(obj)+6; - var jan1 = new Date(obj.getFullYear(), 0, 1); - var jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) - { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday/7); - }; - - ul4._isleap = function _isleap(obj) - { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; - }; - - ul4._yearday = function _yearday(obj) - { - var leap = ul4._isleap(obj) ? 1 : 0; - var day = obj.getDate(); - switch (obj.getMonth()) - { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } - }; - - ul4._append = function _append(obj, items) - { - for (var i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; - }; - - ul4._insert = function _insert(obj, pos, items) - { - if (pos < 0) - pos += obj.length; - - for (var i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; - }; - - ul4._pop = function _pop(obj, pos) - { - if (pos < 0) - pos += obj.length; - - var result = obj[pos]; - obj.splice(pos, 1); - return result; - }; - - ul4._update = function _update(obj, others, kwargs) - { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (var i = 0; i < others.length; ++i) - { - var other = others[i]; - if (ul4._ismap(other)) - { - other.forEach(function(value, key){ - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) - { - for (var key in other) - ul4on._setmap(obj, key, other[key]); - } - else if (ul4._islist(other)) - { - for (var j = 0; j < other.length; ++j) - { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); - } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - for (var key in kwargs) - ul4on._setmap(obj, key, kwargs[key]); - return null; - }; - - ul4._clear = function _clear(obj) - { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) - { - for (var key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; - }; - - ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r, g, b, a) - { - var c = ul4._clone(this); - c._r = typeof(r) !== "undefined" ? r : 0; - c._g = typeof(g) !== "undefined" ? g : 0; - c._b = typeof(b) !== "undefined" ? b : 0; - c._a = typeof(a) !== "undefined" ? a : 255; - return c; - }, - - __repr__: function __repr__() - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) - return "#" + r[0] + g[0] + b[0] + a[0]; - else - return "#" + r + g + b + a; - } - else - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __str__: function __str__() - { - if (this._a !== 0xff) - { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; - } - else - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __iter__: function __iter__() - { - return { - obj: this, - index: 0, - next: function() { - if (this.index == 0) - { - ++this.index; - return {value: this.obj._r, done: false}; - } - else if (this.index == 1) - { - ++this.index; - return {value: this.obj._g, done: false}; - } - else if (this.index == 2) - { - ++this.index; - return {value: this.obj._b, done: false}; - } - else if (this.index == 3) - { - ++this.index; - return {value: this.obj._a, done: false}; - } - else - return {done: true}; - } - }; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "r": - return ul4.expose([], function r(){ return self._r; }); - case "g": - return ul4.expose([], function g(){ return self._g; }); - case "b": - return ul4.expose([], function b(){ return self._b; }); - case "a": - return ul4.expose([], function a(){ return self._a; }); - case "lum": - return ul4.expose([], function lum(){ return self.lum(); }); - case "hls": - return ul4.expose([], function hls(){ return self.hls(); }); - case "hlsa": - return ul4.expose([], function hlsa(){ return self.hlsa(); }); - case "hsv": - return ul4.expose([], function hsv(){ return self.hsv(); }); - case "hsva": - return ul4.expose([], function hsva(){ return self.hsva(); }); - case "witha": - return ul4.expose(["a"], function witha(a){ return self.witha(a); }); - case "withlum": - return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); - case "abslum": - return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); - case "rellum": - return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); - default: - return undefined; - } - }, - - __getitem__: function __getitem__(key) - { - var orgkey = key; - if (key < 0) - key += 4; - switch (key) - { - case 0: - return this._r; - case 1: - return this._g; - case 2: - return this._b; - case 3: - return this._a; - default: - return undefined; - } - }, - - __eq__: function __eq__(other) - { - if (ul4._iscolor(other)) - return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; - return false; - }, - - r: ul4.expose([], function r() { return this._r; }), - - g: ul4.expose([], function g() { return this._g; }), - - b: ul4.expose([], function b() { return this._b; }), - - a: ul4.expose([], function a() { return this._a; }), - - lum: ul4.expose([], function lum() {return this.hls()[1]; }), - - hls: ul4.expose([], - function hls() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var h, l, s; - var rc, gc, bc; - - l = (minc+maxc)/2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc-minc) / (maxc+minc); - else - s = (maxc-minc) / (2.0-maxc-minc); - rc = (maxc-r) / (maxc-minc); - gc = (maxc-g) / (maxc-minc); - bc = (maxc-b) / (maxc-minc); - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() - { - var hls = this.hls(); - return hls.concat(this._a/255.0); - } - ), - - hsv: ul4.expose([], - function hsv() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - var s = (maxc-minc) / maxc; - var rc = (maxc-r) / (maxc-minc); - var gc = (maxc-g) / (maxc-minc); - var bc = (maxc-b) / (maxc-minc); - var h; - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, s, v]; - } - ), - - hsva: ul4.expose([], - function hsva() - { - var hsv = this.hsv(); - return hsv.concat(this._a/255.0); - } - ), - - witha: ul4.expose(["a"], - function witha(a) - { - if (typeof(a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), - - withlum: ul4.expose(["lum"], - function withlum(lum) - { - if (typeof(lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - var hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } - ); - - ul4.TimeDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.TimeDelta", - - create: function create(days, seconds, microseconds) - { - var td = ul4._clone(this); - if (typeof(days) === "undefined") - days = 0; - if (typeof(seconds) === "undefined") - seconds = 0; - if (typeof(microseconds) === "undefined") - microseconds = 0; - - var total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); - - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - var total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); - days = Math.floor(total_seconds / 86400); - if (seconds < 0) - { - seconds += 86400; - --days; - } - - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, - - __repr__: function __repr__() - { - if (!this._microseconds) - { - if (!this._seconds) - { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, - - __str__: function __str__() - { - var v = []; - if (this._days) - { - v.push(this._days + " day"); - if (this._days !== -1 && this._days !== 1) - v.push("s"); - v.push(", "); - } - var seconds = this._seconds % 60; - var minutes = Math.floor(this._seconds / 60); - var hours = Math.floor(minutes / 60); - minutes = minutes % 60; - - v.push("" + hours); - v.push(":"); - v.push(ul4._lpad(minutes.toString(), "0", 2)); - v.push(":"); - v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) - { - v.push("."); - v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); - } - return v.join(""); - }, - - __bool__: function __bool__() - { - return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, - - __abs__: function __abs__() - { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._istimedelta(other)) - return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds < other._microseconds; - } - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds <= other._microseconds; - } - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds > other._microseconds; - } - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds >= other._microseconds; - } - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) - { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate() + days; - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds() + seconds; - var millisecond = date.getMilliseconds() + microseconds/1000; - return new Date(year, month, day, hour, minute, second, millisecond); - }, - - __add__: function __add__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); - else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __sub__: function __sub__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) - { - var myValue = this._days; - var otherValue = other._days; - var hasSeconds = this._seconds || other._seconds; - var hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) - { - myValue = myValue*86400+this._seconds; - otherValue = otherValue*86400 + other._seconds; - if (hasMicroseconds) - { - myValue = myValue * 1000000 + this._microseconds; - otherValue = otherValue * 1000000 + other._microseconds; - } - } - return myValue/otherValue; - } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "days": - return ul4.expose([], function days(){ return self._days; }); - case "seconds": - return ul4.expose([], function seconds(){ return self._seconds; }); - case "microseconds": - return ul4.expose([], function microseconds(){ return self._microseconds; }); - default: - return undefined; - } - }, - - days: function days() - { - return this._days; - }, - - seconds: function seconds() - { - return this._seconds; - }, - - microseconds: function microseconds() - { - return this._microseconds; - } - } - ); - - ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", - - create: function create(months) - { - var md = ul4._clone(this); - md._months = typeof(months) !== "undefined" ? months : 0; - return md; - }, - - __repr__: function __repr__() - { - if (!this._months) - return "monthdelta()"; - return "monthdelta(" + this._months + ")"; - }, - - __str__: function __str__() - { - if (this._months) - { - if (this._months !== -1 && this._months !== 1) - return this._months + " months"; - return this._months + " month"; - } - return "0 months"; - }, - - __bool__: function __bool__() - { - return this._months !== 0; - }, - - __abs__: function __abs__() - { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._ismonthdelta(other)) - return this._months === other._months; - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months < other._months; - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._ismonthdelta(other)) - return this._months <= other._months; - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months > other._months; - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._ismonthdelta(other)) - return this._months >= other._months; - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) - { - var year = date.getFullYear(); - var month = date.getMonth() + months; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds(); - var millisecond = date.getMilliseconds(); - - while (true) - { - // As the month might be out of bounds, we have to find out, what the real target month is - var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - var result = new Date(year, month, day, hour, minute, second, millisecond); - if (result.getMonth() === targetmonth) - return result; - --day; - } - }, - - __add__: function __add__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); - else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __sub__: function __sub__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); - else if (ul4._ismonthdelta(other)) - return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, - - __truediv__: function __truediv__(other) - { - if (ul4._ismonthdelta(other)) - return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "months": - return ul4.expose([], function months(){ return self._months; }); - default: - return undefined; - } - }, - - months: function months() - { - return this._months; - } - } - ); - - // When we don't have a real ``Set`` type, emulate one that supports strings - ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create() - { - var set = ul4._clone(this); - set.items = {}; - set.add.apply(set, arguments); - return set; - }, - - add: function add() - { - for (var i = 0; i < arguments.length; ++i) - { - this.items[arguments[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ self.add.apply(self, items); }); - default: - return undefined; - } - }, - - __contains__: function __contains__(item) - { - return this.items[item] || false; - }, - - __bool__: function __bool__() - { - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - - __repr__: function __repr__() - { - var v = []; - v.push("{"); - var i = 0; - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function(other) - { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (var item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function(other) - { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function(other) - { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) - { - var result = true; - other.forEach(function(value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in other.items) - { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); - } - } - ); - - var classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var ul4onname = name; - if (ul4onname.substr(ul4onname.length-3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length-3); - ul4onname = ul4onname.toLowerCase(); - var object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); - } - - })(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c49770b..5807205 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,763 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0.tgz", + "integrity": "sha512-nrvxS5u6QUN5gLl1GEakIcmOeoUHT1/gQtdMRq18WFURJ5osn4ppJLVSseMQo4zVWKJfBTF4muIYijXUnKlRLQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/helpers": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0.tgz", + "integrity": "sha512-/BM2vupkpbZXq22l1ALO7MqXJZH2k8bKVv8Y+pABFnzWdztDB/ZLveP5At21vLz5c2YtSE6p7j2FZEsqafMz5Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0.tgz", + "integrity": "sha512-9HdU8lrAc4FUZOy+y2w//kUhynSpkGIRYDzJW1oKJx7+v8m6UEAbAd2tSvxirsq2kJTXJZZS6Eo8FnUDUH0ZWw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0.tgz", + "integrity": "sha512-HdYG6vr4KgXHK0q1QRZ8guoYCF5rZjIdPlhcVY+j4EBK/FDR+cXRM5/6lQr3NIWDc7dO1KfgjG5rfH6lM89VBw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-define-map": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0.tgz", + "integrity": "sha512-acbCxYS9XufWxsBiclmXMK1CFz7en/XSYvHFcbb3Jb8BqjFEBrA46WlIsoSQTRG/eYN60HciUnzdyQxOZhrHfw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.0.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0.tgz", + "integrity": "sha512-5gLPwdDnYf8GfPsjS+UmZUtYE1jaXTFm1P+ymGobqvXbA0q3ANgpH60+C6zDrRAWXYbQXYvzzQC/r0gJVNNltQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz", + "integrity": "sha512-Zo+LGvfYp4rMtz84BLF3bavFTdf8y4rJtMPTe2J+rxYmnDOIeH8le++VFI/pRJU+rQhjqiXxE4LMaIau28Tv1Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0.tgz", + "integrity": "sha512-QdwmTTlPmT7TZcf30dnqm8pem+o48tVt991xXogE5CQCwqSpWKuzH2E9v8VWeccQ66a6/CmrLZ+bwp66JYeM5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.0.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0.tgz", + "integrity": "sha512-3o4sYLOsK6m0A7t1P0saTanBPmk5MAlxVnp9773Of4L8PMVLukU7loZix5KoJgflxSo2c2ETTzseptc0rQEp7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0.tgz", + "integrity": "sha512-fsSv7VogxzMSmGch6DwhKHGsciVXo7hbfhBgH9ZrgJMXKMjO7ASQTUfbVL7MU1uCfviyqjucazGK7TWPT9weuQ==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0.tgz", + "integrity": "sha512-CNeuX52jbQSq4j1n+R+21xrjbTjsnXa9n1aERbgHRD/p9h4Udkxr1n24yPMQmnTETHdnQDvkVSYWFw/ETAymYg==", + "dev": true, + "requires": { + "@babel/template": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0.tgz", + "integrity": "sha512-kjprWPDNVPZ/9pyLRXcZBvfjnFwqokmXTPTaC4AV8Ns7WRl7ewSxrB19AWZzQsC/WSPQLOw1ciR8uPYkAM1znA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helpers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0.tgz", + "integrity": "sha512-jbvgR8iLZPnyk6m/UqdXYsSxbVtRi7Pd3CzB4OPwPBnmhNG1DWjiiy777NTuoyIcniszK51R40L5pgfXAfHDtw==", + "dev": true, + "requires": { + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0.tgz", + "integrity": "sha512-RgJhNdRinpO8zibnoHbzTTexNs4c8ROkXFBanNDZTLHjwbdLk8J5cJSKulx/bycWTLYmKVNCkxRtVCoJnqPk+g==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0.tgz", + "integrity": "sha512-QsXmmjLrFADCcDQAfdQn7tfBRLjpTzRWaDpKpW4ZXW1fahPG4SvjcF1xfvVnXGC662RSExYXL+6DAqbtgqMXeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.0.0", + "@babel/plugin-syntax-async-generators": "^7.0.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", + "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.0.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", + "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.0.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", + "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", + "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", + "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", + "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", + "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0.tgz", + "integrity": "sha512-CiWNhSMZzj1n3uEKUUS/oL+a7Xi8hnPQB6GpC1WfL/ZYvxBLDBn14sHMo5EyOaeArccSonyk5jFIKMRRbrHOnQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", + "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", + "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0.tgz", + "integrity": "sha512-8LBm7XsHQiNISEmb+ejBiHi1pUihwUf+lrIwyVsXVbQ1vLqgkvhgayK5JnW3WXvQD2rmM0qxFAIyDE5vtMem2A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.0.0", + "@babel/helper-function-name": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.0.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", + "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz", + "integrity": "sha512-Fr2GtF8YJSXGTyFPakPFB4ODaEKGU04bPsAllAIabwoXdFrPxL0LVXQX5dQWoxOjjgozarJcC9eWGsj0fD6Zsg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", + "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", + "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0.tgz", + "integrity": "sha512-Ig74elCuFQ0mvHkWUq5qDCNI3qHWlop5w4TcDxdtJiOk8Egqe2uxDRY9XnXGSlmWClClmnixcoYumyvbAuj4dA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", + "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0.tgz", + "integrity": "sha512-mR7JN9vkwsAIot74pSwzn/2Gq4nn2wN0HKtQyJLc1ghAarsymdBMTfh+Q/aeR2N3heXs3URQscTLrKe3yUU7Yw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", + "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0.tgz", + "integrity": "sha512-CtSVpT/0tty/4405qczoIHm41YfFbPChplsmfBwsi3RTq/M9cHgVb3ixI5bqqgdKkqWwSX2sXqejvMKLuTVU+Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0.tgz", + "integrity": "sha512-BIcQLgPFCxi7YygtNpz5xj+7HxhOprbCGZKeLW6Kxsn1eHS6sJZMw4MfmqFZagl/v6IVa0AJoMHdDXLVrpd3Aw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz", + "integrity": "sha512-8EDKMAsitLkiF/D4Zhe9CHEE2XLh4bfLbb9/Zf3FgXYQOZyZYyg7EAel/aT2A7bHv62jwHf09q2KU/oEexr83g==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0.tgz", + "integrity": "sha512-EMyKpzgugxef+R1diXDwqw/Hmt5ls8VxfI8Gq5Lo8Qp3oKIepkYG4L/mvE2dmZSRalgL9sguoPKbnQ1m96hVFw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0.tgz", + "integrity": "sha512-BfAiF1l18Xr1shy1NyyQgLiHDvh/S7APiEM5+0wxTsQ+e3fgXO+NA47u4PvppzH0meJS21y0gZHcjnvUAJj8tQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.0.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0.tgz", + "integrity": "sha512-eWngvRBWx0gScot0xa340JzrkA+8HGAk1OaCHDfXAjkrTFkp73Lcf+78s7AStSdRML5nzx5aXpnjN1MfrjkBoA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.0.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", + "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", + "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", + "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", + "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", + "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", + "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/preset-env": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.0.0.tgz", + "integrity": "sha512-Fnx1wWaWv2w2rl+VHxA9si//Da40941IQ29fKiRejVR7oN1FxSEL8+SyAX/2oKIye2gPvY/GBbJVEKQ/oi43zQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-json-strings": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.0.0", + "@babel/plugin-syntax-async-generators": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-dotall-regex": "^7.0.0", + "@babel/plugin-transform-duplicate-keys": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-amd": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-modules-systemjs": "^7.0.0", + "@babel/plugin-transform-modules-umd": "^7.0.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typeof-symbol": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "browserslist": "^4.1.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/template": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0.tgz", + "integrity": "sha512-VLQZik/G5mjYJ6u19U3W2u7eM+rA/NGzH+GtHDFFkLTKLW66OasFrxZ/yK7hkyQcswrmvugFyZpDFRW0DjcjCw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/traverse": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0.tgz", + "integrity": "sha512-ka/lwaonJZTlJyn97C4g5FYjPOx+Oxd3ab05hbDr1Mx9aP1FclJ+SUHyLx3Tx40sGmOVJApDxE6puJhd3ld2kw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/helper-function-name": "^7.0.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", + "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, "@types/chai": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz", "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==", "dev": true }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/mocha": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.1.tgz", @@ -32,12 +783,42 @@ "negotiator": "0.6.1" } }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -50,6 +831,12 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -98,12 +885,34 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "browserslist": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", + "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000884", + "electron-to-chromium": "^1.3.62", + "node-releases": "^1.0.0-alpha.11" + } + }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", @@ -116,6 +925,12 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "caniuse-lite": { + "version": "1.0.30000884", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz", + "integrity": "sha512-ibROerckpTH6U5zReSjbaitlH4gl5V4NWNCBzRNCa3GEDmzzkfStk+2k5mO4ZDM6pwtdjbZ3hjvsYhPGVLWgNw==", + "dev": true + }, "chai": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", @@ -130,12 +945,55 @@ "type-detect": "^4.0.0" } }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", @@ -163,6 +1021,15 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -175,6 +1042,12 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -184,6 +1057,12 @@ "ms": "2.0.0" } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -217,6 +1096,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "electron-to-chromium": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz", + "integrity": "sha512-x09ndL/Gjnuk3unlAyoGyUg3wbs4w/bXurgL7wL913vXHAOWmMhrLf1VNGRaMLngmadd5Q8gsV9BFuIr6rP+Xg==", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -235,12 +1120,42 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", @@ -279,6 +1194,34 @@ "vary": "~1.1.2" } }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -312,6 +1255,21 @@ } } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -350,6 +1308,31 @@ "path-is-absolute": "^1.0.0" } }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -422,6 +1405,15 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "ipaddr.js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", @@ -433,12 +1425,132 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-levenshtein": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", + "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, "lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", @@ -507,12 +1619,27 @@ "lodash.isarray": "^3.0.0" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", "dev": true }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -525,12 +1652,42 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", @@ -618,6 +1775,34 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "node-releases": { + "version": "1.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", + "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -636,6 +1821,18 @@ "wrappy": "1" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -648,6 +1845,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -660,6 +1863,24 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", @@ -676,6 +1897,31 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -694,12 +1940,187 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", + "dev": true + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "rollup": { + "version": "0.65.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.65.1.tgz", + "integrity": "sha512-46SzczqVygjcFVWsTBEg5x6hYVab9D/SFXWMkRgkGrBYxaUDvc442wwciO8Ow5DK4VCTwAC2CsX2Tpb89U9sXA==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*" + } + }, + "rollup-plugin-babel": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.0.3.tgz", + "integrity": "sha512-/PP0MgbPQyRywI4zRIJim6ySjTcOLo4kQbEbROqp9kOR3kHC3FeU++QpBDZhS2BcHtJTVZMVbBV46flbBN5zxQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.3.0" + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-plugin-uglify": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-5.0.2.tgz", + "integrity": "sha512-CRRyMgKjTwTx1GXnn+v1VYV+6De5NyPB1UBStsQIQ+asrxvP7dK43cg2pf1vyFNr/NIHGvfYAR9Yo4j+5ZMQsw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "jest-worker": "^23.2.0", + "uglify-js": "^3.4.8" + } + }, + "rollup-pluginutils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz", + "integrity": "sha512-JZS8aJMHEHhqmY2QVPMXwKP6lsD1ShkrcGYjhAIvqKKdXQyPHw/9NF0tl3On/xOJ4ACkxfeG7AF+chfCN1NpBg==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -745,6 +2166,19 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", @@ -755,12 +2189,27 @@ "source-map": "^0.6.0" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", @@ -770,6 +2219,18 @@ "has-flag": "^1.0.0" } }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "ts-node": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.1.0.tgz", @@ -815,12 +2276,70 @@ "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", "dev": true }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 7b67a5a..383c30d 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,12 @@ "blueimp-md5": "^2.10.0" }, "devDependencies": { + "@babel/core": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "rollup": "^0.65.0", + "rollup-plugin-babel": "^4.0.2", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-uglify": "^5.0.2", "@types/chai": "^4.1.3", "@types/mocha": "^5.2.1", "@types/node": "^10.3.2", diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..00ee830 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,29 @@ +const uglify = require('rollup-plugin-uglify'); +const sourcemaps = require('rollup-plugin-sourcemaps'); +const babel = require('rollup-plugin-babel'); + +export default { + input: './dist/es2015/livingsdk.js', + output: { + file: './dist/umd/livingsdk.js', + format: 'umd', + name: 'livingsdk', + sourcemap: true + }, + plugins: [ + uglify.uglify(), + sourcemaps(), + babel( + { + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "entry" + } + ] + ] + } + ) + ] +} \ No newline at end of file diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 476c35e..80607bb 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,9 +1,10 @@ rm -Rf ./dist echo build LivingApps.Javascript.LivingAPI -tsc -p ./config/tsconfig.es2015.json & -tsc -p ./tsconfig.json +./node_modules/typescript/bin/tsc -p ./config/tsconfig.es2015.json wait echo copy modules cp -R ./src/modules ./dist/es2015/ -cp -R ./src/modules ./dist/umd/ -echo finished copying \ No newline at end of file +echo run rollup +./node_modules/rollup/bin/rollup -c +echo copy d.ts file +cp ./dist/es2015/livingsdk.d.ts ./dist/umd/livingsdk.d.ts \ No newline at end of file diff --git a/src/livingsdk.ts b/src/livingsdk.ts index b2a3b73..fb692ba 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -1,25 +1,15 @@ import axios, { AxiosResponse } from 'axios'; +///@ts-ignore +import livingApi from './modules/livingapi'; +///@ts-ignore +import { ul4, ul4on } from './modules/ul4'; -declare let module: any; -declare let require: any; -declare let window: any; -export type Auth_Token = string; +export type Auth_Token = string; export type LivingApi = any; export type LAPIRecord = any; - let commonjs = (typeof module === 'object' && module.exports); let nodejs: any = {}; -let ul4on: any; -let livingApi: any; -if (commonjs) { - livingApi = require('./modules/livingapi'); - nodejs.https = require('https') - ul4on = require('./modules/ul4').ul4on; -} else { - ul4on = window.ul4on; - livingApi = window.livingapi; -} export interface LivingSDKOptions { url?: string; loginRequired?: boolean; diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index 844e68a..e52d445 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -1,990 +1,900 @@ -(function(root){ - - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - let la = {}; - - let ul4, ul4on; - - if (commonjs) { - ul4 = require('./ul4.js').ul4; - ul4on = require('./ul4').ul4on; - module.exports = la; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - root.livingapi = la; - } - la.Base = ul4._inherit( - ul4.Proto, - { - create: function() - { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - return this[name]; - }, - - ul4onload: function ul4onload(decoder) - { - for (var i = 0, iter = decoder.loadcontent();; ++i) - { - var iteritem = iter.next(); - if (iteritem.done) - break; - if (i < this._ul4onattrs.length) - this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); - } - for (; i < this._ul4onattrs.length; ++i) - { - this._setDefaultUL4ONAttr(this._ul4onattrs[i]); - } - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - this[name] = value; - }, - - _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) - { - this[name] = null; +import { ul4, ul4on } from './ul4'; +let amd = (typeof define === 'function' && define.amd); +let commonjs = (typeof module === 'object' && module.exports); + +let la = {}; + + +la.Base = ul4._inherit( + ul4.Proto, + { + create: function () { + return ul4._clone(this); + }, + + ul4ondump: function ul4ondump(encoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + return this[name]; + }, + + ul4onload: function ul4onload(decoder) { + for (var i = 0, iter = decoder.loadcontent(); ; ++i) { + var iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); } - } - ); - - la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() - { - return ""; - }, - - // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) - geodist: function geodist(geo1, geo2) - { - var sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; - var sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; - var deg2rad = Math.PI/180; // Conversion factor degree -> radians - var radius = 6378.137; // Equatorial radius of earth in km - var flat = 1/298.257223563; // Earth flattening - - var lat1 = geo1.lat * deg2rad; - var long1 = geo1.long * deg2rad; - var lat2 = geo2.lat * deg2rad; - var long2 = geo2.long * deg2rad; - var F = (lat1 + lat2)/2; - var G = (lat1 - lat2)/2; - var l = (long1 - long2)/2; - var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); - var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); - var w = Math.atan(Math.sqrt(S/C)); - var D = 2 * w * radius; - var T = Math.sqrt(S*C)/w; - var H1 = (3*T-1)/(2*C); - var H2 = (3*T+1)/(2*S); - var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); - return s; + for (; i < this._ul4onattrs.length; ++i) { + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); } + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + this[name] = value; + }, + + _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) { + this[name] = null; } - ); - - la.FlashMessage = ul4._inherit( - la.Base, - { - _ul4onattrs: ["timestamp", "type", "title", "message"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.Globals = ul4._inherit( + la.Base, + { + _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], + + __repr__: function repr() { + return ""; + }, + + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + geodist: function geodist(geo1, geo2) { + var sqsin = function sqsin(x) { x = Math.sin(x); return x * x }; + var sqcos = function sqsos(x) { x = Math.cos(x); return x * x }; + var deg2rad = Math.PI / 180; // Conversion factor degree -> radians + var radius = 6378.137; // Equatorial radius of earth in km + var flat = 1 / 298.257223563; // Earth flattening + + var lat1 = geo1.lat * deg2rad; + var long1 = geo1.long * deg2rad; + var lat2 = geo2.lat * deg2rad; + var long2 = geo2.long * deg2rad; + var F = (lat1 + lat2) / 2; + var G = (lat1 - lat2) / 2; + var l = (long1 - long2) / 2; + var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + var w = Math.atan(Math.sqrt(S / C)); + var D = 2 * w * radius; + var T = Math.sqrt(S * C) / w; + var H1 = (3 * T - 1) / (2 * C); + var H2 = (3 * T + 1) / (2 * S); + var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; } - ); - - la.App = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], - - insert: function (values) - { - return this.globals.Login._insert(this, values); - }, - - __repr__: function repr() - { - return ""; - } + } +); + +la.FlashMessage = ul4._inherit( + la.Base, + { + _ul4onattrs: ["timestamp", "type", "title", "message"], + + __repr__: function repr() { + return ""; } - ); - - la.View = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.App = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], + + insert: function (values) { + return this.globals.Login._insert(this, values); + }, + + __repr__: function repr() { + return ""; } - ); - - la.DataSource = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "app", "apps"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.View = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + + __repr__: function repr() { + return ""; } - ); - - la.Record = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], - - delete: function () - { + } +); + +la.DataSource = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "app", "apps"], + + __repr__: function repr() { + return ""; + } + } +); + +la.Record = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + + delete: function () { return this.app.globals.Login._delete(this); }, - update: function (values) - { + update: function (values) { return this.app.globals.Login._update(this, values); }, - - __repr__: function repr() - { - return ""; - }, - - search: function search(search) - { - for (var identifier in search) - { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) - { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } - } - return true; - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "values") - return this._sparsevalues; - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "values") - { - this._sparsevalues = value; - this._values = null; - this._fields = null; + + __repr__: function repr() { + return ""; + }, + + search: function search(search) { + for (var identifier in search) { + var fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; } - else - this[name] = value; - } - } - ); - - Object.defineProperty(la.Record, "values", { - get: function() - { - if (this._values === null) - { - this._values = ul4on._havemap ? new Map() : {}; - var self = this; - this.app.controls.forEach(function(control, id){ - var fieldvalue = self._sparsevalues.get(control.identifier); - if (typeof(fieldvalue) === "undefined") - fieldvalue = null; - self._values.set(id, fieldvalue); - }); } - return this._values; - } - }); - - Object.defineProperty(la.Record, "fields", { - get: function() - { - if (this._fields === null) - { - this._fields = ul4on._havemap ? new Map() : {}; - var self = this; - this.values.forEach(function(value, id){ - var field = la.Field.create(self.app.controls.get(id), self.app, value); - self._fields.set(id, field); - }); + return true; + }, + + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + if (name === "values") + return this._sparsevalues; + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + if (name === "values") { + this._sparsevalues = value; + this._values = null; + this._fields = null; } - return this._fields; - } - }); - - la.Control = ul4._inherit( - la.Base, - { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], - - __repr__: function repr() - { - return ""; - }, - - asjson: function(value) - { - return value; - }, - - _logsearch: function _logsearch(value, search) - { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, - - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) - { + else + this[name] = value; + } + } +); + +Object.defineProperty(la.Record, "values", { + get: function () { + if (this._values === null) { + this._values = ul4on._havemap ? new Map() : {}; + var self = this; + this.app.controls.forEach(function (control, id) { + var fieldvalue = self._sparsevalues.get(control.identifier); + if (typeof (fieldvalue) === "undefined") + fieldvalue = null; + self._values.set(id, fieldvalue); + }); + } + return this._values; + } +}); + +Object.defineProperty(la.Record, "fields", { + get: function () { + if (this._fields === null) { + this._fields = ul4on._havemap ? new Map() : {}; + var self = this; + this.values.forEach(function (value, id) { + var field = la.Field.create(self.app.controls.get(id), self.app, value); + self._fields.set(id, field); + }); + } + return this._fields; + } +}); + +la.Control = ul4._inherit( + la.Base, + { + type: null, + subtype: null, + _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], + + __repr__: function repr() { + return ""; + }, + + asjson: function (value) { + return value; + }, + + _logsearch: function _logsearch(value, search) { + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); + }, + + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search: function search(value, search) { + return false; + } + } +); + +la.BoolControl = ul4._inherit( + la.Control, + { + type: "bool", + __type__: "BoolControl", + + // ``search`` must by ``null``, ``false`` or ``true`` + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else return false; - } } - ); - - la.BoolControl = ul4._inherit( - la.Control, - { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; - } + } +); + +la.IntControl = ul4._inherit( + la.Control, + { + type: "int", + __type__: "IntControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; } - ); - - la.IntControl = ul4._inherit( - la.Control, - { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else + } +); + +la.NumberControl = ul4._inherit( + la.Control, + { + type: "number", + __type__: "NumberControl", + + // ``search.value`` must by ``null`` or an integer + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") { + if (value === null) return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); } + else + return false; } - ); - - la.NumberControl = ul4._inherit( - la.Control, - { - type: "number", - __type__: "NumberControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") + } +); + +la.StringControl = ul4._inherit( + la.Control, + { + type: "string", + + asjson: function (value) { + return value; + }, + + search: function search(value, search) { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") { + if (search.value === null || value === null) return search.value === value; - else if (search.operator === "range") - { - if (value === null) - return false; - return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); - } else - return false; + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; } } - ); - - la.StringControl = ul4._inherit( - la.Control, - { - type: "string", + } +); + +la.TextControl = ul4._inherit( + la.StringControl, + { + subtype: "text", + __type__: "TextControl" + } +); + +la.EmailControl = ul4._inherit( + la.StringControl, + { + subtype: "email", + __type__: "EmailControl" + } +); + +la.URLControl = ul4._inherit( + la.StringControl, + { + subtype: "url", + __type__: "URLControl" + } +); + +la.TelControl = ul4._inherit( + la.StringControl, + { + subtype: "tel" + } +); + +la.PasswordControl = ul4._inherit( + la.StringControl, + { + subtype: "password" + } +); + +la.TextAreaControl = ul4._inherit( + la.StringControl, + { + subtype: "textarea", + __type__: "TextAreaControl" + } +); - asjson: function (value) - { +la.DateControl = ul4._inherit( + la.Control, + { + type: "date", + subtype: "date", + __type__: "DateControl", + + asjson: function (value) { + if (value instanceof Date) { + value = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; + } return value; }, - search: function search(value, search) - { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") - { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; - } - } - } - ); - - la.TextControl = ul4._inherit( - la.StringControl, - { - subtype: "text", - __type__: "TextControl" - } - ); - - la.EmailControl = ul4._inherit( - la.StringControl, - { - subtype: "email", - __type__: "EmailControl" - } - ); - - la.URLControl = ul4._inherit( - la.StringControl, - { - subtype: "url", - __type__: "URLControl" - } - ); - - la.TelControl = ul4._inherit( - la.StringControl, - { - subtype: "tel" - } - ); - - la.PasswordControl = ul4._inherit( - la.StringControl, - { - subtype: "password" - } - ); - - la.TextAreaControl = ul4._inherit( - la.StringControl, - { - subtype: "textarea", - __type__: "TextAreaControl" - } - ); - - la.DateControl = ul4._inherit( - la.Control, - { - type: "date", - subtype: "date", - __type__: "DateControl", - - asjson: function (value) - { - if (value instanceof Date){ - value = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, - - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) - { - this._logsearch(value, search); - - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); - - if (search.operator === "equals") + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; + }, + + // searchvalue must be ``null``, a ``Date`` object or a string + search: function search(value, search) { + this._logsearch(value, search); + + var searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") { + if (searchvalue === null || value === null) return searchvalue === value; - else if (search.operator === "contains") - { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } else - return false; + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; } + else + return false; } - ); - - la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M"; - else - return "%m/%d/%Y %H:%M"; - } + } +); + +la.DatetimeMinuteControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimeminute", + __type__: "DatetimeMinuteControl", + + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; } - ); - - la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", - - formatstring: function formatstring(language) - { - language = language || this.app.language; - - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } + } +); + +la.DatetimeSecondControl = ul4._inherit( + la.DateControl, + { + subtype: "datetimesecond", + __type__: "DatetimeMinuteSecond", + + formatstring: function formatstring(language) { + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; } - ); - - la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), - - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (this.lookupapp === null) - { - if (search.operator === "equals") - { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } + } +); + +la.LookupControl = ul4._inherit( + la.Control, + { + type: "lookup", + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), + + // ``search.value`` must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (this.lookupapp === null) { + if (search.operator === "equals") { + if (value === null) + return search.value === null; else - return false; + return value.key === search.value; } else - { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } + return false; } - } - ); - - la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } - ); - - la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } - ); - - la.LookupChoiceControl = ul4._inherit( - la.LookupControl, - { - subtype: "choice", - __type__: "LookupChoiceControl" - } - ); - - la.AppLookupControl = ul4._inherit( - la.Control, - { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { + else { if (value === null || search.value === null) return value === search.value; else return value.search(search); } } - ); - - la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } - ); - - la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "radio", - __type__: "AppLookupRadioControl" - } - ); - - la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "choice", - __type__: "AppLookupChoiceControl" - } - ); - - la.MultipleLookupControl = ul4._inherit( - la.LookupControl, - { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { - if (this.lookupapp === null) - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].key === search.value) - return true; - } - return false; - } - else - { - if (search.value === null) - return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { - if (value[i].search(search.value)) - return true; - } - return false; - } + } +); + +la.LookupSelectControl = ul4._inherit( + la.LookupControl, + { + subtype: "select", + __type__: "LookupSelectControl" + } +); + +la.LookupRadioControl = ul4._inherit( + la.LookupControl, + { + subtype: "radio", + __type__: "LookupRadioControl" + } +); + +la.LookupChoiceControl = ul4._inherit( + la.LookupControl, + { + subtype: "choice", + __type__: "LookupChoiceControl" + } +); + +la.AppLookupControl = ul4._inherit( + la.Control, + { + type: "applookup", + _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); + } + } +); + +la.AppLookupSelectControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "select", + __type__: "AppLookupSelectControl" + } +); + +la.AppLookupRadioControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "radio", + __type__: "AppLookupRadioControl" + } +); + +la.AppLookupChoiceControl = ul4._inherit( + la.AppLookupControl, + { + subtype: "choice", + __type__: "AppLookupChoiceControl" + } +); + +la.MultipleLookupControl = ul4._inherit( + la.LookupControl, + { + type: "multiplelookup", + + // search.value must be ``null`` or a ``LookupItem`` key + // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (search.operator === "equals") { + if (this.lookupapp === null) { + for (var i = 0; i < value.length; ++i) { + if (value[i].key === search.value) + return true; } - } - else return false; - } - } - ); - - la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "select", - __type__: "MultipleLookupSelectControl" - } - ); - - la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, - { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" - } - ); - - la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, - { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) - { - if (search.operator === "equals") - { + } + else { if (search.value === null) return value.length === 0; - else - { - for (var i = 0; i < value.length; ++i) - { + else { + for (var i = 0; i < value.length; ++i) { if (value[i].search(search.value)) return true; } return false; } } - else - return false; } + else + return false; } - ); - - la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } - ); - - la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } - ); - - la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", - - - asjson: function(value) - { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - }, - - __type__: "GeoControl" - } - ); - - la.FileControl = ul4._inherit( - la.Control, - { - type: "file", - __type__: "FileControl" - } - ); - - la.ButtonControl = ul4._inherit( - la.Control, - { - type: "button", - __type__: "ButtonControl" - } - ); - - la.Field = ul4._inherit( - la.Base, - { - create: function create(control, record, value) - { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, - - search: function search(searchvalue) - { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() - { - return ""; + } +); + +la.MultipleLookupSelectControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "select", + __type__: "MultipleLookupSelectControl" + } +); + +la.MultipleLookupCheckboxControl = ul4._inherit( + la.MultipleLookupControl, + { + subtype: "checkbox", + __type__: "MultipleLookupCheckboxControl" + } +); + +la.MultipleAppLookupControl = ul4._inherit( + la.AppLookupControl, + { + type: "multipleapplookup", + + // ``search.value`` must be an object containing the search criteria for the referenced record + search: function search(value, search) { + if (search.operator === "equals") { + if (search.value === null) + return value.length === 0; + else { + for (var i = 0; i < value.length; ++i) { + if (value[i].search(search.value)) + return true; + } + return false; + } } + else + return false; } - ); - - la.LookupItem = ul4._inherit( - la.Base, - { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.MultipleAppLookupSelectControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "select", + __type__: "MultipleAppLookupSelectControl" + } +); + +la.MultipleAppLookupCheckboxControl = ul4._inherit( + la.MultipleAppLookupControl, + { + subtype: "checkbox", + __type__: "MultipleAppLookupCheckboxControl" + } +); + +la.GeoControl = ul4._inherit( + la.Control, + { + type: "geo", + + + asjson: function (value) { + if (la.Geo.isprotoof(value)) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + }, + + __type__: "GeoControl" + } +); + +la.FileControl = ul4._inherit( + la.Control, + { + type: "file", + __type__: "FileControl" + } +); + +la.ButtonControl = ul4._inherit( + la.Control, + { + type: "button", + __type__: "ButtonControl" + } +); + +la.Field = ul4._inherit( + la.Base, + { + create: function create(control, record, value) { + var field = la.Base.create.call(this); + field.control = control; + field.record = record; + field.value = value; + return field; + }, + + search: function search(searchvalue) { + return this.control.search(this.value, searchvalue); + }, + + __repr__: function repr() { + return ""; } - ); - - la.User = ul4._inherit( - la.Base, - { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.LookupItem = ul4._inherit( + la.Base, + { + _ul4onattrs: ["key", "label"], + + __repr__: function repr() { + return ""; } - ); - - la.File = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.User = ul4._inherit( + la.Base, + { + _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], + + __repr__: function repr() { + return ""; } - ); - - la.Geo = ul4._inherit( - la.Base, - { - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.File = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], + + __repr__: function repr() { + return ""; } - ); - - la.Attachment = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.Geo = ul4._inherit( + la.Base, + { + _ul4onattrs: ["lat", "long", "info"], + + __repr__: function repr() { + return ""; } - ); - - la.NoteAttachment = ul4._inherit( - la.Attachment, - { - type: "noteattachment", - __type__: "NoteAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.URLAttachment = ul4._inherit( - la.Attachment, - { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.FileAttachment = ul4._inherit( - la.Attachment, - { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) - } - ); - - la.ImageAttachment = ul4._inherit( - la.Attachment, - { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) - } - ); - - la.JSONAttachment = ul4._inherit( - la.Attachment, - { - type: "jsonattachment", - __type__: "JSONAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) - { - if (name === "value") - return ul4._asjson(this.value); - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) - { - if (name === "value") - this.value = ul4._fromjson(value); - else - this[name] = value - } + } +); + +la.Attachment = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "record", "label", "active"], + + __repr__: function repr() { + return ""; } - ); - - la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.NoteAttachment = ul4._inherit( + la.Attachment, + { + type: "noteattachment", + __type__: "NoteAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.URLAttachment = ul4._inherit( + la.Attachment, + { + type: "urlattachment", + __type__: "URLAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.FileAttachment = ul4._inherit( + la.Attachment, + { + type: "fileattachment", + __type__: "FileAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + } +); + +la.ImageAttachment = ul4._inherit( + la.Attachment, + { + type: "imageattachment", + __type__: "ImageAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + } +); + +la.JSONAttachment = ul4._inherit( + la.Attachment, + { + type: "jsonattachment", + __type__: "JSONAttachment", + _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), + _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + }, + + _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value } - ); - - la.Category = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], - - __repr__: function repr() - { - var v = []; - var category = this; - while (category !== null) - { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } + } +); + +la.Installation = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "name"], + + __repr__: function repr() { + return ""; } - ); - - la.KeyView = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], - - __repr__: function repr() - { - return ""; + } +); + +la.Category = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + + __repr__: function repr() { + var v = []; + var category = this; + while (category !== null) { + v.splice(0, 0, category.identifier); + category = category.parent; } + return ""; } - ); - - la.AppParameter = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], - - __repr__: function repr() - { - return ""; - } + } +); + +la.KeyView = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "identifier", "name", "key", "user"], + + __repr__: function repr() { + return ""; + } + } +); + +la.AppParameter = ul4._inherit( + la.Base, + { + _ul4onattrs: ["id", "app", "identifier", "description", "value"], + + __repr__: function repr() { + return ""; } - ); - - var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "AppLookupControl", - "AppLookupSelectControl", - "AppLookupRadioControl", - "AppLookupChoiceControl", - "MultipleLookupControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "MultipleAppLookupControl", - "MultipleAppLookupSelectControl", - "MultipleAppLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); - } - - })(this); \ No newline at end of file + } +); + +var classes = [ + "Globals", + "App", + "View", + "DataSource", + "Record", + "BoolControl", + "IntControl", + "NumberControl", + "TextControl", + "EmailControl", + "URLControl", + "TelControl", + "PasswordControl", + "TextAreaControl", + "DateControl", + "DatetimeMinuteControl", + "DatetimeSecondControl", + "LookupControl", + "LookupSelectControl", + "LookupRadioControl", + "LookupChoiceControl", + "AppLookupControl", + "AppLookupSelectControl", + "AppLookupRadioControl", + "AppLookupChoiceControl", + "MultipleLookupControl", + "MultipleLookupSelectControl", + "MultipleLookupCheckboxControl", + "MultipleAppLookupControl", + "MultipleAppLookupSelectControl", + "MultipleAppLookupCheckboxControl", + "GeoControl", + "FileControl", + "ButtonControl", + "Field", + "LookupItem", + "User", + "File", + "Geo", + "NoteAttachment", + "URLAttachment", + "FileAttachment", + "ImageAttachment", + "JSONAttachment", + "Installation", + "Category", + "KeyView", + "AppParameter" +]; + +for (var i = 0; i < classes.length; ++i) { + var name = classes[i]; + var object = la[name]; + ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); +} + +export default la; \ No newline at end of file diff --git a/src/modules/ul4.js b/src/modules/ul4.js index cad6ec8..5efbe33 100644 --- a/src/modules/ul4.js +++ b/src/modules/ul4.js @@ -29,8776 +29,7731 @@ /*jslint vars: true */ -(function(undefined){ - - let amd = (typeof define === 'function' && define.amd); - let commonjs = (typeof module === 'object' && module.exports); - - var root = this, ul4 = {}, ul4on = {}; - - root.ul4 = ul4; - - root.ul4on = ul4on; - - - if (commonjs) { - module.exports.ul4 = ul4; - module.exports.ul4on = ul4on; - } else { - ul4 = root.ul4; - ul4on = root.ul4on; - } - - ul4.version = "41"; - - // - // UL4ON - // - - ul4on._registry = {}; - - ul4on._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); - - ul4on._havemapconstructor = false; - - if (ul4on._havemap) - { - try - { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) - { - } - } - - ul4on._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); - - ul4on._havesetconstructor = false; - - if (ul4on._haveset) - { - try - { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) - { - } - } - - // Function used for making maps, when the Map constructor doesn't work - ul4on._makemap = function _makemap() - { - var map = new Map(); - - for (var i = 0; i < arguments.length; ++i) - { - var argument = arguments[i]; - map.set(argument[0], argument[1]); - } - return map; - }; - - // Function that creates en empty Map (if supported) or an empty object - ul4on._emptymap = function _emptymap() - { - return ul4on._havemap ? new Map() : {}; - }; - - // Function that adds a (key, value) item to an object (or map) - if (ul4on._havemap) - { - ul4on._setmap = function _setmap(map, key, value) - { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else - map[key] = value; - }; - } - else - { - ul4on._setmap = function _setmap(map, key, value) - { - map[key] = value; - }; - } - - // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) - if (ul4on._haveset) - { - ul4on._makeset = function _makeset() - { - var set = this._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - else - { - ul4on._makeset = function _makeset() - { - var set = ul4._Set.create(); - - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; - } - - // Register the object ``obj`` under the name ``name`` with the UL4ON machinery - ul4on.register = function register(name, obj) - { - obj.ul4onname = name; - ul4on._registry[name] = function(){return obj.create();}; - }, - - // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) - { - var encoder = ul4on.Encoder.create(indent); - encoder.dump(obj); - return encoder.finish(); - }, - - // Load an object from the string ``data``. - // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) - { - var decoder = ul4on.Decoder.create(data, registry); - return decoder.load(); - }, - - // Helper "class" for encoding - ul4on.Encoder = { - // Create a new Encoder object - create: function create(indent) - { - var encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line) - { - var i, oldindent; - - if (this.indent !== null) - { - for (i = 0; i < this._level; ++i) - this.data.push(this.indent); - } - else - { - if (this.data.length) - this.data.push(" "); - } - this.data.push(line); - - if (arguments.length > 1) - { - oldindent = this.indent; - this.indent = null; - for (i = 1; i < arguments.length; ++i) - this.dump(arguments[i]); - this.indent = oldindent; - } - - if (this.indent !== null) - this.data.push("\n"); - }, - - // Return the complete string written to the buffer - finish: function finish() - { - return this.data.join(""); - }, - - dump: function dump(obj) - { - if (obj === null) - this._line("n"); - else if (typeof(obj) == "boolean") - this._line(obj ? "bT" : "bF"); - else if (typeof(obj) == "number") - { - var type = (Math.round(obj) == obj) ? "i" : "f"; - this._line(type + obj); - } - else if (typeof(obj) == "string") - { - var index = this._strings2index[obj]; - if (typeof(index) !== "undefined") - { - this._line("^" + index); - } - else - { - this._strings2index[obj] = this._backrefs++; - this._line("S" + ul4._str_repr(obj)); - } - } - else if (ul4._iscolor(obj)) - this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); - else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); - else if (ul4._istimedelta(obj)) - this._line("t", obj.days(), obj.seconds(), obj.microseconds()); - else if (ul4._ismonthdelta(obj)) - this._line("m", obj.months()); - else if (typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.slice)) - this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) - { - if (obj.__id__) - { - var index = this._ids2index[obj.__id__]; - if (typeof(index) != "undefined") - { - this._line("^" + index); - return; - } - } - if (obj.__id__) - this._ids2index[obj.__id__] = this._backrefs++; - this._line("O", obj.ul4onname); - ++this._level; - obj.ul4ondump(this); - --this._level; - this._line(")"); - } - else if (ul4._islist(obj)) - { - this._line("l"); - ++this._level; - for (var i in obj) - this.dump(obj[i]); - --this._level; - this._line("]"); - } - else if (ul4._ismap(obj)) - { - this._line("e"); - ++this._level; - obj.forEach(function(value, key) { - this.dump(key); - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else if (ul4._isdict(obj)) - { - this._line("d"); - ++this._level; - for (var key in obj) - { - this.dump(key); - this.dump(obj[key]); - } - --this._level; - this._line("}"); - } - else if (ul4._isset(obj)) - { - this._line("y"); - ++this._level; - obj.forEach(function(value) { - this.dump(value); - }, this); - --this._level; - this._line("}"); - } - else - throw "can't handle object"; - } - }; - - // Helper "class" for decoding - ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) - { - var decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof(registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, - - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() - { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, - - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() - { - var re_white = /\s/; - - for (;;) - { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - var c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; - } - }, - - // Read ``size`` characters from the buffer - read: function read(size) - { - if (this.pos+size > this.length) - size = this.length-this.pos; - var result = this.data.substring(this.pos, this.pos+size); - this.pos += size; - return result; - }, - - // "unread" one character - backup: function backup() - { - --this.pos; - }, - - // Read a number from the buffer - readnumber: function readnumber() - { - var re_digits = /[-+0123456789.eE]/, value = ""; - for (;;) - { - var c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else - { - var result = parseFloat(value); - if (result == NaN) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; - } - } - }, - - _beginfakeloading: function _beginfakeloading() - { - var oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, - - _endfakeloading: function _endfakeloading(oldpos, value) - { - this.backrefs[oldpos] = value; - }, - - _readescape: function _readescape(escapechar, length) - { - var chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - var codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, - - // Load the next object from the buffer - load: function load() - { - var typecode = this.readblackchar(); - var result; - switch (typecode) - { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - var delimiter = this.readblackchar(); - for (;;) - { - var c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") - { - var c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); - else - result.push("\\" + c2); - } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load()/1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - var key = this.load(); - var value = this.load(); - ul4on._setmap(result, key, value); - } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (;;) - { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - var oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - var name = this.load(); - var proto; - if (this.registry !== null) - { - proto = this.registry[name]; - if (typeof(proto) === "undefined") - proto = ul4on._registry[name]; - } - else - proto = ul4on._registry[name]; - if (typeof(proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; - } - }, - - // Return an iterator for loading the content of a object - loadcontent: function load(loadcontent) - { - let self = this; - return { - next: function() - { - let typecode = self.readblackchar(); - self.backup(); - if (typecode == ")") - return {done: true}; - else - return {done: false, value: self.load()}; - } - }; - } - }; - - - // - // UL4 - // - - // REs for parsing JSON - ul4._rvalidchars = /^[\],:{}\s]*$/; - ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - - /// Helper functions - - // Crockford style object creation - ul4._simpleclone = function _simpleclone(obj) - { - function F(){}; - F.prototype = obj; - var result = new F(); - return result; - }; - - // Crockford style object creation + prototype chain + object ids - ul4._clone = function _clone(obj) - { - var result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; - }; - - // Adds attributes from on object to another and returns it - ul4._extend = function _extend(obj, attrs) - { - for (var name in attrs) - obj[name] = attrs[name]; - return obj; - }; - - // Clone an object via ``_simpleclone`` and extend it - ul4._simpleinherit = function _simpleinherit(baseobj, attrs) - { - return ul4._extend(ul4._simpleclone(baseobj), attrs); - }; - - // Clone an object via ``_clone`` and extend it - ul4._inherit = function _inherit(baseobj, attrs) - { - return ul4._extend(ul4._clone(baseobj), attrs); - }; - - // Convert a map to an object - ul4._map2object = function _map2object(obj) - { - if (ul4._ismap(obj)) - { - var newobj = {}; - obj.forEach(function(value, key){ - if (typeof(key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; - }; - - // Clip a number to the range [0;max) - ul4._bound = function _bound(value, upper) - { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; - }; - - // Create a pretty stacktrace from an exception - ul4._stacktrace = function _stacktrace(exc) - { - var output = ul4._type(exc); - var s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; - }; - - // Call a function ``f`` with UL4 argument handling - ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) - { - var finalargs; - if (needsobject) - { - if (signature === null) - { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; - } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else - { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); - }; - - ul4._callfunction = function _callfunction(context, f, args, kwargs) - { - var name = f._ul4_name || f.name; - if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); - } - - ul4._callobject = function _callobject(context, obj, args, kwargs) - { - if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); - } - - ul4._callrender = function _callrender(context, obj, args, kwargs) - { - if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); - } - - ul4._call = function _call(context, f, args, kwargs) - { - if (typeof(f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof(f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); - } - - ul4._unpackvar = function _unpackvar(lvalue, value) - { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else - { - var newvalue = []; - var iter = ul4._iter(value); - - for (var i = 0;;++i) - { - var item = iter.next(); - - if (item.done) - { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else - { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } - }; - - ul4._formatsource = function _formatsource(out) - { - var finalout = []; - var level = 0, needlf = false; - for (var i = 0; i < out.length; ++i) - { - if (typeof(out[i]) === "number") - { - level += out[i]; - needlf = true; - } - else - { - if (needlf) - { - finalout.push("\n"); - for (var j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; - } - finalout.push(out[i]); - } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); - }; - - // Compare ``obj1`` and ``obj2`` if they have the same value - ul4._eq = function _eq(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof(obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 == obj2 - else - return false; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); - else - return false; - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } - else - return false; - } - else if (ul4._isobject(obj1)) - { - if (ul4._isobject(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.hasOwnProperty(key)) - { - if (!ul4._eq(obj1[key], obj2[key])) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) - { - if (obj2.has(key)) - { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; - } - else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - var result = true; - obj2.forEach(function(value, key){ - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; - } - else - return false; - } - else if (ul4._ismap(obj1)) - { - if (ul4._isobject(obj2)) - { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; - } - }); - if (!result) - return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) - { - if (!obj1.has(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function(value, key){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2.get(key))) - result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) - { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) - { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) - return false; - var result = true; - obj1.forEach(function(value){ - if (result) // Skip code, if result is already ``false`` - { - if (!obj2.has(value)) - result = false; - } - }); - return result; - } - else - return false; - } - else - return obj1 === obj2; - }; - - // Compare ``obj1`` and ``obj2`` if they don't have the same value - ul4._ne = function _ne(obj1, obj2) - { - if (obj1 && typeof(obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof(obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); - } - - ul4._unorderable = function _unorderable(operator, obj1, obj2) - { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); - }; - - // Return: - // -1 when ``obj1 < obj2``, - // 0 when ``obj1 == obj2``, - // 1 when ``obj1 > obj2``, - // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) - // raise TypeError if objects are uncomparable - // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= - // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - - ul4._cmp = function _cmp(operator, obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - { - var v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); - } - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return 0; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return 1; - var res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; - } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); - } - - // Return whether ``obj1 < obj2`` - ul4._lt = function _lt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 < obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length < obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) - { - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); - }; - - // Return whether ``obj1 <= obj2`` - ul4._le = function _le(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); - } - return obj1.length <= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); - }; - - // Return whether ``obj1 > obj2`` - ul4._gt = function _gt(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 > obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length > obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); - }; - - // Return whether ``obj1 >= obj2`` - ul4._ge = function _ge(obj1, obj2) - { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof(obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof(obj1)) != -1) - { - if (numbertypes.indexOf(typeof(obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof(obj1) === "string") - { - if (typeof(obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) - { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) - { - if (ul4._islist(obj2)) - { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) - { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); - } - return obj1.length >= obj2.length; - } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) - { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) - { - if (ul4._isset(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function(value){ - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - obj1.forEach(function(value){ - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) - { - if (!obj1.has(value)) - { - in2only = true; - break; - } - } - } - } - else if (ul4._isul4set(obj2)) - { - if (ul4._isset(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.has(value)) - { - in1only = true; - break; - } - } - obj2.forEach(function(value){ - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) - { - for (var value in obj1.items) - { - if (!obj2.items[value]) - { - in1only = true; - break; - } - } - for (var value in obj2.items) - { - if (!obj1.items[value]) - { - in2only = true; - break; - } - } - } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) - { - if (in2only) - return null; - else - return 1; - } - else - { - if (in2only) - return -1; - else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); - }; - - // Return an iterator for ``obj`` - ul4._iter = function _iter(obj) - { - if (typeof(obj) === "string" || ul4._islist(obj)) - { - return { - index: 0, - next: function() - { - if (this.index < obj.length) - return {value: obj[this.index++], done: false}; - else - return {done: true}; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof(obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) - { - var keys = []; - obj.forEach(function(value, key){ - keys.push(key); - }); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - else if (ul4._isset(obj)) - { - var values = []; - obj.forEach(function(value, key){ - values.push(value); - }); - return { - index: 0, - next: function() - { - if (this.index >= values.length) - return {done: true}; - return {value: values[this.index++], done: false}; - } - }; - } - else if (ul4._isul4set(obj)) - { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) - { - var keys = []; - for (var key in obj) - keys.push(key); - return { - index: 0, - next: function() - { - if (this.index >= keys.length) - return {done: true}; - return {value: keys[this.index++], done: false}; - } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); - }; - - ul4._str_repr = function _str_repr(str, ascii) - { - var result = ""; - var squote = false, dquote = false; - - for (var i = 0; i "; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof(obj) === "undefined") - return ""; - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; - }; - - // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` - ul4._repr = function _repr(obj) - { - return ul4._repr_internal(obj, false); - } - - ul4._ascii = function _ascii(obj) - { - return ul4._repr_internal(obj, true); - } - - ul4._date_str = function _date_str(obj) - { - var year = obj.getFullYear(); - var month = obj.getMonth()+1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - - var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; - }; - - ul4._str = function _str(obj) - { - if (typeof(obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof(obj) === "string") - return obj; - else if (typeof(obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") - return obj.__str__(); - else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; - }; - - // Convert ``obj`` to bool, according to its "truth value" - ul4._bool = function _bool(obj) - { - if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else - { - if (typeof(obj) === "object", typeof(obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) - { - for (var key in obj) - { - if (!obj.hasOwnProperty(key)) - continue; - return true; - } - return false; - } - return true; - } - }; - - // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) - ul4._int = function _int(obj, base) - { - var result; - if (base !== null) - { - if (typeof(obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else - { - if (typeof(obj) == "string") - { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; - } - else if (typeof(obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } - }; - - // Convert ``obj`` to a float - ul4._float = function _float(obj) - { - if (typeof(obj) === "string") - return parseFloat(obj); - else if (typeof(obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); - }; - - // Convert ``obj`` to a list - ul4._list = function _list(obj) - { - var iter = ul4._iter(obj); - - var result = []; - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } - }; - - // Convert ``obj`` to a set - ul4._set = function _set(obj) - { - var iter = ul4._iter(obj); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (;;) - { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } - }; - - // Return the length of ``sequence`` - ul4._len = function _len(sequence) - { - if (typeof(sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) - { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); - }; - - ul4._type = function _type(obj) - { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof(obj) === "undefined") - return "undefined"; - else if (typeof(obj) === "string") - return "str"; - else if (typeof(obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof(obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; - }; - - - // Return whether any of the items in ``iterable`` are true - ul4._any = function _any(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } - }; - - // Return whether all of the items in ``iterable`` are true - ul4._all = function _all(iterable) - { - if (typeof(iterable) == "string") - { - for (var i = 0; i < iterable.length; ++i) - { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else - { - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } - }; - - // Check if ``obj`` is undefined - ul4._isundefined = function _isundefined(obj) - { - return typeof(obj) === "undefined"; - }; - - - // Check if ``obj`` is *not* undefined - ul4._isdefined = function _isdefined(obj) - { - return typeof(obj) !== "undefined"; - }; - - // Check if ``obj`` is ``None`` - ul4._isnone = function _isnone(obj) - { - return obj === null; - }; - - // Check if ``obj`` is a boolean - ul4._isbool = function _isbool(obj) - { - return typeof(obj) == "boolean"; - }; - - // Check if ``obj`` is a int - ul4._isint = function _isint(obj) - { - return (typeof(obj) == "number") && Math.round(obj) == obj; - }; - - // Check if ``obj`` is a float - ul4._isfloat = function _isfloat(obj) - { - return (typeof(obj) == "number") && Math.round(obj) != obj; - }; - - // Check if ``obj`` is a string - ul4._isstr = function _isstr(obj) - { - return typeof(obj) == "string"; - }; - - // Check if ``obj`` is a date - ul4._isdate = function _isdate(obj) - { - return Object.prototype.toString.call(obj) == "[object Date]"; - }; - - // Check if ``obj`` is a color - ul4._iscolor = function _iscolor(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Color)); - }; - - // Check if ``obj`` is a timedelta object - ul4._istimedelta = function _istimedelta(obj) - { - return (obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.TimeDelta)); - }; - - // Check if ``obj`` is a monthdelta object - ul4._ismonthdelta = function _ismonthdelta(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.MonthDelta); - }; - - // Check if ``obj`` is a template - ul4._istemplate = function _istemplate(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); - }; - - // Check if ``obj`` is a function - ul4._isfunction = function _isfunction(obj) - { - return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); - }; - - // Check if ``obj`` is a list - ul4._islist = function _islist(obj) - { - return Object.prototype.toString.call(obj) == "[object Array]"; - }; - - // Check if ``obj`` is a set - ul4._isset = function _isset(obj) - { - return Object.prototype.toString.call(obj) == "[object Set]"; - }; - - // Check if ``obj`` is an exception (at least a UL4 exception) - ul4._isexception = function _isexception(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4.Error); - }; - - ul4._isul4set = function _isul4set(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.isa) === "function" && obj.isa(ul4._Set); - }; - - // Check if ``obj`` is an iterator - ul4._isiter = function _isiter(obj) - { - return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; - }; - - // Check if ``obj`` is a JS object - ul4._isobject = function _isobject(obj) - { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined"; - }; - - // Check if ``obj`` is a map - ul4._ismap = function _ismap(obj) - { - if (ul4on._havemap) - return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - return false; - }; - - // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) - ul4._isdict = function _isdict(obj) - { - return ul4._isobject(obj) || ul4._ismap(obj); - }; - - - // Repeat string ``str`` ``rep`` times - ul4._str_repeat = function _str_repeat(str, rep) - { - var result = ""; - for (; rep>0; --rep) - result += str; - return result; - }; - - ul4._list_repeat = function _list_repeat(list, rep) - { - var result = []; - for (; rep>0; --rep) - for (var i = 0; i < list.length; ++i) - result.push(list[i]); - return result; - }; - - ul4._str_json = function _str_json(str) - { - var result = ""; - for (var i = 0; i < str.length; ++i) - { - var c = str[i]; - switch (c) - { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - default: - var code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; - }; - - // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) - ul4._asjson = function _asjson(obj) - { - if (obj === null) - return "null"; - else if (typeof(obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof(obj) === "string") - return ul4._str_json(obj); - else if (typeof(obj) === "number") - { - return "" + obj; - } - else if (ul4._islist(obj)) - { - var v = []; - v.push("["); - for (var i = 0; i < obj.length; ++i) - { - if (i != 0) - v.push(", "); - v.push(ul4._asjson(obj[i])); - } - v.push("]"); - return v.join(""); - } - else if (ul4._ismap(obj)) - { - var v = []; - v.push("{"); - var i = 0; - obj.forEach(function(value, key){ - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); - v.push("}"); - return v.join(""); - } - else if (ul4._isobject(obj)) - { - var v = []; - v.push("{"); - var i = 0; - for (var key in obj) - { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(obj[key])); - } - v.push("}"); - return v.join(""); - } - else if (ul4._isdate(obj)) - { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) - { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) - { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) - { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) - { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); - }; - - // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object - ul4._fromjson = function _fromjson(string) - { - // The following is from jQuery's parseJSON function - string = ul4._strip(string, null); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); - }; - - // Encodes ``obj`` in the UL4 Object Notation format - ul4._asul4on = function _asul4on(obj) - { - return ul4on.dumps(obj); - }; - - // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object - ul4._fromul4on = function _fromul4on(string) - { - return ul4on.loads(string); - }; - - ul4._format_date = function _format_date(obj, fmt, lang) - { - var translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - var translation = translations[lang]; - - var firstday; - - var result = []; - var inspec = false; - for (var i = 0; i < fmt.length; ++i) - { - var c = fmt[i]; - if (inspec) - { - switch (c) - { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth()+1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; - } - result.push(c); - inspec = false; - } - else - { - if (c == "%") - inspec = true; - else - result.push(c); - } - } - return result.join(""); - }; - - ul4._format_int = function _format_int(obj, fmt, lang) - { - var work = fmt; - - // Defaults - var fill = ' '; - var align = '>'; // '<', '>', '=' or '^' - var sign = '-'; // '+', '-' or ' ' - var alternate = false; - var minimumwidth = 0; - var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) - { - type = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract minimum width - if (/\d+$/.test(work)) - { - var minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) - { - align = '='; - fill = '0'; - } - minimumwidth = parseInt(minimumwidthStr); - } - - // Alternate form? - if (/#$/.test(work)) - { - alternate = true; - work = work.substring(0, work.length-1); - } - - // Determine sign - if (/[+ -]$/.test(work)) - { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length-1); - work = work.substring(0, work.length-1); - } - - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) - { - if (/[<>=^]$/.test(work)) - { - align = work[1]; - fill = work[0]; - } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) - { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - - // Basic number formatting - var neg = obj < 0; - - if (neg) - obj = -obj; - - var output; - switch (type) - { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } - - // The rest of the formatting - if (align === '=') - { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; - - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; - - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else - { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) - { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth-output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth-output.length) + output; - else // if (align == '^') - { - var pad = minimumwidth - output.length; - var padBefore = Math.floor(pad/2); - var padAfter = pad-padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } - } - } - return output; - }; - - // Format ``obj`` using the format string ``fmt`` in the language ``lang`` - ul4._format = function _format(obj, fmt, lang) - { - if (typeof(lang) === "undefined" || lang === null) - lang = "en"; - else - { - var translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; - lang = lang.toLowerCase(); - if (typeof(translations[lang]) === "undefined") - { - lang = lang.split(/_/)[0]; - if (typeof(translations[lang]) === "undefined") - lang = "en"; - } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); - }; - - ul4._lpad = function _lpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; - }; - - ul4._rpad = function _rpad(string, pad, len) - { - if (typeof(string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; - }; - - ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) - { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - - isprotoof: function isprotoof(obj) - { - while (true) - { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof(obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; - } - }, - - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) - { - return this === other; - }, - - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) - { - return !this.__eq__(other); - }, - - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` - - __bool__: function __bool__() - { - return true; - } - }; - - ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create() - { - var signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - var nextDefault = false; - var lastArgname = null; - for (var i = 0; i < arguments.length; ++i) - { - var argName = arguments[i]; - if (nextDefault) - { - signature.args.push({name: lastArgname, defaultValue: argName}); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else - { - if (argName.substr(argName.length-1) === "=") - { - lastArgname = argName.substr(0, argName.length-1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else - { - signature.args.push({name: argName}); - signature.argNames[argName] = true; - } - } - } - return signature; - }, - - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) - { - var finalargs = []; - var decname = name !== null ? name + "() " : ""; - - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - if (i < args.length) - { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else - { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else - { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } - } - } - - // Do we accept additional positional arguments? - if (this.remargs === null) - { - // No, but we have them -> complain - if (args.length > this.args.length) - { - var prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else - { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } - - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) - { - // No => complain about unknown ones - for (var key in kwargs) - { - if (!this.argNames[key]) - { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else - { - // Yes => Put the unknown ones into an object and add that to the arguments array - var remkwargs = {}; - for (var key in kwargs) - { - if (!this.argNames[key]) - remkwargs[key] = kwargs[key]; - } - finalargs.push(remkwargs); - } - - return finalargs; - }, - - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) - { - args = this.bindArray(name, args, kwargs); - var argObject = {}; - var i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, - - __repr__: function __repr__() - { - return ""; - }, - - __str__: function __str__() - { - return this.toString(); - }, - - toString: function toString() - { - var v = []; - for (var i = 0; i < this.args.length; ++i) - { - var arg = this.args[i]; - - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); - } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; - } - } - ); - - // Adds name and signature to a function/method and makes the method callable in templates - ul4.expose = function expose(signature, options, f) - { - if (typeof(f) === "undefined") - { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; - }; - - ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) - { - if (vars === null || typeof(vars) === "undefined") - vars = {}; - var context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, - - /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. - * This is used by the various comprehensions to avoid leaking loop variables. - */ - inheritvars: function inheritvars() - { - var context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); - return context; - }, - - /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) - { - var context = ul4._clone(this); - if (indent !== null) - { - context.indents = this.indents.slice(); - context.indents.push(indent); - } - return context; - }, - - /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() - { - var context = ul4._clone(this); - context._output = []; - return context; - }, - - clone: function clone(vars) - { - return ul4._clone(this); - }, - - output: function output(value) - { - this._output.push(value); - }, - - getoutput: function getoutput() - { - return this._output.join(""); - }, - - get: function get(name) - { - return this.vars[name]; - }, - - set: function set(name, value) - { - this.vars[name] = value; - } - } - ); - - /// Exceptions - - ul4.Exception = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Exception", - "cause": null, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - default: - return undefined; - } - } - } - ); - - // Exceptions used internally by UL4 for flow control - ul4.InternalException = ul4._inherit(ul4.Exception, {}); - - // Control flow exceptions - ul4.ReturnException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ReturnException", - - create: function create(result) - { - var exception = ul4._clone(this); - exception.result = result; - return exception; - } - } - ); - - ul4.BreakException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.BreakException" - } - ); - - ul4.ContinueException = ul4._inherit( - ul4.InternalException, - { - __type__: "ul4.ContinueException" - } - ); - - // Real exceptions raised by various parts of UL4 - ul4.SyntaxError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.SyntaxError" - } - ); - - ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, - { - __type__: "ul4.LValueRequiredError", - - toString: function toString() - { - return "lvalue required!"; - } - } - ); - - ul4.TypeError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.TypeError", - - create: function create(operation, message) - { - var exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ValueError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ValueError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - ul4.ArgumentError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.ArgumentError", - - create: function create(message) - { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() - { - return this.message; - } - } - ); - - /// Exception that wraps other exceptions while they bubble up the stack - ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", - - create: function create(location, cause) - { - var exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, - - _templateprefix: function(template) - { - var out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - var first = true; - while (template != null) - { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; - } - return out.join(""); - }, - - _template: function _template() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() - { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else - { - var tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; - } - }, - - _innerpos: function _innerpos() - { - return this.location.pos; - }, - - toString: function toString() - { - var template = this._template(); - var templateprefix = this._templateprefix(template); - var outerpos = this._outerpos(); - var innerpos = this._innerpos(); - - var prefix = template.source.substring(outerpos.start, innerpos.start); - var code = template.source.substring(innerpos.start, innerpos.stop); - var suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - var text = prefix + code + suffix; - var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - var lineno = 1, colno = 1; - for (var i = 0; i < innerpos.start; ++i) - { - if (template.source[i] === "\n") - { - ++lineno; - colno = 1; - } - else - ++colno; - } - - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - return templateprefix + ": " + pos + "\n" + text + "\n" + underline; - }, - - __getattr__: function __getattr__(attrname) - { - switch (attrname) - { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - return undefined; - } - } - } - ); - - - /// Classes for the syntax tree - ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) - { - var ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() - { - var out = []; - this._str(out); - return ul4._formatsource(out); - }, - __repr__: function __repr__() - { - var out = []; - this._repr(out); - return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, value) - { - try - { - return this._eval_set(context, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_set: function _eval_set(context, value) - { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) - { - try - { - return this._eval_modify(context, operator, value); - } - catch (exc) - { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval_modify: function _eval_modify(context, operator, value) - { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) - { - }, - _str: function _str(out) - { - }, - ul4ondump: function ul4ondump(encoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) - { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) - { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } - ); - - ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) - { - var text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() - { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) - { - context.output(this._text()); - }, - _str: function _str(out) - { - out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) - { - var indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) - { - if (typeof(this.template) !== "undefined") - { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() - { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); - else - return this.text; - }, - _eval: function _eval(context) - { - for (var i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) - encoder.dump(null); - else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) - { - out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.LineEndAST = ul4._inherit( - ul4.TextAST, - { - _str: function _str(out) - { - out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) - { - var tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() - { - if (typeof(this.template) !== "undefined") - { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else - { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) - { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } - ); - - ul4.CodeAST = ul4._inherit( - ul4.AST, - { - create: function create(tag, pos) - { - var code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) - { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - } - } - ); - - ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) - { - var constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this.value; - } - } - ); - - ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, - { - _handle_eval_list: function _handle_eval_list(context, result) - { - try - { - return this._eval_list(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_set: function _handle_eval_set(context, result) - { - try - { - return this._eval_set(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) - { - try - { - return this._eval_dict(context, result); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) - { - try - { - return this._eval_call(context, args, kwargs); - } - catch (exc) - { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - result.push(value); - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - result.add(value); - } - } - ); - - - ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_list: function _eval_list(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.push(item.value); - } - }, - _eval_set: function _eval_set(context, result) - { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - result.add(item.value); - } - } - } - ); - - ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) - { - var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var key = this.key._handle_eval(context); - var value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); - } - } - ); - - ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_dict: function _eval_dict(context, result) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - ul4on._setmap(result, key, value); - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - ul4on._setmap(result, key, item[key]); - } - } - } - ); - - ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var value = this.value._handle_eval(context); - args.push(value); - } - } - ); - - ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - var value = this.value._handle_eval(context); - kwargs[this.name] = value; - } - } - ); - - ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - args.push.apply(args, item); - } - } - ); - - ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) - { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) - { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) - { - for (var i = 0; i < item.length; ++i) - { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - } - } - else if (ul4._ismap(item)) - { - item.forEach(function(value, key){ - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = value; - }); - } - else if (ul4._isobject(item)) - { - for (var key in item) - { - if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); - kwargs[key] = item[key]; - } - } - } - } - ); - - ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = []; - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); - return result; - } - } - ); - - ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = []; - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.push(this.item._handle_eval(localcontext)); - } - return result; - } - } - ); - - ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._emptymap(); - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); - return result; - } - } - ); - - ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) - { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._emptymap(); - - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - { - var key = this.key._handle_eval(localcontext); - var value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); - } - } - - return result; - } - } - ); - - ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); - - return result; - } - } - ); - - ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - var localcontext = context.inheritvars(); - - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (var iter = ul4._iter(container);;) - { - var item = iter.next(); - if (item.done) - break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); - } - - return result; - } - } - ); - - ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) - { - var genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - var iter = ul4._iter(container); - - var localcontext = context.inheritvars(); - - var self = this; - - var result = { - next: function(){ - while (true) - { - var item = iter.next(); - if (item.done) - return item; - var varitems = ul4._unpackvar(self.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) - { - var value = self.item._handle_eval(localcontext); - return {value: value, done: false}; - } - } - } - }; - - return result; - } - } - ); - - ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) - { - var variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) - { - this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) - { - var result = context.get(name); - if (typeof(result) === "undefined") - result = ul4.functions[name]; - return result; - }, - _set: function _set(context, name, value) - { - context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) - { - var newvalue = operator._ido(context.get(name), value) - context.set(name, newvalue); - } - } - ); - - ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) - { - var unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" obj="); - this.obj._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - return this._do(obj); - } - } - ); - - // Negation - ul4.NegAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - if (obj !== null && typeof(obj.__neg__) === "function") - return obj.__neg__(); - return -obj; - } - } - ); - - // Bitwise not - ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return -obj-1; - } - } - ); - - // Not - ul4.NotAST = ul4._inherit( - ul4.UnaryAST, - { - _do: function _do(obj) - { - return !ul4._bool(obj); - } - } - ); - - // If expression - ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) - { - var ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(+1); - out.push("objif="); - this.objif._repr(out); - out.push(0); - out.push("objcond="); - this.objcond._repr(out); - out.push(0); - out.push("objelse="); - this.objelse._repr(out); - out.push(-1); - out.push(">"); - }, - _eval: function _eval(context) - { - var result; - var condvalue = this.objcond._handle_eval(context); - if (ul4._bool(condvalue)) - result = this.objif._handle_eval(context); - else - result = this.objelse._handle_eval(context); - return result; - } - } - ); - - ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) - { - out.push("return "); - this.obj._str(out); - } - } - ); - - ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._str(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("print "); - this.obj._str(out); - } - } - ); - - ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, - { - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var output = ul4._xmlescape(obj); - context.output(output); - }, - _str: function _str(out) - { - out.push("printx "); - this.obj._str(out); - } - } - ); - - ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) - { - var binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.type); - out.push(" obj1="); - this.obj1._repr(out); - out.push(" obj2="); - this.obj2._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - return this._do(obj1, obj2); - } - } - ); - - // Item access and assignment: dict[key], list[index], string[index], color[index] - ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - var result = this._get(obj1, obj2); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); - this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) - { - if (typeof(container) === "string" || ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (typeof(start) === "undefined" || start === null) - start = 0; - if (typeof(stop) === "undefined" || stop === null) - stop = container.length; - return container.slice(start, stop); - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - return container[key]; - } - } - else if (container && typeof(container.__getitem__) === "function") // test this before the generic object test - return container.__getitem__(key); - else if (ul4._ismap(container)) - return container.get(key); - else if (Object.prototype.toString.call(container) === "[object Object]") - return container[key]; - else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) - { - if (ul4._islist(container)) - { - if (typeof(key) === "object" && typeof(key.isa) === "function" && key.isa(ul4.slice)) - { - var start = key.start, stop = key.stop; - if (start === null) - start = 0; - else if (start < 0) - start += container.length; - if (start < 0) - start = 0; - else if (start > container.length) - start = container.length; - if (stop === null) - stop = container.length; - else if (stop < 0) - stop += container.length; - if (stop < 0) - stop = 0; - else if (stop > container.length) - stop = container.length; - if (stop < start) - stop = start; - container.splice(start, stop-start); // Remove old element - for (var iter = ul4._iter(value);;) - { - var item = iter.next(); - if (item.done) - break; - container.splice(start++, 0, item.value); - } - } - else - { - var orgkey = key; - if (key < 0) - key += container.length; - container[key] = value; - } - } - else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test - container.__setitem__(key, value); - else if (ul4._ismap(container)) - container.set(key, value); - else if (Object.prototype.toString.call(container) === "[object Object]") - container[key] = value; - else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) - { - this._set(container, key, operator._ido(this._get(container, key), value)); - } - } - ); - - // Identifty test operator ``is`` - ul4.IsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 === obj2; - } - } - ); - - // Inverted tdentifty test operator ``is not`` - ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return obj1 !== obj2; - } - } - ); - - // Comparison operator == - ul4.EQAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._eq(obj1, obj2); - } - } - ); - - // Comparison operator != - ul4.NEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ne(obj1, obj2); - } - } - ); - - // Comparison operator < - ul4.LTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._lt(obj1, obj2); - } - } - ); - - // Comparison operator <= - ul4.LEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._le(obj1, obj2); - } - } - ); - - // Comparison operator > - ul4.GTAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._gt(obj1, obj2); - } - } - ); - - // Comparison operator >= - ul4.GEAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - return ul4._ge(obj1, obj2); - } - } - ); - - // Containment test: string in string, obj in list, key in dict, value in rgb - ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - if (typeof(obj) === "string" && typeof(container) === "string") - { - return container.indexOf(obj) !== -1; - } - else if (ul4._islist(container)) - { - return container.indexOf(obj) !== -1; - } - else if (container && typeof(container.__contains__) === "function") // test this before the generic object test - return container.__contains__(obj); - else if (ul4._ismap(container) || ul4._isset(container)) - return container.has(obj); - else if (ul4._isobject(container)) - { - for (var key in container) - { - if (key === obj) - return true; - } - return false; - } - else if (ul4._iscolor(container)) - { - return container._r === obj || container._g === obj || container._b === obj || container._a === obj; - } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); - } - } - ); - - // Inverted containment test - ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj, container) - { - return !ul4.ContainsAST._do(obj, container); - } - } - ); - - // Addition: num + num, string + string - ul4.AddAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__add__) === "function") - return obj1.__add__(obj2); - else if (obj2 && typeof(obj2.__radd__) === "function") - return obj2.__radd__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - var result = []; - ul4._append(result, obj1); - ul4._append(result, obj2); - return result; - } - else - return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._islist(obj2)) - { - ul4._append(obj1, obj2); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Substraction: num - num - ul4.SubAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__sub__) === "function") - return obj1.__sub__(obj2); - else if (obj2 && typeof(obj2.__rsub__) === "function") - return obj2.__rsub__(obj1); - else if (ul4._isdate(obj1) && ul4._isdate(obj2)) - return this._date_sub(obj1, obj2); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); - return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) - { - var swap = (obj2 > obj1); - - if (swap) - { - var t = obj1; - obj1 = obj2; - obj2 = t; - } - // From now on obj1 is > than obj2 - - var year1 = obj1.getFullYear(); - var yearday1 = ul4._yearday(obj1); - var year2 = obj2.getFullYear(); - var yearday2 = ul4._yearday(obj2); - - var diffdays = 0; - - while (year1 > year2) - { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); - ++year2; - } - diffdays += yearday1 - yearday2; - - var hours1 = obj1.getHours(); - var minutes1 = obj1.getMinutes(); - var seconds1 = obj1.getSeconds(); - var hours2 = obj2.getHours(); - var minutes2 = obj2.getMinutes(); - var seconds2 = obj2.getSeconds(); - - var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - - var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - - if (swap) - { - diffdays = -diffdays; - diffseconds = -diffseconds; - diffmilliseconds = -diffmilliseconds; - } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000*diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Multiplication: num * num, int * str, str * int, int * list, list * int - ul4.MulAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__mul__) === "function") - return obj1.__mul__(obj2); - else if (obj2 && typeof(obj2.__rmul__) === "function") - return obj2.__rmul__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) - { - if (typeof(obj2) === "string") - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj2, obj1); - } - else if (ul4._islist(obj2)) - { - if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj2, obj1); - } - } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) - { - if (typeof(obj1) === "string") - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._str_repeat(obj1, obj2); - } - else if (ul4._islist(obj1)) - { - if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); - return ul4._list_repeat(obj1, obj2); - } - } - return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) - { - if (ul4._islist(obj1) && ul4._isint(obj2)) - { - if (obj2 > 0) - { - var i = 0; - var targetsize = obj1.length * obj2; - while (obj1.length < targetsize) - obj1.push(obj1[i++]) - } - else - obj1.splice(0, obj1.length); - return obj1; - } - else - return this._do(obj1, obj2); - } - } - ); - - // Truncating division - ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__floordiv__) === "function") - return obj1.__floordiv__(obj2); - else if (obj2 && typeof(obj2.__rfloordiv__) === "function") - return obj2.__rfloordiv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); - return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // "Real" division - ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj1 && typeof(obj1.__truediv__) === "function") - return obj1.__truediv__(obj2); - else if (obj2 && typeof(obj2.__rtruediv__) === "function") - return obj2.__rtruediv__(obj1); - if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); - return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Modulo - ul4.ModAST = ul4._inherit( - ul4.BinaryAST, - { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) - { - var div = Math.floor(obj1 / obj2); - var mod = obj1 - div * obj2; - - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) - { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise left shift - ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 *= 2; - return obj1; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise right shift - ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); - if (obj1 === false) - obj1 = 0; - else if (obj1 === true) - obj1 = 1; - while (obj2--) - obj1 /= 2; - return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise and - ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise exclusive or - ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - // Bitwise or - ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, - { - _do: function _do(obj1, obj2) - { - if (obj2 === false) - obj2 = 0; - else if (obj2 === true) - obj2 = 1; - return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) - { - return this._do(obj1, obj2); - } - } - ); - - ul4.AndAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (!ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.OrAST = ul4._inherit( - ul4.BinaryAST, - { - _eval: function _eval(context) - { - var obj1 = this.obj1._handle_eval(context); - if (ul4._bool(obj1)) - return obj1; - var obj2 = this.obj2._handle_eval(context); - return obj2; - } - } - ); - - ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) - { - var attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var result = this._get(obj, this.attrname); - return result; - }, - _eval_set: function _eval_set(context, value) - { - var obj = this.obj._handle_eval(context); - this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) - { - var obj = this.obj._handle_eval(context); - this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) - { - if (typeof(object) === "string") - { - switch (attrname) - { - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - case "replace": - return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count){ return ul4._replace(object, old, new_, count); }); - case "strip": - return ul4.expose(["chars=", null], function strip(chars){ return ul4._strip(object, chars); }); - case "lstrip": - return ul4.expose(["chars=", null], function lstrip(chars){ return ul4._lstrip(object, chars); }); - case "rstrip": - return ul4.expose(["chars=", null], function rstrip(chars){ return ul4._rstrip(object, chars); }); - case "split": - return ul4.expose(["sep=", null, "count=", null], function split(sep, count){ return ul4._split(object, sep, count); }); - case "rsplit": - return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count){ return ul4._rsplit(object, sep, count); }); - case "splitlines": - return ul4.expose(["keepends=", false], function splitlines(keepends){ return ul4._splitlines(object, keepends); }); - case "lower": - return ul4.expose([], function lower(){ return object.toLowerCase(); }); - case "upper": - return ul4.expose([], function upper(){ return object.toUpperCase(); }); - case "capitalize": - return ul4.expose([], function capitalize(){ return ul4._capitalize(object); }); - case "join": - return ul4.expose(["iterable"], function join(iterable){ return ul4._join(object, iterable); }); - case "startswith": - return ul4.expose(["prefix"], function startswith(prefix){ return ul4._startswith(object, prefix); }); - case "endswith": - return ul4.expose(["suffix"], function endswith(suffix){ return ul4._endswith(object, suffix); }); - default: - return undefined; - } - } - else if (ul4._islist(object)) - { - switch (attrname) - { - case "append": - return ul4.expose(["*items"], function append(items){ return ul4._append(object, items); }); - case "insert": - return ul4.expose(["pos", "*items"], function insert(pos, items){ return ul4._insert(object, pos, items); }); - case "pop": - return ul4.expose(["pos=", -1], function pop(pos){ return ul4._pop(object, pos); }); - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end){ return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end){ return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end){ return ul4._rfind(object, sub, start, end); }); - default: - return undefined; - } - } - else if (ul4._isdate(object)) - { - switch (attrname) - { - case "weekday": - return ul4.expose([], function weekday(){ return ul4._weekday(object); }); - case "week": - return ul4.expose(["firstweekday=", null], function week(firstweekday){ return ul4._week(object, firstweekday); }); - case "day": - return ul4.expose([], function day(){ return object.getDate(); }); - case "month": - return ul4.expose([], function month(){ return object.getMonth()+1; }); - case "year": - return ul4.expose([], function year(){ return object.getFullYear(); }); - case "hour": - return ul4.expose([], function hour(){ return object.getHours(); }); - case "minute": - return ul4.expose([], function minute(){ return object.getMinutes(); }); - case "second": - return ul4.expose([], function second(){ return object.getSeconds(); }); - case "microsecond": - return ul4.expose([], function microsecond(){ return object.getMilliseconds() * 1000; }); - case "mimeformat": - return ul4.expose([], function mimeformat(){ return ul4._mimeformat(object); }); - case "isoformat": - return ul4.expose([], function isoformat(){ return ul4._isoformat(object); }); - case "yearday": - return ul4.expose([], function yearday(){ return ul4._yearday(object); }); - default: - return undefined; - } - } - else if (ul4._ismap(object)) - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return object.get(attrname); - } - } - else if (ul4._isset(object)) - { - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ for (var i = 0; i < items.length; ++i) { object.add(items[i]); } } ); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - return undefined; - } - } - else if (Object.prototype.toString.call(object) === "[object Object]") - { - switch (attrname) - { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_){ return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items(){ return ul4._items(object); }); - case "values": - return ul4.expose([], function values(){ return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs){ return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear(){ return ul4._clear(object); }); - default: - var result; - if (object && typeof(object.__getattr__) === "function") // test this before the generic object test - result = object.__getattr__(attrname); - else - result = object[attrname]; - if (typeof(result) !== "function") - return result; - var realresult = function() { - return result.apply(object, arguments); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } - } - throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); - }, - _set: function _set(object, attrname, value) - { - if (typeof(object) === "object" && typeof(object.__setattr__) === "function") - object.__setattr__(attrname, value); - else if (ul4._ismap(object)) - object.set(attrname, value) - else if (ul4._isobject(object)) - object[attrname] = value; - else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) - { - var oldvalue = this._get(object, attrname); - var newvalue = operator._ido(oldvalue, value); - this._set(object, attrname, newvalue); - } - } - ); - - ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) - { - var call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) - { - out.push(""); - }, - _makeargs: function _makeargs(context) - { - var args = [], kwargs = {}; - for (var i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return {args: args, kwargs: kwargs}; - }, - _handle_eval: function _handle_eval(context) - { - try - { - return this._eval(context); - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - }, - _eval: function _eval(context) - { - var obj = this.obj._handle_eval(context); - var args = this._makeargs(context); - var result = ul4._call(context, obj, args.args, args.kwargs); - return result; - } - } - ); - - ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) - { - var render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) - { - out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); - } - }, - _handle_eval: function _handle_eval(context) - { - var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - var obj = this.obj._handle_eval(localcontext); - var args = this._makeargs(localcontext); - - try - { - var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); - return result; - } - catch (exc) - { - exc = ul4.LocationError.create(this, exc); - throw exc; - } - } - } - ); - - // Slice object - ul4.slice = ul4._inherit( - ul4.Proto, - { - create: function create(start, stop) - { - var slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() - { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; - } - } - ); - - - // List/String slice - ul4.SliceAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, index1, index2) - { - var slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) - { - out.push(""); - }, - _eval: function _eval(context) - { - var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); - } - } - ); - - - ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, lvalue, value) - { - var changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" lvalue="); - out.push(ul4._repr(this.lvalue)); - out.push(" value="); - this.value._repr(out); - out.push(">"); - }, - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_set(context, item[1]); - } - } - } - ); - - ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, - { - _eval: function _eval(context) - { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) - { - var item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); - } - } - } - ); - - ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); - - ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); - - ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); - - ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); - - ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); - - ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); - - ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); - - ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); - - ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); - - ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); - - ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); - - ul4.BlockAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) - { - if (this.content.length) - { - for (var i = 0; i < this.content.length; ++i) - { - this.content[i]._str(out); - out.push(0); - } - } - else - { - out.push("pass"); - out.push(0); - } - } - } - ); - - ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) - { - var for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str_varname: function _str_varname(out, varname) - { - if (ul4._islist(varname)) - { - out.push("("); - for (var i = 0; i < varname.length; ++i) - { - if (i) - out.push(", "); - this._str_varname(out, varname[i]); - } - if (varname.length == 1) - out.push(","); - out.push(")"); - } - else - varname._str(out); - }, - _eval: function _eval(context) - { - var container = this.container._handle_eval(context); - - for (var iter = ul4._iter(container);;) - { - var value = iter.next(); - if (value.done) - break; - var varitems = ul4._unpackvar(this.varname, value.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("for "); - this._str_varname(out, this.varname); - out.push(" in "); - this.container._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("while "), - this.container._repr(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _eval: function _eval(context) - { - while (true) - { - var cond = this.condition._handle_eval(context); - if (!ul4._bool(cond)) - break; - try - { - // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); - } - catch (exc) - { - if (exc === ul4.BreakException) - break; - else if (exc === ul4.ContinueException) - ; - else - throw exc; - } - } - }, - _str: function _str(out) - { - out.push("while "); - ul4.AST._str.call(this, out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.BreakAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.BreakException; - }, - _str: function _str(out) - { - out.push("break"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, - { - _eval: function _eval(context) - { - throw ul4.ContinueException; - }, - _str: function _str(out) - { - out.push("continue"); - out.push(0); - }, - _repr: function _repr(out) - { - out.push(""); - } - } - ); - - ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, - { - _eval: function _eval(context) - { - for (var i = 0; i < this.content.length; ++i) - { - var block = this.content[i]; - var execute = block._execute(context); - if (execute) - { - block._handle_eval(context); - break; - } - } - } - } - ); - - ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) - { - var block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" condition="); - this.condition._repr(out); - out.push(">"); - }, - _str: function _str(out) - { - out.push(this._strname); - out.push(" "); - this.condition._str(out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - var cond = this.condition._handle_eval(context); - var result = ul4._bool(cond); - return result; - } - } - ); - - ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "if"}); - - ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, {_strname: "else if"}); - - ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, - { - _repr: function _repr(out) - { - out.push(""); - }, - _str: function _str(out) - { - out.push("else:"), - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) - { - return true; - }, - _str: function _str(out) - { - out.push("else:"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - } - } - ); - - ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) - { - var template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) - { - var signature; - encoder.dump(ul4.version); - encoder.dump(this.name); - encoder.dump(this.source); - encoder.dump(this.whitespace); - encoder.dump(this.startdelim); - encoder.dump(this.enddelim); - encoder.dump(this.docpos); - encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) - signature = this.signature; - else - { - signature = []; - for (var i = 0; i < this.signature.args.length; ++i) - { - var arg = this.signature.args[i]; - if (typeof(arg.defaultValue) === "undefined") - signature.push(arg.name); - else - signature.push(arg.name+"=", arg.defaultValue); - } - if (this.signature.remargs !== null) - signature.push("*" + this.signature.remargs); - if (this.signature.remkwargs !== null) - signature.push("**" + this.signature.remkwargs); - } - encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) - { - var version = decoder.load(); - var signature; - - if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); - - if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); - this.name = decoder.load(); - this.source = decoder.load(); - this.whitespace = decoder.load(); - this.startdelim = decoder.load(); - this.enddelim = decoder.load(); - this.docpos = decoder.load(); - this.parenttemplate = decoder.load(); - signature = decoder.load(); - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - this.signature = signature; - this._ul4_callsignature = signature; - this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) - { - return ul4on.loads(string); - }, - _eval: function _eval(context) - { - var signature = null; - if (this.signature !== null) - signature = this.signature._handle_eval(context); - var closure = ul4.TemplateClosure.create(this, signature, context.vars); - context.set(this.name, closure); - }, - _repr: function _repr(out) - { - out.push("") - { - out.push(" enddelim="); - out.push(ul4._repr(this.enddelim)); - } - out.push(">"); - }, - _str: function _str(out) - { - out.push("def "); - out.push(this.name ? this.name : "unnamed"); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (!ul4.ReturnException.isprotoof(exc)) - throw exc; - } - }, - __render__: function __render__(context, vars) - { - this._renderbound(context, vars); - }, - render: function render(context, vars) - { - this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) - { - var localcontext = context.replaceoutput(); - this._renderbound(localcontext, vars); - return localcontext.getoutput(); - }, - renders: function renders(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._rendersbound(context, vars); - }, - doc: function doc() - { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - default: - return undefined; - } - }, - _callbound: function _callbound(context, vars) - { - var localcontext = context.clone(); - localcontext.vars = vars; - try - { - ul4.BlockAST._eval.call(this, localcontext); - } - catch (exc) - { - if (ul4.ReturnException.isprotoof(exc)) - return exc.result; - else - throw exc; - } - return null; - }, - call: function call(vars) - { - vars = vars || {}; - var context = ul4.Context.create(); - if (this.signature !== null) - vars = this.signature.bindObject(this.name, [], vars); - return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) - { - return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } - ); - - ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) - { - var signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) - { - ul4.CodeAST.ul4ondump.call(this, encoder); - - var dump = []; - - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - dump.push(param[0]); - else - dump.push(param); - } - encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) - { - ul4.AST.ul4onload.call(this, decoder); - var dump = decoder.load(); - this.params = []; - for (var i = 0; i < dump.length; ++i) - { - var param = dump[i]; - if (typeof(param) === "string") - this.params.push([param, null]); - else - this.params.push(param); - } - }, - _eval: function _eval(context) - { - var args = []; - for (var i = 0; i < this.params.length; ++i) - { - var param = this.params[i]; - if (param[1] === null) - args.push(param[0]); - else - { - args.push(param[0] + "="); - args.push(param[1]._handle_eval(context)); - } - } - return ul4.Signature.create.apply(ul4.Signature, args); - }, - _repr: function _repr(out) - { - out.push("<"); - out.push(this.typename); - out.push(" params="); - this.params._repr(out); - out.push(">"); - } - } - ); - - ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) - { - var closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; - // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) - { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) - { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) - { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "render": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function render(context, vars){ self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, {needscontext: true, needsobject: true}, function renders(context, vars){ return self._rendersbound(context, vars); }); - case "signature": - return this.signature; - default: - return this.template.__getattr__(attrname); - } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } - ); - - // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` - ul4._rgb = function _rgb(r, g, b, a) - { - return this.Color.create(255*r, 255*g, 255*b, 255*a); - }; - - // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference - ul4._xmlescape = function _xmlescape(obj) - { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; - }; - - // Convert ``obj`` to a string suitable for output into a CSV file - ul4._csv = function _csv(obj) - { - if (obj === null) - return ""; - else if (typeof(obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; - }; - - // Return a string containing one character with the codepoint ``i`` - ul4._chr = function _chr(i) - { - if (typeof(i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); - }; - - // Return the codepoint for the one and only character in the string ``c`` - ul4._ord = function _ord(c) - { - if (typeof(c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); - }; - - // Convert an integer to a hexadecimal string - ul4._hex = function _hex(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); - }; - - // Convert an integer to a octal string - ul4._oct = function _oct(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); - }; - - // Convert an integer to a binary string - ul4._bin = function _bin(number) - { - if (typeof(number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); - }; - - // Return the minimum value - ul4._min = function _min(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; - } - if (first || (item.value < result)) - result = item.value; - first = false; - } - }; - - // Return the maximum value - ul4._max = function _max(obj) - { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) - { - var item = iter.next(); - if (item.done) - { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; - } - if (first || (item.value > result)) - result = item.value; - first = false; - } - }; - - // Return the of the values from the iterable starting with ``start`` (default ``0``) - ul4._sum = function _sum(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; - }; - - // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._first = function _first(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; - }; - - // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) - ul4._last = function _last(iterable, defaultValue) - { - if (typeof(defaultValue) === "undefined") - defaultValue = null; - - var value = defaultValue; - - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; - }; - - // Return a sorted version of ``iterable`` - ul4._sorted = function _sorted(context, iterable, key, reverse) - { - var cmp; - if (key === null) - { - // FIXME: stability - if (reverse) - { - cmp = function cmp(a, b) - { - return -ul4._cmp("<=>", a, b); - } - } - else - { - cmp = function cmp(a, b) - { - return ul4._cmp("<=>", a, b); - } - } - var result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else - { - var sort = []; - - for (var i = 0, iter = ul4._iter(iterable);;++i) - { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); - } - cmp = function cmp(s1, s2) - { - var res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; - } - - sort.sort(cmp); - - var result = []; - for (var i = 0; i < sort.length; ++i) - { - result.push(sort[i][2]); - } - return result; - } - }; - - // Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` - ul4._range = function _range(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) - { - lower = start; - heigher = stop; - } - else - { - lower = stop; - heigher = start; - } - var length = (lower < heigher) ? Math.floor((heigher - lower - 1)/Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function() - { - if (this.index >= length) - return {done: true}; - return {value: start + (this.index++) * step, done: false}; - } - }; - }; - - // Return a iterable object returning a slice from the argument - ul4._slice = function _slice(args) - { - var iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) - { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) - { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - var next = start, count = 0; - var iter = ul4._iter(iterable); - return { - next: function() { - var result; - while (count < next) - { - result = iter.next(); - if (result.done) - return result; - ++count; - } - if (stop !== null && count >= stop) - return {done: true}; - result = iter.next(); - if (result.done) - return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } - }; - }; - - // ``%`` escape unsafe characters in the string ``string`` - ul4._urlquote = function _urlquote(string) - { - return encodeURIComponent(string); - }; - - // The inverse function of ``urlquote`` - ul4._urlunquote = function _urlunquote(string) - { - return decodeURIComponent(string); - }; - - // Return a reverse iterator over ``sequence`` - ul4._reversed = function _reversed(sequence) - { - if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length-1, - next: function() { - return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; - } - }; - }; - - // Returns a random number in the interval ``[0;1[`` - ul4._random = function _random() - { - return Math.random(); - }; - - // Return a randomly select item from ``range(start, stop, step)`` - ul4._randrange = function _randrange(args) - { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) - { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) - { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) - { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var width = stop-start; - - var value = Math.random(); - - var n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step*Math.floor(value * n); - }; - - // Return a random item/char from the list/string ``sequence`` - ul4._randchoice = function _randchoice(sequence) - { - var iscolor = ul4._iscolor(sequence); - if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; - }; - - // Round a number ``x`` to ``digits`` decimal places (may be negative) - ul4._round = function _round(x, digits) - { - if (typeof(digits) === "undefined") - digits = 0; - if (digits) - { - var threshhold = Math.pow(10, digits); - return Math.round(x*threshhold)/threshhold; - } - else - return Math.round(x); - }; - - // Return a hex-encode MD5 hash of the argument - // This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 - ul4._md5 = function _md5(string) - { - return md5(string); - }; - - // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) - ul4._enumerate = function _enumerate(iterable, start) - { - if (typeof(start) === "undefined") - start = 0; - - return { - iter: ul4._iter(iterable), - index: start, - next: function() { - var item = this.iter.next(); - return item.done ? item : {value: [this.index++, item.value], done: false}; - } - }; - }; - - // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) - ul4._isfirst = function _isfirst(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - return { - next: function() { - var item = iter.next(); - var result = item.done ? item : {value: [isfirst, item.value], done: false}; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) - ul4._islast = function _islast(iterable) - { - var iter = ul4._iter(iterable); - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [item.done, lastitem.value], done: false}; - lastitem = item; - return result; - } - }; - }; - - // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._isfirstlast = function _isfirstlast(iterable) - { - var iter = ul4._iter(iterable); - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) - ul4._enumfl = function _enumfl(iterable, start) - { - var iter = ul4._iter(iterable); - var i = start; - var isfirst = true; - var lastitem = iter.next(); - return { - next: function() { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; - lastitem = item; - isfirst = false; - return result; - } - }; - }; - - // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) - ul4._zip = function _zip(iterables) - { - var result; - if (iterables.length) - { - var iters = []; - for (var i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); - - return { - next: function() { - var items = []; - for (var i = 0; i < iters.length; ++i) - { - var item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return {value: items, done: false}; - } - }; - } - else - { - return { - next: function() { - return {done: true}; - } - }; - } - }; - - // Return the absolute value for the number ``number`` - ul4._abs = function _abs(number) - { - if (number !== null && typeof(number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); - }; - - // Return a ``Date`` object from the arguments passed in - ul4._date = function _date(year, month, day, hour, minute, second, microsecond) - { - if (typeof(hour) === "undefined") - hour = 0; - - if (typeof(minute) === "undefined") - minute = 0; - - if (typeof(second) === "undefined") - second = 0; - - if (typeof(microsecond) === "undefined") - microsecond = 0; - - return new Date(year, month-1, day, hour, minute, second, microsecond/1000); - }; - - // Return a ``TimeDelta`` object from the arguments passed in - ul4._timedelta = function _timedelta(days, seconds, microseconds) - { - return this.TimeDelta.create(days, seconds, microseconds); - }; - - // Return a ``MonthDelta`` object from the arguments passed in - ul4._monthdelta = function _monthdelta(months) - { - return this.MonthDelta.create(months); - }; - - // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) - ul4._hls = function _hls(h, l, s, a) - { - var _v = function(m1, m2, hue) - { - hue = hue % 1.0; - if (hue < 1/6) - return m1 + (m2-m1)*hue*6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2/3) - return m1 + (m2-m1)*(2/3-hue)*6.0; - return m1; - }; - - var m1, m2; - if (typeof(a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0+s); - else - m2 = l+s-(l*s); - m1 = 2.0*l - m2; - return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); - }; - - // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) - ul4._hsv = function _hsv(h, s, v, a) - { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - var i = Math.floor(h*6.0); - var f = (h*6.0) - i; - var p = v*(1.0 - s); - var q = v*(1.0 - s*f); - var t = v*(1.0 - s*(1.0-f)); - switch (i%6) - { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } - }; - - // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` - ul4._get = function _get(container, key, defaultvalue) - { - if (ul4._ismap(container)) - { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) - { - var result = container[key]; - if (typeof(result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); - }; - - // Return a ``Date`` object for the current time - ul4.now = function now() - { - return new Date(); - }; - - // Return a ``Date`` object for the current time in UTC - ul4.utcnow = function utcnow() - { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); - }; - - ul4.functions = { - repr: ul4.expose(["obj"], {name: "repr"}, ul4._repr), - ascii: ul4.expose(["obj"], {name: "ascii"}, ul4._ascii), - str: ul4.expose(["obj=", ""], {name: "str"}, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], {name: "int"}, ul4._int), - float: ul4.expose(["obj=", 0.0], {name: "float"}, ul4._float), - list: ul4.expose(["iterable=", []], {name: "list"}, ul4._list), - set: ul4.expose(["iterable=", []], {name: "set"}, ul4._set), - bool: ul4.expose(["obj=", false], {name: "bool"}, ul4._bool), - len: ul4.expose(["sequence"], {name: "len"}, ul4._len), - type: ul4.expose(["obj"], {name: "type"}, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], {name: "format"}, ul4._format), - any: ul4.expose(["iterable"], {name: "any"}, ul4._any), - all: ul4.expose(["iterable"], {name: "all"}, ul4._all), - zip: ul4.expose(["*iterables"], {name: "zip"}, ul4._zip), - isundefined: ul4.expose(["obj"], {name: "isundefined"}, ul4._isundefined), - isdefined: ul4.expose(["obj"], {name: "isdefined"}, ul4._isdefined), - isnone: ul4.expose(["obj"], {name: "isnone"}, ul4._isnone), - isbool: ul4.expose(["obj"], {name: "isbool"}, ul4._isbool), - isint: ul4.expose(["obj"], {name: "isint"}, ul4._isint), - isfloat: ul4.expose(["obj"], {name: "isfloat"}, ul4._isfloat), - isstr: ul4.expose(["obj"], {name: "isstr"}, ul4._isstr), - isdate: ul4.expose(["obj"], {name: "isdate"}, ul4._isdate), - iscolor: ul4.expose(["obj"], {name: "iscolor"}, ul4._iscolor), - istimedelta: ul4.expose(["obj"], {name: "istimedelta"}, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], {name: "ismonthdelta"}, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], {name: "istemplate"}, ul4._istemplate), - isfunction: ul4.expose(["obj"], {name: "isfunction"}, ul4._isfunction), - islist: ul4.expose(["obj"], {name: "islist"}, ul4._islist), - isset: ul4.expose(["obj"], {name: "isset"}, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], {name: "isdict"}, ul4._isdict), - isexception: ul4.expose(["obj"], {name: "isexception"}, ul4._isexception), - asjson: ul4.expose(["obj"], {name: "asjson"}, ul4._asjson), - fromjson: ul4.expose(["string"], {name: "fromjson"}, ul4._fromjson), - asul4on: ul4.expose(["obj"], {name: "asul4on"}, ul4._asul4on), - fromul4on: ul4.expose(["string"], {name: "fromul4on"}, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], {name: "enumerate"}, ul4._enumerate), - isfirst: ul4.expose(["iterable"], {name: "isfirst"}, ul4._isfirst), - islast: ul4.expose(["iterable"], {name: "islast"}, ul4._islast), - isfirstlast: ul4.expose(["iterable"], {name: "isfirstlast"}, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], {name: "enumfl"}, ul4._enumfl), - abs: ul4.expose(["number"], {name: "abs"}, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "date"}, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], {name: "monthdelta"}, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], {name: "rgb"}, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], {name: "hls"}, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], {name: "hsv"}, ul4._hsv), - xmlescape: ul4.expose(["obj"], {name: "xmlescape"}, ul4._xmlescape), - csv: ul4.expose(["obj"], {name: "csv"}, ul4._csv), - chr: ul4.expose(["i"], {name: "chr"}, ul4._chr), - ord: ul4.expose(["c"], {name: "ord"}, ul4._ord), - hex: ul4.expose(["number"], {name: "hex"}, ul4._hex), - oct: ul4.expose(["number"], {name: "oct"}, ul4._oct), - bin: ul4.expose(["number"], {name: "bin"}, ul4._bin), - min: ul4.expose(["*obj"], {name: "min"}, ul4._min), - max: ul4.expose(["*obj"], {name: "max"}, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], {name: "sum"}, ul4._sum), - first: ul4.expose(["iterable", "default=", null], {name: "first"}, ul4._first), - last: ul4.expose(["iterable", "default=", null], {name: "last"}, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}, ul4._sorted), - range: ul4.expose(["*args"], {name: "range"}, ul4._range), - slice: ul4.expose(["*args"], {name: "slice"}, ul4._slice), - urlquote: ul4.expose(["string"], {name: "urlquote"}, ul4._urlquote), - urlunquote: ul4.expose(["string"], {name: "urlunquote"}, ul4._urlunquote), - reversed: ul4.expose(["sequence"], {name: "reversed"}, ul4._reversed), - random: ul4.expose([], {name: "random"}, ul4._random), - randrange: ul4.expose(["*args"], {name: "randrange"}, ul4._randrange), - randchoice: ul4.expose(["sequence"], {name: "randchoice"}, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], {name: "round"}, ul4._round), - md5: ul4.expose(["string"], {name: "md5"}, ul4._md5) - }; - - // Functions implementing UL4 methods - ul4._replace = function _replace(string, old, new_, count) - { - if (count === null) - count = string.length; - - var result = []; - while (string.length) - { - var pos = string.indexOf(old); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); - }; - - ul4._strip = function _strip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._lstrip = function _lstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; - }; - - ul4._rstrip = function _rstrip(string, chars) - { - if (chars === null) - chars = " \r\n\t"; - else if (typeof(chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length-1]) >= 0) - string = string.substr(0, string.length-1); - return string; - }; - - ul4._split = function _split(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.indexOf(sep); - if (pos === -1 || !count--) - { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._lstrip(string, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); - } - return result; - } - } - }; - - ul4._rsplit = function _rsplit(string, sep, count) - { - if (sep !== null && typeof(sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); - - if (count === null) - { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) - { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length-1].length) - result.splice(-1); - } - return result; - } - else - { - if (sep !== null) - { - var result = []; - while (string.length) - { - var pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) - { - result.unshift(string); - break; - } - result.unshift(string.substr(pos+sep.length)); - string = string.substr(0, pos); - } - return result; - } - else - { - var result = []; - while (string.length) - { - string = ul4._rstrip(string, null, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - { - part = string.split(/[ \n\r\t]+/); - part = part[part.length-1]; - } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length-part.length); - } - return result; - } - } - }; - - ul4._splitlines = function _splitlines(string, keepends) - { - var lookingAtLineEnd = function lookingAtLineEnd() - { - var c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') - { - if (pos == length-1) - return 1; - if (string[pos+1] === '\n') - return 2; - return 1; - } - return 0; - }; - - var result = [], length = string.length; - - for (var pos = 0, startpos = 0;;) - { - if (pos >= length) - { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; - } - var lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else - { - var endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; - } - } - }; - - ul4._count = function _count(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - - var isstr = ul4._isstr(obj); - - if (isstr && !sub.length) - { - if (end < 0 || start > obj.length || start > end) - return 0; - var result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } - - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - var count = 0; - if (ul4._islist(obj)) - { - for (var i = start; i < end; ++i) - { - if (ul4._eq(obj[i], sub)) - ++count; - } - return count; - } - else // string - { - var lastIndex = start; - - for (;;) - { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; - } - return count; - } - }; - - ul4._find = function _find(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._rfind = function _rfind(obj, sub, start, end) - { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) - { - if (typeof(obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; - }; - - ul4._capitalize = function _capitalize(obj) - { - if (typeof(obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; - }; - - ul4._items = function _items(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push([key, obj[key]]); - return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); - }; - - ul4._values = function _values(obj) - { - if (ul4._ismap(obj)) - { - var result = []; - obj.forEach(function(value, key){ - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) - { - var result = []; - for (var key in obj) - result.push(obj[key]); - return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); - }; - - ul4._join = function _join(sep, iterable) - { - var resultlist = []; - for (var iter = ul4._iter(iterable);;) - { - var item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); - }; - - ul4._startswith = function _startswith(string, prefix) - { - if (typeof(prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; - }; - - ul4._endswith = function _endswith(string, suffix) - { - if (typeof(suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length-suffix.length) === suffix; - }; - - ul4._isoformat = function _isoformat(obj) - { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - if (hour || minute || second || ms) - { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; - }; - - ul4._mimeformat = function _mimeformat(obj) - { - var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; - }; - - ul4._weekday = function _weekday(obj) - { - var d = obj.getDay(); - return d ? d-1 : 6; - }; - - ul4._week = function _week(obj, firstweekday) - { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - var yearday = ul4._yearday(obj)+6; - var jan1 = new Date(obj.getFullYear(), 0, 1); - var jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) - { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday/7); - }; - - ul4._isleap = function _isleap(obj) - { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; - }; - - ul4._yearday = function _yearday(obj) - { - var leap = ul4._isleap(obj) ? 1 : 0; - var day = obj.getDate(); - switch (obj.getMonth()) - { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } - }; - - ul4._append = function _append(obj, items) - { - for (var i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; - }; - - ul4._insert = function _insert(obj, pos, items) - { - if (pos < 0) - pos += obj.length; - - for (var i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; - }; - - ul4._pop = function _pop(obj, pos) - { - if (pos < 0) - pos += obj.length; - - var result = obj[pos]; - obj.splice(pos, 1); - return result; - }; - - ul4._update = function _update(obj, others, kwargs) - { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (var i = 0; i < others.length; ++i) - { - var other = others[i]; - if (ul4._ismap(other)) - { - other.forEach(function(value, key){ - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) - { - for (var key in other) - ul4on._setmap(obj, key, other[key]); - } - else if (ul4._islist(other)) - { - for (var j = 0; j < other.length; ++j) - { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); - } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - for (var key in kwargs) - ul4on._setmap(obj, key, kwargs[key]); - return null; - }; - - ul4._clear = function _clear(obj) - { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) - { - for (var key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; - }; - - ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r, g, b, a) - { - var c = ul4._clone(this); - c._r = typeof(r) !== "undefined" ? r : 0; - c._g = typeof(g) !== "undefined" ? g : 0; - c._b = typeof(b) !== "undefined" ? b : 0; - c._a = typeof(a) !== "undefined" ? a : 255; - return c; - }, - - __repr__: function __repr__() - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) - return "#" + r[0] + g[0] + b[0] + a[0]; - else - return "#" + r + g + b + a; - } - else - { - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __str__: function __str__() - { - if (this._a !== 0xff) - { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; - } - else - { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) - return "#" + r[0] + g[0] + b[0]; - else - return "#" + r + g + b; - } - }, - - __iter__: function __iter__() - { - return { - obj: this, - index: 0, - next: function() { - if (this.index == 0) - { - ++this.index; - return {value: this.obj._r, done: false}; - } - else if (this.index == 1) - { - ++this.index; - return {value: this.obj._g, done: false}; - } - else if (this.index == 2) - { - ++this.index; - return {value: this.obj._b, done: false}; - } - else if (this.index == 3) - { - ++this.index; - return {value: this.obj._a, done: false}; - } - else - return {done: true}; - } - }; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "r": - return ul4.expose([], function r(){ return self._r; }); - case "g": - return ul4.expose([], function g(){ return self._g; }); - case "b": - return ul4.expose([], function b(){ return self._b; }); - case "a": - return ul4.expose([], function a(){ return self._a; }); - case "lum": - return ul4.expose([], function lum(){ return self.lum(); }); - case "hls": - return ul4.expose([], function hls(){ return self.hls(); }); - case "hlsa": - return ul4.expose([], function hlsa(){ return self.hlsa(); }); - case "hsv": - return ul4.expose([], function hsv(){ return self.hsv(); }); - case "hsva": - return ul4.expose([], function hsva(){ return self.hsva(); }); - case "witha": - return ul4.expose(["a"], function witha(a){ return self.witha(a); }); - case "withlum": - return ul4.expose(["lum"], function withlum(lum){ return self.withlum(lum); }); - case "abslum": - return ul4.expose(["lum"], function abslum(lum){ return self.abslum(lum); }); - case "rellum": - return ul4.expose(["lum"], function rellum(lum){ return self.rellum(lum); }); - default: - return undefined; - } - }, - - __getitem__: function __getitem__(key) - { - var orgkey = key; - if (key < 0) - key += 4; - switch (key) - { - case 0: - return this._r; - case 1: - return this._g; - case 2: - return this._b; - case 3: - return this._a; - default: - return undefined; - } - }, - - __eq__: function __eq__(other) - { - if (ul4._iscolor(other)) - return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; - return false; - }, - - r: ul4.expose([], function r() { return this._r; }), - - g: ul4.expose([], function g() { return this._g; }), - - b: ul4.expose([], function b() { return this._b; }), - - a: ul4.expose([], function a() { return this._a; }), - - lum: ul4.expose([], function lum() {return this.hls()[1]; }), - - hls: ul4.expose([], - function hls() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var h, l, s; - var rc, gc, bc; - - l = (minc+maxc)/2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc-minc) / (maxc+minc); - else - s = (maxc-minc) / (2.0-maxc-minc); - rc = (maxc-r) / (maxc-minc); - gc = (maxc-g) / (maxc-minc); - bc = (maxc-b) / (maxc-minc); - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() - { - var hls = this.hls(); - return hls.concat(this._a/255.0); - } - ), - - hsv: ul4.expose([], - function hsv() - { - var r = this._r/255.0; - var g = this._g/255.0; - var b = this._b/255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - var s = (maxc-minc) / maxc; - var rc = (maxc-r) / (maxc-minc); - var gc = (maxc-g) / (maxc-minc); - var bc = (maxc-b) / (maxc-minc); - var h; - if (r == maxc) - h = bc-gc; - else if (g == maxc) - h = 2.0+rc-bc; - else - h = 4.0+gc-rc; - h = (h/6.0) % 1.0; - return [h, s, v]; - } - ), - - hsva: ul4.expose([], - function hsva() - { - var hsv = this.hsv(); - return hsv.concat(this._a/255.0); - } - ), - - witha: ul4.expose(["a"], - function witha(a) - { - if (typeof(a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), - - withlum: ul4.expose(["lum"], - function withlum(lum) - { - if (typeof(lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - var hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } - ); - - ul4.TimeDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.TimeDelta", - - create: function create(days, seconds, microseconds) - { - var td = ul4._clone(this); - if (typeof(days) === "undefined") - days = 0; - if (typeof(seconds) === "undefined") - seconds = 0; - if (typeof(microseconds) === "undefined") - microseconds = 0; - - var total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); - - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - var total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); - days = Math.floor(total_seconds / 86400); - if (seconds < 0) - { - seconds += 86400; - --days; - } - - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, - - __repr__: function __repr__() - { - if (!this._microseconds) - { - if (!this._seconds) - { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, - - __str__: function __str__() - { - var v = []; - if (this._days) - { - v.push(this._days + " day"); - if (this._days !== -1 && this._days !== 1) - v.push("s"); - v.push(", "); - } - var seconds = this._seconds % 60; - var minutes = Math.floor(this._seconds / 60); - var hours = Math.floor(minutes / 60); - minutes = minutes % 60; - - v.push("" + hours); - v.push(":"); - v.push(ul4._lpad(minutes.toString(), "0", 2)); - v.push(":"); - v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) - { - v.push("."); - v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); - } - return v.join(""); - }, - - __bool__: function __bool__() - { - return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, - - __abs__: function __abs__() - { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._istimedelta(other)) - return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds < other._microseconds; - } - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days < other._days; - if (this._seconds != other._seconds) - return this._seconds < other._seconds; - return this._microseconds <= other._microseconds; - } - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds > other._microseconds; - } - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._istimedelta(other)) - { - if (this._days != other._days) - return this._days > other._days; - if (this._seconds != other._seconds) - return this._seconds > other._seconds; - return this._microseconds >= other._microseconds; - } - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) - { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate() + days; - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds() + seconds; - var millisecond = date.getMilliseconds() + microseconds/1000; - return new Date(year, month, day, hour, minute, second, millisecond); - }, - - __add__: function __add__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); - else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, - - __sub__: function __sub__(other) - { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) - { - if (typeof(other) === "number") - { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) - { - var myValue = this._days; - var otherValue = other._days; - var hasSeconds = this._seconds || other._seconds; - var hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) - { - myValue = myValue*86400+this._seconds; - otherValue = otherValue*86400 + other._seconds; - if (hasMicroseconds) - { - myValue = myValue * 1000000 + this._microseconds; - otherValue = otherValue * 1000000 + other._microseconds; - } - } - return myValue/otherValue; - } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "days": - return ul4.expose([], function days(){ return self._days; }); - case "seconds": - return ul4.expose([], function seconds(){ return self._seconds; }); - case "microseconds": - return ul4.expose([], function microseconds(){ return self._microseconds; }); - default: - return undefined; - } - }, - - days: function days() - { - return this._days; - }, - - seconds: function seconds() - { - return this._seconds; - }, - - microseconds: function microseconds() - { - return this._microseconds; - } - } - ); - - ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", - - create: function create(months) - { - var md = ul4._clone(this); - md._months = typeof(months) !== "undefined" ? months : 0; - return md; - }, - - __repr__: function __repr__() - { - if (!this._months) - return "monthdelta()"; - return "monthdelta(" + this._months + ")"; - }, - - __str__: function __str__() - { - if (this._months) - { - if (this._months !== -1 && this._months !== 1) - return this._months + " months"; - return this._months + " month"; - } - return "0 months"; - }, - - __bool__: function __bool__() - { - return this._months !== 0; - }, - - __abs__: function __abs__() - { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, - - __eq__: function __eq__(other) - { - if (ul4._ismonthdelta(other)) - return this._months === other._months; - return false; - }, - - __lt__: function __lt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months < other._months; - ul4._unorderable("<", this, other); - }, - - __le__: function __le__(other) - { - if (ul4._ismonthdelta(other)) - return this._months <= other._months; - ul4._unorderable("<=", this, other); - }, - - __gt__: function __gt__(other) - { - if (ul4._ismonthdelta(other)) - return this._months > other._months; - ul4._unorderable(">", this, other); - }, - - __ge__: function __ge__(other) - { - if (ul4._ismonthdelta(other)) - return this._months >= other._months; - ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() - { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) - { - var year = date.getFullYear(); - var month = date.getMonth() + months; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds(); - var millisecond = date.getMilliseconds(); - - while (true) - { - // As the month might be out of bounds, we have to find out, what the real target month is - var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - var result = new Date(year, month, day, hour, minute, second, millisecond); - if (result.getMonth() === targetmonth) - return result; - --day; - } - }, - - __add__: function __add__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); - else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __radd__: function __radd__(other) - { - if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, - - __sub__: function __sub__(other) - { - if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __rsub__: function __rsub__(other) - { - if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) - { - if (typeof(other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); - else if (ul4._ismonthdelta(other)) - return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, - - __truediv__: function __truediv__(other) - { - if (ul4._ismonthdelta(other)) - return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "months": - return ul4.expose([], function months(){ return self._months; }); - default: - return undefined; - } - }, - - months: function months() - { - return this._months; - } - } - ); - - // When we don't have a real ``Set`` type, emulate one that supports strings - ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create() - { - var set = ul4._clone(this); - set.items = {}; - set.add.apply(set, arguments); - return set; - }, - - add: function add() - { - for (var i = 0; i < arguments.length; ++i) - { - this.items[arguments[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) - { - var self = this; - switch (attrname) - { - case "add": - return ul4.expose(["*items"], function add(items){ self.add.apply(self, items); }); - default: - return undefined; - } - }, - - __contains__: function __contains__(item) - { - return this.items[item] || false; - }, - - __bool__: function __bool__() - { - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - - __repr__: function __repr__() - { - var v = []; - v.push("{"); - var i = 0; - for (var item in this.items) - { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function(other) - { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (var item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function(other) - { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in this.items) - { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function(other) - { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) - { - var result = true; - other.forEach(function(value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) - { - var count = 0; - for (var item in other.items) - { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); - } - } - ); - - var classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" - ]; - - for (var i = 0; i < classes.length; ++i) - { - var name = classes[i]; - var ul4onname = name; - if (ul4onname.substr(ul4onname.length-3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length-3); - ul4onname = ul4onname.toLowerCase(); - var object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); - } - - })(); \ No newline at end of file + + +let amd = (typeof define === 'function' && define.amd); +let commonjs = (typeof module === 'object' && module.exports); + +export let ul4 = {}; +export let ul4on = {}; + +ul4.version = "41"; + +// +// UL4ON +// + +ul4on._registry = {}; + +ul4on._havemap = (typeof (Map) === "function" && typeof (Map.prototype.forEach) === "function"); + +ul4on._havemapconstructor = false; + +if (ul4on._havemap) { + try { + if (new Map([[1, 2]]).size == 1) + ul4on._havemapconstructor = true; + } + catch (error) { + } +} + +ul4on._haveset = (typeof (Set) === "function" && typeof (Set.prototype.forEach) === "function"); + +ul4on._havesetconstructor = false; + +if (ul4on._haveset) { + try { + if (new Set([1, 2]).size == 2) + ul4on._havesetconstructor = true; + } + catch (error) { + } +} + +// Function used for making maps, when the Map constructor doesn't work +ul4on._makemap = function _makemap() { + var map = new Map(); + + for (var i = 0; i < arguments.length; ++i) { + var argument = arguments[i]; + map.set(argument[0], argument[1]); + } + return map; +}; + +// Function that creates en empty Map (if supported) or an empty object +ul4on._emptymap = function _emptymap() { + return ul4on._havemap ? new Map() : {}; +}; + +// Function that adds a (key, value) item to an object (or map) +if (ul4on._havemap) { + ul4on._setmap = function _setmap(map, key, value) { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; +} +else { + ul4on._setmap = function _setmap(map, key, value) { + map[key] = value; + }; +} + +// Function used for making sets, when the Set constructor doesn't work (or we don't have sets) +if (ul4on._haveset) { + ul4on._makeset = function _makeset() { + var set = this._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; +} +else { + ul4on._makeset = function _makeset() { + var set = ul4._Set.create(); + + for (var i = 0; i < arguments.length; ++i) + set.add(arguments[i]); + return set; + }; +} + +// Register the object ``obj`` under the name ``name`` with the UL4ON machinery +ul4on.register = function register(name, obj) { + obj.ul4onname = name; + ul4on._registry[name] = function () { return obj.create(); }; +}, + + // Return a string that contains the object ``obj`` in the UL4ON serialization format + ul4on.dumps = function dumps(obj, indent) { + var encoder = ul4on.Encoder.create(indent); + encoder.dump(obj); + return encoder.finish(); + }, + + // Load an object from the string ``data``. + // ``data`` must contain the object in the UL4ON serialization format + // ``registry`` may be null or a dictionary mapping type names to objects with a create method + ul4on.loads = function loads(data, registry) { + var decoder = ul4on.Decoder.create(data, registry); + return decoder.load(); + }, + + // Helper "class" for encoding + ul4on.Encoder = { + // Create a new Encoder object + create: function create(indent) { + var encoder = ul4._clone(this); + encoder.indent = indent || null; + encoder.data = []; + encoder._level = 0; + encoder._strings2index = {}; + encoder._ids2index = {}; + encoder._backrefs = 0; + return encoder; + }, + + _line: function _line(line) { + var i, oldindent; + + if (this.indent !== null) { + for (i = 0; i < this._level; ++i) + this.data.push(this.indent); + } + else { + if (this.data.length) + this.data.push(" "); + } + this.data.push(line); + + if (arguments.length > 1) { + oldindent = this.indent; + this.indent = null; + for (i = 1; i < arguments.length; ++i) + this.dump(arguments[i]); + this.indent = oldindent; + } + + if (this.indent !== null) + this.data.push("\n"); + }, + + // Return the complete string written to the buffer + finish: function finish() { + return this.data.join(""); + }, + + dump: function dump(obj) { + if (obj === null) + this._line("n"); + else if (typeof (obj) == "boolean") + this._line(obj ? "bT" : "bF"); + else if (typeof (obj) == "number") { + var type = (Math.round(obj) == obj) ? "i" : "f"; + this._line(type + obj); + } + else if (typeof (obj) == "string") { + var index = this._strings2index[obj]; + if (typeof (index) !== "undefined") { + this._line("^" + index); + } + else { + this._strings2index[obj] = this._backrefs++; + this._line("S" + ul4._str_repr(obj)); + } + } + else if (ul4._iscolor(obj)) + this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); + else if (ul4._isdate(obj)) + this._line("z", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + else if (ul4._istimedelta(obj)) + this._line("t", obj.days(), obj.seconds(), obj.microseconds()); + else if (ul4._ismonthdelta(obj)) + this._line("m", obj.months()); + else if (typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.slice)) + this._line("r", obj.start, obj.stop); + else if (obj.ul4onname && obj.ul4ondump) { + if (obj.__id__) { + var index = this._ids2index[obj.__id__]; + if (typeof (index) != "undefined") { + this._line("^" + index); + return; + } + } + if (obj.__id__) + this._ids2index[obj.__id__] = this._backrefs++; + this._line("O", obj.ul4onname); + ++this._level; + obj.ul4ondump(this); + --this._level; + this._line(")"); + } + else if (ul4._islist(obj)) { + this._line("l"); + ++this._level; + for (var i in obj) + this.dump(obj[i]); + --this._level; + this._line("]"); + } + else if (ul4._ismap(obj)) { + this._line("e"); + ++this._level; + obj.forEach(function (value, key) { + this.dump(key); + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else if (ul4._isdict(obj)) { + this._line("d"); + ++this._level; + for (var key in obj) { + this.dump(key); + this.dump(obj[key]); + } + --this._level; + this._line("}"); + } + else if (ul4._isset(obj)) { + this._line("y"); + ++this._level; + obj.forEach(function (value) { + this.dump(value); + }, this); + --this._level; + this._line("}"); + } + else + throw "can't handle object"; + } + }; + +// Helper "class" for decoding +ul4on.Decoder = { + // Creates a new decoder for reading from the string ``data`` + create: function create(data, registry) { + var decoder = ul4._clone(this); + decoder.data = data; + decoder.pos = 0; + decoder.backrefs = []; + decoder.registry = typeof (registry) === "undefined" ? null : registry; + return decoder; + }, + + // Read a character from the buffer + readchar: function readchar() { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + return this.data.charAt(this.pos++); + }, + + // Read a character from the buffer (return null on eof) + readcharoreof: function readcharoreof() { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + }, + + // Read next not-whitespace character from the buffer + readblackchar: function readblackchar() { + var re_white = /\s/; + + for (; ;) { + if (this.pos >= this.data.length) + throw "UL4 decoder at EOF"; + var c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } + }, + + // Read ``size`` characters from the buffer + read: function read(size) { + if (this.pos + size > this.length) + size = this.length - this.pos; + var result = this.data.substring(this.pos, this.pos + size); + this.pos += size; + return result; + }, + + // "unread" one character + backup: function backup() { + --this.pos; + }, + + // Read a number from the buffer + readnumber: function readnumber() { + var re_digits = /[-+0123456789.eE]/, value = ""; + for (; ;) { + var c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else { + var result = parseFloat(value); + if (result == NaN) + throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; + return result; + } + } + }, + + _beginfakeloading: function _beginfakeloading() { + var oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + }, + + _endfakeloading: function _endfakeloading(oldpos, value) { + this.backrefs[oldpos] = value; + }, + + _readescape: function _readescape(escapechar, length) { + var chars = this.read(length); + if (chars.length != length) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + var codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; + return String.fromCharCode(codepoint); + }, + + // Load the next object from the buffer + load: function load() { + var typecode = this.readblackchar(); + var result; + switch (typecode) { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + var delimiter = this.readblackchar(); + for (; ;) { + var c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") { + var c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } + else + result.push(c); + } + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = ul4.Color.create(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load() / 1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = ul4.TimeDelta.create(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = ul4.slice.create(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = ul4.MonthDelta.create(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "]") + return result; + this.backup(); + result.push(this.load()); + } + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4on._havemap && (typecode == "e" || typecode == "E")) + throw "ordered dictionaries are not supported!"; + result = ul4on._emptymap(); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + var key = this.load(); + var value = this.load(); + ul4on._setmap(result, key, value); + } + return result; + case "y": + case "Y": + result = ul4on._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (; ;) { + typecode = this.readblackchar(); + if (typecode === "}") + return result; + this.backup(); + result.add(this.load()); + } + return result; + case "o": + case "O": + var oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + var name = this.load(); + var proto; + if (this.registry !== null) { + proto = this.registry[name]; + if (typeof (proto) === "undefined") + proto = ul4on._registry[name]; + } + else + proto = ul4on._registry[name]; + if (typeof (proto) === "undefined") + throw "can't load object of type " + ul4._repr(name); + result = proto(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); + typecode = this.readblackchar(); + if (typecode !== ")") + throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; + return result; + default: + throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + } + }, + + // Return an iterator for loading the content of a object + loadcontent: function load(loadcontent) { + let self = this; + return { + next: function () { + let typecode = self.readblackchar(); + self.backup(); + if (typecode == ")") + return { done: true }; + else + return { done: false, value: self.load() }; + } + }; + } +}; + + +// +// UL4 +// + +// REs for parsing JSON +ul4._rvalidchars = /^[\],:{}\s]*$/; +ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; +ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; +ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; + +/// Helper functions + +// Crockford style object creation +ul4._simpleclone = function _simpleclone(obj) { + function F() { }; + F.prototype = obj; + var result = new F(); + return result; +}; + +// Crockford style object creation + prototype chain + object ids +ul4._clone = function _clone(obj) { + var result = ul4._simpleclone(obj); + result.__prototype__ = obj; + result.__id__ = ul4.Proto._nextid++; + return result; +}; + +// Adds attributes from on object to another and returns it +ul4._extend = function _extend(obj, attrs) { + for (var name in attrs) + obj[name] = attrs[name]; + return obj; +}; + +// Clone an object via ``_simpleclone`` and extend it +ul4._simpleinherit = function _simpleinherit(baseobj, attrs) { + return ul4._extend(ul4._simpleclone(baseobj), attrs); +}; + +// Clone an object via ``_clone`` and extend it +ul4._inherit = function _inherit(baseobj, attrs) { + return ul4._extend(ul4._clone(baseobj), attrs); +}; + +// Convert a map to an object +ul4._map2object = function _map2object(obj) { + if (ul4._ismap(obj)) { + var newobj = {}; + obj.forEach(function (value, key) { + if (typeof (key) !== "string") + throw ul4.TypeError.create("keys must be strings"); + newobj[key] = value; + }); + return newobj; + } + return obj; +}; + +// Clip a number to the range [0;max) +ul4._bound = function _bound(value, upper) { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; +}; + +// Create a pretty stacktrace from an exception +ul4._stacktrace = function _stacktrace(exc) { + var output = ul4._type(exc); + var s = exc.toString(); + if (s) + output += ": " + s; + if (exc.cause) + output += "\n\n" + ul4._stacktrace(exc.cause); + return output; +}; + +// Call a function ``f`` with UL4 argument handling +ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) { + var finalargs; + if (needsobject) { + if (signature === null) { + if (args.length) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; + } + else + finalargs = [signature.bindObject(name, args, kwargs)]; + } + else { + if (signature === null) + throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); +}; + +ul4._callfunction = function _callfunction(context, f, args, kwargs) { + var name = f._ul4_name || f.name; + if (typeof (f._ul4_signature) === "undefined" || typeof (f._ul4_needsobject) === "undefined" || typeof (f._ul4_needscontext) === "undefined") + throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); +} + +ul4._callobject = function _callobject(context, obj, args, kwargs) { + if (typeof (obj._ul4_callsignature) === "undefined" || typeof (obj._ul4_callneedsobject) === "undefined" || typeof (obj._ul4_callneedscontext) === "undefined") + throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); +} + +ul4._callrender = function _callrender(context, obj, args, kwargs) { + if (typeof (obj._ul4_rendersignature) === "undefined" || typeof (obj._ul4_renderneedsobject) === "undefined" || typeof (obj._ul4_renderneedscontext) === "undefined") + throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); +} + +ul4._call = function _call(context, f, args, kwargs) { + if (typeof (f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof (f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); + else + throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); +} + +ul4._unpackvar = function _unpackvar(lvalue, value) { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else { + var newvalue = []; + var iter = ul4._iter(value); + + for (var i = 0; ; ++i) { + var item = iter.next(); + + if (item.done) { + if (i === lvalue.length) + break; + else + throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); + } + else { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); + } + } + return newvalue; + } +}; + +ul4._formatsource = function _formatsource(out) { + var finalout = []; + var level = 0, needlf = false; + for (var i = 0; i < out.length; ++i) { + if (typeof (out[i]) === "number") { + level += out[i]; + needlf = true; + } + else { + if (needlf) { + finalout.push("\n"); + for (var j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; + } + finalout.push(out[i]); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); +}; + +// Compare ``obj1`` and ``obj2`` if they have the same value +ul4._eq = function _eq(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof (obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 == obj2 + else + return false; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 == obj2; + else + return false; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; + } + else + return false; + } + else if (ul4._isobject(obj1)) { + if (ul4._isobject(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) { + if (obj2.hasOwnProperty(key)) { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) { + if (!obj1.hasOwnProperty(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (var key in obj1) { + if (obj2.has(key)) { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + var result = true; + obj2.forEach(function (value, key) { + if (!obj1.hasOwnProperty(key)) + result = false; + }); + return result; + } + else + return false; + } + else if (ul4._ismap(obj1)) { + if (ul4._isobject(obj2)) { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function (value, key) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.hasOwnProperty(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + result = false; + } + }); + if (!result) + return false; + // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) + for (var key in obj2) { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + var result = true; + obj1.forEach(function (value, key) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(key)) + result = false; + else if (!ul4._eq(obj1.get(key), obj2.get(key))) + result = false; + } + }); + return result; + } + else + return false; + } + else if (ul4._isset(obj1)) { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + var result = true; + obj1.forEach(function (value) { + if (result) // Skip code, if result is already ``false`` + { + if (!obj2.has(value)) + result = false; + } + }); + return result; + } + else + return false; + } + else + return obj1 === obj2; +}; + +// Compare ``obj1`` and ``obj2`` if they don't have the same value +ul4._ne = function _ne(obj1, obj2) { + if (obj1 && typeof (obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof (obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); +} + +ul4._unorderable = function _unorderable(operator, obj1, obj2) { + throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); +}; + +// Return: +// -1 when ``obj1 < obj2``, +// 0 when ``obj1 == obj2``, +// 1 when ``obj1 > obj2``, +// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) +// raise TypeError if objects are uncomparable +// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= +// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + +ul4._cmp = function _cmp(operator, obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) { + var v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); + } + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return 0; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return 1; + var res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; + } + return obj2.length > obj1.length ? -1 : 0; + } + } + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + else + ul4._unorderable(operator, obj1, obj2); +} + +// Return whether ``obj1 < obj2`` +ul4._lt = function _lt(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 < obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1)) { + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<", obj1, obj2); +}; + +// Return whether ``obj1 <= obj2`` +ul4._le = function _le(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return false; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length <= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable("<=", obj1, obj2); +}; + +// Return whether ``obj1 > obj2`` +ul4._gt = function _gt(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 > obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return false; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length > obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">", obj1, obj2); +}; + +// Return whether ``obj1 >= obj2`` +ul4._ge = function _ge(obj1, obj2) { + var numbertypes = ["boolean", "number"]; + + if (obj1 && typeof (obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof (obj1)) != -1) { + if (numbertypes.indexOf(typeof (obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof (obj1) === "string") { + if (typeof (obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdate(obj1)) { + if (ul4._isdate(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) { + if (ul4._islist(obj2)) { + if (obj1 === obj2) + return true; + for (var i = 0; i < obj1.length; ++i) { + if (i >= obj2.length) + return true; + var eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); + } + return obj1.length >= obj2.length; + } + } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { + var in1only = false; + var in2only = false; + + if (ul4._isset(obj2)) { + if (ul4._isset(obj2)) { + obj1.forEach(function (value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function (value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + obj1.forEach(function (value) { + if (!obj2.items[value]) + in1only = true; + }); + for (var value in obj2.items) { + if (!obj1.has(value)) { + in2only = true; + break; + } + } + } + } + else if (ul4._isul4set(obj2)) { + if (ul4._isset(obj2)) { + for (var value in obj1.items) { + if (!obj2.has(value)) { + in1only = true; + break; + } + } + obj2.forEach(function (value) { + if (!obj1.items[value]) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) { + for (var value in obj1.items) { + if (!obj2.items[value]) { + in1only = true; + break; + } + } + for (var value in obj2.items) { + if (!obj1.items[value]) { + in2only = true; + break; + } + } + } + } + else + ul4._unorderable(operator, obj1, obj2); + + if (in1only) { + if (in2only) + return null; + else + return 1; + } + else { + if (in2only) + return -1; + else + return 0; + } + } + ul4._unorderable(">=", obj1, obj2); +}; + +// Return an iterator for ``obj`` +ul4._iter = function _iter(obj) { + if (typeof (obj) === "string" || ul4._islist(obj)) { + return { + index: 0, + next: function () { + if (this.index < obj.length) + return { value: obj[this.index++], done: false }; + else + return { done: true }; + } + }; + } + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof (obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) { + var keys = []; + obj.forEach(function (value, key) { + keys.push(key); + }); + return { + index: 0, + next: function () { + if (this.index >= keys.length) + return { done: true }; + return { value: keys[this.index++], done: false }; + } + }; + } + else if (ul4._isset(obj)) { + var values = []; + obj.forEach(function (value, key) { + values.push(value); + }); + return { + index: 0, + next: function () { + if (this.index >= values.length) + return { done: true }; + return { value: values[this.index++], done: false }; + } + }; + } + else if (ul4._isul4set(obj)) { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) { + var keys = []; + for (var key in obj) + keys.push(key); + return { + index: 0, + next: function () { + if (this.index >= keys.length) + return { done: true }; + return { value: keys[this.index++], done: false }; + } + }; + } + throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); +}; + +ul4._str_repr = function _str_repr(str, ascii) { + var result = ""; + var squote = false, dquote = false; + + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + if (c == '"') { + dquote = true; + if (squote) + break; + } + else if (c == "'") { + squote = true; + if (dquote) + break; + } + } + + // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes + var quote = (squote && !dquote) ? '"' : "'"; + + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + switch (c) { + case '"': + result += (quote == c) ? '\\"' : c; + break; + case "'": + result += (quote == c) ? "\\'" : c; + break; + case "\\": + result += "\\\\"; + break; + case "\t": + result += "\\t"; + break; + case "\n": + result += "\\n"; + break; + case "\r": + result += "\\r"; + break; + default: + var code = str.charCodeAt(i); + var escape; + if (code < 32) + escape = 2; + else if (code < 0x7f) + escape = 0; + else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) + escape = 0; + else if (code <= 0xff) + escape = 2; + else if (code <= 0xffff) + escape = 4; + else + escape = 8; + + if (escape === 0) + result += c; + else if (escape === 2) + result += "\\x" + ul4._lpad(code.toString(16), "0", 2); + else if (escape === 4) + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + else + result += "\\U" + ul4._lpad(code.toString(16), "0", 8); + break; + } + } + return quote + result + quote; +}; + +ul4._date_repr = function _date_repr(obj, ascii) { + var year = obj.getFullYear(); + var month = obj.getMonth() + 1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + var result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); + + if (hour || minute || second || ms) { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + result += ")"; + + return result; +}; + +ul4._map_repr = function _map_repr(obj, ascii) { + var v = []; + v.push("{"); + + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(value, ascii)); + }); + + v.push("}"); + return v.join(""); +}; + +ul4._list_repr = function _list_repr(obj, ascii) { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) { + if (i !== 0) + v.push(", "); + v.push(ul4._repr_internal(obj[i], ascii)); + } + v.push("]"); + return v.join(""); +}; + +ul4._set_repr = function _set_repr(obj, ascii) { + var v = []; + v.push("{"); + if (!obj.size) + v.push("/"); + else { + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(value, ascii)); + }); + } + v.push("}"); + return v.join(""); +}; + +ul4._object_repr = function _object_repr(obj, ascii) { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) { + if (!obj.hasOwnProperty(key)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(obj[key], ascii)); + } + v.push("}"); + return v.join(""); +}; + +ul4._repr_internal = function _repr_internal(obj, ascii) { + if (obj === null) + return "None"; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof (obj) === "string") + return ul4._str_repr(obj, ascii); + else if (typeof (obj) === "number") + return "" + obj; + else if (typeof (obj) === "function") + if (obj._ul4_name || obj.name) + return ""; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (typeof (obj) === "undefined") + return ""; + else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; +}; + +// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` +ul4._repr = function _repr(obj) { + return ul4._repr_internal(obj, false); +} + +ul4._ascii = function _ascii(obj) { + return ul4._repr_internal(obj, true); +} + +ul4._date_str = function _date_str(obj) { + var year = obj.getFullYear(); + var month = obj.getMonth() + 1; + var day = obj.getDate(); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + + var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; +}; + +ul4._str = function _str(obj) { + if (typeof (obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof (obj) === "string") + return obj; + else if (typeof (obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof (obj) === "object" && typeof (obj.__str__) === "function") + return obj.__str__(); + else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; +}; + +// Convert ``obj`` to bool, according to its "truth value" +ul4._bool = function _bool(obj) { + if (typeof (obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else { + if (typeof (obj) === "object", typeof (obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) { + for (var key in obj) { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } +}; + +// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) +ul4._int = function _int(obj, base) { + var result; + if (base !== null) { + if (typeof (obj) !== "string" || !ul4._isint(base)) + throw ul4.TypeError.create("int()", "int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else { + if (typeof (obj) == "string") { + result = parseInt(obj); + if (result.toString() == "NaN") + throw ul4.TypeError.create("int()", "invalid literal for int()"); + return result; + } + else if (typeof (obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); + } +}; + +// Convert ``obj`` to a float +ul4._float = function _float(obj) { + if (typeof (obj) === "string") + return parseFloat(obj); + else if (typeof (obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); +}; + +// Convert ``obj`` to a list +ul4._list = function _list(obj) { + var iter = ul4._iter(obj); + + var result = []; + for (; ;) { + var value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } +}; + +// Convert ``obj`` to a set +ul4._set = function _set(obj) { + var iter = ul4._iter(obj); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (; ;) { + var value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } +}; + +// Return the length of ``sequence`` +ul4._len = function _len(sequence) { + if (typeof (sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) { + var i = 0; + for (var key in sequence) + ++i; + return i; + } + throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); +}; + +ul4._type = function _type(obj) { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof (obj) === "undefined") + return "undefined"; + else if (typeof (obj) === "string") + return "str"; + else if (typeof (obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (ul4._islist(obj)) + return "list"; + else if (ul4._isset(obj)) + return "set"; + else if (ul4._isdate(obj)) + return "date"; + else if (typeof (obj.__type__) !== "undefined") + return obj.__type__; + else if (ul4._istimedelta(obj)) + return "timedelta"; + else if (ul4._isdict(obj)) + return "dict"; + else if (ul4._istemplate(obj)) + return "template"; + else if (ul4._isfunction(obj)) + return "function"; + return null; +}; + + +// Return whether any of the items in ``iterable`` are true +ul4._any = function _any(iterable) { + if (typeof (iterable) == "string") { + for (var i = 0; i < iterable.length; ++i) { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else { + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } +}; + +// Return whether all of the items in ``iterable`` are true +ul4._all = function _all(iterable) { + if (typeof (iterable) == "string") { + for (var i = 0; i < iterable.length; ++i) { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else { + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } +}; + +// Check if ``obj`` is undefined +ul4._isundefined = function _isundefined(obj) { + return typeof (obj) === "undefined"; +}; + + +// Check if ``obj`` is *not* undefined +ul4._isdefined = function _isdefined(obj) { + return typeof (obj) !== "undefined"; +}; + +// Check if ``obj`` is ``None`` +ul4._isnone = function _isnone(obj) { + return obj === null; +}; + +// Check if ``obj`` is a boolean +ul4._isbool = function _isbool(obj) { + return typeof (obj) == "boolean"; +}; + +// Check if ``obj`` is a int +ul4._isint = function _isint(obj) { + return (typeof (obj) == "number") && Math.round(obj) == obj; +}; + +// Check if ``obj`` is a float +ul4._isfloat = function _isfloat(obj) { + return (typeof (obj) == "number") && Math.round(obj) != obj; +}; + +// Check if ``obj`` is a string +ul4._isstr = function _isstr(obj) { + return typeof (obj) == "string"; +}; + +// Check if ``obj`` is a date +ul4._isdate = function _isdate(obj) { + return Object.prototype.toString.call(obj) == "[object Date]"; +}; + +// Check if ``obj`` is a color +ul4._iscolor = function _iscolor(obj) { + return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Color)); +}; + +// Check if ``obj`` is a timedelta object +ul4._istimedelta = function _istimedelta(obj) { + return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.TimeDelta)); +}; + +// Check if ``obj`` is a monthdelta object +ul4._ismonthdelta = function _ismonthdelta(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.MonthDelta); +}; + +// Check if ``obj`` is a template +ul4._istemplate = function _istemplate(obj) { + return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); +}; + +// Check if ``obj`` is a function +ul4._isfunction = function _isfunction(obj) { + return typeof (obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); +}; + +// Check if ``obj`` is a list +ul4._islist = function _islist(obj) { + return Object.prototype.toString.call(obj) == "[object Array]"; +}; + +// Check if ``obj`` is a set +ul4._isset = function _isset(obj) { + return Object.prototype.toString.call(obj) == "[object Set]"; +}; + +// Check if ``obj`` is an exception (at least a UL4 exception) +ul4._isexception = function _isexception(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Error); +}; + +ul4._isul4set = function _isul4set(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4._Set); +}; + +// Check if ``obj`` is an iterator +ul4._isiter = function _isiter(obj) { + return obj !== null && typeof (obj) === "object" && typeof (obj.next) === "function"; +}; + +// Check if ``obj`` is a JS object +ul4._isobject = function _isobject(obj) { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof (obj.__type__) === "undefined"; +}; + +// Check if ``obj`` is a map +ul4._ismap = function _ismap(obj) { + if (ul4on._havemap) + return obj !== null && typeof (obj) === "object" && typeof (obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + return false; +}; + +// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) +ul4._isdict = function _isdict(obj) { + return ul4._isobject(obj) || ul4._ismap(obj); +}; + + +// Repeat string ``str`` ``rep`` times +ul4._str_repeat = function _str_repeat(str, rep) { + var result = ""; + for (; rep > 0; --rep) + result += str; + return result; +}; + +ul4._list_repeat = function _list_repeat(list, rep) { + var result = []; + for (; rep > 0; --rep) + for (var i = 0; i < list.length; ++i) + result.push(list[i]); + return result; +}; + +ul4._str_json = function _str_json(str) { + var result = ""; + for (var i = 0; i < str.length; ++i) { + var c = str[i]; + switch (c) { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + default: + var code = str.charCodeAt(i); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; +}; + +// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) +ul4._asjson = function _asjson(obj) { + if (obj === null) + return "null"; + else if (typeof (obj) === "undefined") + return "{}.undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof (obj) === "string") + return ul4._str_json(obj); + else if (typeof (obj) === "number") { + return "" + obj; + } + else if (ul4._islist(obj)) { + var v = []; + v.push("["); + for (var i = 0; i < obj.length; ++i) { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) { + var v = []; + v.push("{"); + var i = 0; + obj.forEach(function (value, key) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) { + var v = []; + v.push("{"); + var i = 0; + for (var key in obj) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) { + return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) { + return "ul4.MonthDelta.create(" + obj.months + ")"; + } + else if (ul4._iscolor(obj)) { + return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); +}; + +// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object +ul4._fromjson = function _fromjson(string) { + // The following is from jQuery's parseJSON function + string = ul4._strip(string, null); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw ul4.TypeError.create("fromjson()", "invalid JSON"); +}; + +// Encodes ``obj`` in the UL4 Object Notation format +ul4._asul4on = function _asul4on(obj) { + return ul4on.dumps(obj); +}; + +// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object +ul4._fromul4on = function _fromul4on(string) { + return ul4on.loads(string); +}; + +ul4._format_date = function _format_date(obj, fmt, lang) { + var translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p " + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + var translation = translations[lang]; + + var firstday; + + var result = []; + var inspec = false; + for (var i = 0; i < fmt.length; ++i) { + var c = fmt[i]; + if (inspec) { + switch (c) { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours() - 1) % 12) + 1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4._yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth() + 1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); +}; + +ul4._format_int = function _format_int(obj, fmt, lang) { + var work = fmt; + + // Defaults + var fill = ' '; + var align = '>'; // '<', '>', '=' or '^' + var sign = '-'; // '+', '-' or ' ' + var alternate = false; + var minimumwidth = 0; + var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) { + type = work.substring(work.length - 1); + work = work.substring(0, work.length - 1); + } + + // Extract minimum width + if (/\d+$/.test(work)) { + var minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) { + alternate = true; + work = work.substring(0, work.length - 1); + } + + // Determine sign + if (/[+ -]$/.test(work)) { + if (type == 'c') + throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length - 1); + work = work.substring(0, work.length - 1); + } + + // Extract fill and align char + if (work.length >= 3) + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) { + if (/[<>=^]$/.test(work)) { + align = work[1]; + fill = work[0]; + } + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + var neg = obj < 0; + + if (neg) + obj = -obj; + + var output; + switch (type) { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw ul4.ValueError.create("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth - output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + else // if (align == '^') + { + var pad = minimumwidth - output.length; + var padBefore = Math.floor(pad / 2); + var padAfter = pad - padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; +}; + +// Format ``obj`` using the format string ``fmt`` in the language ``lang`` +ul4._format = function _format(obj, fmt, lang) { + if (typeof (lang) === "undefined" || lang === null) + lang = "en"; + else { + var translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null }; + lang = lang.toLowerCase(); + if (typeof (translations[lang]) === "undefined") { + lang = lang.split(/_/)[0]; + if (typeof (translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_date(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); +}; + +ul4._lpad = function _lpad(string, pad, len) { + if (typeof (string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; +}; + +ul4._rpad = function _rpad(string, pad, len) { + if (typeof (string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; +}; + +ul4.Proto = { + __prototype__: null, + __id__: 0, + _nextid: 1, + isa: function isa(type) { + if (this === type) + return true; + if (this.__prototype__ === null) + return false; + return this.__prototype__.isa(type); + }, + + isprotoof: function isprotoof(obj) { + while (true) { + if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof (obj.__prototype__) === "undefined") + return false; + if (obj === this) + return true; + obj = obj.__prototype__; + } + }, + + // equality comparison of objects defaults to identity comparison + __eq__: function __eq__(other) { + return this === other; + }, + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__: function __ne__(other) { + return !this.__eq__(other); + }, + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__: function __bool__() { + return true; + } +}; + +ul4.Signature = ul4._inherit( + ul4.Proto, + { + create: function create() { + var signature = ul4._clone(this); + signature.args = []; + signature.argNames = {}; + signature.remargs = null; + signature.remkwargs = null; + + var nextDefault = false; + var lastArgname = null; + for (var i = 0; i < arguments.length; ++i) { + var argName = arguments[i]; + if (nextDefault) { + signature.args.push({ name: lastArgname, defaultValue: argName }); + signature.argNames[lastArgname] = true; + nextDefault = false; + } + else { + if (argName.substr(argName.length - 1) === "=") { + lastArgname = argName.substr(0, argName.length - 1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + signature.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + signature.remargs = argName.substr(1); + else { + signature.args.push({ name: argName }); + signature.argNames[argName] = true; + } + } + } + return signature; + }, + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray: function bindArray(name, args, kwargs) { + var finalargs = []; + var decname = name !== null ? name + "() " : ""; + + for (var i = 0; i < this.args.length; ++i) { + var arg = this.args[i]; + if (i < args.length) { + if (kwargs.hasOwnProperty(arg.name)) + throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) { + // No, but we have them -> complain + if (args.length > this.args.length) { + var prefix = name === null ? "expected" : name + "() expects"; + throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) { + // No => complain about unknown ones + for (var key in kwargs) { + if (!this.argNames[key]) { + if (name === null) + throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else { + // Yes => Put the unknown ones into an object and add that to the arguments array + var remkwargs = {}; + for (var key in kwargs) { + if (!this.argNames[key]) + remkwargs[key] = kwargs[key]; + } + finalargs.push(remkwargs); + } + + return finalargs; + }, + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject: function bindObject(name, args, kwargs) { + args = this.bindArray(name, args, kwargs); + var argObject = {}; + var i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + }, + + __repr__: function __repr__() { + return ""; + }, + + __str__: function __str__() { + return this.toString(); + }, + + toString: function toString() { + var v = []; + for (var i = 0; i < this.args.length; ++i) { + var arg = this.args[i]; + + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + } +); + +// Adds name and signature to a function/method and makes the method callable in templates +ul4.expose = function expose(signature, options, f) { + if (typeof (f) === "undefined") { + f = options; + options = {}; + } + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + + return f; +}; + +ul4.Context = ul4._inherit( + ul4.Proto, + { + create: function create(vars) { + if (vars === null || typeof (vars) === "undefined") + vars = {}; + var context = ul4._clone(this); + context.vars = vars; + context.indents = []; + context._output = []; + return context; + }, + + /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. + * This is used by the various comprehensions to avoid leaking loop variables. + */ + inheritvars: function inheritvars() { + var context = ul4._clone(this); + context.vars = ul4._simpleclone(this.vars); + return context; + }, + + /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ + withindent: function withindent(indent) { + var context = ul4._clone(this); + if (indent !== null) { + context.indents = this.indents.slice(); + context.indents.push(indent); + } + return context; + }, + + /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ + replaceoutput: function replaceoutput() { + var context = ul4._clone(this); + context._output = []; + return context; + }, + + clone: function clone(vars) { + return ul4._clone(this); + }, + + output: function output(value) { + this._output.push(value); + }, + + getoutput: function getoutput() { + return this._output.join(""); + }, + + get: function get(name) { + return this.vars[name]; + }, + + set: function set(name, value) { + this.vars[name] = value; + } + } +); + +/// Exceptions + +ul4.Exception = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Exception", + "cause": null, + + __getattr__: function __getattr__(attrname) { + switch (attrname) { + case "cause": + return this.cause; + default: + return undefined; + } + } + } +); + +// Exceptions used internally by UL4 for flow control +ul4.InternalException = ul4._inherit(ul4.Exception, {}); + +// Control flow exceptions +ul4.ReturnException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ReturnException", + + create: function create(result) { + var exception = ul4._clone(this); + exception.result = result; + return exception; + } + } +); + +ul4.BreakException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.BreakException" + } +); + +ul4.ContinueException = ul4._inherit( + ul4.InternalException, + { + __type__: "ul4.ContinueException" + } +); + +// Real exceptions raised by various parts of UL4 +ul4.SyntaxError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.SyntaxError" + } +); + +ul4.LValueRequiredError = ul4._inherit( + ul4.SyntaxError, + { + __type__: "ul4.LValueRequiredError", + + toString: function toString() { + return "lvalue required!"; + } + } +); + +ul4.TypeError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.TypeError", + + create: function create(operation, message) { + var exception = ul4._clone(this); + exception.operation = operation; + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +ul4.ValueError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ValueError", + + create: function create(message) { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +ul4.ArgumentError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.ArgumentError", + + create: function create(message) { + var exception = ul4._clone(this); + exception.message = message; + return exception; + }, + toString: function toString() { + return this.message; + } + } +); + +/// Exception that wraps other exceptions while they bubble up the stack +ul4.LocationError = ul4._inherit( + ul4.Exception, + { + __type__: "ul4.LocationError", + + create: function create(location, cause) { + var exception = ul4._clone(this); + exception.location = location; + exception.cause = cause; + return exception; + }, + + _templateprefix: function (template) { + var out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + var first = true; + while (template != null) { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + }, + + _template: function _template() { + if (ul4.Tag.isprotoof(this.location)) + return this.location.template; + else + return this.location.tag.template; + }, + + _outerpos: function _outerpos() { + if (ul4.Tag.isprotoof(this.location)) + return this.location.pos; + else { + var tag = this.location.tag; + if (tag === null) // A top level template as no tag + return this.location.pos; + else + return tag.pos; + } + }, + + _innerpos: function _innerpos() { + return this.location.pos; + }, + + toString: function toString() { + var template = this._template(); + var templateprefix = this._templateprefix(template); + var outerpos = this._outerpos(); + var innerpos = this._innerpos(); + + var prefix = template.source.substring(outerpos.start, innerpos.start); + var code = template.source.substring(innerpos.start, innerpos.stop); + var suffix = template.source.substring(innerpos.stop, outerpos.stop); + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + var text = prefix + code + suffix; + var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + // find line numbers + var lineno = 1, colno = 1; + for (var i = 0; i < innerpos.start; ++i) { + if (template.source[i] === "\n") { + ++lineno; + colno = 1; + } + else + ++colno; + } + + pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; + + return templateprefix + ": " + pos + "\n" + text + "\n" + underline; + }, + + __getattr__: function __getattr__(attrname) { + switch (attrname) { + case "cause": + return this.cause; + case "location": + return this.location; + case "template": + return this._template; + case "outerpos": + return this._outerpos; + case "innerpos": + return this._innerpos; + default: + return undefined; + } + } + } +); + + +/// Classes for the syntax tree +ul4.AST = ul4._inherit( + ul4.Proto, + { + create: function create(pos) { + var ast = ul4._clone(this); + ast.pos = pos; + return ast; + }, + __str__: function __str__() { + var out = []; + this._str(out); + return ul4._formatsource(out); + }, + __repr__: function __repr__() { + var out = []; + this._repr(out); + return ul4._formatsource(out); + }, + _handle_eval: function _handle_eval(context) { + try { + return this._eval(context); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, value) { + try { + return this._eval_set(context, value); + } + catch (exc) { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_set: function _eval_set(context, value) { + throw ul4.LValueRequiredError; + }, + _handle_eval_modify: function _handle_eval_modify(context, operator, value) { + try { + return this._eval_modify(context, operator, value); + } + catch (exc) { + if (!ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval_modify: function _eval_modify(context, operator, value) { + throw ul4.LValueRequiredError; + }, + _repr: function _repr(out) { + }, + _str: function _str(out) { + }, + ul4ondump: function ul4ondump(encoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this[this._ul4onattrs[i]]); + }, + ul4onload: function ul4onload(decoder) { + for (var i = 0; i < this._ul4onattrs.length; ++i) + this[this._ul4onattrs[i]] = decoder.load(); + }, + __setitem__: function __setitem__(attrname, value) { + throw ul4.TypeError.create("mutate", "object is immutable"); + }, + // used in ul4ondump/ul4ondump to automatically dump these attributes + _ul4onattrs: ["pos"] + } +); + +ul4.TextAST = ul4._inherit( + ul4.AST, + { + create: function create(template, pos) { + var text = ul4.AST.create.call(this, pos); + text.template = template; + return text; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), + _text: function _text() { + return this.template.source.substring(this.pos.start, this.pos.stop); + }, + _eval: function _eval(context) { + context.output(this._text()); + }, + _str: function _str(out) { + out.push("text "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.IndentAST = ul4._inherit( + ul4.TextAST, + { + create: function create(template, pos, text) { + var indent = ul4.TextAST.create.call(this, template, pos); + indent._maketext(text); + return indent; + }, + _maketext: function _maketext(text) { + if (typeof (this.template) !== "undefined") { + if (text === null) + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + else + this.text = text; + } + else + this.text = null; + }, + _text: function _text() { + if (this.text === null) + return this.template.source.substring(this.pos.start, this.pos.stop); + else + return this.text; + }, + _eval: function _eval(context) { + for (var i = 0; i < context.indents.length; ++i) + context.output(context.indents[i]); + context.output(this._text()); + }, + ul4ondump: function ul4ondump(encoder) { + ul4.TextAST.ul4ondump.call(this, encoder); + + if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + encoder.dump(null); + else + encoder.dump(this.text); + }, + ul4onload: function ul4onload(decoder) { + ul4.TextAST.ul4onload.call(this, decoder); + // Recreate ``text`` attribute + this._maketext(decoder.load()); + }, + _str: function _str(out) { + out.push("indent "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.LineEndAST = ul4._inherit( + ul4.TextAST, + { + _str: function _str(out) { + out.push("lineend "); + out.push(ul4._repr(this._text())); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.Tag = ul4._inherit( + ul4.AST, + { + create: function create(template, tag, tagpos, codepos) { + var tago = ul4.AST.create.call(this, tagpos); + tago.template = template; + tago.tag = tag; + tago.codepos = codepos; + tago._maketext(); + return tago; + }, + _maketext: function _maketext() { + if (typeof (this.template) !== "undefined") { + this.text = this.template.source.substring(this.pos.start, this.pos.stop); + this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); + } + else { + this.text = null; + this.code = null; + } + }, + ul4ondump: function ul4ondump(encoder) { + ul4.AST.ul4ondump.call(this, encoder); + encoder.dump(this.template); + encoder.dump(this.tag); + encoder.dump(this.codepos); + }, + ul4onload: function ul4onload(decoder) { + ul4.TextAST.ul4onload.call(this, decoder); + this.template = decoder.load(); + this.tag = decoder.load(); + this.codepos = decoder.load(); + // Recreate ``text`` attribute + this._maketext(); + } + } +); + +ul4.CodeAST = ul4._inherit( + ul4.AST, + { + create: function create(tag, pos) { + var code = ul4.AST.create.call(this, pos); + code.tag = tag; + return code; + }, + _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), + _str: function _str(out) { + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + } + } +); + +ul4.ConstAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, value) { + var constant = ul4.CodeAST.create.call(this, tag, pos); + constant.value = value; + return constant; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + return this.value; + } + } +); + +ul4.ItemArgBase = ul4._inherit( + ul4.CodeAST, + { + _handle_eval_list: function _handle_eval_list(context, result) { + try { + return this._eval_list(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_set: function _handle_eval_set(context, result) { + try { + return this._eval_set(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_dict: function _handle_eval_dict(context, result) { + try { + return this._eval_dict(context, result); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _handle_eval_call: function _handle_eval_call(context, args, kwargs) { + try { + return this._eval_call(context, args, kwargs); + } + catch (exc) { + if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } +); + +ul4.SeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); + seqitem.value = value; + return seqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_list: function _eval_list(context, result) { + var value = this.value._handle_eval(context); + result.push(value); + }, + _eval_set: function _eval_set(context, result) { + var value = this.value._handle_eval(context); + result.add(value); + } + } +); + + +ul4.UnpackSeqItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackseqitem.value = value; + return unpackseqitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_list: function _eval_list(context, result) { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + result.push(item.value); + } + }, + _eval_set: function _eval_set(context, result) { + var value = this.value._handle_eval(context); + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + result.add(item.value); + } + } + } +); + +ul4.DictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, key, value) { + var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); + dictitem.key = key; + dictitem.value = value; + return dictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) { + var key = this.key._handle_eval(context); + var value = this.value._handle_eval(context); + ul4on._setmap(result, key, value); + } + } +); + +ul4.UnpackDictItemAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); + unpackdictitem.item = item; + return unpackdictitem; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_dict: function _eval_dict(context, result) { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) { + for (var i = 0; i < item.length; ++i) { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + ul4on._setmap(result, key, value); + } + } + else if (ul4._ismap(item)) { + item.forEach(function (value, key) { + ul4on._setmap(result, key, value); + }); + } + else if (ul4._isobject(item)) { + for (var key in item) + ul4on._setmap(result, key, item[key]); + } + } + } +); + +ul4.PosArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, value) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var value = this.value._handle_eval(context); + args.push(value); + } + } +); + +ul4.KeywordArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, name, value) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.name = name; + arg.value = value; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + if (kwargs.hasOwnProperty(this.name)) + throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); + var value = this.value._handle_eval(context); + kwargs[this.name] = value; + } + } +); + +ul4.UnpackListArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var item = this.item._handle_eval(context); + args.push.apply(args, item); + } + } +); + +ul4.UnpackDictArgAST = ul4._inherit( + ul4.ItemArgBase, + { + create: function create(tag, pos, item) { + var arg = ul4.ItemArgBase.create.call(this, tag, pos); + arg.item = item; + return arg; + }, + _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval_call: function _eval_call(context, args, kwargs) { + var item = this.item._handle_eval(context); + if (ul4._islist(item)) { + for (var i = 0; i < item.length; ++i) { + if (!ul4._islist(item[i]) || item[i].length != 2) + throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); + var key = item[i][0], value = item[i][1]; + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + } + } + else if (ul4._ismap(item)) { + item.forEach(function (value, key) { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = value; + }); + } + else if (ul4._isobject(item)) { + for (var key in item) { + if (kwargs.hasOwnProperty(key)) + throw ul4.ArgumentError.create("duplicate keyword argument " + key); + kwargs[key] = item[key]; + } + } + } + } +); + +ul4.ListAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var list = ul4.CodeAST.create.call(this, tag, pos); + list.items = []; + return list; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = []; + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_list(context, result); + return result; + } + } +); + +ul4.ListCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.item = item; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = []; + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.push(this.item._handle_eval(localcontext)); + } + return result; + } + } +); + +ul4.DictAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var dict = ul4.CodeAST.create.call(this, tag, pos); + dict.items = []; + return dict; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = ul4on._emptymap(); + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_dict(context, result); + return result; + } + } +); + +ul4.DictCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, key, value, varname, container, condition) { + var listcomp = ul4.CodeAST.create.call(this, tag, pos); + listcomp.key = key; + listcomp.value = value; + listcomp.varname = varname; + listcomp.container = container; + listcomp.condition = condition; + return listcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._emptymap(); + + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) { + var key = this.key._handle_eval(localcontext); + var value = this.value._handle_eval(localcontext); + ul4on._setmap(result, key, value); + } + } + + return result; + } + } +); + +ul4.SetAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var set = ul4.CodeAST.create.call(this, tag, pos); + set.items = []; + return set; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + + for (var i = 0; i < this.items.length; ++i) + this.items[i]._handle_eval_set(context, result); + + return result; + } + } +); + +ul4.SetCompAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var setcomp = ul4.CodeAST.create.call(this, tag, pos); + setcomp.item = item; + setcomp.container = container; + setcomp.condition = condition; + return setcomp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + var localcontext = context.inheritvars(); + + var result = ul4on._haveset ? new Set() : ul4._Set.create(); + for (var iter = ul4._iter(container); ;) { + var item = iter.next(); + if (item.done) + break; + var varitems = ul4._unpackvar(this.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); + } + + return result; + } + } +); + +ul4.GenExprAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, item, varname, container, condition) { + var genexp = ul4.CodeAST.create.call(this, tag, pos); + genexp.item = item; + genexp.varname = varname; + genexp.container = container; + genexp.condition = condition; + return genexp; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + var iter = ul4._iter(container); + + var localcontext = context.inheritvars(); + + var self = this; + + var result = { + next: function () { + while (true) { + var item = iter.next(); + if (item.done) + return item; + var varitems = ul4._unpackvar(self.varname, item.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) { + var value = self.item._handle_eval(localcontext); + return { value: value, done: false }; + } + } + } + }; + + return result; + } + } +); + +ul4.VarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, name) { + var variable = ul4.CodeAST.create.call(this, tag, pos); + variable.name = name; + return variable; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + return this._get(context, this.name); + }, + _eval_set: function _eval_set(context, value) { + this._set(context, this.name, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + this._modify(context, operator, this.name, value); + }, + _get: function _get(context, name) { + var result = context.get(name); + if (typeof (result) === "undefined") + result = ul4.functions[name]; + return result; + }, + _set: function _set(context, name, value) { + context.set(name, value); + }, + _modify: function _modify(context, operator, name, value) { + var newvalue = operator._ido(context.get(name), value) + context.set(name, newvalue); + } + } +); + +ul4.UnaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj) { + var unary = ul4.CodeAST.create.call(this, tag, pos); + unary.obj = obj; + return unary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" obj="); + this.obj._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + return this._do(obj); + } + } +); + +// Negation +ul4.NegAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + if (obj !== null && typeof (obj.__neg__) === "function") + return obj.__neg__(); + return -obj; + } + } +); + +// Bitwise not +ul4.BitNotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + return -obj - 1; + } + } +); + +// Not +ul4.NotAST = ul4._inherit( + ul4.UnaryAST, + { + _do: function _do(obj) { + return !ul4._bool(obj); + } + } +); + +// If expression +ul4.IfAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, objif, objcond, objelse) { + var ifexpr = ul4.CodeAST.create.call(this, tag, pos); + ifexpr.objif = objif; + ifexpr.objcond = objcond; + ifexpr.objelse = objelse; + return ifexpr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(+1); + out.push("objif="); + this.objif._repr(out); + out.push(0); + out.push("objcond="); + this.objcond._repr(out); + out.push(0); + out.push("objelse="); + this.objelse._repr(out); + out.push(-1); + out.push(">"); + }, + _eval: function _eval(context) { + var result; + var condvalue = this.objcond._handle_eval(context); + if (ul4._bool(condvalue)) + result = this.objif._handle_eval(context); + else + result = this.objelse._handle_eval(context); + return result; + } + } +); + +ul4.ReturnAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var result = this.obj._handle_eval(context); + throw ul4.ReturnException.create(result); + }, + _str: function _str(out) { + out.push("return "); + this.obj._str(out); + } + } +); + +ul4.PrintAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var output = ul4._str(obj); + context.output(output); + }, + _str: function _str(out) { + out.push("print "); + this.obj._str(out); + } + } +); + +ul4.PrintXAST = ul4._inherit( + ul4.UnaryAST, + { + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var output = ul4._xmlescape(obj); + context.output(output); + }, + _str: function _str(out) { + out.push("printx "); + this.obj._str(out); + } + } +); + +ul4.BinaryAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj1, obj2) { + var binary = ul4.CodeAST.create.call(this, tag, pos); + binary.obj1 = obj1; + binary.obj2 = obj2; + return binary; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.type); + out.push(" obj1="); + this.obj1._repr(out); + out.push(" obj2="); + this.obj2._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + return this._do(obj1, obj2); + } + } +); + +// Item access and assignment: dict[key], list[index], string[index], color[index] +ul4.ItemAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + var result = this._get(obj1, obj2); + return result; + }, + _eval_set: function _eval_set(context, value) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._set(obj1, obj2, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + var obj1 = this.obj1._handle_eval(context); + var obj2 = this.obj2._handle_eval(context); + this._modify(operator, obj1, obj2, value); + }, + _get: function _get(container, key) { + if (typeof (container) === "string" || ul4._islist(container)) { + if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { + var start = key.start, stop = key.stop; + if (typeof (start) === "undefined" || start === null) + start = 0; + if (typeof (stop) === "undefined" || stop === null) + stop = container.length; + return container.slice(start, stop); + } + else { + var orgkey = key; + if (key < 0) + key += container.length; + return container[key]; + } + } + else if (container && typeof (container.__getitem__) === "function") // test this before the generic object test + return container.__getitem__(key); + else if (ul4._ismap(container)) + return container.get(key); + else if (Object.prototype.toString.call(container) === "[object Object]") + return container[key]; + else + throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); + }, + _set: function _set(container, key, value) { + if (ul4._islist(container)) { + if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { + var start = key.start, stop = key.stop; + if (start === null) + start = 0; + else if (start < 0) + start += container.length; + if (start < 0) + start = 0; + else if (start > container.length) + start = container.length; + if (stop === null) + stop = container.length; + else if (stop < 0) + stop += container.length; + if (stop < 0) + stop = 0; + else if (stop > container.length) + stop = container.length; + if (stop < start) + stop = start; + container.splice(start, stop - start); // Remove old element + for (var iter = ul4._iter(value); ;) { + var item = iter.next(); + if (item.done) + break; + container.splice(start++, 0, item.value); + } + } + else { + var orgkey = key; + if (key < 0) + key += container.length; + container[key] = value; + } + } + else if (container && typeof (container.__setitem__) === "function") // test this before the generic object test + container.__setitem__(key, value); + else if (ul4._ismap(container)) + container.set(key, value); + else if (Object.prototype.toString.call(container) === "[object Object]") + container[key] = value; + else + throw ul4.NotSubscriptableError.create(container); + }, + _modify: function _modify(operator, container, key, value) { + this._set(container, key, operator._ido(this._get(container, key), value)); + } + } +); + +// Identifty test operator ``is`` +ul4.IsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return obj1 === obj2; + } + } +); + +// Inverted tdentifty test operator ``is not`` +ul4.IsNotAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return obj1 !== obj2; + } + } +); + +// Comparison operator == +ul4.EQAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._eq(obj1, obj2); + } + } +); + +// Comparison operator != +ul4.NEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._ne(obj1, obj2); + } + } +); + +// Comparison operator < +ul4.LTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._lt(obj1, obj2); + } + } +); + +// Comparison operator <= +ul4.LEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._le(obj1, obj2); + } + } +); + +// Comparison operator > +ul4.GTAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._gt(obj1, obj2); + } + } +); + +// Comparison operator >= +ul4.GEAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + return ul4._ge(obj1, obj2); + } + } +); + +// Containment test: string in string, obj in list, key in dict, value in rgb +ul4.ContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) { + if (typeof (obj) === "string" && typeof (container) === "string") { + return container.indexOf(obj) !== -1; + } + else if (ul4._islist(container)) { + return container.indexOf(obj) !== -1; + } + else if (container && typeof (container.__contains__) === "function") // test this before the generic object test + return container.__contains__(obj); + else if (ul4._ismap(container) || ul4._isset(container)) + return container.has(obj); + else if (ul4._isobject(container)) { + for (var key in container) { + if (key === obj) + return true; + } + return false; + } + else if (ul4._iscolor(container)) { + return container._r === obj || container._g === obj || container._b === obj || container._a === obj; + } + throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + } + } +); + +// Inverted containment test +ul4.NotContainsAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj, container) { + return !ul4.ContainsAST._do(obj, container); + } + } +); + +// Addition: num + num, string + string +ul4.AddAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__add__) === "function") + return obj1.__add__(obj2); + else if (obj2 && typeof (obj2.__radd__) === "function") + return obj2.__radd__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) { + var result = []; + ul4._append(result, obj1); + ul4._append(result, obj2); + return result; + } + else + return obj1 + obj2; + }, + _ido: function _ido(obj1, obj2) { + if (ul4._islist(obj1) && ul4._islist(obj2)) { + ul4._append(obj1, obj2); + return obj1; + } + else + return this._do(obj1, obj2); + } + } +); + +// Substraction: num - num +ul4.SubAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__sub__) === "function") + return obj1.__sub__(obj2); + else if (obj2 && typeof (obj2.__rsub__) === "function") + return obj2.__rsub__(obj1); + else if (ul4._isdate(obj1) && ul4._isdate(obj2)) + return this._date_sub(obj1, obj2); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + return obj1 - obj2; + }, + _date_sub: function _date_sub(obj1, obj2) { + var swap = (obj2 > obj1); + + if (swap) { + var t = obj1; + obj1 = obj2; + obj2 = t; + } + // From now on obj1 is > than obj2 + + var year1 = obj1.getFullYear(); + var yearday1 = ul4._yearday(obj1); + var year2 = obj2.getFullYear(); + var yearday2 = ul4._yearday(obj2); + + var diffdays = 0; + + while (year1 > year2) { + diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + ++year2; + } + diffdays += yearday1 - yearday2; + + var hours1 = obj1.getHours(); + var minutes1 = obj1.getMinutes(); + var seconds1 = obj1.getSeconds(); + var hours2 = obj2.getHours(); + var minutes2 = obj2.getMinutes(); + var seconds2 = obj2.getSeconds(); + + var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + + var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + + if (swap) { + diffdays = -diffdays; + diffseconds = -diffseconds; + diffmilliseconds = -diffmilliseconds; + } + return ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Multiplication: num * num, int * str, str * int, int * list, list * int +ul4.MulAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__mul__) === "function") + return obj1.__mul__(obj2); + else if (obj2 && typeof (obj2.__rmul__) === "function") + return obj2.__rmul__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) { + if (typeof (obj2) === "string") { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj2, obj1); + } + else if (ul4._islist(obj2)) { + if (obj1 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj2, obj1); + } + } + else if (ul4._isint(obj2) || ul4._isbool(obj2)) { + if (typeof (obj1) === "string") { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._str_repeat(obj1, obj2); + } + else if (ul4._islist(obj1)) { + if (obj2 < 0) + throw ul4.ValueError.create("repetition counter must be positive"); + return ul4._list_repeat(obj1, obj2); + } + } + return obj1 * obj2; + }, + _ido: function _ido(obj1, obj2) { + if (ul4._islist(obj1) && ul4._isint(obj2)) { + if (obj2 > 0) { + var i = 0; + var targetsize = obj1.length * obj2; + while (obj1.length < targetsize) + obj1.push(obj1[i++]) + } + else + obj1.splice(0, obj1.length); + return obj1; + } + else + return this._do(obj1, obj2); + } + } +); + +// Truncating division +ul4.FloorDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__floordiv__) === "function") + return obj1.__floordiv__(obj2); + else if (obj2 && typeof (obj2.__rfloordiv__) === "function") + return obj2.__rfloordiv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + return Math.floor(obj1 / obj2); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// "Real" division +ul4.TrueDivAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj1 && typeof (obj1.__truediv__) === "function") + return obj1.__truediv__(obj2); + else if (obj2 && typeof (obj2.__rtruediv__) === "function") + return obj2.__rtruediv__(obj1); + if (obj1 === null || obj2 === null) + throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + return obj1 / obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Modulo +ul4.ModAST = ul4._inherit( + ul4.BinaryAST, + { + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + _do: function _do(obj1, obj2) { + var div = Math.floor(obj1 / obj2); + var mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise left shift +ul4.ShiftLeftAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftRightAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 *= 2; + return obj1; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise right shift +ul4.ShiftRightAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + if (obj2 < 0) + return ul4.ShiftLeftAST._do(obj1, -obj2); + if (obj1 === false) + obj1 = 0; + else if (obj1 === true) + obj1 = 1; + while (obj2--) + obj1 /= 2; + return Math.floor(obj1); + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise and +ul4.BitAndAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 & obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise exclusive or +ul4.BitXOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 ^ obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +// Bitwise or +ul4.BitOrAST = ul4._inherit( + ul4.BinaryAST, + { + _do: function _do(obj1, obj2) { + if (obj2 === false) + obj2 = 0; + else if (obj2 === true) + obj2 = 1; + return obj1 | obj2; + }, + _ido: function _ido(obj1, obj2) { + return this._do(obj1, obj2); + } + } +); + +ul4.AndAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + if (!ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } +); + +ul4.OrAST = ul4._inherit( + ul4.BinaryAST, + { + _eval: function _eval(context) { + var obj1 = this.obj1._handle_eval(context); + if (ul4._bool(obj1)) + return obj1; + var obj2 = this.obj2._handle_eval(context); + return obj2; + } + } +); + +ul4.AttrAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, attrname) { + var attr = ul4.CodeAST.create.call(this, tag, pos); + attr.obj = obj; + attr.attrname = attrname; + return attr; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var result = this._get(obj, this.attrname); + return result; + }, + _eval_set: function _eval_set(context, value) { + var obj = this.obj._handle_eval(context); + this._set(obj, this.attrname, value); + }, + _eval_modify: function _eval_modify(context, operator, value) { + var obj = this.obj._handle_eval(context); + this._modify(operator, obj, this.attrname, value); + }, + _get: function _get(object, attrname) { + if (typeof (object) === "string") { + switch (attrname) { + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); + case "replace": + return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); }); + case "strip": + return ul4.expose(["chars=", null], function strip(chars) { return ul4._strip(object, chars); }); + case "lstrip": + return ul4.expose(["chars=", null], function lstrip(chars) { return ul4._lstrip(object, chars); }); + case "rstrip": + return ul4.expose(["chars=", null], function rstrip(chars) { return ul4._rstrip(object, chars); }); + case "split": + return ul4.expose(["sep=", null, "count=", null], function split(sep, count) { return ul4._split(object, sep, count); }); + case "rsplit": + return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); }); + case "splitlines": + return ul4.expose(["keepends=", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); }); + case "lower": + return ul4.expose([], function lower() { return object.toLowerCase(); }); + case "upper": + return ul4.expose([], function upper() { return object.toUpperCase(); }); + case "capitalize": + return ul4.expose([], function capitalize() { return ul4._capitalize(object); }); + case "join": + return ul4.expose(["iterable"], function join(iterable) { return ul4._join(object, iterable); }); + case "startswith": + return ul4.expose(["prefix"], function startswith(prefix) { return ul4._startswith(object, prefix); }); + case "endswith": + return ul4.expose(["suffix"], function endswith(suffix) { return ul4._endswith(object, suffix); }); + default: + return undefined; + } + } + else if (ul4._islist(object)) { + switch (attrname) { + case "append": + return ul4.expose(["*items"], function append(items) { return ul4._append(object, items); }); + case "insert": + return ul4.expose(["pos", "*items"], function insert(pos, items) { return ul4._insert(object, pos, items); }); + case "pop": + return ul4.expose(["pos=", -1], function pop(pos) { return ul4._pop(object, pos); }); + case "count": + return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); + case "find": + return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); + case "rfind": + return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); + default: + return undefined; + } + } + else if (ul4._isdate(object)) { + switch (attrname) { + case "weekday": + return ul4.expose([], function weekday() { return ul4._weekday(object); }); + case "week": + return ul4.expose(["firstweekday=", null], function week(firstweekday) { return ul4._week(object, firstweekday); }); + case "day": + return ul4.expose([], function day() { return object.getDate(); }); + case "month": + return ul4.expose([], function month() { return object.getMonth() + 1; }); + case "year": + return ul4.expose([], function year() { return object.getFullYear(); }); + case "hour": + return ul4.expose([], function hour() { return object.getHours(); }); + case "minute": + return ul4.expose([], function minute() { return object.getMinutes(); }); + case "second": + return ul4.expose([], function second() { return object.getSeconds(); }); + case "microsecond": + return ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; }); + case "mimeformat": + return ul4.expose([], function mimeformat() { return ul4._mimeformat(object); }); + case "isoformat": + return ul4.expose([], function isoformat() { return ul4._isoformat(object); }); + case "yearday": + return ul4.expose([], function yearday() { return ul4._yearday(object); }); + default: + return undefined; + } + } + else if (ul4._ismap(object)) { + switch (attrname) { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items() { return ul4._items(object); }); + case "values": + return ul4.expose([], function values() { return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + return object.get(attrname); + } + } + else if (ul4._isset(object)) { + switch (attrname) { + case "add": + return ul4.expose(["*items"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + return undefined; + } + } + else if (Object.prototype.toString.call(object) === "[object Object]") { + switch (attrname) { + case "get": + return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); + case "items": + return ul4.expose([], function items() { return ul4._items(object); }); + case "values": + return ul4.expose([], function values() { return ul4._values(object); }); + case "update": + return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); + case "clear": + return ul4.expose([], function clear() { return ul4._clear(object); }); + default: + var result; + if (object && typeof (object.__getattr__) === "function") // test this before the generic object test + result = object.__getattr__(attrname); + else + result = object[attrname]; + if (typeof (result) !== "function") + return result; + var realresult = function () { + return result.apply(object, arguments); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + } + throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); + }, + _set: function _set(object, attrname, value) { + if (typeof (object) === "object" && typeof (object.__setattr__) === "function") + object.__setattr__(attrname, value); + else if (ul4._ismap(object)) + object.set(attrname, value) + else if (ul4._isobject(object)) + object[attrname] = value; + else + throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); + }, + _modify: function _modify(operator, object, attrname, value) { + var oldvalue = this._get(object, attrname); + var newvalue = operator._ido(oldvalue, value); + this._set(object, attrname, newvalue); + } + } +); + +ul4.CallAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, obj, args) { + var call = ul4.CodeAST.create.call(this, tag, pos); + call.obj = obj; + call.args = args; + return call; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), + _repr: function _repr(out) { + out.push(""); + }, + _makeargs: function _makeargs(context) { + var args = [], kwargs = {}; + for (var i = 0; i < this.args.length; ++i) + this.args[i]._handle_eval_call(context, args, kwargs); + return { args: args, kwargs: kwargs }; + }, + _handle_eval: function _handle_eval(context) { + try { + return this._eval(context); + } + catch (exc) { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + }, + _eval: function _eval(context) { + var obj = this.obj._handle_eval(context); + var args = this._makeargs(context); + var result = ul4._call(context, obj, args.args, args.kwargs); + return result; + } + } +); + +ul4.RenderAST = ul4._inherit( + ul4.CallAST, + { + create: function create(tag, pos, obj, args) { + var render = ul4.CallAST.create.call(this, tag, pos, obj, args); + render.indent = null; + return render; + }, + _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("render "); + out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + if (this.indent !== null) { + out.push(" with indent "); + out.push(ul4._repr(this.indent._text())); + } + }, + _handle_eval: function _handle_eval(context) { + var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); + var obj = this.obj._handle_eval(localcontext); + var args = this._makeargs(localcontext); + + try { + var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + return result; + } + catch (exc) { + exc = ul4.LocationError.create(this, exc); + throw exc; + } + } + } +); + +// Slice object +ul4.slice = ul4._inherit( + ul4.Proto, + { + create: function create(start, stop) { + var slice = ul4._clone(this); + slice.start = start; + slice.stop = stop; + return slice; + }, + __repr__: function __repr__() { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + } + } +); + + +// List/String slice +ul4.SliceAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, index1, index2) { + var slice = ul4.CodeAST.create.call(this, tag, pos); + slice.index1 = index1; + slice.index2 = index2; + return slice; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), + _repr: function _repr(out) { + out.push(""); + }, + _eval: function _eval(context) { + var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return ul4.slice.create(index1, index2); + } + } +); + + +ul4.SetVarAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos, lvalue, value) { + var changevar = ul4.CodeAST.create.call(this, tag, pos); + changevar.lvalue = lvalue; + changevar.value = value; + return changevar; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" lvalue="); + out.push(ul4._repr(this.lvalue)); + out.push(" value="); + this.value._repr(out); + out.push(">"); + }, + _eval: function _eval(context) { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item[0]._handle_eval_set(context, item[1]); + } + } + } +); + +ul4.ModifyVarAST = ul4._inherit( + ul4.SetVarAST, + { + _eval: function _eval(context) { + var value = this.value._handle_eval(context); + var items = ul4._unpackvar(this.lvalue, value); + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item[0]._handle_eval_modify(context, this._operator, item[1]); + } + } + } +); + +ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + +ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + +ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + +ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + +ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + +ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + +ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + +ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + +ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + +ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + +ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + +ul4.BlockAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var block = ul4.CodeAST.create.call(this, tag, pos); + block.endtag = null; + block.content = []; + return block; + }, + _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), + _eval: function _eval(context) { + for (var i = 0; i < this.content.length; ++i) + this.content[i]._handle_eval(context); + }, + _str: function _str(out) { + if (this.content.length) { + for (var i = 0; i < this.content.length; ++i) { + this.content[i]._str(out); + out.push(0); + } + } + else { + out.push("pass"); + out.push(0); + } + } + } +); + +ul4.ForBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, varname, container) { + var for_ = ul4.BlockAST.create.call(this, tag, pos); + for_.varname = varname; + for_.container = container; + return for_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), + _repr: function _repr(out) { + out.push(""); + }, + _str_varname: function _str_varname(out, varname) { + if (ul4._islist(varname)) { + out.push("("); + for (var i = 0; i < varname.length; ++i) { + if (i) + out.push(", "); + this._str_varname(out, varname[i]); + } + if (varname.length == 1) + out.push(","); + out.push(")"); + } + else + varname._str(out); + }, + _eval: function _eval(context) { + var container = this.container._handle_eval(context); + + for (var iter = ul4._iter(container); ;) { + var value = iter.next(); + if (value.done) + break; + var varitems = ul4._unpackvar(this.varname, value.value); + for (var i = 0; i < varitems.length; ++i) + varitems[i][0]._handle_eval_set(context, varitems[i][1]); + try { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) { + out.push("for "); + this._str_varname(out, this.varname); + out.push(" in "); + this.container._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.WhileBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) { + var while_ = ul4.BlockAST.create.call(this, tag, pos); + while_.condition = condition; + return while_; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("while "), + this.container._repr(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _eval: function _eval(context) { + while (true) { + var cond = this.condition._handle_eval(context); + if (!ul4._bool(cond)) + break; + try { + // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion + // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels + ul4.BlockAST._eval.call(this, context); + } + catch (exc) { + if (exc === ul4.BreakException) + break; + else if (exc === ul4.ContinueException) + ; + else + throw exc; + } + } + }, + _str: function _str(out) { + out.push("while "); + ul4.AST._str.call(this, out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.BreakAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) { + throw ul4.BreakException; + }, + _str: function _str(out) { + out.push("break"); + out.push(0); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.ContinueAST = ul4._inherit( + ul4.CodeAST, + { + _eval: function _eval(context) { + throw ul4.ContinueException; + }, + _str: function _str(out) { + out.push("continue"); + out.push(0); + }, + _repr: function _repr(out) { + out.push(""); + } + } +); + +ul4.CondBlockAST = ul4._inherit( + ul4.BlockAST, + { + _eval: function _eval(context) { + for (var i = 0; i < this.content.length; ++i) { + var block = this.content[i]; + var execute = block._execute(context); + if (execute) { + block._handle_eval(context); + break; + } + } + } + } +); + +ul4.ConditionalBlockAST = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, condition) { + var block = ul4.BlockAST.create.call(this, tag, pos); + block.condition = condition; + return block; + }, + _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" condition="); + this.condition._repr(out); + out.push(">"); + }, + _str: function _str(out) { + out.push(this._strname); + out.push(" "); + this.condition._str(out); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) { + var cond = this.condition._handle_eval(context); + var result = ul4._bool(cond); + return result; + } + } +); + +ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "if" }); + +ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "else if" }); + +ul4.ElseBlockAST = ul4._inherit( + ul4.BlockAST, + { + _repr: function _repr(out) { + out.push(""); + }, + _str: function _str(out) { + out.push("else:"), + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _execute: function _execute(context) { + return true; + }, + _str: function _str(out) { + out.push("else:"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + } + } +); + +ul4.Template = ul4._inherit( + ul4.BlockAST, + { + create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) { + var template = ul4.BlockAST.create.call(this, tag, pos); + template.source = source; + template.name = name; + template.whitespace = whitespace; + template.startdelim = startdelim; + template.enddelim = enddelim; + template.docpos = null; + template.signature = signature; + template._jsfunction = null; + template._asts = null; + template._ul4_callsignature = signature; + template._ul4_rendersignature = signature; + template.parenttemplate = null; + return template; + }, + ul4ondump: function ul4ondump(encoder) { + var signature; + encoder.dump(ul4.version); + encoder.dump(this.name); + encoder.dump(this.source); + encoder.dump(this.whitespace); + encoder.dump(this.startdelim); + encoder.dump(this.enddelim); + encoder.dump(this.docpos); + encoder.dump(this.parenttemplate); + if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + signature = this.signature; + else { + signature = []; + for (var i = 0; i < this.signature.args.length; ++i) { + var arg = this.signature.args[i]; + if (typeof (arg.defaultValue) === "undefined") + signature.push(arg.name); + else + signature.push(arg.name + "=", arg.defaultValue); + } + if (this.signature.remargs !== null) + signature.push("*" + this.signature.remargs); + if (this.signature.remkwargs !== null) + signature.push("**" + this.signature.remkwargs); + } + encoder.dump(signature); + ul4.BlockAST.ul4ondump.call(this, encoder); + }, + ul4onload: function ul4onload(decoder) { + var version = decoder.load(); + var signature; + + if (version === null) + throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + + if (version !== ul4.version) + throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); + this.source = decoder.load(); + this.whitespace = decoder.load(); + this.startdelim = decoder.load(); + this.enddelim = decoder.load(); + this.docpos = decoder.load(); + this.parenttemplate = decoder.load(); + signature = decoder.load(); + if (ul4._islist(signature)) + signature = ul4.Signature.create.apply(ul4.Signature, signature); + this.signature = signature; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + ul4.BlockAST.ul4onload.call(this, decoder); + }, + loads: function loads(string) { + return ul4on.loads(string); + }, + _eval: function _eval(context) { + var signature = null; + if (this.signature !== null) + signature = this.signature._handle_eval(context); + var closure = ul4.TemplateClosure.create(this, signature, context.vars); + context.set(this.name, closure); + }, + _repr: function _repr(out) { + out.push("") { + out.push(" enddelim="); + out.push(ul4._repr(this.enddelim)); + } + out.push(">"); + }, + _str: function _str(out) { + out.push("def "); + out.push(this.name ? this.name : "unnamed"); + out.push(":"); + out.push(+1); + ul4.BlockAST._str.call(this, out); + out.push(-1); + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + _renderbound: function _renderbound(context, vars) { + var localcontext = context.clone(); + localcontext.vars = vars; + try { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) { + if (!ul4.ReturnException.isprotoof(exc)) + throw exc; + } + }, + __render__: function __render__(context, vars) { + this._renderbound(context, vars); + }, + render: function render(context, vars) { + this._renderbound(context, vars); + }, + _rendersbound: function _rendersbound(context, vars) { + var localcontext = context.replaceoutput(); + this._renderbound(localcontext, vars); + return localcontext.getoutput(); + }, + renders: function renders(vars) { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._rendersbound(context, vars); + }, + doc: function doc() { + return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; + }, + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "tag": + return this.tag; + case "endtag": + return this.endtag; + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + default: + return undefined; + } + }, + _callbound: function _callbound(context, vars) { + var localcontext = context.clone(); + localcontext.vars = vars; + try { + ul4.BlockAST._eval.call(this, localcontext); + } + catch (exc) { + if (ul4.ReturnException.isprotoof(exc)) + return exc.result; + else + throw exc; + } + return null; + }, + call: function call(vars) { + vars = vars || {}; + var context = ul4.Context.create(); + if (this.signature !== null) + vars = this.signature.bindObject(this.name, [], vars); + return this._callbound(context, vars); + }, + __call__: function __call__(context, vars) { + return this._callbound(context, vars); + }, + __type__: "ul4.Template" // used by ``istemplate()`` + } +); + +ul4.SignatureAST = ul4._inherit( + ul4.CodeAST, + { + create: function create(tag, pos) { + var signature = ul4.CodeAST.create.call(this, tag, pos); + signature.params = []; + return signature; + }, + ul4ondump: function ul4ondump(encoder) { + ul4.CodeAST.ul4ondump.call(this, encoder); + + var dump = []; + + for (var i = 0; i < this.params.length; ++i) { + var param = this.params[i]; + if (param[1] === null) + dump.push(param[0]); + else + dump.push(param); + } + encoder.dump(dump); + }, + ul4onload: function ul4onload(decoder) { + ul4.AST.ul4onload.call(this, decoder); + var dump = decoder.load(); + this.params = []; + for (var i = 0; i < dump.length; ++i) { + var param = dump[i]; + if (typeof (param) === "string") + this.params.push([param, null]); + else + this.params.push(param); + } + }, + _eval: function _eval(context) { + var args = []; + for (var i = 0; i < this.params.length; ++i) { + var param = this.params[i]; + if (param[1] === null) + args.push(param[0]); + else { + args.push(param[0] + "="); + args.push(param[1]._handle_eval(context)); + } + } + return ul4.Signature.create.apply(ul4.Signature, args); + }, + _repr: function _repr(out) { + out.push("<"); + out.push(this.typename); + out.push(" params="); + this.params._repr(out); + out.push(">"); + } + } +); + +ul4.TemplateClosure = ul4._inherit( + ul4.Proto, + { + create: function create(template, signature, vars) { + var closure = ul4._clone(this); + closure.template = template; + closure.signature = signature; + closure.vars = vars; + closure._ul4_callsignature = signature; + closure._ul4_rendersignature = signature; + // Copy over the required attribute from the template + closure.name = template.name; + closure.tag = template.tag; + closure.endtag = template.endtag; + closure.source = template.source; + closure.startdelim = template.startdelim; + closure.enddelim = template.enddelim; + closure.docpos = template.docpos; + closure.content = template.content; + return closure; + }, + _ul4_callneedsobject: true, + _ul4_callneedscontext: true, + _ul4_renderneedsobject: true, + _ul4_renderneedscontext: true, + __render__: function __render__(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + render: function render(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __call__: function __call__(context, vars) { + return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _renderbound: function _renderbound(context, vars) { + this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); + }, + _rendersbound: function _rendersbound(context, vars) { + return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); + }, + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "render": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + case "renders": + return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + case "signature": + return this.signature; + default: + return this.template.__getattr__(attrname); + } + }, + __type__: "ul4.TemplateClosure" // used by ``istemplate()`` + } +); + +// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` +ul4._rgb = function _rgb(r, g, b, a) { + return this.Color.create(255 * r, 255 * g, 255 * b, 255 * a); +}; + +// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference +ul4._xmlescape = function _xmlescape(obj) { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; +}; + +// Convert ``obj`` to a string suitable for output into a CSV file +ul4._csv = function _csv(obj) { + if (obj === null) + return ""; + else if (typeof (obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; +}; + +// Return a string containing one character with the codepoint ``i`` +ul4._chr = function _chr(i) { + if (typeof (i) != "number") + throw ul4.TypeError.create("chr()", "chr() requires an int"); + return String.fromCharCode(i); +}; + +// Return the codepoint for the one and only character in the string ``c`` +ul4._ord = function _ord(c) { + if (typeof (c) != "string" || c.length != 1) + throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); + return c.charCodeAt(0); +}; + +// Convert an integer to a hexadecimal string +ul4._hex = function _hex(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("hex()", "hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); +}; + +// Convert an integer to a octal string +ul4._oct = function _oct(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("oct()", "oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); +}; + +// Convert an integer to a binary string +ul4._bin = function _bin(number) { + if (typeof (number) != "number") + throw ul4.TypeError.create("bin()", "bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); +}; + +// Return the minimum value +ul4._min = function _min(obj) { + if (obj.length == 0) + throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) { + var item = iter.next(); + if (item.done) { + if (first) + throw ul4.ValueError.create("min() argument is an empty sequence!"); + return result; + } + if (first || (item.value < result)) + result = item.value; + first = false; + } +}; + +// Return the maximum value +ul4._max = function _max(obj) { + if (obj.length == 0) + throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + var iter = ul4._iter(obj); + var result; + var first = true; + while (true) { + var item = iter.next(); + if (item.done) { + if (first) + throw ul4.ValueError.create("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } +}; + +// Return the of the values from the iterable starting with ``start`` (default ``0``) +ul4._sum = function _sum(iterable, start) { + if (typeof (start) === "undefined") + start = 0; + + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; +}; + +// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) +ul4._first = function _first(iterable, defaultValue) { + if (typeof (defaultValue) === "undefined") + defaultValue = null; + + var item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; +}; + +// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) +ul4._last = function _last(iterable, defaultValue) { + if (typeof (defaultValue) === "undefined") + defaultValue = null; + + var value = defaultValue; + + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + value = item.value; + } + return value; +}; + +// Return a sorted version of ``iterable`` +ul4._sorted = function _sorted(context, iterable, key, reverse) { + var cmp; + if (key === null) { + // FIXME: stability + if (reverse) { + cmp = function cmp(a, b) { + return -ul4._cmp("<=>", a, b); + } + } + else { + cmp = function cmp(a, b) { + return ul4._cmp("<=>", a, b); + } + } + var result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else { + var sort = []; + + for (var i = 0, iter = ul4._iter(iterable); ; ++i) { + var item = iter.next(); + if (item.done) + break; + var keyvalue = ul4._call(context, key, [item.value], {}); + sort.push([keyvalue, i, item.value]); + } + cmp = function cmp(s1, s2) { + var res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp(s1[1], s2[1]); + return reverse ? -res : res; + } + + sort.sort(cmp); + + var result = []; + for (var i = 0; i < sort.length; ++i) { + result.push(sort[i][2]); + } + return result; + } +}; + +// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` +ul4._range = function _range(args) { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required range() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var lower, higher; + if (step === 0) + throw ul4.ValueError.create("range() requires a step argument != 0"); + else if (step > 0) { + lower = start; + heigher = stop; + } + else { + lower = stop; + heigher = start; + } + var length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0; + + return { + index: 0, + next: function () { + if (this.index >= length) + return { done: true }; + return { value: start + (this.index++) * step, done: false }; + } + }; +}; + +// Return a iterable object returning a slice from the argument +ul4._slice = function _slice(args) { + var iterable, start, stop, step; + if (args.length < 2) + throw ul4.ArgumentError.create("required slice() argument missing"); + else if (args.length > 4) + throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw ul4.ValueError.create("slice() requires a start argument >= 0"); + if (stop < 0) + throw ul4.ValueError.create("slice() requires a stop argument >= 0"); + if (step <= 0) + throw ul4.ValueError.create("slice() requires a step argument > 0"); + + var next = start, count = 0; + var iter = ul4._iter(iterable); + return { + next: function () { + var result; + while (count < next) { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return { done: true }; + result = iter.next(); + if (result.done) + return result; + ++count; + next += step; + if (stop !== null && next > stop) + next = stop; + return result; + } + }; +}; + +// ``%`` escape unsafe characters in the string ``string`` +ul4._urlquote = function _urlquote(string) { + return encodeURIComponent(string); +}; + +// The inverse function of ``urlquote`` +ul4._urlunquote = function _urlunquote(string) { + return decodeURIComponent(string); +}; + +// Return a reverse iterator over ``sequence`` +ul4._reversed = function _reversed(sequence) { + if (typeof (sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length - 1, + next: function () { + return this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true }; + } + }; +}; + +// Returns a random number in the interval ``[0;1[`` +ul4._random = function _random() { + return Math.random(); +}; + +// Return a randomly select item from ``range(start, stop, step)`` +ul4._randrange = function _randrange(args) { + var start, stop, step; + if (args.length < 1) + throw ul4.ArgumentError.create("required randrange() argument missing"); + else if (args.length > 3) + throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) { + start = args[0]; + stop = args[1]; + step = args[2]; + } + var width = stop - start; + + var value = Math.random(); + + var n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw ul4.ValueError.create("randrange() requires a step argument != 0"); + return start + step * Math.floor(value * n); +}; + +// Return a random item/char from the list/string ``sequence`` +ul4._randchoice = function _randchoice(sequence) { + var iscolor = ul4._iscolor(sequence); + if (typeof (sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw ul4.TypeError.create("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; +}; + +// Round a number ``x`` to ``digits`` decimal places (may be negative) +ul4._round = function _round(x, digits) { + if (typeof (digits) === "undefined") + digits = 0; + if (digits) { + var threshhold = Math.pow(10, digits); + return Math.round(x * threshhold) / threshhold; + } + else + return Math.round(x); +}; + +// Return a hex-encode MD5 hash of the argument +// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 +ul4._md5 = function _md5(string) { + return md5(string); +}; + +// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) +ul4._enumerate = function _enumerate(iterable, start) { + if (typeof (start) === "undefined") + start = 0; + + return { + iter: ul4._iter(iterable), + index: start, + next: function () { + var item = this.iter.next(); + return item.done ? item : { value: [this.index++, item.value], done: false }; + } + }; +}; + +// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) +ul4._isfirst = function _isfirst(iterable) { + var iter = ul4._iter(iterable); + var isfirst = true; + return { + next: function () { + var item = iter.next(); + var result = item.done ? item : { value: [isfirst, item.value], done: false }; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) +ul4._islast = function _islast(iterable) { + var iter = ul4._iter(iterable); + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [item.done, lastitem.value], done: false }; + lastitem = item; + return result; + } + }; +}; + +// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) +ul4._isfirstlast = function _isfirstlast(iterable) { + var iter = ul4._iter(iterable); + var isfirst = true; + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [isfirst, item.done, lastitem.value], done: false }; + lastitem = item; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) +ul4._enumfl = function _enumfl(iterable, start) { + var iter = ul4._iter(iterable); + var i = start; + var isfirst = true; + var lastitem = iter.next(); + return { + next: function () { + if (lastitem.done) + return lastitem; + var item = iter.next(); + var result = { value: [i++, isfirst, item.done, lastitem.value], done: false }; + lastitem = item; + isfirst = false; + return result; + } + }; +}; + +// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) +ul4._zip = function _zip(iterables) { + var result; + if (iterables.length) { + var iters = []; + for (var i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); + + return { + next: function () { + var items = []; + for (var i = 0; i < iters.length; ++i) { + var item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return { value: items, done: false }; + } + }; + } + else { + return { + next: function () { + return { done: true }; + } + }; + } +}; + +// Return the absolute value for the number ``number`` +ul4._abs = function _abs(number) { + if (number !== null && typeof (number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); +}; + +// Return a ``Date`` object from the arguments passed in +ul4._date = function _date(year, month, day, hour, minute, second, microsecond) { + if (typeof (hour) === "undefined") + hour = 0; + + if (typeof (minute) === "undefined") + minute = 0; + + if (typeof (second) === "undefined") + second = 0; + + if (typeof (microsecond) === "undefined") + microsecond = 0; + + return new Date(year, month - 1, day, hour, minute, second, microsecond / 1000); +}; + +// Return a ``TimeDelta`` object from the arguments passed in +ul4._timedelta = function _timedelta(days, seconds, microseconds) { + return this.TimeDelta.create(days, seconds, microseconds); +}; + +// Return a ``MonthDelta`` object from the arguments passed in +ul4._monthdelta = function _monthdelta(months) { + return this.MonthDelta.create(months); +}; + +// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) +ul4._hls = function _hls(h, l, s, a) { + var _v = function (m1, m2, hue) { + hue = hue % 1.0; + if (hue < 1 / 6) + return m1 + (m2 - m1) * hue * 6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2 / 3) + return m1 + (m2 - m1) * (2 / 3 - hue) * 6.0; + return m1; + }; + + var m1, m2; + if (typeof (a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0 + s); + else + m2 = l + s - (l * s); + m1 = 2.0 * l - m2; + return ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a); +}; + +// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) +ul4._hsv = function _hsv(h, s, v, a) { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + var i = Math.floor(h * 6.0); + var f = (h * 6.0) - i; + var p = v * (1.0 - s); + var q = v * (1.0 - s * f); + var t = v * (1.0 - s * (1.0 - f)); + switch (i % 6) { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } +}; + +// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` +ul4._get = function _get(container, key, defaultvalue) { + if (ul4._ismap(container)) { + if (container.has(key)) + return container.get(key); + return defaultvalue; + } + else if (ul4._isobject(container)) { + var result = container[key]; + if (typeof (result) === "undefined") + return defaultvalue; + return result; + } + throw ul4.TypeError.create("get()", "get() requires a dict"); +}; + +// Return a ``Date`` object for the current time +ul4.now = function now() { + return new Date(); +}; + +// Return a ``Date`` object for the current time in UTC +ul4.utcnow = function utcnow() { + var now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); +}; + +ul4.functions = { + repr: ul4.expose(["obj"], { name: "repr" }, ul4._repr), + ascii: ul4.expose(["obj"], { name: "ascii" }, ul4._ascii), + str: ul4.expose(["obj=", ""], { name: "str" }, ul4._str), + int: ul4.expose(["obj=", 0, "base=", null], { name: "int" }, ul4._int), + float: ul4.expose(["obj=", 0.0], { name: "float" }, ul4._float), + list: ul4.expose(["iterable=", []], { name: "list" }, ul4._list), + set: ul4.expose(["iterable=", []], { name: "set" }, ul4._set), + bool: ul4.expose(["obj=", false], { name: "bool" }, ul4._bool), + len: ul4.expose(["sequence"], { name: "len" }, ul4._len), + type: ul4.expose(["obj"], { name: "type" }, ul4._type), + format: ul4.expose(["obj", "fmt", "lang=", null], { name: "format" }, ul4._format), + any: ul4.expose(["iterable"], { name: "any" }, ul4._any), + all: ul4.expose(["iterable"], { name: "all" }, ul4._all), + zip: ul4.expose(["*iterables"], { name: "zip" }, ul4._zip), + isundefined: ul4.expose(["obj"], { name: "isundefined" }, ul4._isundefined), + isdefined: ul4.expose(["obj"], { name: "isdefined" }, ul4._isdefined), + isnone: ul4.expose(["obj"], { name: "isnone" }, ul4._isnone), + isbool: ul4.expose(["obj"], { name: "isbool" }, ul4._isbool), + isint: ul4.expose(["obj"], { name: "isint" }, ul4._isint), + isfloat: ul4.expose(["obj"], { name: "isfloat" }, ul4._isfloat), + isstr: ul4.expose(["obj"], { name: "isstr" }, ul4._isstr), + isdate: ul4.expose(["obj"], { name: "isdate" }, ul4._isdate), + iscolor: ul4.expose(["obj"], { name: "iscolor" }, ul4._iscolor), + istimedelta: ul4.expose(["obj"], { name: "istimedelta" }, ul4._istimedelta), + ismonthdelta: ul4.expose(["obj"], { name: "ismonthdelta" }, ul4._ismonthdelta), + istemplate: ul4.expose(["obj"], { name: "istemplate" }, ul4._istemplate), + isfunction: ul4.expose(["obj"], { name: "isfunction" }, ul4._isfunction), + islist: ul4.expose(["obj"], { name: "islist" }, ul4._islist), + isset: ul4.expose(["obj"], { name: "isset" }, ul4on._haveset ? ul4._isset : ul4._isul4set), + isdict: ul4.expose(["obj"], { name: "isdict" }, ul4._isdict), + isexception: ul4.expose(["obj"], { name: "isexception" }, ul4._isexception), + asjson: ul4.expose(["obj"], { name: "asjson" }, ul4._asjson), + fromjson: ul4.expose(["string"], { name: "fromjson" }, ul4._fromjson), + asul4on: ul4.expose(["obj"], { name: "asul4on" }, ul4._asul4on), + fromul4on: ul4.expose(["string"], { name: "fromul4on" }, ul4._fromul4on), + now: ul4.expose([], ul4.now), + utcnow: ul4.expose([], ul4.utcnow), + enumerate: ul4.expose(["iterable", "start=", 0], { name: "enumerate" }, ul4._enumerate), + isfirst: ul4.expose(["iterable"], { name: "isfirst" }, ul4._isfirst), + islast: ul4.expose(["iterable"], { name: "islast" }, ul4._islast), + isfirstlast: ul4.expose(["iterable"], { name: "isfirstlast" }, ul4._isfirstlast), + enumfl: ul4.expose(["iterable", "start=", 0], { name: "enumfl" }, ul4._enumfl), + abs: ul4.expose(["number"], { name: "abs" }, ul4._abs), + date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], { name: "date" }, ul4._date), + timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], { name: "timedelta" }, ul4._timedelta), + monthdelta: ul4.expose(["months=", 0], { name: "monthdelta" }, ul4._monthdelta), + rgb: ul4.expose(["r", "g", "b", "a=", 1.0], { name: "rgb" }, ul4._rgb), + hls: ul4.expose(["h", "l", "s", "a=", 1.0], { name: "hls" }, ul4._hls), + hsv: ul4.expose(["h", "s", "v", "a=", 1.0], { name: "hsv" }, ul4._hsv), + xmlescape: ul4.expose(["obj"], { name: "xmlescape" }, ul4._xmlescape), + csv: ul4.expose(["obj"], { name: "csv" }, ul4._csv), + chr: ul4.expose(["i"], { name: "chr" }, ul4._chr), + ord: ul4.expose(["c"], { name: "ord" }, ul4._ord), + hex: ul4.expose(["number"], { name: "hex" }, ul4._hex), + oct: ul4.expose(["number"], { name: "oct" }, ul4._oct), + bin: ul4.expose(["number"], { name: "bin" }, ul4._bin), + min: ul4.expose(["*obj"], { name: "min" }, ul4._min), + max: ul4.expose(["*obj"], { name: "max" }, ul4._max), + sum: ul4.expose(["iterable", "start=", 0], { name: "sum" }, ul4._sum), + first: ul4.expose(["iterable", "default=", null], { name: "first" }, ul4._first), + last: ul4.expose(["iterable", "default=", null], { name: "last" }, ul4._last), + sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], { name: "sorted", needscontext: true }, ul4._sorted), + range: ul4.expose(["*args"], { name: "range" }, ul4._range), + slice: ul4.expose(["*args"], { name: "slice" }, ul4._slice), + urlquote: ul4.expose(["string"], { name: "urlquote" }, ul4._urlquote), + urlunquote: ul4.expose(["string"], { name: "urlunquote" }, ul4._urlunquote), + reversed: ul4.expose(["sequence"], { name: "reversed" }, ul4._reversed), + random: ul4.expose([], { name: "random" }, ul4._random), + randrange: ul4.expose(["*args"], { name: "randrange" }, ul4._randrange), + randchoice: ul4.expose(["sequence"], { name: "randchoice" }, ul4._randchoice), + round: ul4.expose(["x", "digit=", 0], { name: "round" }, ul4._round), + md5: ul4.expose(["string"], { name: "md5" }, ul4._md5) +}; + +// Functions implementing UL4 methods +ul4._replace = function _replace(string, old, new_, count) { + if (count === null) + count = string.length; + + var result = []; + while (string.length) { + var pos = string.indexOf(old); + if (pos === -1 || !count--) { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + result.push(new_); + string = string.substr(pos + old.length); + } + return result.join(""); +}; + +ul4._strip = function _strip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("strip()", "strip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + while (string && chars.indexOf(string[string.length - 1]) >= 0) + string = string.substr(0, string.length - 1); + return string; +}; + +ul4._lstrip = function _lstrip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); + + while (string && chars.indexOf(string[0]) >= 0) + string = string.substr(1); + return string; +}; + +ul4._rstrip = function _rstrip(string, chars) { + if (chars === null) + chars = " \r\n\t"; + else if (typeof (chars) !== "string") + throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); + + while (string && chars.indexOf(string[string.length - 1]) >= 0) + string = string.substr(0, string.length - 1); + return string; +}; + +ul4._split = function _split(string, sep, count) { + if (sep !== null && typeof (sep) !== "string") + throw ul4.TypeError.create("split()", "split() requires a string"); + + if (count === null) { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length - 1].length) + result.splice(-1); + } + return result; + } + else { + if (sep !== null) { + var result = []; + while (string.length) { + var pos = string.indexOf(sep); + if (pos === -1 || !count--) { + result.push(string); + break; + } + result.push(string.substr(0, pos)); + string = string.substr(pos + sep.length); + } + return result; + } + else { + var result = []; + while (string.length) { + string = ul4._lstrip(string, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else + part = string.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + string = string.substr(part.length); + } + return result; + } + } +}; + +ul4._rsplit = function _rsplit(string, sep, count) { + if (sep !== null && typeof (sep) !== "string") + throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + + if (count === null) { + var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length - 1].length) + result.splice(-1); + } + return result; + } + else { + if (sep !== null) { + var result = []; + while (string.length) { + var pos = string.lastIndexOf(sep); + if (pos === -1 || !count--) { + result.unshift(string); + break; + } + result.unshift(string.substr(pos + sep.length)); + string = string.substr(0, pos); + } + return result; + } + else { + var result = []; + while (string.length) { + string = ul4._rstrip(string, null, null); + var part; + if (!count--) + part = string; // Take the rest of the string + else { + part = string.split(/[ \n\r\t]+/); + part = part[part.length - 1]; + } + if (part.length) + result.unshift(part); + string = string.substr(0, string.length - part.length); + } + return result; + } + } +}; + +ul4._splitlines = function _splitlines(string, keepends) { + var lookingAtLineEnd = function lookingAtLineEnd() { + var c = string[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') { + if (pos == length - 1) + return 1; + if (string[pos + 1] === '\n') + return 2; + return 1; + } + return 0; + }; + + var result = [], length = string.length; + + for (var pos = 0, startpos = 0; ;) { + if (pos >= length) { + if (startpos != pos) + result.push(string.substring(startpos)); + return result; + } + var lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else { + var endpos = pos + (keepends ? lineendlen : 0); + result.push(string.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } +}; + +ul4._count = function _count(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + var isstr = ul4._isstr(obj); + + if (isstr && !sub.length) { + if (end < 0 || start > obj.length || start > end) + return 0; + var result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } + + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + var count = 0; + if (ul4._islist(obj)) { + for (var i = start; i < end; ++i) { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + var lastIndex = start; + + for (; ;) { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; + ++count; + lastIndex += sub.length; + } + return count; + } +}; + +ul4._find = function _find(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) { + if (typeof (obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.indexOf(sub); + if (result !== -1) + result += start; + return result; +}; + +ul4._rfind = function _rfind(obj, sub, start, end) { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) { + if (typeof (obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + var result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; + return result; +}; + +ul4._capitalize = function _capitalize(obj) { + if (typeof (obj) != "string") + throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); + + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; +}; + +ul4._items = function _items(obj) { + if (ul4._ismap(obj)) { + var result = []; + obj.forEach(function (value, key) { + result.push([key, value]); + }); + return result; + } + else if (ul4._isobject(obj)) { + var result = []; + for (var key in obj) + result.push([key, obj[key]]); + return result; + } + throw ul4.TypeError.create("items()", "items() requires a dict"); +}; + +ul4._values = function _values(obj) { + if (ul4._ismap(obj)) { + var result = []; + obj.forEach(function (value, key) { + result.push(value); + }); + return result; + } + else if (ul4._isobject(obj)) { + var result = []; + for (var key in obj) + result.push(obj[key]); + return result; + } + throw ul4.TypeError.create("values()", "values() requires a dict"); +}; + +ul4._join = function _join(sep, iterable) { + var resultlist = []; + for (var iter = ul4._iter(iterable); ;) { + var item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(sep); +}; + +ul4._startswith = function _startswith(string, prefix) { + if (typeof (prefix) !== "string") + throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); + + return string.substr(0, prefix.length) === prefix; +}; + +ul4._endswith = function _endswith(string, suffix) { + if (typeof (suffix) !== "string") + throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); + + return string.substr(string.length - suffix.length) === suffix; +}; + +ul4._isoformat = function _isoformat(obj) { + if (!ul4._isdate(obj)) + throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); + + var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth() + 1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); + var hour = obj.getHours(); + var minute = obj.getMinutes(); + var second = obj.getSeconds(); + var ms = obj.getMilliseconds(); + if (hour || minute || second || ms) { + result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; +}; + +ul4._mimeformat = function _mimeformat(obj) { + var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; +}; + +ul4._weekday = function _weekday(obj) { + var d = obj.getDay(); + return d ? d - 1 : 6; +}; + +ul4._week = function _week(obj, firstweekday) { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; + + var yearday = ul4._yearday(obj) + 6; + var jan1 = new Date(obj.getFullYear(), 0, 1); + var jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; + + while (jan1weekday != firstweekday) { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; + } + return Math.floor(yearday / 7); +}; + +ul4._isleap = function _isleap(obj) { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; +}; + +ul4._yearday = function _yearday(obj) { + var leap = ul4._isleap(obj) ? 1 : 0; + var day = obj.getDate(); + switch (obj.getMonth()) { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; + } +}; + +ul4._append = function _append(obj, items) { + for (var i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; +}; + +ul4._insert = function _insert(obj, pos, items) { + if (pos < 0) + pos += obj.length; + + for (var i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; +}; + +ul4._pop = function _pop(obj, pos) { + if (pos < 0) + pos += obj.length; + + var result = obj[pos]; + obj.splice(pos, 1); + return result; +}; + +ul4._update = function _update(obj, others, kwargs) { + if (!ul4._isdict(obj)) + throw ul4.TypeError.create("update()", "update() requires a dict"); + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + if (ul4._ismap(other)) { + other.forEach(function (value, key) { + ul4on._setmap(obj, key, value); + }); + } + else if (ul4._isobject(other)) { + for (var key in other) + ul4on._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) { + for (var j = 0; j < other.length; ++j) { + if (!ul4._islist(other[j]) || (other[j].length != 2)) + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + ul4on._setmap(obj, other[j][0], other[j][1]); + } + } + else + throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); + } + for (var key in kwargs) + ul4on._setmap(obj, key, kwargs[key]); + return null; +}; + +ul4._clear = function _clear(obj) { + if (ul4._ismap(obj)) + obj.clear(); + else if (ul4._isset(obj)) + obj.clear(); + else if (ul4._isobject(obj)) { + for (var key in obj) + delete obj[key]; + } + else + throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); + return null; +}; + +ul4.Color = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.Color", + + create: function create(r, g, b, a) { + var c = ul4._clone(this); + c._r = typeof (r) !== "undefined" ? r : 0; + c._g = typeof (g) !== "undefined" ? g : 0; + c._b = typeof (b) !== "undefined" ? b : 0; + c._a = typeof (a) !== "undefined" ? a : 255; + return c; + }, + + __repr__: function __repr__() { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) + return "#" + r[0] + g[0] + b[0] + a[0]; + else + return "#" + r + g + b + a; + } + else { + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __str__: function __str__() { + if (this._a !== 0xff) { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a / 255) + ")"; + } + else { + var r = ul4._lpad(this._r.toString(16), "0", 2); + var g = ul4._lpad(this._g.toString(16), "0", 2); + var b = ul4._lpad(this._b.toString(16), "0", 2); + var a = ul4._lpad(this._a.toString(16), "0", 2); + if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) + return "#" + r[0] + g[0] + b[0]; + else + return "#" + r + g + b; + } + }, + + __iter__: function __iter__() { + return { + obj: this, + index: 0, + next: function () { + if (this.index == 0) { + ++this.index; + return { value: this.obj._r, done: false }; + } + else if (this.index == 1) { + ++this.index; + return { value: this.obj._g, done: false }; + } + else if (this.index == 2) { + ++this.index; + return { value: this.obj._b, done: false }; + } + else if (this.index == 3) { + ++this.index; + return { value: this.obj._a, done: false }; + } + else + return { done: true }; + } + }; + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "r": + return ul4.expose([], function r() { return self._r; }); + case "g": + return ul4.expose([], function g() { return self._g; }); + case "b": + return ul4.expose([], function b() { return self._b; }); + case "a": + return ul4.expose([], function a() { return self._a; }); + case "lum": + return ul4.expose([], function lum() { return self.lum(); }); + case "hls": + return ul4.expose([], function hls() { return self.hls(); }); + case "hlsa": + return ul4.expose([], function hlsa() { return self.hlsa(); }); + case "hsv": + return ul4.expose([], function hsv() { return self.hsv(); }); + case "hsva": + return ul4.expose([], function hsva() { return self.hsva(); }); + case "witha": + return ul4.expose(["a"], function witha(a) { return self.witha(a); }); + case "withlum": + return ul4.expose(["lum"], function withlum(lum) { return self.withlum(lum); }); + case "abslum": + return ul4.expose(["lum"], function abslum(lum) { return self.abslum(lum); }); + case "rellum": + return ul4.expose(["lum"], function rellum(lum) { return self.rellum(lum); }); + default: + return undefined; + } + }, + + __getitem__: function __getitem__(key) { + var orgkey = key; + if (key < 0) + key += 4; + switch (key) { + case 0: + return this._r; + case 1: + return this._g; + case 2: + return this._b; + case 3: + return this._a; + default: + return undefined; + } + }, + + __eq__: function __eq__(other) { + if (ul4._iscolor(other)) + return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; + return false; + }, + + r: ul4.expose([], function r() { return this._r; }), + + g: ul4.expose([], function g() { return this._g; }), + + b: ul4.expose([], function b() { return this._b; }), + + a: ul4.expose([], function a() { return this._a; }), + + lum: ul4.expose([], function lum() { return this.hls()[1]; }), + + hls: ul4.expose([], + function hls() { + var r = this._r / 255.0; + var g = this._g / 255.0; + var b = this._b / 255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var h, l, s; + var rc, gc, bc; + + l = (minc + maxc) / 2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc - minc) / (maxc + minc); + else + s = (maxc - minc) / (2.0 - maxc - minc); + rc = (maxc - r) / (maxc - minc); + gc = (maxc - g) / (maxc - minc); + bc = (maxc - b) / (maxc - minc); + if (r == maxc) + h = bc - gc; + else if (g == maxc) + h = 2.0 + rc - bc; + else + h = 4.0 + gc - rc; + h = (h / 6.0) % 1.0; + return [h, l, s]; + } + ), + + hlsa: ul4.expose([], + function hlsa() { + var hls = this.hls(); + return hls.concat(this._a / 255.0); + } + ), + + hsv: ul4.expose([], + function hsv() { + var r = this._r / 255.0; + var g = this._g / 255.0; + var b = this._b / 255.0; + var maxc = Math.max(r, g, b); + var minc = Math.min(r, g, b); + var v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + var s = (maxc - minc) / maxc; + var rc = (maxc - r) / (maxc - minc); + var gc = (maxc - g) / (maxc - minc); + var bc = (maxc - b) / (maxc - minc); + var h; + if (r == maxc) + h = bc - gc; + else if (g == maxc) + h = 2.0 + rc - bc; + else + h = 4.0 + gc - rc; + h = (h / 6.0) % 1.0; + return [h, s, v]; + } + ), + + hsva: ul4.expose([], + function hsva() { + var hsv = this.hsv(); + return hsv.concat(this._a / 255.0); + } + ), + + witha: ul4.expose(["a"], + function witha(a) { + if (typeof (a) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + return ul4.Color.create(this._r, this._g, this._b, a); + } + ), + + withlum: ul4.expose(["lum"], + function withlum(lum) { + if (typeof (lum) !== "number") + throw ul4.TypeError.create("witha()", "witha() requires a number"); + var hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + ) + } +); + +ul4.TimeDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.TimeDelta", + + create: function create(days, seconds, microseconds) { + var td = ul4._clone(this); + if (typeof (days) === "undefined") + days = 0; + if (typeof (seconds) === "undefined") + seconds = 0; + if (typeof (microseconds) === "undefined") + microseconds = 0; + + var total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds); + + microseconds = ul4.ModAST._do(total_microseconds, 1000000); + var total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST._do(total_seconds, 86400); + days = Math.floor(total_seconds / 86400); + if (seconds < 0) { + seconds += 86400; + --days; + } + + td._microseconds = microseconds; + td._seconds = seconds; + td._days = days; + + return td; + }, + + __repr__: function __repr__() { + if (!this._microseconds) { + if (!this._seconds) { + if (!this._days) + return "timedelta()"; + return "timedelta(" + this._days + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ")"; + } + return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; + }, + + __str__: function __str__() { + var v = []; + if (this._days) { + v.push(this._days + " day"); + if (this._days !== -1 && this._days !== 1) + v.push("s"); + v.push(", "); + } + var seconds = this._seconds % 60; + var minutes = Math.floor(this._seconds / 60); + var hours = Math.floor(minutes / 60); + minutes = minutes % 60; + + v.push("" + hours); + v.push(":"); + v.push(ul4._lpad(minutes.toString(), "0", 2)); + v.push(":"); + v.push(ul4._lpad(seconds.toString(), "0", 2)); + if (this._microseconds) { + v.push("."); + v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); + } + return v.join(""); + }, + + __bool__: function __bool__() { + return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; + }, + + __abs__: function __abs__() { + return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; + }, + + __eq__: function __eq__(other) { + if (ul4._istimedelta(other)) + return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); + return false; + }, + + __lt__: function __lt__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds < other._microseconds; + } + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days < other._days; + if (this._seconds != other._seconds) + return this._seconds < other._seconds; + return this._microseconds <= other._microseconds; + } + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds > other._microseconds; + } + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) { + if (ul4._istimedelta(other)) { + if (this._days != other._days) + return this._days > other._days; + if (this._seconds != other._seconds) + return this._seconds > other._seconds; + return this._microseconds >= other._microseconds; + } + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() { + return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); + }, + + _add: function _add(date, days, seconds, microseconds) { + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate() + days; + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds() + seconds; + var millisecond = date.getMilliseconds() + microseconds / 1000; + return new Date(year, month, day, hour, minute, second, millisecond); + }, + + __add__: function __add__(other) { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + else if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __radd__: function __radd__(other) { + if (ul4._isdate(other)) + return this._add(other, this._days, this._seconds, this._microseconds); + throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); + }, + + __sub__: function __sub__(other) { + if (ul4._istimedelta(other)) + return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __rsub__: function __rsub__(other) { + if (ul4._isdate(other)) + return this._add(other, -this._days, -this._seconds, -this._microseconds); + throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); + }, + + __mul__: function __mul__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __rmul__: function __rmul__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); + } + throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); + }, + + __truediv__: function __truediv__(other) { + if (typeof (other) === "number") { + return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (ul4._istimedelta(other)) { + var myValue = this._days; + var otherValue = other._days; + var hasSeconds = this._seconds || other._seconds; + var hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) { + myValue = myValue * 86400 + this._seconds; + otherValue = otherValue * 86400 + other._seconds; + if (hasMicroseconds) { + myValue = myValue * 1000000 + this._microseconds; + otherValue = otherValue * 1000000 + other._microseconds; + } + } + return myValue / otherValue; + } + throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "days": + return ul4.expose([], function days() { return self._days; }); + case "seconds": + return ul4.expose([], function seconds() { return self._seconds; }); + case "microseconds": + return ul4.expose([], function microseconds() { return self._microseconds; }); + default: + return undefined; + } + }, + + days: function days() { + return this._days; + }, + + seconds: function seconds() { + return this._seconds; + }, + + microseconds: function microseconds() { + return this._microseconds; + } + } +); + +ul4.MonthDelta = ul4._inherit( + ul4.Proto, + { + __type__: "ul4.MonthDelta", + + create: function create(months) { + var md = ul4._clone(this); + md._months = typeof (months) !== "undefined" ? months : 0; + return md; + }, + + __repr__: function __repr__() { + if (!this._months) + return "monthdelta()"; + return "monthdelta(" + this._months + ")"; + }, + + __str__: function __str__() { + if (this._months) { + if (this._months !== -1 && this._months !== 1) + return this._months + " months"; + return this._months + " month"; + } + return "0 months"; + }, + + __bool__: function __bool__() { + return this._months !== 0; + }, + + __abs__: function __abs__() { + return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; + }, + + __eq__: function __eq__(other) { + if (ul4._ismonthdelta(other)) + return this._months === other._months; + return false; + }, + + __lt__: function __lt__(other) { + if (ul4._ismonthdelta(other)) + return this._months < other._months; + ul4._unorderable("<", this, other); + }, + + __le__: function __le__(other) { + if (ul4._ismonthdelta(other)) + return this._months <= other._months; + ul4._unorderable("<=", this, other); + }, + + __gt__: function __gt__(other) { + if (ul4._ismonthdelta(other)) + return this._months > other._months; + ul4._unorderable(">", this, other); + }, + + __ge__: function __ge__(other) { + if (ul4._ismonthdelta(other)) + return this._months >= other._months; + ul4._unorderable(">=", this, other); + }, + + __neg__: function __neg__() { + return ul4.MonthDelta.create(-this._months); + }, + + _add: function _add(date, months) { + var year = date.getFullYear(); + var month = date.getMonth() + months; + var day = date.getDate(); + var hour = date.getHours(); + var minute = date.getMinutes(); + var second = date.getSeconds(); + var millisecond = date.getMilliseconds(); + + while (true) { + // As the month might be out of bounds, we have to find out, what the real target month is + var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + var result = new Date(year, month, day, hour, minute, second, millisecond); + if (result.getMonth() === targetmonth) + return result; + --day; + } + }, + + __add__: function __add__(other) { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months + other._months); + else if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __radd__: function __radd__(other) { + if (ul4._isdate(other)) + return this._add(other, this._months); + throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; + }, + + __sub__: function __sub__(other) { + if (ul4._ismonthdelta(other)) + return ul4.MonthDelta.create(this._months - other._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __rsub__: function __rsub__(other) { + if (ul4._isdate(other)) + return this._add(other, -this._months); + throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; + }, + + __mul__: function __mul__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __rmul__: function __rmul__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(this._months * Math.floor(other)); + throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; + }, + + __floordiv__: function __floordiv__(other) { + if (typeof (other) === "number") + return ul4.MonthDelta.create(Math.floor(this._months / other)); + else if (ul4._ismonthdelta(other)) + return Math.floor(this._months / other._months); + throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; + }, + + __truediv__: function __truediv__(other) { + if (ul4._ismonthdelta(other)) + return this._months / other._months; + throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "months": + return ul4.expose([], function months() { return self._months; }); + default: + return undefined; + } + }, + + months: function months() { + return this._months; + } + } +); + +// When we don't have a real ``Set`` type, emulate one that supports strings +ul4._Set = ul4._inherit( + ul4.Proto, + { + __type__: "ul4._Set", + + create: function create() { + var set = ul4._clone(this); + set.items = {}; + set.add.apply(set, arguments); + return set; + }, + + add: function add() { + for (var i = 0; i < arguments.length; ++i) { + this.items[arguments[i]] = true; + } + }, + + __getattr__: function __getattr__(attrname) { + var self = this; + switch (attrname) { + case "add": + return ul4.expose(["*items"], function add(items) { self.add.apply(self, items); }); + default: + return undefined; + } + }, + + __contains__: function __contains__(item) { + return this.items[item] || false; + }, + + __bool__: function __bool__() { + for (var item in this.items) { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + }, + + __repr__: function __repr__() { + var v = []; + v.push("{"); + var i = 0; + for (var item in this.items) { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + }, + + __eq__: function (other) { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) { + var count = 0; + for (var item in this.items) { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in this.items) { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Substract the number of items that ``other`` has + for (var item in other.items) + --count; + return count == 0; + } + else + return false; + }, + + __le__: function (other) { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) { + var count = 0; + for (var item in this.items) { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in this.items) { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + }, + + __ge__: function (other) { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) { + var result = true; + other.forEach(function (value) { + if (!this.items[value]) + result = false; + }); + return result; + } + else if (ul4._isul4set(other)) { + var count = 0; + for (var item in other.items) { + if (!this.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + } +); + +var classes = [ + "TextAST", + "IndentAST", + "LineEndAST", + "Tag", + "ConstAST", + "SeqItemAST", + "UnpackSeqItemAST", + "DictItemAST", + "UnpackDictItemAST", + "PosArgAST", + "KeywordArgAST", + "UnpackListArgAST", + "UnpackDictArgAST", + "ListAST", + "ListCompAST", + "DictAST", + "DictCompAST", + "SetAST", + "SetCompAST", + "GenExprAST", + "VarAST", + "NotAST", + "NegAST", + "BitNotAST", + "IfAST", + "ReturnAST", + "PrintAST", + "PrintXAST", + "ItemAST", + "IsAST", + "IsNotAST", + "EQAST", + "NEAST", + "LTAST", + "LEAST", + "GTAST", + "GEAST", + "NotContainsAST", + "ContainsAST", + "AddAST", + "SubAST", + "MulAST", + "FloorDivAST", + "TrueDivAST", + "ModAST", + "ShiftLeftAST", + "ShiftRightAST", + "BitAndAST", + "BitXOrAST", + "BitOrAST", + "AndAST", + "OrAST", + "SliceAST", + "AttrAST", + "CallAST", + "RenderAST", + "SetVarAST", + "AddVarAST", + "SubVarAST", + "MulVarAST", + "TrueDivVarAST", + "FloorDivVarAST", + "ModVarAST", + "ShiftLeftVarAST", + "ShiftRightVarAST", + "BitAndVarAST", + "BitXOrVarAST", + "BitOrVarAST", + "ForBlockAST", + "WhileBlockAST", + "BreakAST", + "ContinueAST", + "CondBlockAST", + "IfBlockAST", + "ElIfBlockAST", + "ElseBlockAST", + "SignatureAST", + "Template" +]; + +for (var i = 0; i < classes.length; ++i) { + var name = classes[i]; + var ul4onname = name; + if (ul4onname.substr(ul4onname.length - 3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length - 3); + ul4onname = ul4onname.toLowerCase(); + var object = ul4[name]; + object.typename = name; + object.type = ul4onname; + ul4on.register("de.livinglogic.ul4." + ul4onname, object); +} From a4a0e5fbc1d48a75de455eaa339a2a572d23425f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Schwarzinger?= Date: Wed, 5 Sep 2018 15:52:49 +0200 Subject: [PATCH 38/43] unit testing with karma and mocha --- .gitignore | 3 +- config/tsconfig.es2015.json | 20 - karma.conf.js | 25 + package-lock.json | 7178 +++++++++++++++++++++++++++++++---- package.json | 20 +- rollup.config.js | 81 +- shellscripts/build.sh | 2 +- src/livingsdk.test.ts | 52 +- src/livingsdk.ts | 13 +- src/modules/livingapi.d.ts | 0 src/modules/livingapi.js | 2 - src/modules/ul4.js | 4 - tsconfig.json | 31 +- 13 files changed, 6597 insertions(+), 834 deletions(-) delete mode 100644 config/tsconfig.es2015.json create mode 100644 karma.conf.js delete mode 100644 src/modules/livingapi.d.ts diff --git a/.gitignore b/.gitignore index 936abe7..976567e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ node.js **/config.ts **/config.js **/config.d.ts -**/config.js.map \ No newline at end of file +**/config.js.map +dist/test/ \ No newline at end of file diff --git a/config/tsconfig.es2015.json b/config/tsconfig.es2015.json deleted file mode 100644 index 2f6c378..0000000 --- a/config/tsconfig.es2015.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "include": [ - "../src/**/*.ts" - ], - "exclude": [ - "**/*.test.ts", - "**/config.ts" - ], - "compilerOptions": { - "rootDir": "../src", - "target": "es2015", - "module": "es2015", - "declaration": true, - "outDir": "../dist/es2015", - "removeComments": true, - "moduleResolution": "node", - "esModuleInterop": true, - "sourceMap": true - } -} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..5367dd3 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,25 @@ +// Karma configuration +// Generated on Thu Jul 12 2018 19:50:02 GMT+0200 (CEST) +const resolve = require( 'rollup-plugin-node-resolve' ); +const commonjs = require( 'rollup-plugin-commonjs' ); + + +module.exports = function(config) { + config.set({ + + frameworks: ["mocha", "karma-typescript"], + + files: [ + 'https://unpkg.com/axios/dist/axios.min.js', + './node_modules/chai/chai.js', + { pattern: "dist/test/**/*.test.js" } + ], + + + reporters: ["progress"], + + browsers: ["Chrome"], + + singleRun: true + }); + }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5807205..eeb5df6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -773,6 +773,12 @@ "integrity": "sha512-9NfEUDp3tgRhmoxzTpTo+lq+KIVFxZahuRX0LHF/9IzKHaWuoWsIrrJ61zw5cnnlGINX8lqJzXYfQTOICS5Q+A==", "dev": true }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -783,6 +789,120 @@ "negotiator": "0.6.1" } }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "dev": true, + "optional": true, + "requires": { + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -792,6 +912,307 @@ "color-convert": "^1.9.0" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -807,36 +1228,168 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", + "dev": true, + "optional": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true, + "optional": true + }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -846,17 +1399,202 @@ "is-buffer": "^1.1.5" } }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "dev": true, + "optional": true, + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "dev": true + }, "blueimp-md5": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz", "integrity": "sha512-EkNUOi7tpV68TqjpiUz9D9NcT8um2+qtgntmMbi5UKssVX2m/2PLqotcric0RE63pB3HPN/fjf3cKHN2ufGSUQ==" }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, "body-parser": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", @@ -875,6 +1613,15 @@ "type-is": "~1.6.15" } }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -896,12 +1643,114 @@ "repeat-element": "^1.1.2" } }, - "browser-stdout": { - "version": "1.3.0", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, "browserslist": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", @@ -913,24 +1762,150 @@ "node-releases": "^1.0.0-alpha.11" } }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "buildmail": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", + "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "3.0.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0", + "punycode": "1.4.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, "caniuse-lite": { "version": "1.0.30000884", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz", "integrity": "sha512-ibROerckpTH6U5zReSjbaitlH4gl5V4NWNCBzRNCa3GEDmzzkfStk+2k5mO4ZDM6pwtdjbZ3hjvsYhPGVLWgNw==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, "chai": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", @@ -979,6 +1954,193 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", + "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -994,6 +2156,56 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", @@ -1003,12 +2215,80 @@ "graceful-readlink": ">= 1.0.0" } }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -1042,54 +2322,341 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "ms": "2.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "optional": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, "diff": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1102,12 +2669,126 @@ "integrity": "sha512-x09ndL/Gjnuk3unlAyoGyUg3wbs4w/bXurgL7wL913vXHAOWmMhrLf1VNGRaMLngmadd5Q8gsV9BFuIr6rP+Xg==", "dev": true }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "engine.io": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "uws": "~9.14.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1120,6 +2801,33 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "optional": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true, + "optional": true + }, "estree-walker": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", @@ -1138,6 +2846,72 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -1194,6 +2968,33 @@ "vary": "~1.1.2" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -1203,6 +3004,39 @@ "is-extglob": "^1.0.0" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true, + "optional": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -1237,8 +3071,18 @@ "unpipe": "~1.0.0" } }, - "follow-redirects": { - "version": "1.4.1", + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "follow-redirects": { + "version": "1.4.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { @@ -1270,959 +3114,4506 @@ "for-in": "^1.0.1" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "null-check": "^1.0.0" } }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "has-flag": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, + "optional": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { - "depd": { + "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, "dev": true }, - "setprototypeof": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-uri": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", + "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", + "dev": true, + "optional": true, + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "3", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hipchat-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", + "dev": true, + "optional": true, + "requires": { + "lodash": "^4.0.0", + "request": "^2.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-levenshtein": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", + "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "karma": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz", + "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^2.5.3", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.0.4", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz", + "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", + "dev": true, + "requires": { + "dateformat": "^1.0.6", + "istanbul": "^0.4.0", + "lodash": "^4.17.0", + "minimatch": "^3.0.0", + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "karma-mocha": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", + "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", + "dev": true, + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "karma-rollup-preprocessor": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-6.0.1.tgz", + "integrity": "sha512-tDs2wngYVO7D6sOGie8Mep+b073p7Mvawyu4UFvXxFjkKcjHTOVFvVywA8QR13zhy4dZ6Z3WPsz/nVLuS06lBg==", + "dev": true, + "requires": { + "chokidar": "^2.0.0" + } + }, + "karma-typescript": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-3.0.13.tgz", + "integrity": "sha1-iUivvRA6wZh6WWGg9DoboocQZ80=", + "dev": true, + "requires": { + "acorn": "^4.0.4", + "assert": "^1.4.1", + "async": "^2.1.4", + "browser-resolve": "^1.11.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.0.6", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.5.0", + "crypto-browserify": "^3.11.1", + "diff": "^3.2.0", + "domain-browser": "^1.1.7", + "events": "^1.1.1", + "glob": "^7.1.1", + "https-browserify": "^1.0.0", + "istanbul": "0.4.5", + "json-stringify-safe": "^5.0.1", + "karma-coverage": "^1.1.1", + "lodash": "^4.17.4", + "log4js": "^1.1.1", + "minimatch": "^3.0.3", + "os-browserify": "^0.3.0", + "pad": "^2.0.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^2.3.3", + "remap-istanbul": "^0.10.1", + "source-map": "0.6.1", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.3", + "timers-browserify": "^2.0.2", + "tmp": "0.0.29", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "date-format": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.0.tgz", + "integrity": "sha1-CSBoY6sHDrRZrOpVQsvYVrEZZrM=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "log4js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-1.1.1.tgz", + "integrity": "sha1-wh0px2BAieTyVYM+f5SzRh3h/0M=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "semver": "^5.3.0", + "streamroller": "^0.4.0" + } + }, + "streamroller": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.4.1.tgz", + "integrity": "sha1-1DW9WXQ3Or2b2QaDWVEwhRBswF8=", + "dev": true, + "requires": { + "date-format": "^0.0.0", + "debug": "^0.7.2", + "mkdirp": "^0.5.1", + "readable-stream": "^1.1.7" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", + "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + } + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "log4js": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.11.0.tgz", + "integrity": "sha512-z1XdwyGFg8/WGkOyF6DPJjivCWNLKrklGdViywdYnSKOvgtEBo2UyEMZS5sD2mZrQlU3TvO8wDWLc8mzE1ncBQ==", + "dev": true, + "requires": { + "amqplib": "^0.5.2", + "axios": "^0.15.3", + "circular-json": "^0.5.4", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "hipchat-notifier": "^1.1.0", + "loggly": "^1.1.0", + "mailgun-js": "^0.18.0", + "nodemailer": "^2.5.0", + "redis": "^2.7.1", + "semver": "^5.5.0", + "slack-node": "~0.2.0", + "streamroller": "0.7.0" + }, + "dependencies": { + "axios": { + "version": "0.15.3", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "loggly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", + "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", + "dev": true, + "optional": true, + "requires": { + "json-stringify-safe": "5.0.x", + "request": "2.75.x", + "timespan": "2.3.x" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.75.0", + "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "^0.2.2" + } + }, + "mailcomposer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", + "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, + "requires": { + "buildmail": "4.0.1", + "libmime": "3.0.0" + } + }, + "mailgun-js": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.1.tgz", + "integrity": "sha512-lvuMP14u24HS2uBsJEnzSyPMxzU2b99tQsIx1o6QNjqxjk8b3WvR+vq5oG1mjqz/IBYo+5gF+uSoDS0RkMVHmg==", + "dev": true, + "optional": true, + "requires": { + "async": "~2.6.0", + "debug": "~3.1.0", + "form-data": "~2.3.0", + "inflection": "~1.12.0", + "is-stream": "^1.1.0", + "path-proxy": "~1.0.0", + "promisify-call": "^2.0.2", + "proxy-agent": "~3.0.0", + "tsscmp": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "1.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", + "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + }, + "dependencies": { + "socks": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.2", + "smart-buffer": "^1.0.4" + } + } + } + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "pad": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/pad/-/pad-2.2.1.tgz", + "integrity": "sha512-lVia7rFne82Flf8V5Szzw2oP2zcQBGtCUXvo0pF1c6CmUHc9QLSZ1NQM/YujaM5YdQBsLJ1u90om+T1zKF42HQ==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", + "dev": true, + "optional": true, + "requires": { + "inflection": "~1.3.0" + }, + "dependencies": { + "inflection": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", + "dev": true, + "optional": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promisify-call": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", + "dev": true, + "optional": true, + "requires": { + "with-callback": "^1.0.2" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.1.tgz", + "integrity": "sha512-mAZexaz9ZxQhYPWfAjzlrloEjW+JHiBFryE4AJXFDTnaXfmH/FKqC1swTRKuEPbHWz02flQNXFOyDUF7zfEG6A==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "pac-proxy-agent": "^2.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true, + "optional": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "dev": true, + "optional": true, + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", + "dev": true, + "optional": true + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "dev": true, + "optional": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", "dev": true, "requires": { - "isarray": "1.0.0" + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, - "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "remap-istanbul": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.10.1.tgz", + "integrity": "sha512-gsNQXs5kJLhErICSyYhzVZ++C8LBW8dgwr874Y2QvzAUS75zBlD/juZgXs39nbYJ09fZDlX2AVLVJAY2jbFJoQ==", "dev": true, "requires": { - "merge-stream": "^1.0.1" + "amdefine": "^1.0.0", + "istanbul": "0.4.5", + "minimatch": "^3.0.3", + "plugin-error": "^0.1.2", + "source-map": "^0.6.1", + "through2": "2.0.1" } }, - "js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "optional": true, + "requires": { + "mime-db": "~1.36.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requestretry": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz", + "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==", "dev": true, + "optional": true, "requires": { - "is-buffer": "^1.1.5" + "extend": "^3.0.0", + "lodash": "^4.15.0", + "request": "^2.74.0", + "when": "^3.7.7" } }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "path-parse": "^1.0.5" } }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" + "glob": "^7.0.5" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "rollup": { + "version": "0.65.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.65.1.tgz", + "integrity": "sha512-46SzczqVygjcFVWsTBEg5x6hYVab9D/SFXWMkRgkGrBYxaUDvc442wwciO8Ow5DK4VCTwAC2CsX2Tpb89U9sXA==", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "@types/estree": "0.0.39", + "@types/node": "*" } }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "rollup-plugin-babel": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.0.3.tgz", + "integrity": "sha512-/PP0MgbPQyRywI4zRIJim6ySjTcOLo4kQbEbROqp9kOR3kHC3FeU++QpBDZhS2BcHtJTVZMVbBV46flbBN5zxQ==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.3.0" } }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true + "rollup-plugin-commonjs": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.6.tgz", + "integrity": "sha512-J7GOJm9uzEeLqkVxYSgjyoieh34hATWpa9G2M1ilGzWOLYGfQx5IDQ9ewG8QUj/Z2dzgV+d0/AyloAzElkABAA==", + "dev": true, + "requires": { + "estree-walker": "^0.5.1", + "magic-string": "^0.22.4", + "resolve": "^1.5.0", + "rollup-pluginutils": "^2.0.1" + } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true + "rollup-plugin-node-resolve": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true + } + } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "rollup-plugin-uglify": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-5.0.2.tgz", + "integrity": "sha512-CRRyMgKjTwTx1GXnn+v1VYV+6De5NyPB1UBStsQIQ+asrxvP7dK43cg2pf1vyFNr/NIHGvfYAR9Yo4j+5ZMQsw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "jest-worker": "^23.2.0", + "uglify-js": "^3.4.8" + } }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "rollup-pluginutils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz", + "integrity": "sha512-JZS8aJMHEHhqmY2QVPMXwKP6lsD1ShkrcGYjhAIvqKKdXQyPHw/9NF0tl3On/xOJ4ACkxfeG7AF+chfCN1NpBg==", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "ret": "~0.1.10" } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "ms": "2.0.0" + "is-extendable": "^0.1.0" } } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, - "node-releases": { - "version": "1.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", - "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "semver": "^5.3.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slack-node": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", + "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", "dev": true, + "optional": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "requestretry": "^1.2.2" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "optional": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "ee-first": "1.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "wrappy": "1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "kind-of": "^3.2.0" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "socket.io": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", "dev": true, "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" + "debug": "~2.6.6", + "engine.io": "~3.1.0", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.0.4", + "socket.io-parser": "~3.1.1" } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", "dev": true }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~2.6.4", + "engine.io-client": "~3.1.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.1.1", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "has-binary2": "~1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "dev": true, + "optional": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "smart-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", + "dev": true, + "optional": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "socks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", + "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } } } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "private": "^0.1.6" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "extend-shallow": "^3.0.0" } }, - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, + "optional": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", - "regjsgen": "^0.4.0", - "regjsparser": "^0.3.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, - "rollup": { - "version": "0.65.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.65.1.tgz", - "integrity": "sha512-46SzczqVygjcFVWsTBEg5x6hYVab9D/SFXWMkRgkGrBYxaUDvc442wwciO8Ow5DK4VCTwAC2CsX2Tpb89U9sXA==", + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { - "@types/estree": "0.0.39", - "@types/node": "*" + "ansi-regex": "^2.0.0" } }, - "rollup-plugin-babel": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.0.3.tgz", - "integrity": "sha512-/PP0MgbPQyRywI4zRIJim6ySjTcOLo4kQbEbROqp9kOR3kHC3FeU++QpBDZhS2BcHtJTVZMVbBV46flbBN5zxQ==", + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.3.0" + "is-utf8": "^0.2.0" } }, - "rollup-plugin-sourcemaps": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", - "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "rollup-pluginutils": "^2.0.1", - "source-map-resolve": "^0.5.0" + "get-stdin": "^4.0.1" } }, - "rollup-plugin-uglify": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-5.0.2.tgz", - "integrity": "sha512-CRRyMgKjTwTx1GXnn+v1VYV+6De5NyPB1UBStsQIQ+asrxvP7dK43cg2pf1vyFNr/NIHGvfYAR9Yo4j+5ZMQsw==", + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^23.2.0", - "uglify-js": "^3.4.8" + "has-flag": "^1.0.0" } }, - "rollup-pluginutils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz", - "integrity": "sha512-JZS8aJMHEHhqmY2QVPMXwKP6lsD1ShkrcGYjhAIvqKKdXQyPHw/9NF0tl3On/xOJ4ACkxfeG7AF+chfCN1NpBg==", + "through2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", + "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", "dev": true, "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" + "readable-stream": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true, + "optional": true }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "setimmediate": "^1.0.4" } }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "os-tmpdir": "~1.0.2" } }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "kind-of": "^3.0.2" } }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, + "optional": true, "requires": { - "has-flag": "^1.0.0" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, "trim-right": { @@ -2254,6 +7645,45 @@ } } }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "optional": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -2294,6 +7724,18 @@ } } }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -2322,18 +7764,156 @@ "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2346,18 +7926,156 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true, + "optional": true + }, + "uws": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "with-callback": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "optional": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true, + "optional": true + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", diff --git a/package.json b/package.json index 383c30d..6c1078f 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "mocha -r ts-node/register src/**/*.test.ts", - "build": "sh shellscripts/build.sh" + "test": "sh shellscripts/build.sh && mocha dist/test/**/*.test.js", + "build": "sh shellscripts/build.sh", + "karma": "sh shellscripts/build.sh && karma start" }, "author": "Living Logic AG", "license": "ISC", @@ -21,16 +22,23 @@ "devDependencies": { "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", - "rollup": "^0.65.0", - "rollup-plugin-babel": "^4.0.2", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-uglify": "^5.0.2", "@types/chai": "^4.1.3", "@types/mocha": "^5.2.1", "@types/node": "^10.3.2", "chai": "^4.1.2", "express": "^4.15.4", + "karma": "^2.0.5", + "karma-chrome-launcher": "^2.2.0", + "karma-mocha": "^1.3.0", + "karma-rollup-preprocessor": "^6.0.1", + "karma-typescript": "^3.0.13", "mocha": "^3.5.2", + "rollup": "^0.65.0", + "rollup-plugin-babel": "^4.0.2", + "rollup-plugin-commonjs": "^9.1.6", + "rollup-plugin-node-resolve": "^3.4.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-uglify": "^5.0.2", "ts-node": "^6.1.0", "typescript": "^2.9.1" } diff --git a/rollup.config.js b/rollup.config.js index 00ee830..31a4a25 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,29 +1,60 @@ const uglify = require('rollup-plugin-uglify'); const sourcemaps = require('rollup-plugin-sourcemaps'); const babel = require('rollup-plugin-babel'); +const resolve = require( 'rollup-plugin-node-resolve' ); +const commonjs = require( 'rollup-plugin-commonjs' ); -export default { - input: './dist/es2015/livingsdk.js', - output: { - file: './dist/umd/livingsdk.js', - format: 'umd', - name: 'livingsdk', - sourcemap: true - }, - plugins: [ - uglify.uglify(), - sourcemaps(), - babel( - { - "presets": [ - [ - "@babel/preset-env", - { - "useBuiltIns": "entry" - } - ] - ] - } - ) - ] -} \ No newline at end of file +export default [ + { + preferBuiltins: true, + input: './dist/es2015/livingsdk.js', + output: { + file: './dist/umd/livingsdk.js', + format: 'umd', + name: 'livingsdk', + sourcemap: true + }, + plugins: [ + uglify.uglify(), + sourcemaps(), + babel( + { + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "usage" + } + ] + ] + } + ) + ] + }, + { + preferBuiltins: true, + input: './dist/es2015/livingsdk.test.js', + output: { + file: './dist/test/livingsdk.test.js', + format: 'umd', + name: 'livingsdk', + sourcemap: true + }, + plugins: [ + uglify.uglify(), + sourcemaps(), + babel( + { + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "usage" + } + ] + ] + } + ) + ] + }, +] \ No newline at end of file diff --git a/shellscripts/build.sh b/shellscripts/build.sh index 80607bb..00aadf5 100644 --- a/shellscripts/build.sh +++ b/shellscripts/build.sh @@ -1,6 +1,6 @@ rm -Rf ./dist echo build LivingApps.Javascript.LivingAPI -./node_modules/typescript/bin/tsc -p ./config/tsconfig.es2015.json +./node_modules/typescript/bin/tsc wait echo copy modules cp -R ./src/modules ./dist/es2015/ diff --git a/src/livingsdk.test.ts b/src/livingsdk.test.ts index dc88a38..4035315 100644 --- a/src/livingsdk.test.ts +++ b/src/livingsdk.test.ts @@ -1,6 +1,5 @@ import { LivingSDK, LivingSDKOptions, Auth_Token } from './livingsdk'; import { expect } from 'chai'; -import 'mocha'; import {livingappsData as lsd, removeData } from './config' import { AxiosError } from 'axios'; @@ -27,6 +26,14 @@ function createMaxLSDK () { } describe('LivingSDK: ', () => { + beforeEach( () => { + // time out for not ddos server + return new Promise( (resolve, reject ) => { + setTimeout( () => { + resolve(); + }, 1000); + }) + } ); /* * test login * - getAuthToken @@ -36,9 +43,10 @@ describe('LivingSDK: ', () => { it('no login', () => { let lsdk = new LivingSDK({loginRequired: false, url: SERVER}); return lsdk.login().then((auth_token: Auth_Token) => { - expect(typeof auth_token).to.equal('undefined'); + // expect(typeof auth_token).to.equal('undefined'); + console.log( auth_token ); }); - }); + }).timeout( 10000 ); it('login with correct username and password', () => { let lsdk = new LivingSDK({ url: SERVER}, lsd.username, lsd.password); @@ -46,7 +54,7 @@ describe('LivingSDK: ', () => { console.log(auth_token); expect(typeof auth_token).to.equal('string'); }); - }); + }).timeout( 10000 ); it('change auth_token', () => { let lsdk = new LivingSDK({ url: SERVER}, lsd.username, lsd.password); @@ -62,7 +70,7 @@ describe('LivingSDK: ', () => { }).catch((err: any) => { expect(err.message).to.equal("Request failed with status code 403"); }); - }); + }).timeout( 10000 ); it('login with wrong data', () => { let lsdk = new LivingSDK({ url: SERVER}, "foo", "bar"); @@ -70,7 +78,7 @@ describe('LivingSDK: ', () => { // teste ob ergebnis leer ist expect(auth_token).to.equal(undefined); }); - }); + }).timeout( 10000 ); }); @@ -80,7 +88,7 @@ describe('LivingSDK: ', () => { it('request default', () => { return createMinLSDK().get(lsd.appId); - }); + }).timeout( 10000 ); it('request loggedInUsers', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.loggedIn) @@ -90,7 +98,7 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }); + }).timeout( 10000 ); it('request withPermissionsForApp', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.permissions) @@ -100,7 +108,7 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }); + }).timeout( 10000 ); it('request withWorkingPrivilegesApp', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.workpriv) @@ -110,7 +118,7 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }); + }).timeout( 10000 ); it('request withAdminPrivileges', () => { return createMinLSDK().get(lsd.appId, lsdktemplates.admin) @@ -120,7 +128,7 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 403'); }) - }) + }).timeout( 10000 ) }); @@ -128,23 +136,23 @@ describe('LivingSDK: ', () => { it('request default', () => { return createMaxLSDK().get(lsd.appId); - }); + }).timeout( 10000 ); it('request loggedInUsers', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.loggedIn); - }); + }).timeout( 10000 ); it('request withPermissionsForApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.permissions); - }); + }).timeout( 10000 ); it('request withWorkingPrivilegesApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.workpriv); - }); + }).timeout( 10000 ); it('request withAdminPrivileges', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin); - }); + }).timeout( 10000 ); }); @@ -156,7 +164,7 @@ describe('LivingSDK: ', () => { .catch((err: any) => { expect(err.message).to.equal('Request failed with status code 404'); }) - }); + }).timeout( 10000 ); }); @@ -170,7 +178,7 @@ describe('LivingSDK: ', () => { .then((storage: any) => { expect(storage).to.equal(undefined); }); - }); + }).timeout( 10000 ); it('insert an ID to StorageApp', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) @@ -180,7 +188,7 @@ describe('LivingSDK: ', () => { .then((storage: any) => { return storage.app.insert({id: `[JS]${(new Date()).toDateString()}`}); }); - }); + }).timeout( 10000 ); it('insert to self', () => { return createMaxLSDK().get(lsd.appId, lsdktemplates.admin) @@ -204,7 +212,7 @@ describe('LivingSDK: ', () => { geodata: '0.0,0.0,' }); }); - }); + }).timeout( 10000 ); it('auto relog login', () => { let lsdk = createMaxLSDK(); @@ -230,7 +238,7 @@ describe('LivingSDK: ', () => { .then((storage) => { return storage.app.insert({id: '[JS] relogged'}) }); - }); + }).timeout( 10000 ); }); @@ -277,7 +285,7 @@ describe('LivingSDK: ', () => { }); } }); - }) + }).timeout( 10000 ) it('auto relog update', () => { let lsdk = createMaxLSDK(); return lsdk.get(lsd.appId, lsdktemplates.admin) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index fb692ba..7762c25 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -3,13 +3,12 @@ import axios, { AxiosResponse } from 'axios'; import livingApi from './modules/livingapi'; ///@ts-ignore import { ul4, ul4on } from './modules/ul4'; - +import * as https from 'https'; export type Auth_Token = string; export type LivingApi = any; export type LAPIRecord = any; let commonjs = (typeof module === 'object' && module.exports); -let nodejs: any = {}; export interface LivingSDKOptions { url?: string; loginRequired?: boolean; @@ -54,7 +53,7 @@ export class LivingSDK { username: this._userName, password: this._password }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -68,7 +67,7 @@ export class LivingSDK { return this.session.then((auth_token: Auth_Token | undefined) => { return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -104,7 +103,7 @@ export class LivingSDK { return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -145,7 +144,7 @@ export class LivingSDK { return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -171,7 +170,7 @@ export class LivingSDK { let app = record.app; return this.session.then((auth_token: Auth_Token | undefined) => { return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { diff --git a/src/modules/livingapi.d.ts b/src/modules/livingapi.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index e52d445..d5c70f4 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -1,6 +1,4 @@ import { ul4, ul4on } from './ul4'; -let amd = (typeof define === 'function' && define.amd); -let commonjs = (typeof module === 'object' && module.exports); let la = {}; diff --git a/src/modules/ul4.js b/src/modules/ul4.js index 5efbe33..95ff35b 100644 --- a/src/modules/ul4.js +++ b/src/modules/ul4.js @@ -30,10 +30,6 @@ /*jslint vars: true */ - -let amd = (typeof define === 'function' && define.amd); -let commonjs = (typeof module === 'object' && module.exports); - export let ul4 = {}; export let ul4on = {}; diff --git a/tsconfig.json b/tsconfig.json index 2a066b3..95254bd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,16 @@ { - "include": [ - "./src/**/*.ts" - ], - "compilerOptions": { - - "target": "es2015", - "module": "umd", - "declaration": true, - "rootDir": "./src", - "outDir": "./dist/umd", - "removeComments": true, - "moduleResolution": "node", - "esModuleInterop": true, - - } -} \ No newline at end of file + "include": [ + "./src/**/*.ts" + ], + "compilerOptions": { + "rootDir": "./src", + "target": "es2015", + "module": "es2015", + "declaration": true, + "outDir": "./dist/es2015", + "removeComments": true, + "moduleResolution": "node", + "esModuleInterop": true, + "sourceMap": true + } + } \ No newline at end of file From 06f51f2ce2c0115fd33e516777f5f939f061779f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Schwarzinger?= Date: Wed, 5 Sep 2018 15:52:59 +0200 Subject: [PATCH 39/43] run build --- dist/es2015/livingsdk.js | 12 ++++++------ dist/es2015/livingsdk.js.map | 2 +- dist/es2015/modules/livingapi.d.ts | 0 dist/es2015/modules/livingapi.js | 2 -- dist/es2015/modules/ul4.js | 4 ---- dist/umd/livingsdk.js | 2 +- dist/umd/livingsdk.js.map | 2 +- 7 files changed, 9 insertions(+), 15 deletions(-) delete mode 100644 dist/es2015/modules/livingapi.d.ts diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index 1dfa30c..a2ccdc9 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -1,8 +1,8 @@ import axios from 'axios'; import livingApi from './modules/livingapi'; import { ul4on } from './modules/ul4'; +import * as https from 'https'; let commonjs = (typeof module === 'object' && module.exports); -let nodejs = {}; export class LivingSDK { constructor(options = {}, username, password) { this._password = password || ''; @@ -27,7 +27,7 @@ export class LivingSDK { username: this._userName, password: this._password }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -39,7 +39,7 @@ export class LivingSDK { get(appId, templateName) { return this.session.then((auth_token) => { return axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -72,7 +72,7 @@ export class LivingSDK { return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -111,7 +111,7 @@ export class LivingSDK { return axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, { appdd: data }, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { @@ -136,7 +136,7 @@ export class LivingSDK { let app = record.app; return this.session.then((auth_token) => { return axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, { - httpsAgent: commonjs ? new nodejs.https.Agent({ + httpsAgent: commonjs ? new https.Agent({ ecdhCurve: 'auto' }) : undefined, headers: { diff --git a/dist/es2015/livingsdk.js.map b/dist/es2015/livingsdk.js.map index 25841d3..8ad3fe1 100644 --- a/dist/es2015/livingsdk.js.map +++ b/dist/es2015/livingsdk.js.map @@ -1 +1 @@ -{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/es2015/modules/livingapi.d.ts b/dist/es2015/modules/livingapi.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index e52d445..d5c70f4 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -1,6 +1,4 @@ import { ul4, ul4on } from './ul4'; -let amd = (typeof define === 'function' && define.amd); -let commonjs = (typeof module === 'object' && module.exports); let la = {}; diff --git a/dist/es2015/modules/ul4.js b/dist/es2015/modules/ul4.js index 5efbe33..95ff35b 100644 --- a/dist/es2015/modules/ul4.js +++ b/dist/es2015/modules/ul4.js @@ -30,10 +30,6 @@ /*jslint vars: true */ - -let amd = (typeof define === 'function' && define.amd); -let commonjs = (typeof module === 'object' && module.exports); - export let ul4 = {}; export let ul4on = {}; diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index 7af52d2..24e5569 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("axios")):"function"==typeof define&&define.amd?define(["exports","axios"],t):t(e.livingsdk={},e.axios)}(this,function(e,u){"use strict";function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){for(var r=0;r=this.data.length)throw"UL4 decoder at EOF";return this.data.charAt(this.pos++)},readcharoreof:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)},readblackchar:function(){for(var e=/\s/;;){if(this.pos>=this.data.length)throw"UL4 decoder at EOF";var t=this.data.charAt(this.pos++);if(!t.match(e))return t}},read:function(e){this.pos+e>this.length&&(e=this.length-this.pos);var t=this.data.substring(this.pos,this.pos+e);return this.pos+=e,t},backup:function(){--this.pos},readnumber:function(){for(var e=/[-+0123456789.eE]/,t="";;){var r=this.readcharoreof();if(null===r||!r.match(e)){var n=parseFloat(t);if(NaN==n)throw"invalid number, got "+m._repr("value")+" at position "+this.pos;return n}t+=r}},_beginfakeloading:function(){var e=this.backrefs.length;return this.backrefs.push(null),e},_endfakeloading:function(e,t){this.backrefs[e]=t},_readescape:function(e,t){var r=this.read(t);if(r.length!=t)throw"broken escape "+m._repr("\\"+e+r)+" at position "+this.pos;var n=parseInt(r,16);if(isNaN(n))throw"broken escape "+m._repr("\\"+e+r)+" at position "+this.pos;return String.fromCharCode(n)},load:function(){var e,t=this.readblackchar();switch(t){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===t&&this.backrefs.push(null),null;case"b":case"B":if("T"===(e=this.readchar()))e=!0;else{if("F"!==e)throw"wrong value for boolean, expected 'T' or 'F', got "+m._repr(e)+" at position "+this.pos;e=!1}return"B"===t&&this.backrefs.push(e),e;case"i":case"I":case"f":case"F":return e=this.readnumber(),"I"!==t&&"F"!==t||this.backrefs.push(e),e;case"s":case"S":e=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var i=this.readchar();"\\"==i?e.push("\\"):"n"==i?e.push("\n"):"r"==i?e.push("\r"):"t"==i?e.push("\t"):"f"==i?e.push("\f"):"b"==i?e.push("\b"):"a"==i?e.push(""):"'"==i?e.push("'"):'"'==i?e.push('"'):"x"==i?e.push(this._readescape("x",2)):"u"==i?e.push(this._readescape("u",4)):"U"==i?e.push(this._readescape("U",8)):e.push("\\"+i)}else e.push(n)}return e=e.join(""),"S"===t&&this.backrefs.push(e),e;case"c":case"C":return e=m.Color.create(),"C"===t&&this.backrefs.push(e),e._r=this.load(),e._g=this.load(),e._b=this.load(),e._a=this.load(),e;case"z":case"Z":return(e=new Date).setFullYear(this.load()),e.setDate(1),e.setMonth(this.load()-1),e.setDate(this.load()),e.setHours(this.load()),e.setMinutes(this.load()),e.setSeconds(this.load()),e.setMilliseconds(this.load()/1e3),"Z"===t&&this.backrefs.push(e),e;case"t":case"T":return(e=m.TimeDelta.create())._days=this.load(),e._seconds=this.load(),e._microseconds=this.load(),"T"===t&&this.backrefs.push(e),e;case"r":case"R":return e=m.slice.create(),"R"===t&&this.backrefs.push(e),e.start=this.load(),e.stop=this.load(),e;case"m":case"M":return e=m.MonthDelta.create(),"M"===t&&this.backrefs.push(e),e._months=this.load(),e;case"l":case"L":for(e=[],"L"===t&&this.backrefs.push(e);;){if("]"===(t=this.readblackchar()))return e;this.backup(),e.push(this.load())}return e;case"d":case"D":case"e":case"E":if(!_._havemap&&("e"==t||"E"==t))throw"ordered dictionaries are not supported!";for(e=_._emptymap(),"D"!==t&&"E"!==t||this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup();var o=this.load(),a=this.load();_._setmap(e,o,a)}return e;case"y":case"Y":for(e=_._makeset(),"Y"===t&&this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup(),e.add(this.load())}return e;case"o":case"O":var s;"O"===t&&(s=this._beginfakeloading());var u,l=this.load();if(null!==this.registry?void 0===(u=this.registry[l])&&(u=_._registry[l]):u=_._registry[l],void 0===u)throw"can't load object of type "+m._repr(l);if(e=u(),"O"===t&&this._endfakeloading(s,e),e.ul4onload(this),")"!==(t=this.readblackchar()))throw"object terminator ')' for object of type '"+l+"' expected, got "+m._repr(t)+" at position "+this.pos;return e;default:throw"unknown typecode "+m._repr(t)+" at position "+this.pos}},loadcontent:function(e){var t=this;return{next:function(){var e=t.readblackchar();return t.backup(),")"==e?{done:!0}:{done:!1,value:t.load()}}}}},m._rvalidchars=/^[\],:{}\s]*$/,m._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,m._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,m._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,m._simpleclone=function(e){function t(){}return t.prototype=e,new t},m._clone=function(e){var t=m._simpleclone(e);return t.__prototype__=e,t.__id__=m.Proto._nextid++,t},m._extend=function(e,t){for(var r in t)e[r]=t[r];return e},m._simpleinherit=function(e,t){return m._extend(m._simpleclone(e),t)},m._inherit=function(e,t){return m._extend(m._clone(e),t)},m._map2object=function(e){if(m._ismap(e)){var r={};return e.forEach(function(e,t){if("string"!=typeof t)throw m.TypeError.create("keys must be strings");r[t]=e}),r}return e},m._bound=function(e,t){return e<0?0:t=r.length)return 1;var s=m._cmp(e,t[a],r[a]);if(s)return s}return r.length>t.length?-1:0}}else{if(m._isset(t)||m._isul4set(t)){var u=!1,l=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(u=!0)}),r.forEach(function(e){t.has(e)||(l=!0)});else if(m._isul4set(r))for(var _ in t.forEach(function(e){r.items[e]||(u=!0)}),r.items)if(!t.has(_)){l=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var _ in t.items)if(!r.has(_)){u=!0;break}r.forEach(function(e){t.items[e]||(l=!0)})}else if(m._isul4set(r)){for(var _ in t.items)if(!r.items[_]){u=!0;break}for(var _ in r.items)if(!t.items[_]){l=!0;break}}}else m._unorderable(e,t,r);return u?l?null:1:l?-1:0}m._unorderable(e,t,r)}},m._lt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return t=r.length)return!1;if(!m._eq(t[n],r[n]))return m._lt(t[n],r[n])}return t.length=r.length)return!1;if(!m._eq(t[n],r[n]))return m._lt(t[n],r[n])}return t.length<=r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable("<=",t,r)},m._gt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__gt__)return t.__gt__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return rr.getTime()}else if(m._islist(t)){if(m._islist(r)){if(t===r)return!1;for(var n=0;n=r.length)return!0;if(!m._eq(t[n],r[n]))return m._gt(t[n],r[n])}return t.length>r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable(">",t,r)},m._ge=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__ge__)return t.__ge__(r);if(-1!=e.indexOf(c(t))){if(-1!=e.indexOf(c(r)))return r<=t}else if("string"==typeof t){if("string"==typeof r)return r<=t}else if(m._isdate(t)){if(m._isdate(r))return t.getTime()>=r.getTime()}else if(m._islist(t)){if(m._islist(r)){if(t===r)return!0;for(var n=0;n=r.length)return!0;if(!m._eq(t[n],r[n]))return m._gt(t[n],r[n])}return t.length>=r.length}}else if(m._isset(t)||m._isul4set(t)){var i=!1,o=!1;if(m._isset(r)){if(m._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(m._isul4set(r))for(var a in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(a)){o=!0;break}}else if(m._isul4set(r)){if(m._isset(r)){for(var a in t.items)if(!r.has(a)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(m._isul4set(r)){for(var a in t.items)if(!r.items[a]){i=!0;break}for(var a in r.items)if(!t.items[a]){o=!0;break}}}else m._unorderable(operator,t,r);return i?o?null:1:o?-1:0}m._unorderable(">=",t,r)},m._iter=function(e){if("string"==typeof e||m._islist(e))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(m._isset(e)){var n=[];return e.forEach(function(e,t){n.push(e)}),{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}if(m._isul4set(e))return m._iter(e.items);if(m._isobject(e)){r=[];for(var t in e)r.push(t);return{index:0,next:function(){return this.index>=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}throw m.TypeError.create("iter",m._type(e)+" object is not iterable")},m._str_repr=function(e,t){for(var r="",n=!1,i=!1,o=0;o":"":m._isdate(e)?m._date_repr(e,t):void 0===e?"":"object"===c(e)&&"function"==typeof e.__repr__?e.__repr__():m._islist(e)?m._list_repr(e,t):m._ismap(e)?m._map_repr(e,t):m._isset(e)?m._set_repr(e,t):m._isobject(e)?m._object_repr(e,t):"?"},m._repr=function(e){return m._repr_internal(e,!1)},m._ascii=function(e){return m._repr_internal(e,!0)},m._date_str=function(e){var t=e.getFullYear(),r=e.getMonth()+1,n=e.getDate(),i=e.getHours(),o=e.getMinutes(),a=e.getSeconds(),s=e.getMilliseconds(),u=t+"-"+m._lpad(r.toString(),"0",2)+"-"+m._lpad(n.toString(),"0",2)+" "+m._lpad(i.toString(),"0",2)+":"+m._lpad(o.toString(),"0",2)+":"+m._lpad(a.toString(),"0",2);return s&&(u+="."+m._lpad(s.toString(),"0",3)+"000"),u},m._str=function(e){return void 0===e?"":null===e?"":!1===e?"False":!0===e?"True":"string"==typeof e?e:"number"==typeof e?e.toString():m._isdate(e)?m._date_str(e):m._islist(e)?m._list_repr(e):m._isset(e)?m._set_repr(e):m._ismap(e)?m._map_repr(e):"object"===c(e)&&"function"==typeof e.__str__?e.__str__():"object"===c(e)&&"function"==typeof e.__repr__?e.__repr__():m._isobject(e)?m._object_repr(e):"?"},m._bool=function(e){if(null==e||!1===e||0===e||""===e)return!1;if(c(e),"function"==typeof e.__bool__)return e.__bool__();if(m._islist(e))return 0!==e.length;if(m._ismap(e)||m._isset(e))return 0!=e.size;if(m._isobject(e)){for(var t in e)if(e.hasOwnProperty(t))return!0;return!1}return!0},m._int=function(e,t){var r;if(null!==t){if("string"!=typeof e||!m._isint(t))throw m.TypeError.create("int()","int() requires a string and an integer");if("NaN"==(r=parseInt(e,t)).toString())throw m.TypeError.create("int()","invalid literal for int()");return r}if("string"==typeof e){if("NaN"==(r=parseInt(e)).toString())throw m.TypeError.create("int()","invalid literal for int()");return r}if("number"==typeof e)return Math.floor(e);if(!0===e)return 1;if(!1===e)return 0;throw m.TypeError.create("int()","int() argument must be a string or a number")},m._float=function(e){if("string"==typeof e)return parseFloat(e);if("number"==typeof e)return e;if(!0===e)return 1;if(!1===e)return 0;throw m.TypeError.create("float()","float() argument must be a string or a number")},m._list=function(e){for(var t=m._iter(e),r=[];;){var n=t.next();if(n.done)return r;r.push(n.value)}},m._set=function(e){for(var t=m._iter(e),r=_._haveset?new Set:m._Set.create();;){var n=t.next();if(n.done)return r;r.add(n.value)}},m._len=function(e){if("string"==typeof e||m._islist(e))return e.length;if(m._ismap(e)||m._isset(e))return e.size;if(m._isobject(e)){var t=0;for(var r in e)++t;return t}throw m.TypeError.create("len","object of type '"+m._type(e)+"' has no len()")},m._type=function(e){return null===e?"none":!1===e||!0===e?"bool":void 0===e?"undefined":"string"==typeof e?"str":"number"==typeof e?Math.round(e)==e?"int":"float":m._islist(e)?"list":m._isset(e)?"set":m._isdate(e)?"date":void 0!==e.__type__?e.__type__:m._istimedelta(e)?"timedelta":m._isdict(e)?"dict":m._istemplate(e)?"template":m._isfunction(e)?"function":null},m._any=function(e){if("string"==typeof e){for(var t=0;t=^]$/.test(n))throw m.ValueError.create("illegal integer format string "+m._repr(t));o=n[1],i=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw m.ValueError.create("illegal integer format string "+m._repr(t));o=n}var c,h=e<0;switch(h&&(e=-e),l){case"b":c=e.toString(2);break;case"c":if(h||65535"==o)c=m._str_repeat(i,u-c.length)+c;else{var f=u-c.length,p=Math.floor(f/2),d=f-p;c=m._str_repeat(i,p)+c+m._str_repeat(i,d)}return c},m._format=function(e,t,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return m._isdate(e)?m._format_date(e,t,r):m._isint(e)?m._format_int(e,t,r):!0===e?m._format_int(1,t,r):!1===e?m._format_int(0,t,r):void 0},m._lpad=function(e,t,r){for("number"==typeof e&&(e=e.toString());e.lengththis.args.length){var s=null===e?"expected":e+"() expects";throw m.ArgumentError.create(s+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+t.length+" given")}}else n.push(t.slice(this.args.length));if(null===this.remkwargs){for(var u in r)if(!this.argNames[u])throw null===e?m.ArgumentError.create("an argument named "+m._repr(u)+" isn't supported"):m.ArgumentError.create(e+"() doesn't support an argument named "+m._repr(u))}else{var l={};for(var u in r)this.argNames[u]||(l[u]=r[u]);n.push(l)}return n},bindObject:function(e,t,r){t=this.bindArray(e,t,r);var n,i={};for(n=0;n"},__str__:function(){return this.toString()},toString:function(){for(var e=[],t=0;t")}}),m.IndentAST=m._inherit(m.TextAST,{create:function(e,t,r){var n=m.TextAST.create.call(this,e,t);return n._maketext(r),n},_maketext:function(e){void 0!==this.template?this.text=null===e?this.template.source.substring(this.pos.start,this.pos.stop):e:this.text=null},_text:function(){return null===this.text?this.template.source.substring(this.pos.start,this.pos.stop):this.text},_eval:function(e){for(var t=0;t")}}),m.LineEndAST=m._inherit(m.TextAST,{_str:function(e){e.push("lineend "),e.push(m._repr(this._text()))},_repr:function(e){e.push("")}}),m.Tag=m._inherit(m.AST,{create:function(e,t,r,n){var i=m.AST.create.call(this,r);return i.template=e,i.tag=t,i.codepos=n,i._maketext(),i},_maketext:function(){void 0!==this.template?(this.text=this.template.source.substring(this.pos.start,this.pos.stop),this.code=this.template.source.substring(this.codepos.start,this.codepos.stop)):(this.text=null,this.code=null)},ul4ondump:function(e){m.AST.ul4ondump.call(this,e),e.dump(this.template),e.dump(this.tag),e.dump(this.codepos)},ul4onload:function(e){m.TextAST.ul4onload.call(this,e),this.template=e.load(),this.tag=e.load(),this.codepos=e.load(),this._maketext()}}),m.CodeAST=m._inherit(m.AST,{create:function(e,t){var r=m.AST.create.call(this,t);return r.tag=e,r},_ul4onattrs:m.AST._ul4onattrs.concat(["tag"]),_str:function(e){e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," "))}}),m.ConstAST=m._inherit(m.CodeAST,{create:function(e,t,r){var n=m.CodeAST.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval:function(e){return this.value}}),m.ItemArgBase=m._inherit(m.CodeAST,{_handle_eval_list:function(e,t){try{return this._eval_list(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_set:function(e,t){try{return this._eval_set(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_dict:function(e,t){try{return this._eval_dict(e,t)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}},_handle_eval_call:function(e,t,r){try{return this._eval_call(e,t,r)}catch(e){throw m.InternalException.isprotoof(e)||m.LocationError.isprotoof(e)||(e=m.LocationError.create(this,e)),e}}}),m.SeqItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){var r=this.value._handle_eval(e);t.push(r)},_eval_set:function(e,t){var r=this.value._handle_eval(e);t.add(r)}}),m.UnpackSeqItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){for(var r=this.value._handle_eval(e),n=m._iter(r);;){var i=n.next();if(i.done)break;t.push(i.value)}},_eval_set:function(e,t){for(var r=this.value._handle_eval(e),n=m._iter(r);;){var i=n.next();if(i.done)break;t.add(i.value)}}}),m.DictItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r,n){var i=m.ItemArgBase.create.call(this,e,t);return i.key=r,i.value=n,i},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["key","value"]),_repr:function(e){e.push("")},_eval_dict:function(e,t){var r=this.key._handle_eval(e),n=this.value._handle_eval(e);_._setmap(t,r,n)}}),m.UnpackDictItemAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_dict:function(e,r){var t=this.item._handle_eval(e);if(m._islist(t))for(var n=0;n")},_eval_call:function(e,t,r){var n=this.value._handle_eval(e);t.push(n)}}),m.KeywordArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r,n){var i=m.ItemArgBase.create.call(this,e,t);return i.name=r,i.value=n,i},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["name","value"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){if(r.hasOwnProperty(this.name))throw m.ArgumentError.create("duplicate keyword argument "+this.name);var n=this.value._handle_eval(e);r[this.name]=n}}),m.UnpackListArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);t.push.apply(t,n)}}),m.UnpackDictArgAST=m._inherit(m.ItemArgBase,{create:function(e,t,r){var n=m.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:m.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);if(m._islist(n))for(var i=0;i")},_eval:function(e){for(var t=[],r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=[],i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){for(var t=_._emptymap(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=_._emptymap(),i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){for(var t=_._haveset?new Set:m._Set.create(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=_._haveset?new Set:m._Set.create(),i=m._iter(t);;){var o=i.next();if(o.done)break;for(var a=m._unpackvar(this.varname,o.value),s=0;s")},_eval:function(e){var t=this.container._handle_eval(e),n=m._iter(t),i=e.inheritvars(),o=this;return{next:function(){for(;;){var e=n.next();if(e.done)return e;for(var t=m._unpackvar(o.varname,e.value),r=0;r")},_eval:function(e){return this._get(e,this.name)},_eval_set:function(e,t){this._set(e,this.name,t)},_eval_modify:function(e,t,r){this._modify(e,t,this.name,r)},_get:function(e,t){var r=e.get(t);return void 0===r&&(r=m.functions[t]),r},_set:function(e,t,r){e.set(t,r)},_modify:function(e,t,r,n){var i=t._ido(e.get(r),n);e.set(r,i)}}),m.UnaryAST=m._inherit(m.CodeAST,{create:function(e,t,r){var n=m.CodeAST.create.call(this,e,t);return n.obj=r,n},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["obj"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" obj="),this.obj._repr(e),e.push(">")},_eval:function(e){var t=this.obj._handle_eval(e);return this._do(t)}}),m.NegAST=m._inherit(m.UnaryAST,{_do:function(e){return null!==e&&"function"==typeof e.__neg__?e.__neg__():-e}}),m.BitNotAST=m._inherit(m.UnaryAST,{_do:function(e){return-e-1}}),m.NotAST=m._inherit(m.UnaryAST,{_do:function(e){return!m._bool(e)}}),m.IfAST=m._inherit(m.CodeAST,{create:function(e,t,r,n,i){var o=m.CodeAST.create.call(this,e,t);return o.objif=r,o.objcond=n,o.objelse=i,o},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["objif","objcond","objelse"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(1),e.push("objif="),this.objif._repr(e),e.push(0),e.push("objcond="),this.objcond._repr(e),e.push(0),e.push("objelse="),this.objelse._repr(e),e.push(-1),e.push(">")},_eval:function(e){var t=this.objcond._handle_eval(e);return m._bool(t)?this.objif._handle_eval(e):this.objelse._handle_eval(e)}}),m.ReturnAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e);throw m.ReturnException.create(t)},_str:function(e){e.push("return "),this.obj._str(e)}}),m.PrintAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=m._str(t);e.output(r)},_str:function(e){e.push("print "),this.obj._str(e)}}),m.PrintXAST=m._inherit(m.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=m._xmlescape(t);e.output(r)},_str:function(e){e.push("printx "),this.obj._str(e)}}),m.BinaryAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.obj1=r,i.obj2=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["obj1","obj2"]),_repr:function(e){e.push("<"),e.push(this.type),e.push(" obj1="),this.obj1._repr(e),e.push(" obj2="),this.obj2._repr(e),e.push(">")},_eval:function(e){var t=this.obj1._handle_eval(e),r=this.obj2._handle_eval(e);return this._do(t,r)}}),m.ItemAST=m._inherit(m.BinaryAST,{_do:function(e,t){return this._get(e,t)},_eval_set:function(e,t){var r=this.obj1._handle_eval(e),n=this.obj2._handle_eval(e);this._set(r,n,t)},_eval_modify:function(e,t,r){var n=this.obj1._handle_eval(e),i=this.obj2._handle_eval(e);this._modify(t,n,i,r)},_get:function(e,t){if("string"==typeof e||m._islist(e)){if("object"===c(t)&&"function"==typeof t.isa&&t.isa(m.slice)){var r=t.start,n=t.stop;return null==r&&(r=0),null==n&&(n=e.length),e.slice(r,n)}return t<0&&(t+=e.length),e[t]}if(e&&"function"==typeof e.__getitem__)return e.__getitem__(t);if(m._ismap(e))return e.get(t);if("[object Object]"===Object.prototype.toString.call(e))return e[t];throw m.TypeError.create("[]",m._type(e)+" object is not subscriptable")},_set:function(e,t,r){if(m._islist(e))if("object"===c(t)&&"function"==typeof t.isa&&t.isa(m.slice)){var n=t.start,i=t.stop;null===n?n=0:n<0&&(n+=e.length),n<0?n=0:n>e.length&&(n=e.length),null===i?i=e.length:i<0&&(i+=e.length),i<0?i=0:i>e.length&&(i=e.length),i")},_eval:function(e){var t=this.obj._handle_eval(e);return this._get(t,this.attrname)},_eval_set:function(e,t){var r=this.obj._handle_eval(e);this._set(r,this.attrname,t)},_eval_modify:function(e,t,r){var n=this.obj._handle_eval(e);this._modify(t,n,this.attrname,r)},_get:function(n,e){if("string"==typeof n)switch(e){case"count":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._count(n,e,t,r)});case"find":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._find(n,e,t,r)});case"rfind":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._rfind(n,e,t,r)});case"replace":return m.expose(["old","new","count=",null],function(e,t,r){return m._replace(n,e,t,r)});case"strip":return m.expose(["chars=",null],function(e){return m._strip(n,e)});case"lstrip":return m.expose(["chars=",null],function(e){return m._lstrip(n,e)});case"rstrip":return m.expose(["chars=",null],function(e){return m._rstrip(n,e)});case"split":return m.expose(["sep=",null,"count=",null],function(e,t){return m._split(n,e,t)});case"rsplit":return m.expose(["sep=",null,"count=",null],function(e,t){return m._rsplit(n,e,t)});case"splitlines":return m.expose(["keepends=",!1],function(e){return m._splitlines(n,e)});case"lower":return m.expose([],function(){return n.toLowerCase()});case"upper":return m.expose([],function(){return n.toUpperCase()});case"capitalize":return m.expose([],function(){return m._capitalize(n)});case"join":return m.expose(["iterable"],function(e){return m._join(n,e)});case"startswith":return m.expose(["prefix"],function(e){return m._startswith(n,e)});case"endswith":return m.expose(["suffix"],function(e){return m._endswith(n,e)});default:return}else if(m._islist(n))switch(e){case"append":return m.expose(["*items"],function(e){return m._append(n,e)});case"insert":return m.expose(["pos","*items"],function(e,t){return m._insert(n,e,t)});case"pop":return m.expose(["pos=",-1],function(e){return m._pop(n,e)});case"count":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._count(n,e,t,r)});case"find":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._find(n,e,t,r)});case"rfind":return m.expose(["sub","start=",null,"end=",null],function(e,t,r){return m._rfind(n,e,t,r)});default:return}else if(m._isdate(n))switch(e){case"weekday":return m.expose([],function(){return m._weekday(n)});case"week":return m.expose(["firstweekday=",null],function(e){return m._week(n,e)});case"day":return m.expose([],function(){return n.getDate()});case"month":return m.expose([],function(){return n.getMonth()+1});case"year":return m.expose([],function(){return n.getFullYear()});case"hour":return m.expose([],function(){return n.getHours()});case"minute":return m.expose([],function(){return n.getMinutes()});case"second":return m.expose([],function(){return n.getSeconds()});case"microsecond":return m.expose([],function(){return 1e3*n.getMilliseconds()});case"mimeformat":return m.expose([],function(){return m._mimeformat(n)});case"isoformat":return m.expose([],function(){return m._isoformat(n)});case"yearday":return m.expose([],function(){return m._yearday(n)});default:return}else if(m._ismap(n))switch(e){case"get":return m.expose(["key","default=",null],function(e,t){return m._get(n,e,t)});case"items":return m.expose([],function(){return m._items(n)});case"values":return m.expose([],function(){return m._values(n)});case"update":return m.expose(["*other","**kwargs"],function(e,t){return m._update(n,e,t)});case"clear":return m.expose([],function(){return m._clear(n)});default:return n.get(e)}else if(m._isset(n))switch(e){case"add":return m.expose(["*items"],function(e){for(var t=0;t")},_makeargs:function(e){for(var t=[],r={},n=0;n")},_str:function(e){e.push("render "),e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," ")),null!==this.indent&&(e.push(" with indent "),e.push(m._repr(this.indent._text())))},_handle_eval:function(e){var t=e.withindent(null!==this.indent?this.indent._text():null),r=this.obj._handle_eval(t),n=this._makeargs(t);try{return m._callrender(t,r,n.args,n.kwargs)}catch(e){throw e=m.LocationError.create(this,e)}}}),m.slice=m._inherit(m.Proto,{create:function(e,t){var r=m._clone(this);return r.start=e,r.stop=t,r},__repr__:function(){return"slice("+m._repr(this.start)+", "+m._repr(this.stop)+")"}}),m.SliceAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.index1=r,i.index2=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["index1","index2"]),_repr:function(e){e.push("")},_eval:function(e){var t=null!==this.index1?this.index1._handle_eval(e):null,r=null!==this.index2?this.index2._handle_eval(e):null;return m.slice.create(t,r)}}),m.SetVarAST=m._inherit(m.CodeAST,{create:function(e,t,r,n){var i=m.CodeAST.create.call(this,e,t);return i.lvalue=r,i.value=n,i},_ul4onattrs:m.CodeAST._ul4onattrs.concat(["lvalue","value"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" lvalue="),e.push(m._repr(this.lvalue)),e.push(" value="),this.value._repr(e),e.push(">")},_eval:function(e){for(var t=this.value._handle_eval(e),r=m._unpackvar(this.lvalue,t),n=0;n")},_str_varname:function(e,t){if(m._islist(t)){e.push("(");for(var r=0;r")},_str:function(e){e.push("while "),this.container._repr(e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_eval:function(e){for(;;){var t=this.condition._handle_eval(e);if(!m._bool(t))break;try{m.BlockAST._eval.call(this,e)}catch(e){if(e===m.BreakException)break;if(e!==m.ContinueException)throw e}}}},"_str",function(e){e.push("while "),m.AST._str.call(this,e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)})),m.BreakAST=m._inherit(m.CodeAST,{_eval:function(e){throw m.BreakException},_str:function(e){e.push("break"),e.push(0)},_repr:function(e){e.push("")}}),m.ContinueAST=m._inherit(m.CodeAST,{_eval:function(e){throw m.ContinueException},_str:function(e){e.push("continue"),e.push(0)},_repr:function(e){e.push("")}}),m.CondBlockAST=m._inherit(m.BlockAST,{_eval:function(e){for(var t=0;t")},_str:function(e){e.push(this._strname),e.push(" "),this.condition._str(e),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){var t=this.condition._handle_eval(e);return m._bool(t)}}),m.IfBlockAST=m._inherit(m.ConditionalBlockAST,{_strname:"if"}),m.ElIfBlockAST=m._inherit(m.ConditionalBlockAST,{_strname:"else if"}),m.ElseBlockAST=m._inherit(m.BlockAST,t({_repr:function(e){e.push("")},_str:function(e){e.push("else:"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){return!0}},"_str",function(e){e.push("else:"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)})),m.Template=m._inherit(m.BlockAST,{create:function(e,t,r,n,i,o,a,s){var u=m.BlockAST.create.call(this,e,t);return u.source=r,u.name=n,u.whitespace=i,u.startdelim=o,u.enddelim=a,u.docpos=null,u.signature=s,u._jsfunction=null,u._asts=null,u._ul4_callsignature=s,u._ul4_rendersignature=s,u.parenttemplate=null,u},ul4ondump:function(e){var t;if(e.dump(m.version),e.dump(this.name),e.dump(this.source),e.dump(this.whitespace),e.dump(this.startdelim),e.dump(this.enddelim),e.dump(this.docpos),e.dump(this.parenttemplate),null===this.signature||m.SignatureAST.isprotoof(this.signature))t=this.signature;else{t=[];for(var r=0;r"!==this.enddelim&&(e.push(" enddelim="),e.push(m._repr(this.enddelim))),e.push(">")},_str:function(e){e.push("def "),e.push(this.name?this.name:"unnamed"),e.push(":"),e.push(1),m.BlockAST._str.call(this,e),e.push(-1)},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,_renderbound:function(e,t){var r=e.clone();r.vars=t;try{m.BlockAST._eval.call(this,r)}catch(e){if(!m.ReturnException.isprotoof(e))throw e}},__render__:function(e,t){this._renderbound(e,t)},render:function(e,t){this._renderbound(e,t)},_rendersbound:function(e,t){var r=e.replaceoutput();return this._renderbound(r,t),r.getoutput()},renders:function(e){e=e||{};var t=m.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._rendersbound(t,e)},doc:function(){return null!=this.docpos?this.source.substring(this.docpos.start,this.docpos.stop):null},__getattr__:function(e){var r=this;switch(e){case"tag":return this.tag;case"endtag":return this.endtag;case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});default:return}},_callbound:function(e,t){var r=e.clone();r.vars=t;try{m.BlockAST._eval.call(this,r)}catch(e){if(m.ReturnException.isprotoof(e))return e.result;throw e}return null},call:function(e){e=e||{};var t=m.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._callbound(t,e)},__call__:function(e,t){return this._callbound(e,t)},__type__:"ul4.Template"}),m.SignatureAST=m._inherit(m.CodeAST,{create:function(e,t){var r=m.CodeAST.create.call(this,e,t);return r.params=[],r},ul4ondump:function(e){m.CodeAST.ul4ondump.call(this,e);for(var t=[],r=0;r")}}),m.TemplateClosure=m._inherit(m.Proto,{create:function(e,t,r){var n=m._clone(this);return n.template=e,n.signature=t,n.vars=r,n._ul4_callsignature=t,n._ul4_rendersignature=t,n.name=e.name,n.tag=e.tag,n.endtag=e.endtag,n.source=e.source,n.startdelim=e.startdelim,n.enddelim=e.enddelim,n.docpos=e.docpos,n.content=e.content,n},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,__render__:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},render:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},__call__:function(e,t){return this.template._callbound(e,m._simpleinherit(this.vars,t))},_renderbound:function(e,t){this.template._renderbound(e,m._simpleinherit(this.vars,t))},_rendersbound:function(e,t){return this.template._rendersbound(e,m._simpleinherit(this.vars,t))},__getattr__:function(e){var r=this;switch(e){case"render":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return m.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});case"signature":return this.signature;default:return this.template.__getattr__(e)}},__type__:"ul4.TemplateClosure"}),m._rgb=function(e,t,r,n){return this.Color.create(255*e,255*t,255*r,255*n)},m._xmlescape=function(e){return e=(e=(e=(e=(e=(e=m._str(e)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},m._csv=function(e){return null===e?"":("string"!=typeof e&&(e=m._repr(e)),-1===e.indexOf(",")&&-1===e.indexOf('"')&&-1===e.indexOf("\n")||(e='"'+e.replace(/"/g,'""')+'"'),e)},m._chr=function(e){if("number"!=typeof e)throw m.TypeError.create("chr()","chr() requires an int");return String.fromCharCode(e)},m._ord=function(e){if("string"!=typeof e||1!=e.length)throw m.TypeError.create("ord()","ord() requires a string of length 1");return e.charCodeAt(0)},m._hex=function(e){if("number"!=typeof e)throw m.TypeError.create("hex()","hex() requires an int");return e<0?"-0x"+e.toString(16).substr(1):"0x"+e.toString(16)},m._oct=function(e){if("number"!=typeof e)throw m.TypeError.create("oct()","oct() requires an int");return e<0?"-0o"+e.toString(8).substr(1):"0o"+e.toString(8)},m._bin=function(e){if("number"!=typeof e)throw m.TypeError.create("bin()","bin() requires an int");return e<0?"-0b"+e.toString(2).substr(1):"0b"+e.toString(2)},m._min=function(e){if(0==e.length)throw m.ArgumentError.create("min() requires at least 1 argument, 0 given");1==e.length&&(e=e[0]);for(var t,r=m._iter(e),n=!0;;){var i=r.next();if(i.done){if(n)throw m.ValueError.create("min() argument is an empty sequence!");return t}(n||i.valuet)&&(t=i.value),n=!1}},m._sum=function(e,t){void 0===t&&(t=0);for(var r=m._iter(e);;){var n=r.next();if(n.done)break;t+=n.value}return t},m._first=function(e,t){void 0===t&&(t=null);var r=m._iter(e).next();return r.done?t:r.value},m._last=function(e,t){void 0===t&&(t=null);for(var r=t,n=m._iter(e);;){var i=n.next();if(i.done)break;r=i.value}return r},m._sorted=function(e,t,r,n){var i;if(null===r)return i=n?function(e,t){return-m._cmp("<=>",e,t)}:function(e,t){return m._cmp("<=>",e,t)},(_=m._list(t)).sort(i),_;for(var o=[],a=0,s=m._iter(t);;++a){var u=s.next();if(u.done)break;var l=m._call(e,r,[u.value],{});o.push([l,a,u.value])}i=function(e,t){var r=m._cmp("<=>",e[0],t[0]);return r||(r=m._cmp(e[1],t[1])),n?-r:r},o.sort(i);var _=[];for(a=0;a=o?{done:!0}:{value:t+this.index++*n,done:!1}}}},m._slice=function(e){var t,r,n,i;if(e.length<2)throw m.ArgumentError.create("required slice() argument missing");if(4= 0");if(n<0)throw m.ValueError.create("slice() requires a stop argument >= 0");if(i<=0)throw m.ValueError.create("slice() requires a step argument > 0");var o=r,a=0,s=m._iter(t);return{next:function(){for(var e;ae.length||ne.length+1&&(i=e.length+1),i}r=m._bound(r,e.length),n=m._bound(n,e.length);var o=0;if(m._islist(e)){for(var a=r;an);)++o,s+=t.length;return o},m._find=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=m._bound(r,e.length),n=m._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.indexOf(t);return-1!==i&&(i+=r),i},m._rfind=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=m._bound(r,e.length),n=m._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.lastIndexOf(t);return-1!==i&&(i+=r),i},m._capitalize=function(e){if("string"!=typeof e)throw m.TypeError.create("capitalize()","capitalize() requires a string");return e.length&&(e=e[0].toUpperCase()+e.slice(1).toLowerCase()),e},m._items=function(e){if(m._ismap(e)){var r=[];return e.forEach(function(e,t){r.push([t,e])}),r}if(m._isobject(e)){r=[];for(var t in e)r.push([t,e[t]]);return r}throw m.TypeError.create("items()","items() requires a dict")},m._values=function(e){if(m._ismap(e)){var r=[];return e.forEach(function(e,t){r.push(e)}),r}if(m._isobject(e)){r=[];for(var t in e)r.push(e[t]);return r}throw m.TypeError.create("values()","values() requires a dict")},m._join=function(e,t){for(var r=[],n=m._iter(t);;){var i=n.next();if(i.done)break;r.push(i.value)}return r.join(e)},m._startswith=function(e,t){if("string"!=typeof t)throw m.TypeError.create("startswith()","startswith() argument must be string");return e.substr(0,t.length)===t},m._endswith=function(e,t){if("string"!=typeof t)throw m.TypeError.create("endswith()","endswith() argument must be string");return e.substr(e.length-t.length)===t},m._isoformat=function(e){if(!m._isdate(e))throw m.TypeError.create("isoformat()","isoformat() requires a date");var t=e.getFullYear()+"-"+m._lpad((e.getMonth()+1).toString(),"0",2)+"-"+m._lpad(e.getDate().toString(),"0",2),r=e.getHours(),n=e.getMinutes(),i=e.getSeconds(),o=e.getMilliseconds();return(r||n||i||o)&&(t+="T"+m._lpad(r.toString(),"0",2)+":"+m._lpad(n.toString(),"0",2)+":"+m._lpad(i.toString(),"0",2),o&&(t+="."+m._lpad(o.toString(),"0",3)+"000")),t},m._mimeformat=function(e){return["Mon","Tue","Wed","Thu","Fri","Sat","Sun"][m._weekday(e)]+", "+m._lpad(e.getDate(),"0",2)+" "+["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][e.getMonth()]+" "+e.getFullYear()+" "+m._lpad(e.getHours(),"0",2)+":"+m._lpad(e.getMinutes(),"0",2)+":"+m._lpad(e.getSeconds(),"0",2)+" GMT"},m._weekday=function(e){var t=e.getDay();return t?t-1:6},m._week=function(e,t){null===t?t=0:t%=7;var r=m._yearday(e)+6,n=new Date(e.getFullYear(),0,1).getDay();for(--n<0&&(n=6);n!=t;)--r,7==++n&&(n=0);return Math.floor(r/7)},m._isleap=function(e){return 1===new Date(e.getFullYear(),1,29).getMonth()},m._yearday=function(e){var t=m._isleap(e)?1:0,r=e.getDate();switch(e.getMonth()){case 0:return r;case 1:return 31+r;case 2:return 59+t+r;case 3:return 59+t+31+r;case 4:return 59+t+31+30+r;case 5:return 59+t+31+30+31+r;case 6:return 59+t+31+30+31+30+r;case 7:return 59+t+31+30+31+30+31+r;case 8:return 59+t+31+30+31+30+31+31+r;case 9:return 59+t+31+30+31+30+31+31+30+r;case 10:return 59+t+31+30+31+30+31+31+30+31+r;case 11:return 59+t+31+30+31+30+31+31+30+31+30+r}},m._append=function(e,t){for(var r=0;re._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>e._microseconds;m._unorderable(">",this,e)},__ge__:function(e){if(m._istimedelta(e))return this._days!=e._days?this._days>e._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>=e._microseconds;m._unorderable(">=",this,e)},__neg__:function(){return m.TimeDelta.create(-this._days,-this._seconds,-this._microseconds)},_add:function(e,t,r,n){var i=e.getFullYear(),o=e.getMonth(),a=e.getDate()+t,s=e.getHours(),u=e.getMinutes(),l=e.getSeconds()+r,_=e.getMilliseconds()+n/1e3;return new Date(i,o,a,s,u,l,_)},__add__:function(e){if(m._istimedelta(e))return m.TimeDelta.create(this._days+e._days,this._seconds+e._seconds,this._microseconds+e._microseconds);if(m._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw m.TypeError.create("+",m._type(this)+" + "+m._type(e)+" not supported")},__radd__:function(e){if(m._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw m.TypeError.create("+",m._type(this)+" + "+m._type(e)+" not supported")},__sub__:function(e){if(m._istimedelta(e))return m.TimeDelta.create(this._days-e._days,this._seconds-e._seconds,this._microseconds-e._microseconds);throw m.TypeError.create("-",m._type(this)+" - "+m._type(e)+" not supported")},__rsub__:function(e){if(m._isdate(e))return this._add(e,-this._days,-this._seconds,-this._microseconds);throw m.TypeError.create("-",m._type(this)+" - "+m._type(e)+" not supported")},__mul__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw m.TypeError.create("*",m._type(this)+" * "+m._type(e)+" not supported")},__rmul__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw m.TypeError.create("*",m._type(this)+" * "+m._type(e)+" not supported")},__truediv__:function(e){if("number"==typeof e)return m.TimeDelta.create(this._days/e,this._seconds/e,this._microseconds/e);if(m._istimedelta(e)){var t=this._days,r=e._days,n=this._seconds||e._seconds,i=this._microseconds||e._microseconds;return(n||i)&&(t=86400*t+this._seconds,r=86400*r+e._seconds,i&&(t=1e6*t+this._microseconds,r=1e6*r+e._microseconds)),t/r}throw m.TypeError.create("/",m._type(this)+" / "+m._type(e)+" not supported")},__getattr__:function(e){var t=this;switch(e){case"days":return m.expose([],function(){return t._days});case"seconds":return m.expose([],function(){return t._seconds});case"microseconds":return m.expose([],function(){return t._microseconds});default:return}},days:function(){return this._days},seconds:function(){return this._seconds},microseconds:function(){return this._microseconds}}),m.MonthDelta=m._inherit(m.Proto,{__type__:"ul4.MonthDelta",create:function(e){var t=m._clone(this);return t._months=void 0!==e?e:0,t},__repr__:function(){return this._months?"monthdelta("+this._months+")":"monthdelta()"},__str__:function(){return this._months?-1!==this._months&&1!==this._months?this._months+" months":this._months+" month":"0 months"},__bool__:function(){return 0!==this._months},__abs__:function(){return this._months<0?m.MonthDelta.create(-this._months):this},__eq__:function(e){return!!m._ismonthdelta(e)&&this._months===e._months},__lt__:function(e){if(m._ismonthdelta(e))return this._monthse._months;m._unorderable(">",this,e)},__ge__:function(e){if(m._ismonthdelta(e))return this._months>=e._months;m._unorderable(">=",this,e)},__neg__:function(){return m.MonthDelta.create(-this._months)},_add:function(e,t){for(var r=e.getFullYear(),n=e.getMonth()+t,i=e.getDate(),o=e.getHours(),a=e.getMinutes(),s=e.getSeconds(),u=e.getMilliseconds();;){var l=new Date(r,n,1,o,a,s,u).getMonth(),_=new Date(r,n,i,o,a,s,u);if(_.getMonth()===l)return _;--i}},__add__:function(e){if(m._ismonthdelta(e))return m.MonthDelta.create(this._months+e._months);if(m._isdate(e))return this._add(e,this._months);throw m._type(this)+" + "+m._type(e)+" not supported"},__radd__:function(e){if(m._isdate(e))return this._add(e,this._months);throw m._type(this)+" + "+m._type(e)+" not supported"},__sub__:function(e){if(m._ismonthdelta(e))return m.MonthDelta.create(this._months-e._months);throw m._type(this)+" - "+m._type(e)+" not supported"},__rsub__:function(e){if(m._isdate(e))return this._add(e,-this._months);throw m._type(this)+" - "+m._type(e)+" not supported"},__mul__:function(e){if("number"==typeof e)return m.MonthDelta.create(this._months*Math.floor(e));throw m._type(this)+" * "+m._type(e)+" not supported"},__rmul__:function(e){if("number"==typeof e)return m.MonthDelta.create(this._months*Math.floor(e));throw m._type(this)+" * "+m._type(e)+" not supported"},__floordiv__:function(e){if("number"==typeof e)return m.MonthDelta.create(Math.floor(this._months/e));if(m._ismonthdelta(e))return Math.floor(this._months/e._months);throw m._type(this)+" // "+m._type(e)+" not supported"},__truediv__:function(e){if(m._ismonthdelta(e))return this._months/e._months;throw m._type(this)+" / "+m._type(e)+" not supported"},__getattr__:function(e){var t=this;switch(e){case"months":return m.expose([],function(){return t._months});default:return}},months:function(){return this._months}}),m._Set=m._inherit(m.Proto,{__type__:"ul4._Set",create:function(){var e=m._clone(this);return e.items={},e.add.apply(e,arguments),e},add:function(){for(var e=0;e"},geodist:function(e,t){var r=function(e){return(e=Math.sin(e))*e},n=function(e){return(e=Math.cos(e))*e},i=Math.PI/180,o=1/298.257223563,a=e.lat*i,s=e.long*i,u=t.lat*i,l=(a+u)/2,_=(a-u)/2,c=(s-t.long*i)/2,h=r(_)*n(c)+n(l)*r(c),f=n(_)*n(c)+r(l)*r(c),p=Math.atan(Math.sqrt(h/f)),d=2*p*6378.137,m=Math.sqrt(h*f)/p,g=(3*m+1)/(2*h);return d*(1+o*((3*m-1)/(2*f))*r(l)*n(_)-o*g*n(l)*r(_))}}),l.FlashMessage=m._inherit(l.Base,{_ul4onattrs:["timestamp","type","title","message"],__repr__:function(){return""}}),l.App=m._inherit(l.Base,{_ul4onattrs:["id","globals","name","description","language","startlink","iconlarge","iconsmall","owner","controls","records","recordcount","installation","categories","params","views","datamanagement_identifier"],insert:function(e){return this.globals.Login._insert(this,e)},__repr__:function(){return""}}),l.View=m._inherit(l.Base,{_ul4onattrs:["id","name","app","order","width","height","start","end"],__repr__:function(){return""}}),l.DataSource=m._inherit(l.Base,{_ul4onattrs:["id","identifier","app","apps"],__repr__:function(){return""}}),l.Record=m._inherit(l.Base,{_ul4onattrs:["id","app","createdat","createdby","updatedat","updatedby","updatecount","values","attachments","children"],delete:function(){return this.app.globals.Login._delete(this)},update:function(e){return this.app.globals.Login._update(this,e)},__repr__:function(){return""},search:function(e){for(var t in e){var r=e[t];if(m._bool(r)&&!this.fields.get(t).search(r))return!1}return!0},_dumpUL4ONAttr:function(e){return"values"===e?this._sparsevalues:this[e]},_loadUL4ONAttr:function(e,t){"values"===e?(this._sparsevalues=t,this._values=null,this._fields=null):this[e]=t}}),Object.defineProperty(l.Record,"values",{get:function(){if(null===this._values){this._values=_._havemap?new Map:{};var n=this;this.app.controls.forEach(function(e,t){var r=n._sparsevalues.get(e.identifier);void 0===r&&(r=null),n._values.set(t,r)})}return this._values}}),Object.defineProperty(l.Record,"fields",{get:function(){if(null===this._fields){this._fields=_._havemap?new Map:{};var n=this;this.values.forEach(function(e,t){var r=l.Field.create(n.app.controls.get(t),n.app,e);n._fields.set(t,r)})}return this._fields}}),l.Control=m._inherit(l.Base,{type:null,subtype:null,_ul4onattrs:["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],__repr__:function(){return""},asjson:function(e){return e},_logsearch:function(e,t){},search:function(e,t){return!1}}),l.BoolControl=m._inherit(l.Control,{type:"bool",__type__:"BoolControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),l.IntControl=m._inherit(l.Control,{type:"int",__type__:"IntControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),l.NumberControl=m._inherit(l.Control,{type:"number",__type__:"NumberControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator?t.value===e:"range"===t.operator&&(null!==e&&((null===t.minvalue||t.minvalue<=e)&&(null===t.maxvalue||e"}}),l.LookupItem=m._inherit(l.Base,{_ul4onattrs:["key","label"],__repr__:function(){return""}}),l.User=m._inherit(l.Base,{_ul4onattrs:["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],__repr__:function(){return""}}),l.File=m._inherit(l.Base,{_ul4onattrs:["id","url","filename","mimetype","width","height"],__repr__:function(){return""}}),l.Geo=m._inherit(l.Base,{_ul4onattrs:["lat","long","info"],__repr__:function(){return""}}),l.Attachment=m._inherit(l.Base,{_ul4onattrs:["id","record","label","active"],__repr__:function(){return""}}),l.NoteAttachment=m._inherit(l.Attachment,{type:"noteattachment",__type__:"NoteAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.URLAttachment=m._inherit(l.Attachment,{type:"urlattachment",__type__:"URLAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.FileAttachment=m._inherit(l.Attachment,{type:"fileattachment",__type__:"FileAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"])}),l.ImageAttachment=m._inherit(l.Attachment,{type:"imageattachment",__type__:"ImageAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["original","thumb","small","medium","large"])}),l.JSONAttachment=m._inherit(l.Attachment,{type:"jsonattachment",__type__:"JSONAttachment",_ul4onattrs:l.Attachment._ul4onattrs.concat(["value"]),_dumpUL4ONAttr:function(e){return"value"===e?m._asjson(this.value):this[e]},_loadUL4ONAttr:function(e,t){"value"===e?this.value=m._fromjson(t):this[e]=t}}),l.Installation=m._inherit(l.Base,{_ul4onattrs:["id","name"],__repr__:function(){return""}}),l.Category=m._inherit(l.Base,{_ul4onattrs:["id","identifier","name","order","parent","children","apps"],__repr__:function(){for(var e=[],t=this;null!==t;)e.splice(0,0,t.identifier),t=t.parent;return""}}),l.KeyView=m._inherit(l.Base,{_ul4onattrs:["id","identifier","name","key","user"],__repr__:function(){return""}}),l.AppParameter=m._inherit(l.Base,{_ul4onattrs:["id","app","identifier","description","value"],__repr__:function(){return""}});for(var h=["Globals","App","View","DataSource","Record","BoolControl","IntControl","NumberControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","FileControl","ButtonControl","Field","LookupItem","User","File","Geo","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","KeyView","AppParameter"],f=0;f=this.data.length)throw"UL4 decoder at EOF";return this.data.charAt(this.pos++)},readcharoreof:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)},readblackchar:function(){for(var e=/\s/;;){if(this.pos>=this.data.length)throw"UL4 decoder at EOF";var t=this.data.charAt(this.pos++);if(!t.match(e))return t}},read:function(e){this.pos+e>this.length&&(e=this.length-this.pos);var t=this.data.substring(this.pos,this.pos+e);return this.pos+=e,t},backup:function(){--this.pos},readnumber:function(){for(var e=/[-+0123456789.eE]/,t="";;){var r=this.readcharoreof();if(null===r||!r.match(e)){var n=parseFloat(t);if(NaN==n)throw"invalid number, got "+k._repr("value")+" at position "+this.pos;return n}t+=r}},_beginfakeloading:function(){var e=this.backrefs.length;return this.backrefs.push(null),e},_endfakeloading:function(e,t){this.backrefs[e]=t},_readescape:function(e,t){var r=this.read(t);if(r.length!=t)throw"broken escape "+k._repr("\\"+e+r)+" at position "+this.pos;var n=parseInt(r,16);if(isNaN(n))throw"broken escape "+k._repr("\\"+e+r)+" at position "+this.pos;return String.fromCharCode(n)},load:function(){var e,t=this.readblackchar();switch(t){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===t&&this.backrefs.push(null),null;case"b":case"B":if("T"===(e=this.readchar()))e=!0;else{if("F"!==e)throw"wrong value for boolean, expected 'T' or 'F', got "+k._repr(e)+" at position "+this.pos;e=!1}return"B"===t&&this.backrefs.push(e),e;case"i":case"I":case"f":case"F":return e=this.readnumber(),"I"!==t&&"F"!==t||this.backrefs.push(e),e;case"s":case"S":e=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var i=this.readchar();"\\"==i?e.push("\\"):"n"==i?e.push("\n"):"r"==i?e.push("\r"):"t"==i?e.push("\t"):"f"==i?e.push("\f"):"b"==i?e.push("\b"):"a"==i?e.push(""):"'"==i?e.push("'"):'"'==i?e.push('"'):"x"==i?e.push(this._readescape("x",2)):"u"==i?e.push(this._readescape("u",4)):"U"==i?e.push(this._readescape("U",8)):e.push("\\"+i)}else e.push(n)}return e=e.join(""),"S"===t&&this.backrefs.push(e),e;case"c":case"C":return e=k.Color.create(),"C"===t&&this.backrefs.push(e),e._r=this.load(),e._g=this.load(),e._b=this.load(),e._a=this.load(),e;case"z":case"Z":return(e=new Date).setFullYear(this.load()),e.setDate(1),e.setMonth(this.load()-1),e.setDate(this.load()),e.setHours(this.load()),e.setMinutes(this.load()),e.setSeconds(this.load()),e.setMilliseconds(this.load()/1e3),"Z"===t&&this.backrefs.push(e),e;case"t":case"T":return(e=k.TimeDelta.create())._days=this.load(),e._seconds=this.load(),e._microseconds=this.load(),"T"===t&&this.backrefs.push(e),e;case"r":case"R":return e=k.slice.create(),"R"===t&&this.backrefs.push(e),e.start=this.load(),e.stop=this.load(),e;case"m":case"M":return e=k.MonthDelta.create(),"M"===t&&this.backrefs.push(e),e._months=this.load(),e;case"l":case"L":for(e=[],"L"===t&&this.backrefs.push(e);;){if("]"===(t=this.readblackchar()))return e;this.backup(),e.push(this.load())}return e;case"d":case"D":case"e":case"E":if(!w._havemap&&("e"==t||"E"==t))throw"ordered dictionaries are not supported!";for(e=w._emptymap(),"D"!==t&&"E"!==t||this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup();var o=this.load(),s=this.load();w._setmap(e,o,s)}return e;case"y":case"Y":for(e=w._makeset(),"Y"===t&&this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup(),e.add(this.load())}return e;case"o":case"O":var a;"O"===t&&(a=this._beginfakeloading());var u,l=this.load();if(null!==this.registry?void 0===(u=this.registry[l])&&(u=w._registry[l]):u=w._registry[l],void 0===u)throw"can't load object of type "+k._repr(l);if(e=u(),"O"===t&&this._endfakeloading(a,e),e.ul4onload(this),")"!==(t=this.readblackchar()))throw"object terminator ')' for object of type '"+l+"' expected, got "+k._repr(t)+" at position "+this.pos;return e;default:throw"unknown typecode "+k._repr(t)+" at position "+this.pos}},loadcontent:function(e){var t=this;return{next:function(){var e=t.readblackchar();return t.backup(),")"==e?{done:!0}:{done:!1,value:t.load()}}}}},k._rvalidchars=/^[\],:{}\s]*$/,k._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,k._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,k._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,k._simpleclone=function(e){function t(){}return t.prototype=e,new t},k._clone=function(e){var t=k._simpleclone(e);return t.__prototype__=e,t.__id__=k.Proto._nextid++,t},k._extend=function(e,t){for(var r in t)e[r]=t[r];return e},k._simpleinherit=function(e,t){return k._extend(k._simpleclone(e),t)},k._inherit=function(e,t){return k._extend(k._clone(e),t)},k._map2object=function(e){if(k._ismap(e)){var r={};return e.forEach(function(e,t){if("string"!=typeof t)throw k.TypeError.create("keys must be strings");r[t]=e}),r}return e},k._bound=function(e,t){return e<0?0:t=r.length)return 1;var a=k._cmp(e,t[s],r[s]);if(a)return a}return r.length>t.length?-1:0}}else{if(k._isset(t)||k._isul4set(t)){var u=!1,l=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(u=!0)}),r.forEach(function(e){t.has(e)||(l=!0)});else if(k._isul4set(r))for(var _ in t.forEach(function(e){r.items[e]||(u=!0)}),r.items)if(!t.has(_)){l=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var _ in t.items)if(!r.has(_)){u=!0;break}r.forEach(function(e){t.items[e]||(l=!0)})}else if(k._isul4set(r)){for(var _ in t.items)if(!r.items[_]){u=!0;break}for(var _ in r.items)if(!t.items[_]){l=!0;break}}}else k._unorderable(e,t,r);return u?l?null:1:l?-1:0}k._unorderable(e,t,r)}},k._lt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return t=r.length)return!1;if(!k._eq(t[n],r[n]))return k._lt(t[n],r[n])}return t.length=r.length)return!1;if(!k._eq(t[n],r[n]))return k._lt(t[n],r[n])}return t.length<=r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable("<=",t,r)},k._gt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__gt__)return t.__gt__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return rr.getTime()}else if(k._islist(t)){if(k._islist(r)){if(t===r)return!1;for(var n=0;n=r.length)return!0;if(!k._eq(t[n],r[n]))return k._gt(t[n],r[n])}return t.length>r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable(">",t,r)},k._ge=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__ge__)return t.__ge__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return r<=t}else if("string"==typeof t){if("string"==typeof r)return r<=t}else if(k._isdate(t)){if(k._isdate(r))return t.getTime()>=r.getTime()}else if(k._islist(t)){if(k._islist(r)){if(t===r)return!0;for(var n=0;n=r.length)return!0;if(!k._eq(t[n],r[n]))return k._gt(t[n],r[n])}return t.length>=r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable(">=",t,r)},k._iter=function(e){if("string"==typeof e||k._islist(e))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(k._isset(e)){var n=[];return e.forEach(function(e,t){n.push(e)}),{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}if(k._isul4set(e))return k._iter(e.items);if(k._isobject(e)){r=[];for(var t in e)r.push(t);return{index:0,next:function(){return this.index>=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}throw k.TypeError.create("iter",k._type(e)+" object is not iterable")},k._str_repr=function(e,t){for(var r="",n=!1,i=!1,o=0;o":"":k._isdate(e)?k._date_repr(e,t):void 0===e?"":"object"===A(e)&&"function"==typeof e.__repr__?e.__repr__():k._islist(e)?k._list_repr(e,t):k._ismap(e)?k._map_repr(e,t):k._isset(e)?k._set_repr(e,t):k._isobject(e)?k._object_repr(e,t):"?"},k._repr=function(e){return k._repr_internal(e,!1)},k._ascii=function(e){return k._repr_internal(e,!0)},k._date_str=function(e){var t=e.getFullYear(),r=e.getMonth()+1,n=e.getDate(),i=e.getHours(),o=e.getMinutes(),s=e.getSeconds(),a=e.getMilliseconds(),u=t+"-"+k._lpad(r.toString(),"0",2)+"-"+k._lpad(n.toString(),"0",2)+" "+k._lpad(i.toString(),"0",2)+":"+k._lpad(o.toString(),"0",2)+":"+k._lpad(s.toString(),"0",2);return a&&(u+="."+k._lpad(a.toString(),"0",3)+"000"),u},k._str=function(e){return void 0===e?"":null===e?"":!1===e?"False":!0===e?"True":"string"==typeof e?e:"number"==typeof e?e.toString():k._isdate(e)?k._date_str(e):k._islist(e)?k._list_repr(e):k._isset(e)?k._set_repr(e):k._ismap(e)?k._map_repr(e):"object"===A(e)&&"function"==typeof e.__str__?e.__str__():"object"===A(e)&&"function"==typeof e.__repr__?e.__repr__():k._isobject(e)?k._object_repr(e):"?"},k._bool=function(e){if(null==e||!1===e||0===e||""===e)return!1;if(A(e),"function"==typeof e.__bool__)return e.__bool__();if(k._islist(e))return 0!==e.length;if(k._ismap(e)||k._isset(e))return 0!=e.size;if(k._isobject(e)){for(var t in e)if(e.hasOwnProperty(t))return!0;return!1}return!0},k._int=function(e,t){var r;if(null!==t){if("string"!=typeof e||!k._isint(t))throw k.TypeError.create("int()","int() requires a string and an integer");if("NaN"==(r=parseInt(e,t)).toString())throw k.TypeError.create("int()","invalid literal for int()");return r}if("string"==typeof e){if("NaN"==(r=parseInt(e)).toString())throw k.TypeError.create("int()","invalid literal for int()");return r}if("number"==typeof e)return Math.floor(e);if(!0===e)return 1;if(!1===e)return 0;throw k.TypeError.create("int()","int() argument must be a string or a number")},k._float=function(e){if("string"==typeof e)return parseFloat(e);if("number"==typeof e)return e;if(!0===e)return 1;if(!1===e)return 0;throw k.TypeError.create("float()","float() argument must be a string or a number")},k._list=function(e){for(var t=k._iter(e),r=[];;){var n=t.next();if(n.done)return r;r.push(n.value)}},k._set=function(e){for(var t=k._iter(e),r=w._haveset?new Set:k._Set.create();;){var n=t.next();if(n.done)return r;r.add(n.value)}},k._len=function(e){if("string"==typeof e||k._islist(e))return e.length;if(k._ismap(e)||k._isset(e))return e.size;if(k._isobject(e)){var t=0;for(var r in e)++t;return t}throw k.TypeError.create("len","object of type '"+k._type(e)+"' has no len()")},k._type=function(e){return null===e?"none":!1===e||!0===e?"bool":void 0===e?"undefined":"string"==typeof e?"str":"number"==typeof e?Math.round(e)==e?"int":"float":k._islist(e)?"list":k._isset(e)?"set":k._isdate(e)?"date":void 0!==e.__type__?e.__type__:k._istimedelta(e)?"timedelta":k._isdict(e)?"dict":k._istemplate(e)?"template":k._isfunction(e)?"function":null},k._any=function(e){if("string"==typeof e){for(var t=0;t=^]$/.test(n))throw k.ValueError.create("illegal integer format string "+k._repr(t));o=n[1],i=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw k.ValueError.create("illegal integer format string "+k._repr(t));o=n}var c,h=e<0;switch(h&&(e=-e),l){case"b":c=e.toString(2);break;case"c":if(h||65535"==o)c=k._str_repeat(i,u-c.length)+c;else{var f=u-c.length,p=Math.floor(f/2),d=f-p;c=k._str_repeat(i,p)+c+k._str_repeat(i,d)}return c},k._format=function(e,t,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return k._isdate(e)?k._format_date(e,t,r):k._isint(e)?k._format_int(e,t,r):!0===e?k._format_int(1,t,r):!1===e?k._format_int(0,t,r):void 0},k._lpad=function(e,t,r){for("number"==typeof e&&(e=e.toString());e.lengththis.args.length){var a=null===e?"expected":e+"() expects";throw k.ArgumentError.create(a+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+t.length+" given")}}else n.push(t.slice(this.args.length));if(null===this.remkwargs){for(var u in r)if(!this.argNames[u])throw null===e?k.ArgumentError.create("an argument named "+k._repr(u)+" isn't supported"):k.ArgumentError.create(e+"() doesn't support an argument named "+k._repr(u))}else{var l={};for(var u in r)this.argNames[u]||(l[u]=r[u]);n.push(l)}return n},bindObject:function(e,t,r){t=this.bindArray(e,t,r);var n,i={};for(n=0;n"},__str__:function(){return this.toString()},toString:function(){for(var e=[],t=0;t")}}),k.IndentAST=k._inherit(k.TextAST,{create:function(e,t,r){var n=k.TextAST.create.call(this,e,t);return n._maketext(r),n},_maketext:function(e){void 0!==this.template?this.text=null===e?this.template.source.substring(this.pos.start,this.pos.stop):e:this.text=null},_text:function(){return null===this.text?this.template.source.substring(this.pos.start,this.pos.stop):this.text},_eval:function(e){for(var t=0;t")}}),k.LineEndAST=k._inherit(k.TextAST,{_str:function(e){e.push("lineend "),e.push(k._repr(this._text()))},_repr:function(e){e.push("")}}),k.Tag=k._inherit(k.AST,{create:function(e,t,r,n){var i=k.AST.create.call(this,r);return i.template=e,i.tag=t,i.codepos=n,i._maketext(),i},_maketext:function(){void 0!==this.template?(this.text=this.template.source.substring(this.pos.start,this.pos.stop),this.code=this.template.source.substring(this.codepos.start,this.codepos.stop)):(this.text=null,this.code=null)},ul4ondump:function(e){k.AST.ul4ondump.call(this,e),e.dump(this.template),e.dump(this.tag),e.dump(this.codepos)},ul4onload:function(e){k.TextAST.ul4onload.call(this,e),this.template=e.load(),this.tag=e.load(),this.codepos=e.load(),this._maketext()}}),k.CodeAST=k._inherit(k.AST,{create:function(e,t){var r=k.AST.create.call(this,t);return r.tag=e,r},_ul4onattrs:k.AST._ul4onattrs.concat(["tag"]),_str:function(e){e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," "))}}),k.ConstAST=k._inherit(k.CodeAST,{create:function(e,t,r){var n=k.CodeAST.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval:function(e){return this.value}}),k.ItemArgBase=k._inherit(k.CodeAST,{_handle_eval_list:function(e,t){try{return this._eval_list(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_set:function(e,t){try{return this._eval_set(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_dict:function(e,t){try{return this._eval_dict(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_call:function(e,t,r){try{return this._eval_call(e,t,r)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}}}),k.SeqItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){var r=this.value._handle_eval(e);t.push(r)},_eval_set:function(e,t){var r=this.value._handle_eval(e);t.add(r)}}),k.UnpackSeqItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){for(var r=this.value._handle_eval(e),n=k._iter(r);;){var i=n.next();if(i.done)break;t.push(i.value)}},_eval_set:function(e,t){for(var r=this.value._handle_eval(e),n=k._iter(r);;){var i=n.next();if(i.done)break;t.add(i.value)}}}),k.DictItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r,n){var i=k.ItemArgBase.create.call(this,e,t);return i.key=r,i.value=n,i},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["key","value"]),_repr:function(e){e.push("")},_eval_dict:function(e,t){var r=this.key._handle_eval(e),n=this.value._handle_eval(e);w._setmap(t,r,n)}}),k.UnpackDictItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_dict:function(e,r){var t=this.item._handle_eval(e);if(k._islist(t))for(var n=0;n")},_eval_call:function(e,t,r){var n=this.value._handle_eval(e);t.push(n)}}),k.KeywordArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r,n){var i=k.ItemArgBase.create.call(this,e,t);return i.name=r,i.value=n,i},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["name","value"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){if(r.hasOwnProperty(this.name))throw k.ArgumentError.create("duplicate keyword argument "+this.name);var n=this.value._handle_eval(e);r[this.name]=n}}),k.UnpackListArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);t.push.apply(t,n)}}),k.UnpackDictArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);if(k._islist(n))for(var i=0;i")},_eval:function(e){for(var t=[],r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=[],i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){for(var t=w._emptymap(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=w._emptymap(),i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){for(var t=w._haveset?new Set:k._Set.create(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=w._haveset?new Set:k._Set.create(),i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){var t=this.container._handle_eval(e),n=k._iter(t),i=e.inheritvars(),o=this;return{next:function(){for(;;){var e=n.next();if(e.done)return e;for(var t=k._unpackvar(o.varname,e.value),r=0;r")},_eval:function(e){return this._get(e,this.name)},_eval_set:function(e,t){this._set(e,this.name,t)},_eval_modify:function(e,t,r){this._modify(e,t,this.name,r)},_get:function(e,t){var r=e.get(t);return void 0===r&&(r=k.functions[t]),r},_set:function(e,t,r){e.set(t,r)},_modify:function(e,t,r,n){var i=t._ido(e.get(r),n);e.set(r,i)}}),k.UnaryAST=k._inherit(k.CodeAST,{create:function(e,t,r){var n=k.CodeAST.create.call(this,e,t);return n.obj=r,n},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["obj"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" obj="),this.obj._repr(e),e.push(">")},_eval:function(e){var t=this.obj._handle_eval(e);return this._do(t)}}),k.NegAST=k._inherit(k.UnaryAST,{_do:function(e){return null!==e&&"function"==typeof e.__neg__?e.__neg__():-e}}),k.BitNotAST=k._inherit(k.UnaryAST,{_do:function(e){return-e-1}}),k.NotAST=k._inherit(k.UnaryAST,{_do:function(e){return!k._bool(e)}}),k.IfAST=k._inherit(k.CodeAST,{create:function(e,t,r,n,i){var o=k.CodeAST.create.call(this,e,t);return o.objif=r,o.objcond=n,o.objelse=i,o},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["objif","objcond","objelse"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(1),e.push("objif="),this.objif._repr(e),e.push(0),e.push("objcond="),this.objcond._repr(e),e.push(0),e.push("objelse="),this.objelse._repr(e),e.push(-1),e.push(">")},_eval:function(e){var t=this.objcond._handle_eval(e);return k._bool(t)?this.objif._handle_eval(e):this.objelse._handle_eval(e)}}),k.ReturnAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e);throw k.ReturnException.create(t)},_str:function(e){e.push("return "),this.obj._str(e)}}),k.PrintAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=k._str(t);e.output(r)},_str:function(e){e.push("print "),this.obj._str(e)}}),k.PrintXAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=k._xmlescape(t);e.output(r)},_str:function(e){e.push("printx "),this.obj._str(e)}}),k.BinaryAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.obj1=r,i.obj2=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["obj1","obj2"]),_repr:function(e){e.push("<"),e.push(this.type),e.push(" obj1="),this.obj1._repr(e),e.push(" obj2="),this.obj2._repr(e),e.push(">")},_eval:function(e){var t=this.obj1._handle_eval(e),r=this.obj2._handle_eval(e);return this._do(t,r)}}),k.ItemAST=k._inherit(k.BinaryAST,{_do:function(e,t){return this._get(e,t)},_eval_set:function(e,t){var r=this.obj1._handle_eval(e),n=this.obj2._handle_eval(e);this._set(r,n,t)},_eval_modify:function(e,t,r){var n=this.obj1._handle_eval(e),i=this.obj2._handle_eval(e);this._modify(t,n,i,r)},_get:function(e,t){if("string"==typeof e||k._islist(e)){if("object"===A(t)&&"function"==typeof t.isa&&t.isa(k.slice)){var r=t.start,n=t.stop;return null==r&&(r=0),null==n&&(n=e.length),e.slice(r,n)}return t<0&&(t+=e.length),e[t]}if(e&&"function"==typeof e.__getitem__)return e.__getitem__(t);if(k._ismap(e))return e.get(t);if("[object Object]"===Object.prototype.toString.call(e))return e[t];throw k.TypeError.create("[]",k._type(e)+" object is not subscriptable")},_set:function(e,t,r){if(k._islist(e))if("object"===A(t)&&"function"==typeof t.isa&&t.isa(k.slice)){var n=t.start,i=t.stop;null===n?n=0:n<0&&(n+=e.length),n<0?n=0:n>e.length&&(n=e.length),null===i?i=e.length:i<0&&(i+=e.length),i<0?i=0:i>e.length&&(i=e.length),i")},_eval:function(e){var t=this.obj._handle_eval(e);return this._get(t,this.attrname)},_eval_set:function(e,t){var r=this.obj._handle_eval(e);this._set(r,this.attrname,t)},_eval_modify:function(e,t,r){var n=this.obj._handle_eval(e);this._modify(t,n,this.attrname,r)},_get:function(n,e){if("string"==typeof n)switch(e){case"count":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._count(n,e,t,r)});case"find":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._find(n,e,t,r)});case"rfind":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._rfind(n,e,t,r)});case"replace":return k.expose(["old","new","count=",null],function(e,t,r){return k._replace(n,e,t,r)});case"strip":return k.expose(["chars=",null],function(e){return k._strip(n,e)});case"lstrip":return k.expose(["chars=",null],function(e){return k._lstrip(n,e)});case"rstrip":return k.expose(["chars=",null],function(e){return k._rstrip(n,e)});case"split":return k.expose(["sep=",null,"count=",null],function(e,t){return k._split(n,e,t)});case"rsplit":return k.expose(["sep=",null,"count=",null],function(e,t){return k._rsplit(n,e,t)});case"splitlines":return k.expose(["keepends=",!1],function(e){return k._splitlines(n,e)});case"lower":return k.expose([],function(){return n.toLowerCase()});case"upper":return k.expose([],function(){return n.toUpperCase()});case"capitalize":return k.expose([],function(){return k._capitalize(n)});case"join":return k.expose(["iterable"],function(e){return k._join(n,e)});case"startswith":return k.expose(["prefix"],function(e){return k._startswith(n,e)});case"endswith":return k.expose(["suffix"],function(e){return k._endswith(n,e)});default:return}else if(k._islist(n))switch(e){case"append":return k.expose(["*items"],function(e){return k._append(n,e)});case"insert":return k.expose(["pos","*items"],function(e,t){return k._insert(n,e,t)});case"pop":return k.expose(["pos=",-1],function(e){return k._pop(n,e)});case"count":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._count(n,e,t,r)});case"find":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._find(n,e,t,r)});case"rfind":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._rfind(n,e,t,r)});default:return}else if(k._isdate(n))switch(e){case"weekday":return k.expose([],function(){return k._weekday(n)});case"week":return k.expose(["firstweekday=",null],function(e){return k._week(n,e)});case"day":return k.expose([],function(){return n.getDate()});case"month":return k.expose([],function(){return n.getMonth()+1});case"year":return k.expose([],function(){return n.getFullYear()});case"hour":return k.expose([],function(){return n.getHours()});case"minute":return k.expose([],function(){return n.getMinutes()});case"second":return k.expose([],function(){return n.getSeconds()});case"microsecond":return k.expose([],function(){return 1e3*n.getMilliseconds()});case"mimeformat":return k.expose([],function(){return k._mimeformat(n)});case"isoformat":return k.expose([],function(){return k._isoformat(n)});case"yearday":return k.expose([],function(){return k._yearday(n)});default:return}else if(k._ismap(n))switch(e){case"get":return k.expose(["key","default=",null],function(e,t){return k._get(n,e,t)});case"items":return k.expose([],function(){return k._items(n)});case"values":return k.expose([],function(){return k._values(n)});case"update":return k.expose(["*other","**kwargs"],function(e,t){return k._update(n,e,t)});case"clear":return k.expose([],function(){return k._clear(n)});default:return n.get(e)}else if(k._isset(n))switch(e){case"add":return k.expose(["*items"],function(e){for(var t=0;t")},_makeargs:function(e){for(var t=[],r={},n=0;n")},_str:function(e){e.push("render "),e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," ")),null!==this.indent&&(e.push(" with indent "),e.push(k._repr(this.indent._text())))},_handle_eval:function(e){var t=e.withindent(null!==this.indent?this.indent._text():null),r=this.obj._handle_eval(t),n=this._makeargs(t);try{return k._callrender(t,r,n.args,n.kwargs)}catch(e){throw e=k.LocationError.create(this,e)}}}),k.slice=k._inherit(k.Proto,{create:function(e,t){var r=k._clone(this);return r.start=e,r.stop=t,r},__repr__:function(){return"slice("+k._repr(this.start)+", "+k._repr(this.stop)+")"}}),k.SliceAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.index1=r,i.index2=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["index1","index2"]),_repr:function(e){e.push("")},_eval:function(e){var t=null!==this.index1?this.index1._handle_eval(e):null,r=null!==this.index2?this.index2._handle_eval(e):null;return k.slice.create(t,r)}}),k.SetVarAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.lvalue=r,i.value=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["lvalue","value"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" lvalue="),e.push(k._repr(this.lvalue)),e.push(" value="),this.value._repr(e),e.push(">")},_eval:function(e){for(var t=this.value._handle_eval(e),r=k._unpackvar(this.lvalue,t),n=0;n")},_str_varname:function(e,t){if(k._islist(t)){e.push("(");for(var r=0;r")},_str:function(e){e.push("while "),this.container._repr(e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_eval:function(e){for(;;){var t=this.condition._handle_eval(e);if(!k._bool(t))break;try{k.BlockAST._eval.call(this,e)}catch(e){if(e===k.BreakException)break;if(e!==k.ContinueException)throw e}}}},"_str",function(e){e.push("while "),k.AST._str.call(this,e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)})),k.BreakAST=k._inherit(k.CodeAST,{_eval:function(e){throw k.BreakException},_str:function(e){e.push("break"),e.push(0)},_repr:function(e){e.push("")}}),k.ContinueAST=k._inherit(k.CodeAST,{_eval:function(e){throw k.ContinueException},_str:function(e){e.push("continue"),e.push(0)},_repr:function(e){e.push("")}}),k.CondBlockAST=k._inherit(k.BlockAST,{_eval:function(e){for(var t=0;t")},_str:function(e){e.push(this._strname),e.push(" "),this.condition._str(e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){var t=this.condition._handle_eval(e);return k._bool(t)}}),k.IfBlockAST=k._inherit(k.ConditionalBlockAST,{_strname:"if"}),k.ElIfBlockAST=k._inherit(k.ConditionalBlockAST,{_strname:"else if"}),k.ElseBlockAST=k._inherit(k.BlockAST,x({_repr:function(e){e.push("")},_str:function(e){e.push("else:"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){return!0}},"_str",function(e){e.push("else:"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)})),k.Template=k._inherit(k.BlockAST,{create:function(e,t,r,n,i,o,s,a){var u=k.BlockAST.create.call(this,e,t);return u.source=r,u.name=n,u.whitespace=i,u.startdelim=o,u.enddelim=s,u.docpos=null,u.signature=a,u._jsfunction=null,u._asts=null,u._ul4_callsignature=a,u._ul4_rendersignature=a,u.parenttemplate=null,u},ul4ondump:function(e){var t;if(e.dump(k.version),e.dump(this.name),e.dump(this.source),e.dump(this.whitespace),e.dump(this.startdelim),e.dump(this.enddelim),e.dump(this.docpos),e.dump(this.parenttemplate),null===this.signature||k.SignatureAST.isprotoof(this.signature))t=this.signature;else{t=[];for(var r=0;r"!==this.enddelim&&(e.push(" enddelim="),e.push(k._repr(this.enddelim))),e.push(">")},_str:function(e){e.push("def "),e.push(this.name?this.name:"unnamed"),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,_renderbound:function(e,t){var r=e.clone();r.vars=t;try{k.BlockAST._eval.call(this,r)}catch(e){if(!k.ReturnException.isprotoof(e))throw e}},__render__:function(e,t){this._renderbound(e,t)},render:function(e,t){this._renderbound(e,t)},_rendersbound:function(e,t){var r=e.replaceoutput();return this._renderbound(r,t),r.getoutput()},renders:function(e){e=e||{};var t=k.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._rendersbound(t,e)},doc:function(){return null!=this.docpos?this.source.substring(this.docpos.start,this.docpos.stop):null},__getattr__:function(e){var r=this;switch(e){case"tag":return this.tag;case"endtag":return this.endtag;case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});default:return}},_callbound:function(e,t){var r=e.clone();r.vars=t;try{k.BlockAST._eval.call(this,r)}catch(e){if(k.ReturnException.isprotoof(e))return e.result;throw e}return null},call:function(e){e=e||{};var t=k.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._callbound(t,e)},__call__:function(e,t){return this._callbound(e,t)},__type__:"ul4.Template"}),k.SignatureAST=k._inherit(k.CodeAST,{create:function(e,t){var r=k.CodeAST.create.call(this,e,t);return r.params=[],r},ul4ondump:function(e){k.CodeAST.ul4ondump.call(this,e);for(var t=[],r=0;r")}}),k.TemplateClosure=k._inherit(k.Proto,{create:function(e,t,r){var n=k._clone(this);return n.template=e,n.signature=t,n.vars=r,n._ul4_callsignature=t,n._ul4_rendersignature=t,n.name=e.name,n.tag=e.tag,n.endtag=e.endtag,n.source=e.source,n.startdelim=e.startdelim,n.enddelim=e.enddelim,n.docpos=e.docpos,n.content=e.content,n},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,__render__:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},render:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},__call__:function(e,t){return this.template._callbound(e,k._simpleinherit(this.vars,t))},_renderbound:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},_rendersbound:function(e,t){return this.template._rendersbound(e,k._simpleinherit(this.vars,t))},__getattr__:function(e){var r=this;switch(e){case"render":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});case"signature":return this.signature;default:return this.template.__getattr__(e)}},__type__:"ul4.TemplateClosure"}),k._rgb=function(e,t,r,n){return this.Color.create(255*e,255*t,255*r,255*n)},k._xmlescape=function(e){return e=(e=(e=(e=(e=(e=k._str(e)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},k._csv=function(e){return null===e?"":("string"!=typeof e&&(e=k._repr(e)),-1===e.indexOf(",")&&-1===e.indexOf('"')&&-1===e.indexOf("\n")||(e='"'+e.replace(/"/g,'""')+'"'),e)},k._chr=function(e){if("number"!=typeof e)throw k.TypeError.create("chr()","chr() requires an int");return String.fromCharCode(e)},k._ord=function(e){if("string"!=typeof e||1!=e.length)throw k.TypeError.create("ord()","ord() requires a string of length 1");return e.charCodeAt(0)},k._hex=function(e){if("number"!=typeof e)throw k.TypeError.create("hex()","hex() requires an int");return e<0?"-0x"+e.toString(16).substr(1):"0x"+e.toString(16)},k._oct=function(e){if("number"!=typeof e)throw k.TypeError.create("oct()","oct() requires an int");return e<0?"-0o"+e.toString(8).substr(1):"0o"+e.toString(8)},k._bin=function(e){if("number"!=typeof e)throw k.TypeError.create("bin()","bin() requires an int");return e<0?"-0b"+e.toString(2).substr(1):"0b"+e.toString(2)},k._min=function(e){if(0==e.length)throw k.ArgumentError.create("min() requires at least 1 argument, 0 given");1==e.length&&(e=e[0]);for(var t,r=k._iter(e),n=!0;;){var i=r.next();if(i.done){if(n)throw k.ValueError.create("min() argument is an empty sequence!");return t}(n||i.valuet)&&(t=i.value),n=!1}},k._sum=function(e,t){void 0===t&&(t=0);for(var r=k._iter(e);;){var n=r.next();if(n.done)break;t+=n.value}return t},k._first=function(e,t){void 0===t&&(t=null);var r=k._iter(e).next();return r.done?t:r.value},k._last=function(e,t){void 0===t&&(t=null);for(var r=t,n=k._iter(e);;){var i=n.next();if(i.done)break;r=i.value}return r},k._sorted=function(e,t,r,n){var i;if(null===r)return i=n?function(e,t){return-k._cmp("<=>",e,t)}:function(e,t){return k._cmp("<=>",e,t)},(_=k._list(t)).sort(i),_;for(var o=[],s=0,a=k._iter(t);;++s){var u=a.next();if(u.done)break;var l=k._call(e,r,[u.value],{});o.push([l,s,u.value])}i=function(e,t){var r=k._cmp("<=>",e[0],t[0]);return r||(r=k._cmp(e[1],t[1])),n?-r:r},o.sort(i);var _=[];for(s=0;s=o?{done:!0}:{value:t+this.index++*n,done:!1}}}},k._slice=function(e){var t,r,n,i;if(e.length<2)throw k.ArgumentError.create("required slice() argument missing");if(4= 0");if(n<0)throw k.ValueError.create("slice() requires a stop argument >= 0");if(i<=0)throw k.ValueError.create("slice() requires a step argument > 0");var o=r,s=0,a=k._iter(t);return{next:function(){for(var e;se.length||ne.length+1&&(i=e.length+1),i}r=k._bound(r,e.length),n=k._bound(n,e.length);var o=0;if(k._islist(e)){for(var s=r;sn);)++o,a+=t.length;return o},k._find=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=k._bound(r,e.length),n=k._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.indexOf(t);return-1!==i&&(i+=r),i},k._rfind=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=k._bound(r,e.length),n=k._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.lastIndexOf(t);return-1!==i&&(i+=r),i},k._capitalize=function(e){if("string"!=typeof e)throw k.TypeError.create("capitalize()","capitalize() requires a string");return e.length&&(e=e[0].toUpperCase()+e.slice(1).toLowerCase()),e},k._items=function(e){if(k._ismap(e)){var r=[];return e.forEach(function(e,t){r.push([t,e])}),r}if(k._isobject(e)){r=[];for(var t in e)r.push([t,e[t]]);return r}throw k.TypeError.create("items()","items() requires a dict")},k._values=function(e){if(k._ismap(e)){var r=[];return e.forEach(function(e,t){r.push(e)}),r}if(k._isobject(e)){r=[];for(var t in e)r.push(e[t]);return r}throw k.TypeError.create("values()","values() requires a dict")},k._join=function(e,t){for(var r=[],n=k._iter(t);;){var i=n.next();if(i.done)break;r.push(i.value)}return r.join(e)},k._startswith=function(e,t){if("string"!=typeof t)throw k.TypeError.create("startswith()","startswith() argument must be string");return e.substr(0,t.length)===t},k._endswith=function(e,t){if("string"!=typeof t)throw k.TypeError.create("endswith()","endswith() argument must be string");return e.substr(e.length-t.length)===t},k._isoformat=function(e){if(!k._isdate(e))throw k.TypeError.create("isoformat()","isoformat() requires a date");var t=e.getFullYear()+"-"+k._lpad((e.getMonth()+1).toString(),"0",2)+"-"+k._lpad(e.getDate().toString(),"0",2),r=e.getHours(),n=e.getMinutes(),i=e.getSeconds(),o=e.getMilliseconds();return(r||n||i||o)&&(t+="T"+k._lpad(r.toString(),"0",2)+":"+k._lpad(n.toString(),"0",2)+":"+k._lpad(i.toString(),"0",2),o&&(t+="."+k._lpad(o.toString(),"0",3)+"000")),t},k._mimeformat=function(e){return["Mon","Tue","Wed","Thu","Fri","Sat","Sun"][k._weekday(e)]+", "+k._lpad(e.getDate(),"0",2)+" "+["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][e.getMonth()]+" "+e.getFullYear()+" "+k._lpad(e.getHours(),"0",2)+":"+k._lpad(e.getMinutes(),"0",2)+":"+k._lpad(e.getSeconds(),"0",2)+" GMT"},k._weekday=function(e){var t=e.getDay();return t?t-1:6},k._week=function(e,t){null===t?t=0:t%=7;var r=k._yearday(e)+6,n=new Date(e.getFullYear(),0,1).getDay();for(--n<0&&(n=6);n!=t;)--r,7==++n&&(n=0);return Math.floor(r/7)},k._isleap=function(e){return 1===new Date(e.getFullYear(),1,29).getMonth()},k._yearday=function(e){var t=k._isleap(e)?1:0,r=e.getDate();switch(e.getMonth()){case 0:return r;case 1:return 31+r;case 2:return 59+t+r;case 3:return 59+t+31+r;case 4:return 59+t+31+30+r;case 5:return 59+t+31+30+31+r;case 6:return 59+t+31+30+31+30+r;case 7:return 59+t+31+30+31+30+31+r;case 8:return 59+t+31+30+31+30+31+31+r;case 9:return 59+t+31+30+31+30+31+31+30+r;case 10:return 59+t+31+30+31+30+31+31+30+31+r;case 11:return 59+t+31+30+31+30+31+31+30+31+30+r}},k._append=function(e,t){for(var r=0;re._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>e._microseconds;k._unorderable(">",this,e)},__ge__:function(e){if(k._istimedelta(e))return this._days!=e._days?this._days>e._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>=e._microseconds;k._unorderable(">=",this,e)},__neg__:function(){return k.TimeDelta.create(-this._days,-this._seconds,-this._microseconds)},_add:function(e,t,r,n){var i=e.getFullYear(),o=e.getMonth(),s=e.getDate()+t,a=e.getHours(),u=e.getMinutes(),l=e.getSeconds()+r,_=e.getMilliseconds()+n/1e3;return new Date(i,o,s,a,u,l,_)},__add__:function(e){if(k._istimedelta(e))return k.TimeDelta.create(this._days+e._days,this._seconds+e._seconds,this._microseconds+e._microseconds);if(k._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw k.TypeError.create("+",k._type(this)+" + "+k._type(e)+" not supported")},__radd__:function(e){if(k._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw k.TypeError.create("+",k._type(this)+" + "+k._type(e)+" not supported")},__sub__:function(e){if(k._istimedelta(e))return k.TimeDelta.create(this._days-e._days,this._seconds-e._seconds,this._microseconds-e._microseconds);throw k.TypeError.create("-",k._type(this)+" - "+k._type(e)+" not supported")},__rsub__:function(e){if(k._isdate(e))return this._add(e,-this._days,-this._seconds,-this._microseconds);throw k.TypeError.create("-",k._type(this)+" - "+k._type(e)+" not supported")},__mul__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw k.TypeError.create("*",k._type(this)+" * "+k._type(e)+" not supported")},__rmul__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw k.TypeError.create("*",k._type(this)+" * "+k._type(e)+" not supported")},__truediv__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days/e,this._seconds/e,this._microseconds/e);if(k._istimedelta(e)){var t=this._days,r=e._days,n=this._seconds||e._seconds,i=this._microseconds||e._microseconds;return(n||i)&&(t=86400*t+this._seconds,r=86400*r+e._seconds,i&&(t=1e6*t+this._microseconds,r=1e6*r+e._microseconds)),t/r}throw k.TypeError.create("/",k._type(this)+" / "+k._type(e)+" not supported")},__getattr__:function(e){var t=this;switch(e){case"days":return k.expose([],function(){return t._days});case"seconds":return k.expose([],function(){return t._seconds});case"microseconds":return k.expose([],function(){return t._microseconds});default:return}},days:function(){return this._days},seconds:function(){return this._seconds},microseconds:function(){return this._microseconds}}),k.MonthDelta=k._inherit(k.Proto,{__type__:"ul4.MonthDelta",create:function(e){var t=k._clone(this);return t._months=void 0!==e?e:0,t},__repr__:function(){return this._months?"monthdelta("+this._months+")":"monthdelta()"},__str__:function(){return this._months?-1!==this._months&&1!==this._months?this._months+" months":this._months+" month":"0 months"},__bool__:function(){return 0!==this._months},__abs__:function(){return this._months<0?k.MonthDelta.create(-this._months):this},__eq__:function(e){return!!k._ismonthdelta(e)&&this._months===e._months},__lt__:function(e){if(k._ismonthdelta(e))return this._monthse._months;k._unorderable(">",this,e)},__ge__:function(e){if(k._ismonthdelta(e))return this._months>=e._months;k._unorderable(">=",this,e)},__neg__:function(){return k.MonthDelta.create(-this._months)},_add:function(e,t){for(var r=e.getFullYear(),n=e.getMonth()+t,i=e.getDate(),o=e.getHours(),s=e.getMinutes(),a=e.getSeconds(),u=e.getMilliseconds();;){var l=new Date(r,n,1,o,s,a,u).getMonth(),_=new Date(r,n,i,o,s,a,u);if(_.getMonth()===l)return _;--i}},__add__:function(e){if(k._ismonthdelta(e))return k.MonthDelta.create(this._months+e._months);if(k._isdate(e))return this._add(e,this._months);throw k._type(this)+" + "+k._type(e)+" not supported"},__radd__:function(e){if(k._isdate(e))return this._add(e,this._months);throw k._type(this)+" + "+k._type(e)+" not supported"},__sub__:function(e){if(k._ismonthdelta(e))return k.MonthDelta.create(this._months-e._months);throw k._type(this)+" - "+k._type(e)+" not supported"},__rsub__:function(e){if(k._isdate(e))return this._add(e,-this._months);throw k._type(this)+" - "+k._type(e)+" not supported"},__mul__:function(e){if("number"==typeof e)return k.MonthDelta.create(this._months*Math.floor(e));throw k._type(this)+" * "+k._type(e)+" not supported"},__rmul__:function(e){if("number"==typeof e)return k.MonthDelta.create(this._months*Math.floor(e));throw k._type(this)+" * "+k._type(e)+" not supported"},__floordiv__:function(e){if("number"==typeof e)return k.MonthDelta.create(Math.floor(this._months/e));if(k._ismonthdelta(e))return Math.floor(this._months/e._months);throw k._type(this)+" // "+k._type(e)+" not supported"},__truediv__:function(e){if(k._ismonthdelta(e))return this._months/e._months;throw k._type(this)+" / "+k._type(e)+" not supported"},__getattr__:function(e){var t=this;switch(e){case"months":return k.expose([],function(){return t._months});default:return}},months:function(){return this._months}}),k._Set=k._inherit(k.Proto,{__type__:"ul4._Set",create:function(){var e=k._clone(this);return e.items={},e.add.apply(e,arguments),e},add:function(){for(var e=0;e"},geodist:function(e,t){var r=function(e){return(e=Math.sin(e))*e},n=function(e){return(e=Math.cos(e))*e},i=Math.PI/180,o=1/298.257223563,s=e.lat*i,a=e.long*i,u=t.lat*i,l=(s+u)/2,_=(s-u)/2,c=(a-t.long*i)/2,h=r(_)*n(c)+n(l)*r(c),f=n(_)*n(c)+r(l)*r(c),p=Math.atan(Math.sqrt(h/f)),d=2*p*6378.137,m=Math.sqrt(h*f)/p,g=(3*m+1)/(2*h);return d*(1+o*((3*m-1)/(2*f))*r(l)*n(_)-o*g*n(l)*r(_))}}),L.FlashMessage=k._inherit(L.Base,{_ul4onattrs:["timestamp","type","title","message"],__repr__:function(){return""}}),L.App=k._inherit(L.Base,{_ul4onattrs:["id","globals","name","description","language","startlink","iconlarge","iconsmall","owner","controls","records","recordcount","installation","categories","params","views","datamanagement_identifier"],insert:function(e){return this.globals.Login._insert(this,e)},__repr__:function(){return""}}),L.View=k._inherit(L.Base,{_ul4onattrs:["id","name","app","order","width","height","start","end"],__repr__:function(){return""}}),L.DataSource=k._inherit(L.Base,{_ul4onattrs:["id","identifier","app","apps"],__repr__:function(){return""}}),L.Record=k._inherit(L.Base,{_ul4onattrs:["id","app","createdat","createdby","updatedat","updatedby","updatecount","values","attachments","children"],delete:function(){return this.app.globals.Login._delete(this)},update:function(e){return this.app.globals.Login._update(this,e)},__repr__:function(){return""},search:function(e){for(var t in e){var r=e[t];if(k._bool(r)&&!this.fields.get(t).search(r))return!1}return!0},_dumpUL4ONAttr:function(e){return"values"===e?this._sparsevalues:this[e]},_loadUL4ONAttr:function(e,t){"values"===e?(this._sparsevalues=t,this._values=null,this._fields=null):this[e]=t}}),Object.defineProperty(L.Record,"values",{get:function(){if(null===this._values){this._values=w._havemap?new Map:{};var n=this;this.app.controls.forEach(function(e,t){var r=n._sparsevalues.get(e.identifier);void 0===r&&(r=null),n._values.set(t,r)})}return this._values}}),Object.defineProperty(L.Record,"fields",{get:function(){if(null===this._fields){this._fields=w._havemap?new Map:{};var n=this;this.values.forEach(function(e,t){var r=L.Field.create(n.app.controls.get(t),n.app,e);n._fields.set(t,r)})}return this._fields}}),L.Control=k._inherit(L.Base,{type:null,subtype:null,_ul4onattrs:["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],__repr__:function(){return""},asjson:function(e){return e},_logsearch:function(e,t){},search:function(e,t){return!1}}),L.BoolControl=k._inherit(L.Control,{type:"bool",__type__:"BoolControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),L.IntControl=k._inherit(L.Control,{type:"int",__type__:"IntControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),L.NumberControl=k._inherit(L.Control,{type:"number",__type__:"NumberControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator?t.value===e:"range"===t.operator&&(null!==e&&((null===t.minvalue||t.minvalue<=e)&&(null===t.maxvalue||e"}}),L.LookupItem=k._inherit(L.Base,{_ul4onattrs:["key","label"],__repr__:function(){return""}}),L.User=k._inherit(L.Base,{_ul4onattrs:["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],__repr__:function(){return""}}),L.File=k._inherit(L.Base,{_ul4onattrs:["id","url","filename","mimetype","width","height"],__repr__:function(){return""}}),L.Geo=k._inherit(L.Base,{_ul4onattrs:["lat","long","info"],__repr__:function(){return""}}),L.Attachment=k._inherit(L.Base,{_ul4onattrs:["id","record","label","active"],__repr__:function(){return""}}),L.NoteAttachment=k._inherit(L.Attachment,{type:"noteattachment",__type__:"NoteAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.URLAttachment=k._inherit(L.Attachment,{type:"urlattachment",__type__:"URLAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.FileAttachment=k._inherit(L.Attachment,{type:"fileattachment",__type__:"FileAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.ImageAttachment=k._inherit(L.Attachment,{type:"imageattachment",__type__:"ImageAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["original","thumb","small","medium","large"])}),L.JSONAttachment=k._inherit(L.Attachment,{type:"jsonattachment",__type__:"JSONAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"]),_dumpUL4ONAttr:function(e){return"value"===e?k._asjson(this.value):this[e]},_loadUL4ONAttr:function(e,t){"value"===e?this.value=k._fromjson(t):this[e]=t}}),L.Installation=k._inherit(L.Base,{_ul4onattrs:["id","name"],__repr__:function(){return""}}),L.Category=k._inherit(L.Base,{_ul4onattrs:["id","identifier","name","order","parent","children","apps"],__repr__:function(){for(var e=[],t=this;null!==t;)e.splice(0,0,t.identifier),t=t.parent;return""}}),L.KeyView=k._inherit(L.Base,{_ul4onattrs:["id","identifier","name","key","user"],__repr__:function(){return""}}),L.AppParameter=k._inherit(L.Base,{_ul4onattrs:["id","app","identifier","description","value"],__repr__:function(){return""}});for(var D=["Globals","App","View","DataSource","Record","BoolControl","IntControl","NumberControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","FileControl","ButtonControl","Field","LookupItem","User","File","Geo","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","KeyView","AppParameter"],q=0;q 1) {\n\t\t\t\toldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (i = 1; i < arguments.length; ++i)\n\t\t\t\t\tthis.dump(arguments[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t},\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish: function finish() {\n\t\t\treturn this.data.join(\"\");\n\t\t},\n\n\t\tdump: function dump(obj) {\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof (obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof (obj) == \"number\") {\n\t\t\t\tvar type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof (obj) == \"string\") {\n\t\t\t\tvar index = this._strings2index[obj];\n\t\t\t\tif (typeof (index) !== \"undefined\") {\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tthis._line(\"S\" + ul4._str_repr(obj));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.slice))\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump) {\n\t\t\t\tif (obj.__id__) {\n\t\t\t\t\tvar index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof (index) != \"undefined\") {\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (obj.__id__)\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj)) {\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var i in obj)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj)) {\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj)) {\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var key in obj) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj)) {\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow \"can't handle object\";\n\t\t}\n\t};\n\n// Helper \"class\" for decoding\nul4on.Decoder = {\n\t// Creates a new decoder for reading from the string ``data``\n\tcreate: function create(data, registry) {\n\t\tvar decoder = ul4._clone(this);\n\t\tdecoder.data = data;\n\t\tdecoder.pos = 0;\n\t\tdecoder.backrefs = [];\n\t\tdecoder.registry = typeof (registry) === \"undefined\" ? null : registry;\n\t\treturn decoder;\n\t},\n\n\t// Read a character from the buffer\n\treadchar: function readchar() {\n\t\tif (this.pos >= this.data.length)\n\t\t\tthrow \"UL4 decoder at EOF\";\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read a character from the buffer (return null on eof)\n\treadcharoreof: function readcharoreof() {\n\t\tif (this.pos >= this.data.length)\n\t\t\treturn null;\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read next not-whitespace character from the buffer\n\treadblackchar: function readblackchar() {\n\t\tvar re_white = /\\s/;\n\n\t\tfor (; ;) {\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow \"UL4 decoder at EOF\";\n\t\t\tvar c = this.data.charAt(this.pos++);\n\t\t\tif (!c.match(re_white))\n\t\t\t\treturn c;\n\t\t}\n\t},\n\n\t// Read ``size`` characters from the buffer\n\tread: function read(size) {\n\t\tif (this.pos + size > this.length)\n\t\t\tsize = this.length - this.pos;\n\t\tvar result = this.data.substring(this.pos, this.pos + size);\n\t\tthis.pos += size;\n\t\treturn result;\n\t},\n\n\t// \"unread\" one character\n\tbackup: function backup() {\n\t\t--this.pos;\n\t},\n\n\t// Read a number from the buffer\n\treadnumber: function readnumber() {\n\t\tvar re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\tfor (; ;) {\n\t\t\tvar c = this.readcharoreof();\n\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\tvalue += c;\n\t\t\telse {\n\t\t\t\tvar result = parseFloat(value);\n\t\t\t\tif (result == NaN)\n\t\t\t\t\tthrow \"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t},\n\n\t_beginfakeloading: function _beginfakeloading() {\n\t\tvar oldpos = this.backrefs.length;\n\t\tthis.backrefs.push(null);\n\t\treturn oldpos;\n\t},\n\n\t_endfakeloading: function _endfakeloading(oldpos, value) {\n\t\tthis.backrefs[oldpos] = value;\n\t},\n\n\t_readescape: function _readescape(escapechar, length) {\n\t\tvar chars = this.read(length);\n\t\tif (chars.length != length)\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\tvar codepoint = parseInt(chars, 16);\n\t\tif (isNaN(codepoint))\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\treturn String.fromCharCode(codepoint);\n\t},\n\n\t// Load the next object from the buffer\n\tload: function load() {\n\t\tvar typecode = this.readblackchar();\n\t\tvar result;\n\t\tswitch (typecode) {\n\t\t\tcase \"^\":\n\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\tcase \"n\":\n\t\t\tcase \"N\":\n\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\treturn null;\n\t\t\tcase \"b\":\n\t\t\tcase \"B\":\n\t\t\t\tresult = this.readchar();\n\t\t\t\tif (result === \"T\")\n\t\t\t\t\tresult = true;\n\t\t\t\telse if (result === \"F\")\n\t\t\t\t\tresult = false;\n\t\t\t\telse\n\t\t\t\t\tthrow \"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos;\n\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"i\":\n\t\t\tcase \"I\":\n\t\t\tcase \"f\":\n\t\t\tcase \"F\":\n\t\t\t\tresult = this.readnumber();\n\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"s\":\n\t\t\tcase \"S\":\n\t\t\t\tresult = [];\n\t\t\t\tvar delimiter = this.readblackchar();\n\t\t\t\tfor (; ;) {\n\t\t\t\t\tvar c = this.readchar();\n\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (c == \"\\\\\") {\n\t\t\t\t\t\tvar c2 = this.readchar();\n\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tresult.push(c);\n\t\t\t\t}\n\t\t\t\tresult = result.join(\"\");\n\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"c\":\n\t\t\tcase \"C\":\n\t\t\t\tresult = ul4.Color.create();\n\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._r = this.load();\n\t\t\t\tresult._g = this.load();\n\t\t\t\tresult._b = this.load();\n\t\t\t\tresult._a = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"z\":\n\t\t\tcase \"Z\":\n\t\t\t\tresult = new Date();\n\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\tresult.setDate(1);\n\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\tresult.setDate(this.load());\n\t\t\t\tresult.setHours(this.load());\n\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\tresult.setMilliseconds(this.load() / 1000);\n\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"t\":\n\t\t\tcase \"T\":\n\t\t\t\tresult = ul4.TimeDelta.create();\n\t\t\t\tresult._days = this.load();\n\t\t\t\tresult._seconds = this.load();\n\t\t\t\tresult._microseconds = this.load();\n\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"r\":\n\t\t\tcase \"R\":\n\t\t\t\tresult = ul4.slice.create();\n\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult.start = this.load();\n\t\t\t\tresult.stop = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"m\":\n\t\t\tcase \"M\":\n\t\t\t\tresult = ul4.MonthDelta.create();\n\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._months = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"l\":\n\t\t\tcase \"L\":\n\t\t\t\tresult = [];\n\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.push(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"d\":\n\t\t\tcase \"D\":\n\t\t\tcase \"e\":\n\t\t\tcase \"E\":\n\t\t\t\tif (!ul4on._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\tthrow \"ordered dictionaries are not supported!\";\n\t\t\t\tresult = ul4on._emptymap();\n\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tvar key = this.load();\n\t\t\t\t\tvar value = this.load();\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"y\":\n\t\t\tcase \"Y\":\n\t\t\t\tresult = ul4on._makeset();\n\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.add(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"o\":\n\t\t\tcase \"O\":\n\t\t\t\tvar oldpos;\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\tvar name = this.load();\n\t\t\t\tvar proto;\n\t\t\t\tif (this.registry !== null) {\n\t\t\t\t\tproto = this.registry[name];\n\t\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\tthrow \"can't load object of type \" + ul4._repr(name);\n\t\t\t\tresult = proto();\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\tresult.ul4onload(this);\n\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\tthrow \"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\tdefault:\n\t\t\t\tthrow \"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t}\n\t},\n\n\t// Return an iterator for loading the content of a object\n\tloadcontent: function load(loadcontent) {\n\t\tlet self = this;\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\tself.backup();\n\t\t\t\tif (typecode == \")\")\n\t\t\t\t\treturn { done: true };\n\t\t\t\telse\n\t\t\t\t\treturn { done: false, value: self.load() };\n\t\t\t}\n\t\t};\n\t}\n};\n\n\n//\n// UL4\n//\n\n// REs for parsing JSON\nul4._rvalidchars = /^[\\],:{}\\s]*$/;\nul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n/// Helper functions\n\n// Crockford style object creation\nul4._simpleclone = function _simpleclone(obj) {\n\tfunction F() { };\n\tF.prototype = obj;\n\tvar result = new F();\n\treturn result;\n};\n\n// Crockford style object creation + prototype chain + object ids\nul4._clone = function _clone(obj) {\n\tvar result = ul4._simpleclone(obj);\n\tresult.__prototype__ = obj;\n\tresult.__id__ = ul4.Proto._nextid++;\n\treturn result;\n};\n\n// Adds attributes from on object to another and returns it\nul4._extend = function _extend(obj, attrs) {\n\tfor (var name in attrs)\n\t\tobj[name] = attrs[name];\n\treturn obj;\n};\n\n// Clone an object via ``_simpleclone`` and extend it\nul4._simpleinherit = function _simpleinherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._simpleclone(baseobj), attrs);\n};\n\n// Clone an object via ``_clone`` and extend it\nul4._inherit = function _inherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._clone(baseobj), attrs);\n};\n\n// Convert a map to an object\nul4._map2object = function _map2object(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar newobj = {};\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (typeof (key) !== \"string\")\n\t\t\t\tthrow ul4.TypeError.create(\"keys must be strings\");\n\t\t\tnewobj[key] = value;\n\t\t});\n\t\treturn newobj;\n\t}\n\treturn obj;\n};\n\n// Clip a number to the range [0;max)\nul4._bound = function _bound(value, upper) {\n\tif (value < 0)\n\t\treturn 0;\n\telse if (value > upper)\n\t\treturn upper;\n\telse\n\t\treturn value;\n};\n\n// Create a pretty stacktrace from an exception\nul4._stacktrace = function _stacktrace(exc) {\n\tvar output = ul4._type(exc);\n\tvar s = exc.toString();\n\tif (s)\n\t\toutput += \": \" + s;\n\tif (exc.cause)\n\t\toutput += \"\\n\\n\" + ul4._stacktrace(exc.cause);\n\treturn output;\n};\n\n// Call a function ``f`` with UL4 argument handling\nul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) {\n\tvar finalargs;\n\tif (needsobject) {\n\t\tif (signature === null) {\n\t\t\tif (args.length)\n\t\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = [kwargs];\n\t\t}\n\t\telse\n\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t}\n\telse {\n\t\tif (signature === null)\n\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t}\n\tif (needscontext)\n\t\tfinalargs.unshift(context);\n\treturn f.apply(functioncontext, finalargs);\n};\n\nul4._callfunction = function _callfunction(context, f, args, kwargs) {\n\tvar name = f._ul4_name || f.name;\n\tif (typeof (f._ul4_signature) === \"undefined\" || typeof (f._ul4_needsobject) === \"undefined\" || typeof (f._ul4_needscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", \"function \" + ul4.repr(f) + \" is not callable by UL4\");\n\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n}\n\nul4._callobject = function _callobject(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_callsignature) === \"undefined\" || typeof (obj._ul4_callneedsobject) === \"undefined\" || typeof (obj._ul4_callneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", ul4.type(obj) + \" object is not callable by UL4\");\n\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n}\n\nul4._callrender = function _callrender(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_rendersignature) === \"undefined\" || typeof (obj._ul4_renderneedsobject) === \"undefined\" || typeof (obj._ul4_renderneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"render\", ul4.type(obj) + \" object is not renderable by UL4\");\n\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n}\n\nul4._call = function _call(context, f, args, kwargs) {\n\tif (typeof (f) === \"function\")\n\t\treturn ul4._callfunction(context, f, args, kwargs);\n\telse if (f && typeof (f.__call__) === \"function\")\n\t\treturn ul4._callobject(context, f, args, kwargs);\n\telse\n\t\tthrow ul4.TypeError.create(\"call\", ul4._type(f) + \" is not callable\");\n}\n\nul4._unpackvar = function _unpackvar(lvalue, value) {\n\tif (!ul4._islist(lvalue))\n\t\treturn [[lvalue, value]];\n\telse {\n\t\tvar newvalue = [];\n\t\tvar iter = ul4._iter(value);\n\n\t\tfor (var i = 0; ; ++i) {\n\t\t\tvar item = iter.next();\n\n\t\t\tif (item.done) {\n\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t}\n\t\t}\n\t\treturn newvalue;\n\t}\n};\n\nul4._formatsource = function _formatsource(out) {\n\tvar finalout = [];\n\tvar level = 0, needlf = false;\n\tfor (var i = 0; i < out.length; ++i) {\n\t\tif (typeof (out[i]) === \"number\") {\n\t\t\tlevel += out[i];\n\t\t\tneedlf = true;\n\t\t}\n\t\telse {\n\t\t\tif (needlf) {\n\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\tfor (var j = 0; j < level; ++j)\n\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\tneedlf = false;\n\t\t\t}\n\t\t\tfinalout.push(out[i]);\n\t\t}\n\t}\n\tif (needlf)\n\t\tfinalout.push(\"\\n\");\n\treturn finalout.join(\"\");\n};\n\n// Compare ``obj1`` and ``obj2`` if they have the same value\nul4._eq = function _eq(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__eq__) === \"function\")\n\t\treturn obj1.__eq__(obj2);\n\telse if (obj2 && typeof (obj2.__eq__) === \"function\")\n\t\treturn obj2.__eq__(obj1);\n\telse if (obj1 === null)\n\t\treturn obj2 === null;\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 == obj2\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 == obj2;\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.length != obj2.length)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isobject(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.hasOwnProperty(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.has(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tvar result = true;\n\t\t\tobj2.forEach(function (value, key) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\tresult = false;\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._ismap(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!result)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isset(obj1)) {\n\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\tif (ul4._isset(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse\n\t\treturn obj1 === obj2;\n};\n\n// Compare ``obj1`` and ``obj2`` if they don't have the same value\nul4._ne = function _ne(obj1, obj2) {\n\tif (obj1 && typeof (obj1.__ne__) === \"function\")\n\t\treturn obj1.__ne__(obj2);\n\telse if (obj2 && typeof (obj2.__ne__) === \"function\")\n\t\treturn obj2.__ne__(obj1);\n\telse\n\t\treturn !ul4._eq(obj1, obj2);\n}\n\nul4._unorderable = function _unorderable(operator, obj1, obj2) {\n\tthrow ul4.TypeError.create(operator, \"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n};\n\n// Return:\n// -1 when ``obj1 < obj2``,\n// 0 when ``obj1 == obj2``,\n// 1 when ``obj1 > obj2``,\n// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n// raise TypeError if objects are uncomparable\n// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\nul4._cmp = function _cmp(operator, obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2)) {\n\t\t\tvar v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t}\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn 0;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn 1;\n\t\t\t\tvar res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t}\n\t}\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\telse\n\t\tul4._unorderable(operator, obj1, obj2);\n}\n\n// Return whether ``obj1 < obj2``\nul4._lt = function _lt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__lt__) === \"function\")\n\t\treturn obj1.__lt__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() < obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length < obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1)) {\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<\", obj1, obj2);\n};\n\n// Return whether ``obj1 <= obj2``\nul4._le = function _le(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__le__) === \"function\")\n\t\treturn obj1.__le__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length <= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<=\", obj1, obj2);\n};\n\n// Return whether ``obj1 > obj2``\nul4._gt = function _gt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__gt__) === \"function\")\n\t\treturn obj1.__gt__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() > obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length > obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">\", obj1, obj2);\n};\n\n// Return whether ``obj1 >= obj2``\nul4._ge = function _ge(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__ge__) === \"function\")\n\t\treturn obj1.__ge__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length >= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">=\", obj1, obj2);\n};\n\n// Return an iterator for ``obj``\nul4._iter = function _iter(obj) {\n\tif (typeof (obj) === \"string\" || ul4._islist(obj)) {\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\treturn { value: obj[this.index++], done: false };\n\t\t\t\telse\n\t\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isiter(obj))\n\t\treturn obj;\n\telse if (obj !== null && typeof (obj.__iter__) === \"function\")\n\t\treturn obj.__iter__();\n\telse if (ul4._ismap(obj)) {\n\t\tvar keys = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tkeys.push(key);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isset(obj)) {\n\t\tvar values = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tvalues.push(value);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: values[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isul4set(obj)) {\n\t\treturn ul4._iter(obj.items);\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar keys = [];\n\t\tfor (var key in obj)\n\t\t\tkeys.push(key);\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\tthrow ul4.TypeError.create(\"iter\", ul4._type(obj) + \" object is not iterable\");\n};\n\nul4._str_repr = function _str_repr(str, ascii) {\n\tvar result = \"\";\n\tvar squote = false, dquote = false;\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tif (c == '\"') {\n\t\t\tdquote = true;\n\t\t\tif (squote)\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (c == \"'\") {\n\t\t\tsquote = true;\n\t\t\tif (dquote)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\tvar quote = (squote && !dquote) ? '\"' : \"'\";\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase '\"':\n\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\tbreak;\n\t\t\tcase \"'\":\n\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tvar escape;\n\t\t\t\tif (code < 32)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\tescape = 4;\n\t\t\t\telse\n\t\t\t\t\tescape = 8;\n\n\t\t\t\tif (escape === 0)\n\t\t\t\t\tresult += c;\n\t\t\t\telse if (escape === 2)\n\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\telse if (escape === 4)\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn quote + result + quote;\n};\n\nul4._date_repr = function _date_repr(obj, ascii) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tvar result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\tresult += \")\";\n\n\treturn result;\n};\n\nul4._map_repr = function _map_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\n\tvar i = 0;\n\tobj.forEach(function (value, key) {\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(value, ascii));\n\t});\n\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._list_repr = function _list_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"[\");\n\tfor (var i = 0; i < obj.length; ++i) {\n\t\tif (i !== 0)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(obj[i], ascii));\n\t}\n\tv.push(\"]\");\n\treturn v.join(\"\");\n};\n\nul4._set_repr = function _set_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tif (!obj.size)\n\t\tv.push(\"/\");\n\telse {\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._object_repr = function _object_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tvar i = 0;\n\tfor (var key in obj) {\n\t\tif (!obj.hasOwnProperty(key))\n\t\t\tcontinue;\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._repr_internal = function _repr_internal(obj, ascii) {\n\tif (obj === null)\n\t\treturn \"None\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_repr(obj, ascii);\n\telse if (typeof (obj) === \"number\")\n\t\treturn \"\" + obj;\n\telse if (typeof (obj) === \"function\")\n\t\tif (obj._ul4_name || obj.name)\n\t\t\treturn \"\";\n\t\telse\n\t\t\treturn \"\";\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_repr(obj, ascii);\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj, ascii);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj, ascii);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj, ascii);\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj, ascii);\n\treturn \"?\";\n};\n\n// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\nul4._repr = function _repr(obj) {\n\treturn ul4._repr_internal(obj, false);\n}\n\nul4._ascii = function _ascii(obj) {\n\treturn ul4._repr_internal(obj, true);\n}\n\nul4._date_str = function _date_str(obj) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\n\tvar result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\tif (ms)\n\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\treturn result;\n};\n\nul4._str = function _str(obj) {\n\tif (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (obj === null)\n\t\treturn \"\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn obj;\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj.toString();\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_str(obj);\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj);\n\telse if (typeof (obj) === \"object\" && typeof (obj.__str__) === \"function\")\n\t\treturn obj.__str__();\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj);\n\treturn \"?\";\n};\n\n// Convert ``obj`` to bool, according to its \"truth value\"\nul4._bool = function _bool(obj) {\n\tif (typeof (obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\treturn false;\n\telse {\n\t\tif (typeof (obj) === \"object\", typeof (obj.__bool__) === \"function\")\n\t\t\treturn obj.__bool__();\n\t\tif (ul4._islist(obj))\n\t\t\treturn obj.length !== 0;\n\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\treturn obj.size != 0;\n\t\telse if (ul4._isobject(obj)) {\n\t\t\tfor (var key in obj) {\n\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\nul4._int = function _int(obj, base) {\n\tvar result;\n\tif (base !== null) {\n\t\tif (typeof (obj) !== \"string\" || !ul4._isint(base))\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"int() requires a string and an integer\");\n\t\tresult = parseInt(obj, base);\n\t\tif (result.toString() == \"NaN\")\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\treturn result;\n\t}\n\telse {\n\t\tif (typeof (obj) == \"string\") {\n\t\t\tresult = parseInt(obj);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse if (typeof (obj) == \"number\")\n\t\t\treturn Math.floor(obj);\n\t\telse if (obj === true)\n\t\t\treturn 1;\n\t\telse if (obj === false)\n\t\t\treturn 0;\n\t\tthrow ul4.TypeError.create(\"int()\", \"int() argument must be a string or a number\");\n\t}\n};\n\n// Convert ``obj`` to a float\nul4._float = function _float(obj) {\n\tif (typeof (obj) === \"string\")\n\t\treturn parseFloat(obj);\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj;\n\telse if (obj === true)\n\t\treturn 1.0;\n\telse if (obj === false)\n\t\treturn 0.0;\n\tthrow ul4.TypeError.create(\"float()\", \"float() argument must be a string or a number\");\n};\n\n// Convert ``obj`` to a list\nul4._list = function _list(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = [];\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.push(value.value);\n\t}\n};\n\n// Convert ``obj`` to a set\nul4._set = function _set(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.add(value.value);\n\t}\n};\n\n// Return the length of ``sequence``\nul4._len = function _len(sequence) {\n\tif (typeof (sequence) == \"string\" || ul4._islist(sequence))\n\t\treturn sequence.length;\n\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\treturn sequence.size;\n\telse if (ul4._isobject(sequence)) {\n\t\tvar i = 0;\n\t\tfor (var key in sequence)\n\t\t\t++i;\n\t\treturn i;\n\t}\n\tthrow ul4.TypeError.create(\"len\", \"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n};\n\nul4._type = function _type(obj) {\n\tif (obj === null)\n\t\treturn \"none\";\n\telse if (obj === false || obj === true)\n\t\treturn \"bool\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"undefined\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn \"str\";\n\telse if (typeof (obj) === \"number\")\n\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\telse if (ul4._islist(obj))\n\t\treturn \"list\";\n\telse if (ul4._isset(obj))\n\t\treturn \"set\";\n\telse if (ul4._isdate(obj))\n\t\treturn \"date\";\n\telse if (typeof (obj.__type__) !== \"undefined\")\n\t\treturn obj.__type__;\n\telse if (ul4._istimedelta(obj))\n\t\treturn \"timedelta\";\n\telse if (ul4._isdict(obj))\n\t\treturn \"dict\";\n\telse if (ul4._istemplate(obj))\n\t\treturn \"template\";\n\telse if (ul4._isfunction(obj))\n\t\treturn \"function\";\n\treturn null;\n};\n\n\n// Return whether any of the items in ``iterable`` are true\nul4._any = function _any(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn false;\n\t\t\tif (ul4._bool(item.value))\n\t\t\t\treturn true;\n\t\t}\n\t}\n};\n\n// Return whether all of the items in ``iterable`` are true\nul4._all = function _all(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn true;\n\t\t\tif (!ul4._bool(item.value))\n\t\t\t\treturn false;\n\t\t}\n\t}\n};\n\n// Check if ``obj`` is undefined\nul4._isundefined = function _isundefined(obj) {\n\treturn typeof (obj) === \"undefined\";\n};\n\n\n// Check if ``obj`` is *not* undefined\nul4._isdefined = function _isdefined(obj) {\n\treturn typeof (obj) !== \"undefined\";\n};\n\n// Check if ``obj`` is ``None``\nul4._isnone = function _isnone(obj) {\n\treturn obj === null;\n};\n\n// Check if ``obj`` is a boolean\nul4._isbool = function _isbool(obj) {\n\treturn typeof (obj) == \"boolean\";\n};\n\n// Check if ``obj`` is a int\nul4._isint = function _isint(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) == obj;\n};\n\n// Check if ``obj`` is a float\nul4._isfloat = function _isfloat(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) != obj;\n};\n\n// Check if ``obj`` is a string\nul4._isstr = function _isstr(obj) {\n\treturn typeof (obj) == \"string\";\n};\n\n// Check if ``obj`` is a date\nul4._isdate = function _isdate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n};\n\n// Check if ``obj`` is a color\nul4._iscolor = function _iscolor(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Color));\n};\n\n// Check if ``obj`` is a timedelta object\nul4._istimedelta = function _istimedelta(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.TimeDelta));\n};\n\n// Check if ``obj`` is a monthdelta object\nul4._ismonthdelta = function _ismonthdelta(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.MonthDelta);\n};\n\n// Check if ``obj`` is a template\nul4._istemplate = function _istemplate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\");\n};\n\n// Check if ``obj`` is a function\nul4._isfunction = function _isfunction(obj) {\n\treturn typeof (obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\"));\n};\n\n// Check if ``obj`` is a list\nul4._islist = function _islist(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n};\n\n// Check if ``obj`` is a set\nul4._isset = function _isset(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n};\n\n// Check if ``obj`` is an exception (at least a UL4 exception)\nul4._isexception = function _isexception(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Error);\n};\n\nul4._isul4set = function _isul4set(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4._Set);\n};\n\n// Check if ``obj`` is an iterator\nul4._isiter = function _isiter(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.next) === \"function\";\n};\n\n// Check if ``obj`` is a JS object\nul4._isobject = function _isobject(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof (obj.__type__) === \"undefined\";\n};\n\n// Check if ``obj`` is a map\nul4._ismap = function _ismap(obj) {\n\tif (ul4on._havemap)\n\t\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\treturn false;\n};\n\n// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\nul4._isdict = function _isdict(obj) {\n\treturn ul4._isobject(obj) || ul4._ismap(obj);\n};\n\n\n// Repeat string ``str`` ``rep`` times\nul4._str_repeat = function _str_repeat(str, rep) {\n\tvar result = \"\";\n\tfor (; rep > 0; --rep)\n\t\tresult += str;\n\treturn result;\n};\n\nul4._list_repeat = function _list_repeat(list, rep) {\n\tvar result = [];\n\tfor (; rep > 0; --rep)\n\t\tfor (var i = 0; i < list.length; ++i)\n\t\t\tresult.push(list[i]);\n\treturn result;\n};\n\nul4._str_json = function _str_json(str) {\n\tvar result = \"\";\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tresult += '\\\\\"';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\tresult += c;\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn '\"' + result + '\"';\n};\n\n// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\nul4._asjson = function _asjson(obj) {\n\tif (obj === null)\n\t\treturn \"null\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"{}.undefined\";\n\telse if (obj === false)\n\t\treturn \"false\";\n\telse if (obj === true)\n\t\treturn \"true\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_json(obj);\n\telse if (typeof (obj) === \"number\") {\n\t\treturn \"\" + obj;\n\t}\n\telse if (ul4._islist(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"[\");\n\t\tfor (var i = 0; i < obj.length; ++i) {\n\t\t\tif (i != 0)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._ismap(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(value));\n\t\t});\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tfor (var key in obj) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isdate(obj)) {\n\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t}\n\telse if (ul4._istimedelta(obj)) {\n\t\treturn \"ul4.TimeDelta.create(\" + obj.days + \", \" + obj.seconds + \", \" + obj.microseconds + \")\";\n\t}\n\telse if (ul4._ismonthdelta(obj)) {\n\t\treturn \"ul4.MonthDelta.create(\" + obj.months + \")\";\n\t}\n\telse if (ul4._iscolor(obj)) {\n\t\treturn \"ul4.Color.create(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t}\n\telse if (ul4._istemplate(obj)) {\n\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t}\n\tthrow ul4.TypeError.create(\"asjson()\", \"asjson() requires a serializable object\");\n};\n\n// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\nul4._fromjson = function _fromjson(string) {\n\t// The following is from jQuery's parseJSON function\n\tstring = ul4._strip(string, null);\n\tif (root.JSON && root.JSON.parse)\n\t\treturn root.JSON.parse(string);\n\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\treturn (new Function(\"return \" + string))();\n\tthrow ul4.TypeError.create(\"fromjson()\", \"invalid JSON\");\n};\n\n// Encodes ``obj`` in the UL4 Object Notation format\nul4._asul4on = function _asul4on(obj) {\n\treturn ul4on.dumps(obj);\n};\n\n// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\nul4._fromul4on = function _fromul4on(string) {\n\treturn ul4on.loads(string);\n};\n\nul4._format_date = function _format_date(obj, fmt, lang) {\n\tvar translations = {\n\t\tde: {\n\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\ten: {\n\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\txf: \"%m/%d/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p \"\n\t\t},\n\t\tfr: {\n\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tes: {\n\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\txf: \"%d/%m/%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tit: {\n\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tda: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsv: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t},\n\t\tnl: {\n\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\txf: \"%d-%m-%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tpt: {\n\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tcs: {\n\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tsk: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tpl: {\n\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t},\n\t\thr: {\n\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsr: {\n\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y.\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t},\n\t\tro: {\n\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\thu: {\n\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t},\n\t\ttr: {\n\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tru: {\n\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tzh: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t},\n\t\tko: {\n\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t},\n\t\tja: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t}\n\t};\n\n\tvar translation = translations[lang];\n\n\tvar firstday;\n\n\tvar result = [];\n\tvar inspec = false;\n\tfor (var i = 0; i < fmt.length; ++i) {\n\t\tvar c = fmt[i];\n\t\tif (inspec) {\n\t\t\tswitch (c) {\n\t\t\t\tcase \"a\":\n\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"A\":\n\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"B\":\n\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"H\":\n\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"I\":\n\t\t\t\t\tc = ul4._lpad(((obj.getHours() - 1) % 12) + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"j\":\n\t\t\t\t\tc = ul4._lpad(ul4._yearday(obj), \"0\", 3);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"m\":\n\t\t\t\t\tc = ul4._lpad(obj.getMonth() + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"M\":\n\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"p\":\n\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"S\":\n\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"U\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 6), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"w\":\n\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"W\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 0), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"x\":\n\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"X\":\n\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"y\":\n\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"z\":\n\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\t\t// Time zone name\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.push(c);\n\t\t\tinspec = false;\n\t\t}\n\t\telse {\n\t\t\tif (c == \"%\")\n\t\t\t\tinspec = true;\n\t\t\telse\n\t\t\t\tresult.push(c);\n\t\t}\n\t}\n\treturn result.join(\"\");\n};\n\nul4._format_int = function _format_int(obj, fmt, lang) {\n\tvar work = fmt;\n\n\t// Defaults\n\tvar fill = ' ';\n\tvar align = '>'; // '<', '>', '=' or '^'\n\tvar sign = '-'; // '+', '-' or ' '\n\tvar alternate = false;\n\tvar minimumwidth = 0;\n\tvar type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t// Determine output type\n\tif (/[bcdoxXn]$/.test(work)) {\n\t\ttype = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract minimum width\n\tif (/\\d+$/.test(work)) {\n\t\tvar minimumwidthStr = /\\d+$/.exec(work);\n\t\twork = work.replace(/\\d+$/, \"\");\n\t\tif (/^0/.test(minimumwidthStr)) {\n\t\t\talign = '=';\n\t\t\tfill = '0';\n\t\t}\n\t\tminimumwidth = parseInt(minimumwidthStr);\n\t}\n\n\t// Alternate form?\n\tif (/#$/.test(work)) {\n\t\talternate = true;\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Determine sign\n\tif (/[+ -]$/.test(work)) {\n\t\tif (type == 'c')\n\t\t\tthrow ul4.ValueError.create(\"sign not allowed for integer format type 'c'\");\n\t\tsign = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract fill and align char\n\tif (work.length >= 3)\n\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\telse if (work.length == 2) {\n\t\tif (/[<>=^]$/.test(work)) {\n\t\t\talign = work[1];\n\t\t\tfill = work[0];\n\t\t}\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\telse if (work.length == 1) {\n\t\tif (/^[<>=^]$/.test(work))\n\t\t\talign = work;\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\n\t// Basic number formatting\n\tvar neg = obj < 0;\n\n\tif (neg)\n\t\tobj = -obj;\n\n\tvar output;\n\tswitch (type) {\n\t\tcase 'b':\n\t\t\toutput = obj.toString(2);\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tif (neg || obj > 65535)\n\t\t\t\tthrow ul4.ValueError.create(\"value out of bounds for c format\");\n\t\t\toutput = String.fromCharCode(obj);\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t\tcase 'o':\n\t\t\toutput = obj.toString(8);\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\toutput = obj.toString(16);\n\t\t\tbreak;\n\t\tcase 'X':\n\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\tbreak;\n\t\tcase 'n':\n\t\t\t// FIXME: locale formatting\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t}\n\n\t// The rest of the formatting\n\tif (align === '=') {\n\t\tif (neg || sign !== '-')\n\t\t\t--minimumwidth;\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\tminimumwidth -= 2;\n\n\t\tif (output.length < minimumwidth)\n\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\toutput = \"0\" + type + output;\n\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t}\n\telse {\n\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\toutput = \"0\" + type + output;\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t\tif (output.length < minimumwidth) {\n\t\t\tif (align == '<')\n\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth - output.length);\n\t\t\telse if (align == '>')\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\t\t\telse // if (align == '^')\n\t\t\t{\n\t\t\t\tvar pad = minimumwidth - output.length;\n\t\t\t\tvar padBefore = Math.floor(pad / 2);\n\t\t\t\tvar padAfter = pad - padBefore;\n\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n};\n\n// Format ``obj`` using the format string ``fmt`` in the language ``lang``\nul4._format = function _format(obj, fmt, lang) {\n\tif (typeof (lang) === \"undefined\" || lang === null)\n\t\tlang = \"en\";\n\telse {\n\t\tvar translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null };\n\t\tlang = lang.toLowerCase();\n\t\tif (typeof (translations[lang]) === \"undefined\") {\n\t\t\tlang = lang.split(/_/)[0];\n\t\t\tif (typeof (translations[lang]) === \"undefined\")\n\t\t\t\tlang = \"en\";\n\t\t}\n\t}\n\tif (ul4._isdate(obj))\n\t\treturn ul4._format_date(obj, fmt, lang);\n\telse if (ul4._isint(obj))\n\t\treturn ul4._format_int(obj, fmt, lang);\n\telse if (obj === true)\n\t\treturn ul4._format_int(1, fmt, lang);\n\telse if (obj === false)\n\t\treturn ul4._format_int(0, fmt, lang);\n};\n\nul4._lpad = function _lpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = pad + string;\n\treturn string;\n};\n\nul4._rpad = function _rpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = string + pad;\n\treturn string;\n};\n\nul4.Proto = {\n\t__prototype__: null,\n\t__id__: 0,\n\t_nextid: 1,\n\tisa: function isa(type) {\n\t\tif (this === type)\n\t\t\treturn true;\n\t\tif (this.__prototype__ === null)\n\t\t\treturn false;\n\t\treturn this.__prototype__.isa(type);\n\t},\n\n\tisprotoof: function isprotoof(obj) {\n\t\twhile (true) {\n\t\t\tif (obj === null || Object.prototype.toString.call(obj) !== \"[object Object]\" || typeof (obj.__prototype__) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\tif (obj === this)\n\t\t\t\treturn true;\n\t\t\tobj = obj.__prototype__;\n\t\t}\n\t},\n\n\t// equality comparison of objects defaults to identity comparison\n\t__eq__: function __eq__(other) {\n\t\treturn this === other;\n\t},\n\n\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t// ``__ne__`` will be synthesized from that\n\t__ne__: function __ne__(other) {\n\t\treturn !this.__eq__(other);\n\t},\n\n\t// For other comparison operators, each method has to be implemented:\n\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t// ``>=`` calls ``__ge__``\n\n\t__bool__: function __bool__() {\n\t\treturn true;\n\t}\n};\n\nul4.Signature = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create() {\n\t\t\tvar signature = ul4._clone(this);\n\t\t\tsignature.args = [];\n\t\t\tsignature.argNames = {};\n\t\t\tsignature.remargs = null;\n\t\t\tsignature.remkwargs = null;\n\n\t\t\tvar nextDefault = false;\n\t\t\tvar lastArgname = null;\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tvar argName = arguments[i];\n\t\t\t\tif (nextDefault) {\n\t\t\t\t\tsignature.args.push({ name: lastArgname, defaultValue: argName });\n\t\t\t\t\tsignature.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (argName.substr(argName.length - 1) === \"=\") {\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length - 1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tsignature.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tsignature.remargs = argName.substr(1);\n\t\t\t\t\telse {\n\t\t\t\t\t\tsignature.args.push({ name: argName });\n\t\t\t\t\t\tsignature.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn signature;\n\t\t},\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray: function bindArray(name, args, kwargs) {\n\t\t\tvar finalargs = [];\n\t\t\tvar decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\t\t\t\tif (i < args.length) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null) {\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length) {\n\t\t\t\t\tvar prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow ul4.ArgumentError.create(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null) {\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key]) {\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tvar remkwargs = {};\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tremkwargs[key] = kwargs[key];\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t},\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject: function bindObject(name, args, kwargs) {\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tvar argObject = {};\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\treturn this.toString();\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar v = [];\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t}\n);\n\n// Adds name and signature to a function/method and makes the method callable in templates\nul4.expose = function expose(signature, options, f) {\n\tif (typeof (f) === \"undefined\") {\n\t\tf = options;\n\t\toptions = {};\n\t}\n\tif (options.name)\n\t\tf._ul4_name = options.name;\n\tif (ul4._islist(signature))\n\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\tf._ul4_signature = signature;\n\tf._ul4_needsobject = options.needsobject || false;\n\tf._ul4_needscontext = options.needscontext || false;\n\n\treturn f;\n};\n\nul4.Context = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(vars) {\n\t\t\tif (vars === null || typeof (vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = vars;\n\t\t\tcontext.indents = [];\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars: function inheritvars() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = ul4._simpleclone(this.vars);\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent: function withindent(indent) {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tif (indent !== null) {\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput: function replaceoutput() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\tclone: function clone(vars) {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\toutput: function output(value) {\n\t\t\tthis._output.push(value);\n\t\t},\n\n\t\tgetoutput: function getoutput() {\n\t\t\treturn this._output.join(\"\");\n\t\t},\n\n\t\tget: function get(name) {\n\t\t\treturn this.vars[name];\n\t\t},\n\n\t\tset: function set(name, value) {\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t}\n);\n\n/// Exceptions\n\nul4.Exception = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Exception\",\n\t\t\"cause\": null,\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Exceptions used internally by UL4 for flow control\nul4.InternalException = ul4._inherit(ul4.Exception, {});\n\n// Control flow exceptions\nul4.ReturnException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ReturnException\",\n\n\t\tcreate: function create(result) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.result = result;\n\t\t\treturn exception;\n\t\t}\n\t}\n);\n\nul4.BreakException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.BreakException\"\n\t}\n);\n\nul4.ContinueException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ContinueException\"\n\t}\n);\n\n// Real exceptions raised by various parts of UL4\nul4.SyntaxError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.SyntaxError\"\n\t}\n);\n\nul4.LValueRequiredError = ul4._inherit(\n\tul4.SyntaxError,\n\t{\n\t\t__type__: \"ul4.LValueRequiredError\",\n\n\t\ttoString: function toString() {\n\t\t\treturn \"lvalue required!\";\n\t\t}\n\t}\n);\n\nul4.TypeError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.TypeError\",\n\n\t\tcreate: function create(operation, message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.operation = operation;\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ValueError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ValueError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ArgumentError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ArgumentError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\n/// Exception that wraps other exceptions while they bubble up the stack\nul4.LocationError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.LocationError\",\n\n\t\tcreate: function create(location, cause) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.location = location;\n\t\t\texception.cause = cause;\n\t\t\treturn exception;\n\t\t},\n\n\t\t_templateprefix: function (template) {\n\t\t\tvar out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tvar first = true;\n\t\t\twhile (template != null) {\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name !== null ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t},\n\n\t\t_template: function _template() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.template;\n\t\t\telse\n\t\t\t\treturn this.location.tag.template;\n\t\t},\n\n\t\t_outerpos: function _outerpos() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.pos;\n\t\t\telse {\n\t\t\t\tvar tag = this.location.tag;\n\t\t\t\tif (tag === null) // A top level template as no tag\n\t\t\t\t\treturn this.location.pos;\n\t\t\t\telse\n\t\t\t\t\treturn tag.pos;\n\t\t\t}\n\t\t},\n\n\t\t_innerpos: function _innerpos() {\n\t\t\treturn this.location.pos;\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar template = this._template();\n\t\t\tvar templateprefix = this._templateprefix(template);\n\t\t\tvar outerpos = this._outerpos();\n\t\t\tvar innerpos = this._innerpos();\n\n\t\t\tvar prefix = template.source.substring(outerpos.start, innerpos.start);\n\t\t\tvar code = template.source.substring(innerpos.start, innerpos.stop);\n\t\t\tvar suffix = template.source.substring(innerpos.stop, outerpos.stop);\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\t\t\tvar text = prefix + code + suffix;\n\t\t\tvar underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\t// find line numbers\n\t\t\tvar lineno = 1, colno = 1;\n\t\t\tfor (var i = 0; i < innerpos.start; ++i) {\n\t\t\t\tif (template.source[i] === \"\\n\") {\n\t\t\t\t\t++lineno;\n\t\t\t\t\tcolno = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++colno;\n\t\t\t}\n\n\t\t\tpos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + lineno + \"; col \" + colno;\n\n\t\t\treturn templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tcase \"template\":\n\t\t\t\t\treturn this._template;\n\t\t\t\tcase \"outerpos\":\n\t\t\t\t\treturn this._outerpos;\n\t\t\t\tcase \"innerpos\":\n\t\t\t\t\treturn this._innerpos;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n\n/// Classes for the syntax tree\nul4.AST = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(pos) {\n\t\t\tvar ast = ul4._clone(this);\n\t\t\tast.pos = pos;\n\t\t\treturn ast;\n\t\t},\n\t\t__str__: function __str__() {\n\t\t\tvar out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\tvar out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_handle_eval_modify: function _handle_eval_modify(context, operator, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t},\n\t\t_str: function _str(out) {\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this[this._ul4onattrs[i]]);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tthis[this._ul4onattrs[i]] = decoder.load();\n\t\t},\n\t\t__setitem__: function __setitem__(attrname, value) {\n\t\t\tthrow ul4.TypeError.create(\"mutate\", \"object is immutable\");\n\t\t},\n\t\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\t\t_ul4onattrs: [\"pos\"]\n\t}\n);\n\nul4.TextAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, pos) {\n\t\t\tvar text = ul4.AST.create.call(this, pos);\n\t\t\ttext.template = template;\n\t\t\treturn text;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"template\"]),\n\t\t_text: function _text() {\n\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.IndentAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\tcreate: function create(template, pos, text) {\n\t\t\tvar indent = ul4.TextAST.create.call(this, template, pos);\n\t\t\tindent._maketext(text);\n\t\t\treturn indent;\n\t\t},\n\t\t_maketext: function _maketext(text) {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tif (text === null)\n\t\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\telse\n\t\t\t\t\tthis.text = text;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.text = null;\n\t\t},\n\t\t_text: function _text() {\n\t\t\tif (this.text === null)\n\t\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\telse\n\t\t\t\treturn this.text;\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < context.indents.length; ++i)\n\t\t\t\tcontext.output(context.indents[i]);\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.TextAST.ul4ondump.call(this, encoder);\n\n\t\t\tif (this.text === this.template.source.substring(this.pos.start, this.pos.stop))\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this.text);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext(decoder.load());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.LineEndAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.Tag = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, tag, tagpos, codepos) {\n\t\t\tvar tago = ul4.AST.create.call(this, tagpos);\n\t\t\ttago.template = template;\n\t\t\ttago.tag = tag;\n\t\t\ttago.codepos = codepos;\n\t\t\ttago._maketext();\n\t\t\treturn tago;\n\t\t},\n\t\t_maketext: function _maketext() {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\tthis.code = this.template.source.substring(this.codepos.start, this.codepos.stop);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.text = null;\n\t\t\t\tthis.code = null;\n\t\t\t}\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.AST.ul4ondump.call(this, encoder);\n\t\t\tencoder.dump(this.template);\n\t\t\tencoder.dump(this.tag);\n\t\t\tencoder.dump(this.codepos);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\tthis.template = decoder.load();\n\t\t\tthis.tag = decoder.load();\n\t\t\tthis.codepos = decoder.load();\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext();\n\t\t}\n\t}\n);\n\nul4.CodeAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar code = ul4.AST.create.call(this, pos);\n\t\t\tcode.tag = tag;\n\t\t\treturn code;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"tag\"]),\n\t\t_str: function _str(out) {\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t}\n\t}\n);\n\nul4.ConstAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar constant = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tconstant.value = value;\n\t\t\treturn constant;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this.value;\n\t\t}\n\t}\n);\n\nul4.ItemArgBase = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_handle_eval_list: function _handle_eval_list(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_dict: function _handle_eval_dict(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_call: function _handle_eval_call(context, args, kwargs) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.SeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar seqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tseqitem.value = value;\n\t\t\treturn seqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t}\n);\n\n\nul4.UnpackSeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackseqitem.value = value;\n\t\t\treturn unpackseqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.DictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, key, value) {\n\t\t\tvar dictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tdictitem.key = key;\n\t\t\tdictitem.value = value;\n\t\t\treturn dictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"key\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar key = this.key._handle_eval(context);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tul4on._setmap(result, key, value);\n\t\t}\n\t}\n);\n\nul4.UnpackDictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackdictitem.item = item;\n\t\t\treturn unpackdictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item)\n\t\t\t\t\tul4on._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.PosArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t}\n);\n\nul4.KeywordArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, name, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.name = name;\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"name\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + this.name);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t}\n);\n\nul4.UnpackListArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\targs.push.apply(args, item);\n\t\t}\n\t}\n);\n\nul4.UnpackDictArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ListAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar list = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlist.items = [];\n\t\t\treturn list;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = [];\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_list(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ListCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.item = item;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = [];\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar dict = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tdict.items = [];\n\t\t\treturn dict;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._emptymap();\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_dict(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, key, value, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.key = key;\n\t\t\tlistcomp.value = value;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._emptymap();\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) {\n\t\t\t\t\tvar key = this.key._handle_eval(localcontext);\n\t\t\t\t\tvar value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar set = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tset.items = [];\n\t\t\treturn set;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_set(context, result);\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar setcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsetcomp.item = item;\n\t\t\tsetcomp.container = container;\n\t\t\tsetcomp.condition = condition;\n\t\t\treturn setcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.GenExprAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar genexp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tgenexp.item = item;\n\t\t\tgenexp.varname = varname;\n\t\t\tgenexp.container = container;\n\t\t\tgenexp.condition = condition;\n\t\t\treturn genexp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\t\t\tvar iter = ul4._iter(container);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar self = this;\n\n\t\t\tvar result = {\n\t\t\t\tnext: function () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tvar varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) {\n\t\t\t\t\t\t\tvar value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn { value: value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.VarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, name) {\n\t\t\tvar variable = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tvariable.name = name;\n\t\t\treturn variable;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"name\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this._get(context, this.name);\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthis._set(context, this.name, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t},\n\t\t_get: function _get(context, name) {\n\t\t\tvar result = context.get(name);\n\t\t\tif (typeof (result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t},\n\t\t_set: function _set(context, name, value) {\n\t\t\tcontext.set(name, value);\n\t\t},\n\t\t_modify: function _modify(context, operator, name, value) {\n\t\t\tvar newvalue = operator._ido(context.get(name), value)\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t}\n);\n\nul4.UnaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj) {\n\t\t\tvar unary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tunary.obj = obj;\n\t\t\treturn unary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t}\n);\n\n// Negation\nul4.NegAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\tif (obj !== null && typeof (obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t}\n);\n\n// Bitwise not\nul4.BitNotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn -obj - 1;\n\t\t}\n\t}\n);\n\n// Not\nul4.NotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t}\n);\n\n// If expression\nul4.IfAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, objif, objcond, objelse) {\n\t\t\tvar ifexpr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tifexpr.objif = objif;\n\t\t\tifexpr.objcond = objcond;\n\t\t\tifexpr.objelse = objelse;\n\t\t\treturn ifexpr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result;\n\t\t\tvar condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ReturnAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = this.obj._handle_eval(context);\n\t\t\tthrow ul4.ReturnException.create(result);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintXAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.BinaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj1, obj2) {\n\t\t\tvar binary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tbinary.obj1 = obj1;\n\t\t\tbinary.obj2 = obj2;\n\t\t\treturn binary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj1\", \"obj2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.type);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Item access and assignment: dict[key], list[index], string[index], color[index]\nul4.ItemAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t},\n\t\t_get: function _get(container, key) {\n\t\t\tif (typeof (container) === \"string\" || ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof (start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof (stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__getitem__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\treturn container[key];\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"[]\", ul4._type(container) + \" object is not subscriptable\");\n\t\t},\n\t\t_set: function _set(container, key, value) {\n\t\t\tif (ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop - start); // Remove old element\n\t\t\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.NotSubscriptableError.create(container);\n\t\t},\n\t\t_modify: function _modify(operator, container, key, value) {\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t}\n);\n\n// Identifty test operator ``is``\nul4.IsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t}\n);\n\n// Inverted tdentifty test operator ``is not``\nul4.IsNotAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t}\n);\n\n// Comparison operator ==\nul4.EQAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator !=\nul4.NEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <\nul4.LTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <=\nul4.LEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >\nul4.GTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >=\nul4.GEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Containment test: string in string, obj in list, key in dict, value in rgb\nul4.ContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\tif (typeof (obj) === \"string\" && typeof (container) === \"string\") {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container)) {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof (container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container)) {\n\t\t\t\tfor (var key in container) {\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container)) {\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"in\", ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t}\n);\n\n// Inverted containment test\nul4.NotContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\treturn !ul4.ContainsAST._do(obj, container);\n\t\t}\n\t}\n);\n\n// Addition: num + num, string + string\nul4.AddAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tvar result = [];\n\t\t\t\tul4._append(result, obj1);\n\t\t\t\tul4._append(result, obj2);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tul4._append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Substraction: num - num\nul4.SubAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t},\n\t\t_date_sub: function _date_sub(obj1, obj2) {\n\t\t\tvar swap = (obj2 > obj1);\n\n\t\t\tif (swap) {\n\t\t\t\tvar t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tvar year1 = obj1.getFullYear();\n\t\t\tvar yearday1 = ul4._yearday(obj1);\n\t\t\tvar year2 = obj2.getFullYear();\n\t\t\tvar yearday2 = ul4._yearday(obj2);\n\n\t\t\tvar diffdays = 0;\n\n\t\t\twhile (year1 > year2) {\n\t\t\t\tdiffdays += ul4._yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tvar hours1 = obj1.getHours();\n\t\t\tvar minutes1 = obj1.getMinutes();\n\t\t\tvar seconds1 = obj1.getSeconds();\n\t\t\tvar hours2 = obj2.getHours();\n\t\t\tvar minutes2 = obj2.getMinutes();\n\t\t\tvar seconds2 = obj2.getSeconds();\n\n\t\t\tvar diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tvar diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap) {\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Multiplication: num * num, int * str, str * int, int * list, list * int\nul4.MulAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1)) {\n\t\t\t\tif (typeof (obj2) === \"string\") {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2)) {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2)) {\n\t\t\t\tif (typeof (obj1) === \"string\") {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1)) {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2)) {\n\t\t\t\tif (obj2 > 0) {\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++])\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Truncating division\nul4.FloorDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"//\", ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// \"Real\" division\nul4.TrueDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn obj1 / obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Modulo\nul4.ModAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar div = Math.floor(obj1 / obj2);\n\t\t\tvar mod = obj1 - div * obj2;\n\n\t\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) {\n\t\t\t\tmod += obj2;\n\t\t\t\t--div;\n\t\t\t}\n\t\t\treturn obj1 - div * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise left shift\nul4.ShiftLeftAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise right shift\nul4.ShiftRightAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise and\nul4.BitAndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise exclusive or\nul4.BitXOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise or\nul4.BitOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\nul4.AndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.OrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.AttrAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, attrname) {\n\t\t\tvar attr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tattr.obj = obj;\n\t\t\tattr.attrname = attrname;\n\t\t\treturn attr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"attrname\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t},\n\t\t_get: function _get(object, attrname) {\n\t\t\tif (typeof (object) === \"string\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\treturn ul4.expose([\"old\", \"new\", \"count=\", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); });\n\t\t\t\t\tcase \"strip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function strip(chars) { return ul4._strip(object, chars); });\n\t\t\t\t\tcase \"lstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function lstrip(chars) { return ul4._lstrip(object, chars); });\n\t\t\t\t\tcase \"rstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function rstrip(chars) { return ul4._rstrip(object, chars); });\n\t\t\t\t\tcase \"split\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function split(sep, count) { return ul4._split(object, sep, count); });\n\t\t\t\t\tcase \"rsplit\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); });\n\t\t\t\t\tcase \"splitlines\":\n\t\t\t\t\t\treturn ul4.expose([\"keepends=\", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); });\n\t\t\t\t\tcase \"lower\":\n\t\t\t\t\t\treturn ul4.expose([], function lower() { return object.toLowerCase(); });\n\t\t\t\t\tcase \"upper\":\n\t\t\t\t\t\treturn ul4.expose([], function upper() { return object.toUpperCase(); });\n\t\t\t\t\tcase \"capitalize\":\n\t\t\t\t\t\treturn ul4.expose([], function capitalize() { return ul4._capitalize(object); });\n\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\treturn ul4.expose([\"iterable\"], function join(iterable) { return ul4._join(object, iterable); });\n\t\t\t\t\tcase \"startswith\":\n\t\t\t\t\t\treturn ul4.expose([\"prefix\"], function startswith(prefix) { return ul4._startswith(object, prefix); });\n\t\t\t\t\tcase \"endswith\":\n\t\t\t\t\t\treturn ul4.expose([\"suffix\"], function endswith(suffix) { return ul4._endswith(object, suffix); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._islist(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"append\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function append(items) { return ul4._append(object, items); });\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\treturn ul4.expose([\"pos\", \"*items\"], function insert(pos, items) { return ul4._insert(object, pos, items); });\n\t\t\t\t\tcase \"pop\":\n\t\t\t\t\t\treturn ul4.expose([\"pos=\", -1], function pop(pos) { return ul4._pop(object, pos); });\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isdate(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"weekday\":\n\t\t\t\t\t\treturn ul4.expose([], function weekday() { return ul4._weekday(object); });\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\treturn ul4.expose([\"firstweekday=\", null], function week(firstweekday) { return ul4._week(object, firstweekday); });\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\treturn ul4.expose([], function day() { return object.getDate(); });\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\treturn ul4.expose([], function month() { return object.getMonth() + 1; });\n\t\t\t\t\tcase \"year\":\n\t\t\t\t\t\treturn ul4.expose([], function year() { return object.getFullYear(); });\n\t\t\t\t\tcase \"hour\":\n\t\t\t\t\t\treturn ul4.expose([], function hour() { return object.getHours(); });\n\t\t\t\t\tcase \"minute\":\n\t\t\t\t\t\treturn ul4.expose([], function minute() { return object.getMinutes(); });\n\t\t\t\t\tcase \"second\":\n\t\t\t\t\t\treturn ul4.expose([], function second() { return object.getSeconds(); });\n\t\t\t\t\tcase \"microsecond\":\n\t\t\t\t\t\treturn ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; });\n\t\t\t\t\tcase \"mimeformat\":\n\t\t\t\t\t\treturn ul4.expose([], function mimeformat() { return ul4._mimeformat(object); });\n\t\t\t\t\tcase \"isoformat\":\n\t\t\t\t\t\treturn ul4.expose([], function isoformat() { return ul4._isoformat(object); });\n\t\t\t\t\tcase \"yearday\":\n\t\t\t\t\t\treturn ul4.expose([], function yearday() { return ul4._yearday(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn object.get(attrname);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isset(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Object.prototype.toString.call(object) === \"[object Object]\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar result;\n\t\t\t\t\t\tif (object && typeof (object.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\t\t\t\tresult = object.__getattr__(attrname);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult = object[attrname];\n\t\t\t\t\t\tif (typeof (result) !== \"function\")\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\tvar realresult = function () {\n\t\t\t\t\t\t\treturn result.apply(object, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\t\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\t\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\t\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\t\t\t\treturn realresult;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"get\", ul4._type(object) + \" object has no readable attributes\");\n\t\t},\n\t\t_set: function _set(object, attrname, value) {\n\t\t\tif (typeof (object) === \"object\" && typeof (object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value)\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"set\", ul4._type(object) + \" object has no writable attributes\");\n\t\t},\n\t\t_modify: function _modify(operator, object, attrname, value) {\n\t\t\tvar oldvalue = this._get(object, attrname);\n\t\t\tvar newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t}\n);\n\nul4.CallAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar call = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tcall.obj = obj;\n\t\t\tcall.args = args;\n\t\t\treturn call;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"args\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_makeargs: function _makeargs(context) {\n\t\t\tvar args = [], kwargs = {};\n\t\t\tfor (var i = 0; i < this.args.length; ++i)\n\t\t\t\tthis.args[i]._handle_eval_call(context, args, kwargs);\n\t\t\treturn { args: args, kwargs: kwargs };\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar args = this._makeargs(context);\n\t\t\tvar result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.RenderAST = ul4._inherit(\n\tul4.CallAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar render = ul4.CallAST.create.call(this, tag, pos, obj, args);\n\t\t\trender.indent = null;\n\t\t\treturn render;\n\t\t},\n\t\t_ul4onattrs: ul4.CallAST._ul4onattrs.concat([\"indent\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null) {\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent._text()));\n\t\t\t}\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\tvar localcontext = context.withindent(this.indent !== null ? this.indent._text() : null);\n\t\t\tvar obj = this.obj._handle_eval(localcontext);\n\t\t\tvar args = this._makeargs(localcontext);\n\n\t\t\ttry {\n\t\t\t\tvar result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Slice object\nul4.slice = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(start, stop) {\n\t\t\tvar slice = ul4._clone(this);\n\t\t\tslice.start = start;\n\t\t\tslice.stop = stop;\n\t\t\treturn slice;\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \")\";\n\t\t}\n\t}\n);\n\n\n// List/String slice\nul4.SliceAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, index1, index2) {\n\t\t\tvar slice = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tslice.index1 = index1;\n\t\t\tslice.index2 = index2;\n\t\t\treturn slice;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"index1\", \"index2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tvar index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn ul4.slice.create(index1, index2);\n\t\t}\n\t}\n);\n\n\nul4.SetVarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, lvalue, value) {\n\t\t\tvar changevar = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tchangevar.lvalue = lvalue;\n\t\t\tchangevar.value = value;\n\t\t\treturn changevar;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"lvalue\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_set(context, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ModifyVarAST = ul4._inherit(\n\tul4.SetVarAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_modify(context, this._operator, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST });\n\nul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST });\n\nul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST });\n\nul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST });\n\nul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST });\n\nul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST });\n\nul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST });\n\nul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST });\n\nul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST });\n\nul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST });\n\nul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST });\n\nul4.BlockAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar block = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tblock.endtag = null;\n\t\t\tblock.content = [];\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"endtag\", \"content\"]),\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i)\n\t\t\t\tthis.content[i]._handle_eval(context);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tif (this.content.length) {\n\t\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\t\tthis.content[i]._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ForBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, varname, container) {\n\t\t\tvar for_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tfor_.varname = varname;\n\t\t\tfor_.container = container;\n\t\t\treturn for_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"varname\", \"container\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str_varname: function _str_varname(out, varname) {\n\t\t\tif (ul4._islist(varname)) {\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (var i = 0; i < varname.length; ++i) {\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(context, varitems[i][1]);\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.WhileBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar while_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\twhile_.condition = condition;\n\t\t\treturn while_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \"),\n\t\t\t\tthis.container._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\twhile (true) {\n\t\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \");\n\t\t\tul4.AST._str.call(this, out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.BreakAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.BreakException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.ContinueAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.ContinueException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.CondBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\tvar block = this.content[i];\n\t\t\t\tvar execute = block._execute(context);\n\t\t\t\tif (execute) {\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ConditionalBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar block = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tblock.condition = condition;\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\tvar result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"if\" });\n\nul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"else if\" });\n\nul4.ElseBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\"),\n\t\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\treturn true;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.Template = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) {\n\t\t\tvar template = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\ttemplate.source = source;\n\t\t\ttemplate.name = name;\n\t\t\ttemplate.whitespace = whitespace;\n\t\t\ttemplate.startdelim = startdelim;\n\t\t\ttemplate.enddelim = enddelim;\n\t\t\ttemplate.docpos = null;\n\t\t\ttemplate.signature = signature;\n\t\t\ttemplate._jsfunction = null;\n\t\t\ttemplate._asts = null;\n\t\t\ttemplate._ul4_callsignature = signature;\n\t\t\ttemplate._ul4_rendersignature = signature;\n\t\t\ttemplate.parenttemplate = null;\n\t\t\treturn template;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tvar signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this.source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || ul4.SignatureAST.isprotoof(this.signature))\n\t\t\t\tsignature = this.signature;\n\t\t\telse {\n\t\t\t\tsignature = [];\n\t\t\t\tfor (var i = 0; i < this.signature.args.length; ++i) {\n\t\t\t\t\tvar arg = this.signature.args[i];\n\t\t\t\t\tif (typeof (arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name + \"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tul4.BlockAST.ul4ondump.call(this, encoder);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tvar version = decoder.load();\n\t\t\tvar signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow ul4.ValueError.create(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow ul4.ValueError.create(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\t\t\tthis.name = decoder.load();\n\t\t\tthis.source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tul4.BlockAST.ul4onload.call(this, decoder);\n\t\t},\n\t\tloads: function loads(string) {\n\t\t\treturn ul4on.loads(string);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tvar closure = ul4.TemplateClosure.create(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\") {\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\tvar localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t},\n\t\trenders: function renders(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t},\n\t\tdoc: function doc() {\n\t\t\treturn this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null;\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"tag\":\n\t\t\t\t\treturn this.tag;\n\t\t\t\tcase \"endtag\":\n\t\t\t\t\treturn this.endtag;\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\t_callbound: function _callbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcall: function call(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__type__: \"ul4.Template\" // used by ``istemplate()``\n\t}\n);\n\nul4.SignatureAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar signature = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsignature.params = [];\n\t\t\treturn signature;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.CodeAST.ul4ondump.call(this, encoder);\n\n\t\t\tvar dump = [];\n\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.AST.ul4onload.call(this, decoder);\n\t\t\tvar dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (var i = 0; i < dump.length; ++i) {\n\t\t\t\tvar param = dump[i];\n\t\t\t\tif (typeof (param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar args = [];\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse {\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ul4.Signature.create.apply(ul4.Signature, args);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t}\n);\n\nul4.TemplateClosure = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(template, signature, vars) {\n\t\t\tvar closure = ul4._clone(this);\n\t\t\tclosure.template = template;\n\t\t\tclosure.signature = signature;\n\t\t\tclosure.vars = vars;\n\t\t\tclosure._ul4_callsignature = signature;\n\t\t\tclosure._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tclosure.name = template.name;\n\t\t\tclosure.tag = template.tag;\n\t\t\tclosure.endtag = template.endtag;\n\t\t\tclosure.source = template.source;\n\t\t\tclosure.startdelim = template.startdelim;\n\t\t\tclosure.enddelim = template.enddelim;\n\t\t\tclosure.docpos = template.docpos;\n\t\t\tclosure.content = template.content;\n\t\t\treturn closure;\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this.template._callbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\treturn this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t},\n\t\t__type__: \"ul4.TemplateClosure\" // used by ``istemplate()``\n\t}\n);\n\n// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\nul4._rgb = function _rgb(r, g, b, a) {\n\treturn this.Color.create(255 * r, 255 * g, 255 * b, 255 * a);\n};\n\n// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\nul4._xmlescape = function _xmlescape(obj) {\n\tobj = ul4._str(obj);\n\tobj = obj.replace(/&/g, \"&\");\n\tobj = obj.replace(//g, \">\");\n\tobj = obj.replace(/'/g, \"'\");\n\tobj = obj.replace(/\"/g, \""\");\n\treturn obj;\n};\n\n// Convert ``obj`` to a string suitable for output into a CSV file\nul4._csv = function _csv(obj) {\n\tif (obj === null)\n\t\treturn \"\";\n\telse if (typeof (obj) !== \"string\")\n\t\tobj = ul4._repr(obj);\n\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\treturn obj;\n};\n\n// Return a string containing one character with the codepoint ``i``\nul4._chr = function _chr(i) {\n\tif (typeof (i) != \"number\")\n\t\tthrow ul4.TypeError.create(\"chr()\", \"chr() requires an int\");\n\treturn String.fromCharCode(i);\n};\n\n// Return the codepoint for the one and only character in the string ``c``\nul4._ord = function _ord(c) {\n\tif (typeof (c) != \"string\" || c.length != 1)\n\t\tthrow ul4.TypeError.create(\"ord()\", \"ord() requires a string of length 1\");\n\treturn c.charCodeAt(0);\n};\n\n// Convert an integer to a hexadecimal string\nul4._hex = function _hex(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"hex()\", \"hex() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0x\" + number.toString(16).substr(1);\n\telse\n\t\treturn \"0x\" + number.toString(16);\n};\n\n// Convert an integer to a octal string\nul4._oct = function _oct(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"oct()\", \"oct() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0o\" + number.toString(8).substr(1);\n\telse\n\t\treturn \"0o\" + number.toString(8);\n};\n\n// Convert an integer to a binary string\nul4._bin = function _bin(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"bin()\", \"bin() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0b\" + number.toString(2).substr(1);\n\telse\n\t\treturn \"0b\" + number.toString(2);\n};\n\n// Return the minimum value\nul4._min = function _min(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"min() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"min() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value < result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the maximum value\nul4._max = function _max(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"max() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"max() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value > result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the of the values from the iterable starting with ``start`` (default ``0``)\nul4._sum = function _sum(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tstart += item.value;\n\t}\n\treturn start;\n};\n\n// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._first = function _first(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar item = ul4._iter(iterable).next();\n\treturn item.done ? defaultValue : item.value;\n};\n\n// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._last = function _last(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar value = defaultValue;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tvalue = item.value;\n\t}\n\treturn value;\n};\n\n// Return a sorted version of ``iterable``\nul4._sorted = function _sorted(context, iterable, key, reverse) {\n\tvar cmp;\n\tif (key === null) {\n\t\t// FIXME: stability\n\t\tif (reverse) {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\tvar result = ul4._list(iterable);\n\t\tresult.sort(cmp);\n\t\treturn result;\n\t}\n\telse {\n\t\tvar sort = [];\n\n\t\tfor (var i = 0, iter = ul4._iter(iterable); ; ++i) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvar keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\tsort.push([keyvalue, i, item.value]);\n\t\t}\n\t\tcmp = function cmp(s1, s2) {\n\t\t\tvar res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\tif (res)\n\t\t\t\treturn reverse ? -res : res;\n\t\t\tres = ul4._cmp(s1[1], s2[1]);\n\t\t\treturn reverse ? -res : res;\n\t\t}\n\n\t\tsort.sort(cmp);\n\n\t\tvar result = [];\n\t\tfor (var i = 0; i < sort.length; ++i) {\n\t\t\tresult.push(sort[i][2]);\n\t\t}\n\t\treturn result;\n\t}\n};\n\n// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step``\nul4._range = function _range(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required range() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar lower, higher;\n\tif (step === 0)\n\t\tthrow ul4.ValueError.create(\"range() requires a step argument != 0\");\n\telse if (step > 0) {\n\t\tlower = start;\n\t\theigher = stop;\n\t}\n\telse {\n\t\tlower = stop;\n\t\theigher = start;\n\t}\n\tvar length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0;\n\n\treturn {\n\t\tindex: 0,\n\t\tnext: function () {\n\t\t\tif (this.index >= length)\n\t\t\t\treturn { done: true };\n\t\t\treturn { value: start + (this.index++) * step, done: false };\n\t\t}\n\t};\n};\n\n// Return a iterable object returning a slice from the argument\nul4._slice = function _slice(args) {\n\tvar iterable, start, stop, step;\n\tif (args.length < 2)\n\t\tthrow ul4.ArgumentError.create(\"required slice() argument missing\");\n\telse if (args.length > 4)\n\t\tthrow ul4.ArgumentError.create(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 2) {\n\t\titerable = args[0];\n\t\tstart = 0;\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 4) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = args[3] !== null ? args[3] : 1;\n\t}\n\tif (start < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a start argument >= 0\");\n\tif (stop < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a stop argument >= 0\");\n\tif (step <= 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a step argument > 0\");\n\n\tvar next = start, count = 0;\n\tvar iter = ul4._iter(iterable);\n\treturn {\n\t\tnext: function () {\n\t\t\tvar result;\n\t\t\twhile (count < next) {\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t}\n\t\t\tif (stop !== null && count >= stop)\n\t\t\t\treturn { done: true };\n\t\t\tresult = iter.next();\n\t\t\tif (result.done)\n\t\t\t\treturn result;\n\t\t\t++count;\n\t\t\tnext += step;\n\t\t\tif (stop !== null && next > stop)\n\t\t\t\tnext = stop;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// ``%`` escape unsafe characters in the string ``string``\nul4._urlquote = function _urlquote(string) {\n\treturn encodeURIComponent(string);\n};\n\n// The inverse function of ``urlquote``\nul4._urlunquote = function _urlunquote(string) {\n\treturn decodeURIComponent(string);\n};\n\n// Return a reverse iterator over ``sequence``\nul4._reversed = function _reversed(sequence) {\n\tif (typeof (sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\tsequence = ul4._list(sequence);\n\treturn {\n\t\tindex: sequence.length - 1,\n\t\tnext: function () {\n\t\t\treturn this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true };\n\t\t}\n\t};\n};\n\n// Returns a random number in the interval ``[0;1[``\nul4._random = function _random() {\n\treturn Math.random();\n};\n\n// Return a randomly select item from ``range(start, stop, step)``\nul4._randrange = function _randrange(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required randrange() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar width = stop - start;\n\n\tvar value = Math.random();\n\n\tvar n;\n\tif (step > 0)\n\t\tn = Math.floor((width + step - 1) / step);\n\telse if (step < 0)\n\t\tn = Math.floor((width + step + 1) / step);\n\telse\n\t\tthrow ul4.ValueError.create(\"randrange() requires a step argument != 0\");\n\treturn start + step * Math.floor(value * n);\n};\n\n// Return a random item/char from the list/string ``sequence``\nul4._randchoice = function _randchoice(sequence) {\n\tvar iscolor = ul4._iscolor(sequence);\n\tif (typeof (sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\tthrow ul4.TypeError.create(\"randchoice() requires a string or list\");\n\tif (iscolor)\n\t\tsequence = ul4._list(sequence);\n\treturn sequence[Math.floor(Math.random() * sequence.length)];\n};\n\n// Round a number ``x`` to ``digits`` decimal places (may be negative)\nul4._round = function _round(x, digits) {\n\tif (typeof (digits) === \"undefined\")\n\t\tdigits = 0;\n\tif (digits) {\n\t\tvar threshhold = Math.pow(10, digits);\n\t\treturn Math.round(x * threshhold) / threshhold;\n\t}\n\telse\n\t\treturn Math.round(x);\n};\n\n// Return a hex-encode MD5 hash of the argument\n// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5\nul4._md5 = function _md5(string) {\n\treturn md5(string);\n};\n\n// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\nul4._enumerate = function _enumerate(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\treturn {\n\t\titer: ul4._iter(iterable),\n\t\tindex: start,\n\t\tnext: function () {\n\t\t\tvar item = this.iter.next();\n\t\t\treturn item.done ? item : { value: [this.index++, item.value], done: false };\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\nul4._isfirst = function _isfirst(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\treturn {\n\t\tnext: function () {\n\t\t\tvar item = iter.next();\n\t\t\tvar result = item.done ? item : { value: [isfirst, item.value], done: false };\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\nul4._islast = function _islast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._isfirstlast = function _isfirstlast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._enumfl = function _enumfl(iterable, start) {\n\tvar iter = ul4._iter(iterable);\n\tvar i = start;\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [i++, isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\nul4._zip = function _zip(iterables) {\n\tvar result;\n\tif (iterables.length) {\n\t\tvar iters = [];\n\t\tfor (var i = 0; i < iterables.length; ++i)\n\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tvar items = [];\n\t\t\t\tfor (var i = 0; i < iters.length; ++i) {\n\t\t\t\t\tvar item = iters[i].next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\treturn item;\n\t\t\t\t\titems.push(item.value);\n\t\t\t\t}\n\t\t\t\treturn { value: items, done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n};\n\n// Return the absolute value for the number ``number``\nul4._abs = function _abs(number) {\n\tif (number !== null && typeof (number.__abs__) === \"function\")\n\t\treturn number.__abs__();\n\treturn Math.abs(number);\n};\n\n// Return a ``Date`` object from the arguments passed in\nul4._date = function _date(year, month, day, hour, minute, second, microsecond) {\n\tif (typeof (hour) === \"undefined\")\n\t\thour = 0;\n\n\tif (typeof (minute) === \"undefined\")\n\t\tminute = 0;\n\n\tif (typeof (second) === \"undefined\")\n\t\tsecond = 0;\n\n\tif (typeof (microsecond) === \"undefined\")\n\t\tmicrosecond = 0;\n\n\treturn new Date(year, month - 1, day, hour, minute, second, microsecond / 1000);\n};\n\n// Return a ``TimeDelta`` object from the arguments passed in\nul4._timedelta = function _timedelta(days, seconds, microseconds) {\n\treturn this.TimeDelta.create(days, seconds, microseconds);\n};\n\n// Return a ``MonthDelta`` object from the arguments passed in\nul4._monthdelta = function _monthdelta(months) {\n\treturn this.MonthDelta.create(months);\n};\n\n// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\nul4._hls = function _hls(h, l, s, a) {\n\tvar _v = function (m1, m2, hue) {\n\t\thue = hue % 1.0;\n\t\tif (hue < 1 / 6)\n\t\t\treturn m1 + (m2 - m1) * hue * 6.0;\n\t\telse if (hue < 0.5)\n\t\t\treturn m2;\n\t\telse if (hue < 2 / 3)\n\t\t\treturn m1 + (m2 - m1) * (2 / 3 - hue) * 6.0;\n\t\treturn m1;\n\t};\n\n\tvar m1, m2;\n\tif (typeof (a) === \"undefined\")\n\t\ta = 1;\n\tif (s === 0.0)\n\t\treturn ul4._rgb(l, l, l, a);\n\tif (l <= 0.5)\n\t\tm2 = l * (1.0 + s);\n\telse\n\t\tm2 = l + s - (l * s);\n\tm1 = 2.0 * l - m2;\n\treturn ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a);\n};\n\n// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\nul4._hsv = function _hsv(h, s, v, a) {\n\tif (s === 0.0)\n\t\treturn ul4._rgb(v, v, v, a);\n\tvar i = Math.floor(h * 6.0);\n\tvar f = (h * 6.0) - i;\n\tvar p = v * (1.0 - s);\n\tvar q = v * (1.0 - s * f);\n\tvar t = v * (1.0 - s * (1.0 - f));\n\tswitch (i % 6) {\n\t\tcase 0:\n\t\t\treturn ul4._rgb(v, t, p, a);\n\t\tcase 1:\n\t\t\treturn ul4._rgb(q, v, p, a);\n\t\tcase 2:\n\t\t\treturn ul4._rgb(p, v, t, a);\n\t\tcase 3:\n\t\t\treturn ul4._rgb(p, q, v, a);\n\t\tcase 4:\n\t\t\treturn ul4._rgb(t, p, v, a);\n\t\tcase 5:\n\t\t\treturn ul4._rgb(v, p, q, a);\n\t}\n};\n\n// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\nul4._get = function _get(container, key, defaultvalue) {\n\tif (ul4._ismap(container)) {\n\t\tif (container.has(key))\n\t\t\treturn container.get(key);\n\t\treturn defaultvalue;\n\t}\n\telse if (ul4._isobject(container)) {\n\t\tvar result = container[key];\n\t\tif (typeof (result) === \"undefined\")\n\t\t\treturn defaultvalue;\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"get()\", \"get() requires a dict\");\n};\n\n// Return a ``Date`` object for the current time\nul4.now = function now() {\n\treturn new Date();\n};\n\n// Return a ``Date`` object for the current time in UTC\nul4.utcnow = function utcnow() {\n\tvar now = new Date();\n\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n};\n\nul4.functions = {\n\trepr: ul4.expose([\"obj\"], { name: \"repr\" }, ul4._repr),\n\tascii: ul4.expose([\"obj\"], { name: \"ascii\" }, ul4._ascii),\n\tstr: ul4.expose([\"obj=\", \"\"], { name: \"str\" }, ul4._str),\n\tint: ul4.expose([\"obj=\", 0, \"base=\", null], { name: \"int\" }, ul4._int),\n\tfloat: ul4.expose([\"obj=\", 0.0], { name: \"float\" }, ul4._float),\n\tlist: ul4.expose([\"iterable=\", []], { name: \"list\" }, ul4._list),\n\tset: ul4.expose([\"iterable=\", []], { name: \"set\" }, ul4._set),\n\tbool: ul4.expose([\"obj=\", false], { name: \"bool\" }, ul4._bool),\n\tlen: ul4.expose([\"sequence\"], { name: \"len\" }, ul4._len),\n\ttype: ul4.expose([\"obj\"], { name: \"type\" }, ul4._type),\n\tformat: ul4.expose([\"obj\", \"fmt\", \"lang=\", null], { name: \"format\" }, ul4._format),\n\tany: ul4.expose([\"iterable\"], { name: \"any\" }, ul4._any),\n\tall: ul4.expose([\"iterable\"], { name: \"all\" }, ul4._all),\n\tzip: ul4.expose([\"*iterables\"], { name: \"zip\" }, ul4._zip),\n\tisundefined: ul4.expose([\"obj\"], { name: \"isundefined\" }, ul4._isundefined),\n\tisdefined: ul4.expose([\"obj\"], { name: \"isdefined\" }, ul4._isdefined),\n\tisnone: ul4.expose([\"obj\"], { name: \"isnone\" }, ul4._isnone),\n\tisbool: ul4.expose([\"obj\"], { name: \"isbool\" }, ul4._isbool),\n\tisint: ul4.expose([\"obj\"], { name: \"isint\" }, ul4._isint),\n\tisfloat: ul4.expose([\"obj\"], { name: \"isfloat\" }, ul4._isfloat),\n\tisstr: ul4.expose([\"obj\"], { name: \"isstr\" }, ul4._isstr),\n\tisdate: ul4.expose([\"obj\"], { name: \"isdate\" }, ul4._isdate),\n\tiscolor: ul4.expose([\"obj\"], { name: \"iscolor\" }, ul4._iscolor),\n\tistimedelta: ul4.expose([\"obj\"], { name: \"istimedelta\" }, ul4._istimedelta),\n\tismonthdelta: ul4.expose([\"obj\"], { name: \"ismonthdelta\" }, ul4._ismonthdelta),\n\tistemplate: ul4.expose([\"obj\"], { name: \"istemplate\" }, ul4._istemplate),\n\tisfunction: ul4.expose([\"obj\"], { name: \"isfunction\" }, ul4._isfunction),\n\tislist: ul4.expose([\"obj\"], { name: \"islist\" }, ul4._islist),\n\tisset: ul4.expose([\"obj\"], { name: \"isset\" }, ul4on._haveset ? ul4._isset : ul4._isul4set),\n\tisdict: ul4.expose([\"obj\"], { name: \"isdict\" }, ul4._isdict),\n\tisexception: ul4.expose([\"obj\"], { name: \"isexception\" }, ul4._isexception),\n\tasjson: ul4.expose([\"obj\"], { name: \"asjson\" }, ul4._asjson),\n\tfromjson: ul4.expose([\"string\"], { name: \"fromjson\" }, ul4._fromjson),\n\tasul4on: ul4.expose([\"obj\"], { name: \"asul4on\" }, ul4._asul4on),\n\tfromul4on: ul4.expose([\"string\"], { name: \"fromul4on\" }, ul4._fromul4on),\n\tnow: ul4.expose([], ul4.now),\n\tutcnow: ul4.expose([], ul4.utcnow),\n\tenumerate: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumerate\" }, ul4._enumerate),\n\tisfirst: ul4.expose([\"iterable\"], { name: \"isfirst\" }, ul4._isfirst),\n\tislast: ul4.expose([\"iterable\"], { name: \"islast\" }, ul4._islast),\n\tisfirstlast: ul4.expose([\"iterable\"], { name: \"isfirstlast\" }, ul4._isfirstlast),\n\tenumfl: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumfl\" }, ul4._enumfl),\n\tabs: ul4.expose([\"number\"], { name: \"abs\" }, ul4._abs),\n\tdate: ul4.expose([\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], { name: \"date\" }, ul4._date),\n\ttimedelta: ul4.expose([\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], { name: \"timedelta\" }, ul4._timedelta),\n\tmonthdelta: ul4.expose([\"months=\", 0], { name: \"monthdelta\" }, ul4._monthdelta),\n\trgb: ul4.expose([\"r\", \"g\", \"b\", \"a=\", 1.0], { name: \"rgb\" }, ul4._rgb),\n\thls: ul4.expose([\"h\", \"l\", \"s\", \"a=\", 1.0], { name: \"hls\" }, ul4._hls),\n\thsv: ul4.expose([\"h\", \"s\", \"v\", \"a=\", 1.0], { name: \"hsv\" }, ul4._hsv),\n\txmlescape: ul4.expose([\"obj\"], { name: \"xmlescape\" }, ul4._xmlescape),\n\tcsv: ul4.expose([\"obj\"], { name: \"csv\" }, ul4._csv),\n\tchr: ul4.expose([\"i\"], { name: \"chr\" }, ul4._chr),\n\tord: ul4.expose([\"c\"], { name: \"ord\" }, ul4._ord),\n\thex: ul4.expose([\"number\"], { name: \"hex\" }, ul4._hex),\n\toct: ul4.expose([\"number\"], { name: \"oct\" }, ul4._oct),\n\tbin: ul4.expose([\"number\"], { name: \"bin\" }, ul4._bin),\n\tmin: ul4.expose([\"*obj\"], { name: \"min\" }, ul4._min),\n\tmax: ul4.expose([\"*obj\"], { name: \"max\" }, ul4._max),\n\tsum: ul4.expose([\"iterable\", \"start=\", 0], { name: \"sum\" }, ul4._sum),\n\tfirst: ul4.expose([\"iterable\", \"default=\", null], { name: \"first\" }, ul4._first),\n\tlast: ul4.expose([\"iterable\", \"default=\", null], { name: \"last\" }, ul4._last),\n\tsorted: ul4.expose([\"iterable\", \"key=\", null, \"reverse=\", false], { name: \"sorted\", needscontext: true }, ul4._sorted),\n\trange: ul4.expose([\"*args\"], { name: \"range\" }, ul4._range),\n\tslice: ul4.expose([\"*args\"], { name: \"slice\" }, ul4._slice),\n\turlquote: ul4.expose([\"string\"], { name: \"urlquote\" }, ul4._urlquote),\n\turlunquote: ul4.expose([\"string\"], { name: \"urlunquote\" }, ul4._urlunquote),\n\treversed: ul4.expose([\"sequence\"], { name: \"reversed\" }, ul4._reversed),\n\trandom: ul4.expose([], { name: \"random\" }, ul4._random),\n\trandrange: ul4.expose([\"*args\"], { name: \"randrange\" }, ul4._randrange),\n\trandchoice: ul4.expose([\"sequence\"], { name: \"randchoice\" }, ul4._randchoice),\n\tround: ul4.expose([\"x\", \"digit=\", 0], { name: \"round\" }, ul4._round),\n\tmd5: ul4.expose([\"string\"], { name: \"md5\" }, ul4._md5)\n};\n\n// Functions implementing UL4 methods\nul4._replace = function _replace(string, old, new_, count) {\n\tif (count === null)\n\t\tcount = string.length;\n\n\tvar result = [];\n\twhile (string.length) {\n\t\tvar pos = string.indexOf(old);\n\t\tif (pos === -1 || !count--) {\n\t\t\tresult.push(string);\n\t\t\tbreak;\n\t\t}\n\t\tresult.push(string.substr(0, pos));\n\t\tresult.push(new_);\n\t\tstring = string.substr(pos + old.length);\n\t}\n\treturn result.join(\"\");\n};\n\nul4._strip = function _strip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"strip()\", \"strip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._lstrip = function _lstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"lstrip()\", \"lstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\treturn string;\n};\n\nul4._rstrip = function _rstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rstrip()\", \"rstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._split = function _split(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"split()\", \"split() requires a string\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.indexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.push(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(string.substr(0, pos));\n\t\t\t\tstring = string.substr(pos + sep.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._lstrip(string, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.push(part);\n\t\t\t\tstring = string.substr(part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._rsplit = function _rsplit(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rsplit()\", \"rsplit() requires a string as second argument\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.lastIndexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.unshift(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.unshift(string.substr(pos + sep.length));\n\t\t\t\tstring = string.substr(0, pos);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._rstrip(string, null, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse {\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\tpart = part[part.length - 1];\n\t\t\t\t}\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.unshift(part);\n\t\t\t\tstring = string.substr(0, string.length - part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._splitlines = function _splitlines(string, keepends) {\n\tvar lookingAtLineEnd = function lookingAtLineEnd() {\n\t\tvar c = string[pos];\n\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\treturn 1;\n\t\tif (c === '\\r') {\n\t\t\tif (pos == length - 1)\n\t\t\t\treturn 1;\n\t\t\tif (string[pos + 1] === '\\n')\n\t\t\t\treturn 2;\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tvar result = [], length = string.length;\n\n\tfor (var pos = 0, startpos = 0; ;) {\n\t\tif (pos >= length) {\n\t\t\tif (startpos != pos)\n\t\t\t\tresult.push(string.substring(startpos));\n\t\t\treturn result;\n\t\t}\n\t\tvar lineendlen = lookingAtLineEnd();\n\t\tif (!lineendlen)\n\t\t\t++pos;\n\t\telse {\n\t\t\tvar endpos = pos + (keepends ? lineendlen : 0);\n\t\t\tresult.push(string.substring(startpos, endpos));\n\t\t\tpos += lineendlen;\n\t\t\tstartpos = pos;\n\t\t}\n\t}\n};\n\nul4._count = function _count(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\n\tvar isstr = ul4._isstr(obj);\n\n\tif (isstr && !sub.length) {\n\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\treturn 0;\n\t\tvar result = end - start + 1;\n\t\tif (result > obj.length + 1)\n\t\t\tresult = obj.length + 1;\n\t\treturn result;\n\t}\n\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tvar count = 0;\n\tif (ul4._islist(obj)) {\n\t\tfor (var i = start; i < end; ++i) {\n\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t++count;\n\t\t}\n\t\treturn count;\n\t}\n\telse // string\n\t{\n\t\tvar lastIndex = start;\n\n\t\tfor (; ;) {\n\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\tif (lastIndex == -1)\n\t\t\t\tbreak;\n\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\tbreak;\n\t\t\t++count;\n\t\t\tlastIndex += sub.length;\n\t\t}\n\t\treturn count;\n\t}\n};\n\nul4._find = function _find(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.indexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._rfind = function _rfind(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.lastIndexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._capitalize = function _capitalize(obj) {\n\tif (typeof (obj) != \"string\")\n\t\tthrow ul4.TypeError.create(\"capitalize()\", \"capitalize() requires a string\");\n\n\tif (obj.length)\n\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\treturn obj;\n};\n\nul4._items = function _items(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push([key, value]);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push([key, obj[key]]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"items()\", \"items() requires a dict\");\n};\n\nul4._values = function _values(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push(value);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push(obj[key]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"values()\", \"values() requires a dict\");\n};\n\nul4._join = function _join(sep, iterable) {\n\tvar resultlist = [];\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tresultlist.push(item.value);\n\t}\n\treturn resultlist.join(sep);\n};\n\nul4._startswith = function _startswith(string, prefix) {\n\tif (typeof (prefix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"startswith()\", \"startswith() argument must be string\");\n\n\treturn string.substr(0, prefix.length) === prefix;\n};\n\nul4._endswith = function _endswith(string, suffix) {\n\tif (typeof (suffix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"endswith()\", \"endswith() argument must be string\");\n\n\treturn string.substr(string.length - suffix.length) === suffix;\n};\n\nul4._isoformat = function _isoformat(obj) {\n\tif (!ul4._isdate(obj))\n\t\tthrow ul4.TypeError.create(\"isoformat()\", \"isoformat() requires a date\");\n\n\tvar result = obj.getFullYear() + \"-\" + ul4._lpad((obj.getMonth() + 1).toString(), \"0\", 2) + \"-\" + ul4._lpad(obj.getDate().toString(), \"0\", 2);\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\treturn result;\n};\n\nul4._mimeformat = function _mimeformat(obj) {\n\tvar weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\tvar monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\treturn weekdayname[ul4._weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n};\n\nul4._weekday = function _weekday(obj) {\n\tvar d = obj.getDay();\n\treturn d ? d - 1 : 6;\n};\n\nul4._week = function _week(obj, firstweekday) {\n\tif (firstweekday === null)\n\t\tfirstweekday = 0;\n\telse\n\t\tfirstweekday %= 7;\n\n\tvar yearday = ul4._yearday(obj) + 6;\n\tvar jan1 = new Date(obj.getFullYear(), 0, 1);\n\tvar jan1weekday = jan1.getDay();\n\tif (--jan1weekday < 0)\n\t\tjan1weekday = 6;\n\n\twhile (jan1weekday != firstweekday) {\n\t\t--yearday;\n\t\tif (++jan1weekday == 7)\n\t\t\tjan1weekday = 0;\n\t}\n\treturn Math.floor(yearday / 7);\n};\n\nul4._isleap = function _isleap(obj) {\n\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n};\n\nul4._yearday = function _yearday(obj) {\n\tvar leap = ul4._isleap(obj) ? 1 : 0;\n\tvar day = obj.getDate();\n\tswitch (obj.getMonth()) {\n\t\tcase 0:\n\t\t\treturn day;\n\t\tcase 1:\n\t\t\treturn 31 + day;\n\t\tcase 2:\n\t\t\treturn 31 + 28 + leap + day;\n\t\tcase 3:\n\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\tcase 4:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\tcase 5:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\tcase 6:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\tcase 7:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\tcase 8:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\tcase 9:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\tcase 10:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\tcase 11:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t}\n};\n\nul4._append = function _append(obj, items) {\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.push(items[i]);\n\treturn null;\n};\n\nul4._insert = function _insert(obj, pos, items) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.splice(pos++, 0, items[i]);\n\treturn null;\n};\n\nul4._pop = function _pop(obj, pos) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tvar result = obj[pos];\n\tobj.splice(pos, 1);\n\treturn result;\n};\n\nul4._update = function _update(obj, others, kwargs) {\n\tif (!ul4._isdict(obj))\n\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict\");\n\tfor (var i = 0; i < others.length; ++i) {\n\t\tvar other = others[i];\n\t\tif (ul4._ismap(other)) {\n\t\t\tother.forEach(function (value, key) {\n\t\t\t\tul4on._setmap(obj, key, value);\n\t\t\t});\n\t\t}\n\t\telse if (ul4._isobject(other)) {\n\t\t\tfor (var key in other)\n\t\t\t\tul4on._setmap(obj, key, other[key]);\n\t\t}\n\t\telse if (ul4._islist(other)) {\n\t\t\tfor (var j = 0; j < other.length; ++j) {\n\t\t\t\tif (!ul4._islist(other[j]) || (other[j].length != 2))\n\t\t\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\tul4on._setmap(obj, other[j][0], other[j][1]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t}\n\tfor (var key in kwargs)\n\t\tul4on._setmap(obj, key, kwargs[key]);\n\treturn null;\n};\n\nul4._clear = function _clear(obj) {\n\tif (ul4._ismap(obj))\n\t\tobj.clear();\n\telse if (ul4._isset(obj))\n\t\tobj.clear();\n\telse if (ul4._isobject(obj)) {\n\t\tfor (var key in obj)\n\t\t\tdelete obj[key];\n\t}\n\telse\n\t\tthrow ul4.TypeError.create(\"clear()\", \"clear() requires a dict or set\");\n\treturn null;\n};\n\nul4.Color = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Color\",\n\n\t\tcreate: function create(r, g, b, a) {\n\t\t\tvar c = ul4._clone(this);\n\t\t\tc._r = typeof (r) !== \"undefined\" ? r : 0;\n\t\t\tc._g = typeof (g) !== \"undefined\" ? g : 0;\n\t\t\tc._b = typeof (b) !== \"undefined\" ? b : 0;\n\t\t\tc._a = typeof (a) !== \"undefined\" ? a : 255;\n\t\t\treturn c;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a / 255) + \")\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__iter__: function __iter__() {\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function () {\n\t\t\t\t\tif (this.index == 0) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._r, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._g, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._b, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._a, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"r\":\n\t\t\t\t\treturn ul4.expose([], function r() { return self._r; });\n\t\t\t\tcase \"g\":\n\t\t\t\t\treturn ul4.expose([], function g() { return self._g; });\n\t\t\t\tcase \"b\":\n\t\t\t\t\treturn ul4.expose([], function b() { return self._b; });\n\t\t\t\tcase \"a\":\n\t\t\t\t\treturn ul4.expose([], function a() { return self._a; });\n\t\t\t\tcase \"lum\":\n\t\t\t\t\treturn ul4.expose([], function lum() { return self.lum(); });\n\t\t\t\tcase \"hls\":\n\t\t\t\t\treturn ul4.expose([], function hls() { return self.hls(); });\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\treturn ul4.expose([], function hlsa() { return self.hlsa(); });\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\treturn ul4.expose([], function hsv() { return self.hsv(); });\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\treturn ul4.expose([], function hsva() { return self.hsva(); });\n\t\t\t\tcase \"witha\":\n\t\t\t\t\treturn ul4.expose([\"a\"], function witha(a) { return self.witha(a); });\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function withlum(lum) { return self.withlum(lum); });\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function abslum(lum) { return self.abslum(lum); });\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function rellum(lum) { return self.rellum(lum); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__getitem__: function __getitem__(key) {\n\t\t\tvar orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._iscolor(other))\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t},\n\n\t\tr: ul4.expose([], function r() { return this._r; }),\n\n\t\tg: ul4.expose([], function g() { return this._g; }),\n\n\t\tb: ul4.expose([], function b() { return this._b; }),\n\n\t\ta: ul4.expose([], function a() { return this._a; }),\n\n\t\tlum: ul4.expose([], function lum() { return this.hls()[1]; }),\n\n\t\thls: ul4.expose([],\n\t\t\tfunction hls() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar h, l, s;\n\t\t\t\tvar rc, gc, bc;\n\n\t\t\t\tl = (minc + maxc) / 2.0;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, l, 0.0];\n\t\t\t\tif (l <= 0.5)\n\t\t\t\t\ts = (maxc - minc) / (maxc + minc);\n\t\t\t\telse\n\t\t\t\t\ts = (maxc - minc) / (2.0 - maxc - minc);\n\t\t\t\trc = (maxc - r) / (maxc - minc);\n\t\t\t\tgc = (maxc - g) / (maxc - minc);\n\t\t\t\tbc = (maxc - b) / (maxc - minc);\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, l, s];\n\t\t\t}\n\t\t),\n\n\t\thlsa: ul4.expose([],\n\t\t\tfunction hlsa() {\n\t\t\t\tvar hls = this.hls();\n\t\t\t\treturn hls.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\thsv: ul4.expose([],\n\t\t\tfunction hsv() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar v = maxc;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, 0.0, v];\n\t\t\t\tvar s = (maxc - minc) / maxc;\n\t\t\t\tvar rc = (maxc - r) / (maxc - minc);\n\t\t\t\tvar gc = (maxc - g) / (maxc - minc);\n\t\t\t\tvar bc = (maxc - b) / (maxc - minc);\n\t\t\t\tvar h;\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\t\t),\n\n\t\thsva: ul4.expose([],\n\t\t\tfunction hsva() {\n\t\t\t\tvar hsv = this.hsv();\n\t\t\t\treturn hsv.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\twitha: ul4.expose([\"a\"],\n\t\t\tfunction witha(a) {\n\t\t\t\tif (typeof (a) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\treturn ul4.Color.create(this._r, this._g, this._b, a);\n\t\t\t}\n\t\t),\n\n\t\twithlum: ul4.expose([\"lum\"],\n\t\t\tfunction withlum(lum) {\n\t\t\t\tif (typeof (lum) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\tvar hlsa = this.hlsa();\n\t\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t\t}\n\t\t)\n\t}\n);\n\nul4.TimeDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.TimeDelta\",\n\n\t\tcreate: function create(days, seconds, microseconds) {\n\t\t\tvar td = ul4._clone(this);\n\t\t\tif (typeof (days) === \"undefined\")\n\t\t\t\tdays = 0;\n\t\t\tif (typeof (seconds) === \"undefined\")\n\t\t\t\tseconds = 0;\n\t\t\tif (typeof (microseconds) === \"undefined\")\n\t\t\t\tmicroseconds = 0;\n\n\t\t\tvar total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST._do(total_microseconds, 1000000);\n\t\t\tvar total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0) {\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\ttd._microseconds = microseconds;\n\t\t\ttd._seconds = seconds;\n\t\t\ttd._days = days;\n\n\t\t\treturn td;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._microseconds) {\n\t\t\t\tif (!this._seconds) {\n\t\t\t\t\tif (!this._days)\n\t\t\t\t\t\treturn \"timedelta()\";\n\t\t\t\t\treturn \"timedelta(\" + this._days + \")\";\n\t\t\t\t}\n\t\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \")\";\n\t\t\t}\n\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \", \" + this._microseconds + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tvar v = [];\n\t\t\tif (this._days) {\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tvar seconds = this._seconds % 60;\n\t\t\tvar minutes = Math.floor(this._seconds / 60);\n\t\t\tvar hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds) {\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds);\n\t\t},\n\n\t\t_add: function _add(date, days, seconds, microseconds) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth();\n\t\t\tvar day = date.getDate() + days;\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds() + seconds;\n\t\t\tvar millisecond = date.getMilliseconds() + microseconds / 1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (ul4._istimedelta(other)) {\n\t\t\t\tvar myValue = this._days;\n\t\t\t\tvar otherValue = other._days;\n\t\t\t\tvar hasSeconds = this._seconds || other._seconds;\n\t\t\t\tvar hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds) {\n\t\t\t\t\tmyValue = myValue * 86400 + this._seconds;\n\t\t\t\t\totherValue = otherValue * 86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds) {\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue / otherValue;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"days\":\n\t\t\t\t\treturn ul4.expose([], function days() { return self._days; });\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\treturn ul4.expose([], function seconds() { return self._seconds; });\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\treturn ul4.expose([], function microseconds() { return self._microseconds; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tdays: function days() {\n\t\t\treturn this._days;\n\t\t},\n\n\t\tseconds: function seconds() {\n\t\t\treturn this._seconds;\n\t\t},\n\n\t\tmicroseconds: function microseconds() {\n\t\t\treturn this._microseconds;\n\t\t}\n\t}\n);\n\nul4.MonthDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.MonthDelta\",\n\n\t\tcreate: function create(months) {\n\t\t\tvar md = ul4._clone(this);\n\t\t\tmd._months = typeof (months) !== \"undefined\" ? months : 0;\n\t\t\treturn md;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._months) {\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._months !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._months < 0 ? ul4.MonthDelta.create(-this._months) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.MonthDelta.create(-this._months);\n\t\t},\n\n\t\t_add: function _add(date, months) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth() + months;\n\t\t\tvar day = date.getDate();\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds();\n\t\t\tvar millisecond = date.getMilliseconds();\n\n\t\t\twhile (true) {\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tvar targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tvar result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months - other._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__floordiv__: function __floordiv__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"months\":\n\t\t\t\t\treturn ul4.expose([], function months() { return self._months; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tmonths: function months() {\n\t\t\treturn this._months;\n\t\t}\n\t}\n);\n\n// When we don't have a real ``Set`` type, emulate one that supports strings\nul4._Set = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4._Set\",\n\n\t\tcreate: function create() {\n\t\t\tvar set = ul4._clone(this);\n\t\t\tset.items = {};\n\t\t\tset.add.apply(set, arguments);\n\t\t\treturn set;\n\t\t},\n\n\t\tadd: function add() {\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tthis.items[arguments[i]] = true;\n\t\t\t}\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { self.add.apply(self, items); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__contains__: function __contains__(item) {\n\t\t\treturn this.items[item] || false;\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar v = [];\n\t\t\tv.push(\"{\");\n\t\t\tvar i = 0;\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__eq__: function (other) {\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Substract the number of items that ``other`` has\n\t\t\t\tfor (var item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t},\n\n\t\t__le__: function (other) {\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__ge__: function (other) {\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar result = true;\n\t\t\t\tother.forEach(function (value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in other.items) {\n\t\t\t\t\tif (!this.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"TextAST\",\n\t\"IndentAST\",\n\t\"LineEndAST\",\n\t\"Tag\",\n\t\"ConstAST\",\n\t\"SeqItemAST\",\n\t\"UnpackSeqItemAST\",\n\t\"DictItemAST\",\n\t\"UnpackDictItemAST\",\n\t\"PosArgAST\",\n\t\"KeywordArgAST\",\n\t\"UnpackListArgAST\",\n\t\"UnpackDictArgAST\",\n\t\"ListAST\",\n\t\"ListCompAST\",\n\t\"DictAST\",\n\t\"DictCompAST\",\n\t\"SetAST\",\n\t\"SetCompAST\",\n\t\"GenExprAST\",\n\t\"VarAST\",\n\t\"NotAST\",\n\t\"NegAST\",\n\t\"BitNotAST\",\n\t\"IfAST\",\n\t\"ReturnAST\",\n\t\"PrintAST\",\n\t\"PrintXAST\",\n\t\"ItemAST\",\n\t\"IsAST\",\n\t\"IsNotAST\",\n\t\"EQAST\",\n\t\"NEAST\",\n\t\"LTAST\",\n\t\"LEAST\",\n\t\"GTAST\",\n\t\"GEAST\",\n\t\"NotContainsAST\",\n\t\"ContainsAST\",\n\t\"AddAST\",\n\t\"SubAST\",\n\t\"MulAST\",\n\t\"FloorDivAST\",\n\t\"TrueDivAST\",\n\t\"ModAST\",\n\t\"ShiftLeftAST\",\n\t\"ShiftRightAST\",\n\t\"BitAndAST\",\n\t\"BitXOrAST\",\n\t\"BitOrAST\",\n\t\"AndAST\",\n\t\"OrAST\",\n\t\"SliceAST\",\n\t\"AttrAST\",\n\t\"CallAST\",\n\t\"RenderAST\",\n\t\"SetVarAST\",\n\t\"AddVarAST\",\n\t\"SubVarAST\",\n\t\"MulVarAST\",\n\t\"TrueDivVarAST\",\n\t\"FloorDivVarAST\",\n\t\"ModVarAST\",\n\t\"ShiftLeftVarAST\",\n\t\"ShiftRightVarAST\",\n\t\"BitAndVarAST\",\n\t\"BitXOrVarAST\",\n\t\"BitOrVarAST\",\n\t\"ForBlockAST\",\n\t\"WhileBlockAST\",\n\t\"BreakAST\",\n\t\"ContinueAST\",\n\t\"CondBlockAST\",\n\t\"IfBlockAST\",\n\t\"ElIfBlockAST\",\n\t\"ElseBlockAST\",\n\t\"SignatureAST\",\n\t\"Template\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar ul4onname = name;\n\tif (ul4onname.substr(ul4onname.length - 3) === \"AST\")\n\t\tul4onname = ul4onname.substr(0, ul4onname.length - 3);\n\tul4onname = ul4onname.toLowerCase();\n\tvar object = ul4[name];\n\tobject.typename = name;\n\tobject.type = ul4onname;\n\tul4on.register(\"de.livinglogic.ul4.\" + ul4onname, object);\n}\n","import { ul4, ul4on } from './ul4';\nlet amd = (typeof define === 'function' && define.amd);\nlet commonjs = (typeof module === 'object' && module.exports);\n\nlet la = {};\n\n\nla.Base = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function () {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\treturn this[name];\n\t\t},\n\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0, iter = decoder.loadcontent(); ; ++i) {\n\t\t\t\tvar iteritem = iter.next();\n\t\t\t\tif (iteritem.done)\n\t\t\t\t\tbreak;\n\t\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t\t}\n\t\t\tfor (; i < this._ul4onattrs.length; ++i) {\n\t\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t\t\t}\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tthis[name] = value;\n\t\t},\n\n\t\t_setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) {\n\t\t\tthis[name] = null;\n\t\t}\n\t}\n);\n\nla.Globals = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\t\tgeodist: function geodist(geo1, geo2) {\n\t\t\tvar sqsin = function sqsin(x) { x = Math.sin(x); return x * x };\n\t\t\tvar sqcos = function sqsos(x) { x = Math.cos(x); return x * x };\n\t\t\tvar deg2rad = Math.PI / 180; // Conversion factor degree -> radians\n\t\t\tvar radius = 6378.137; // Equatorial radius of earth in km\n\t\t\tvar flat = 1 / 298.257223563; // Earth flattening\n\n\t\t\tvar lat1 = geo1.lat * deg2rad;\n\t\t\tvar long1 = geo1.long * deg2rad;\n\t\t\tvar lat2 = geo2.lat * deg2rad;\n\t\t\tvar long2 = geo2.long * deg2rad;\n\t\t\tvar F = (lat1 + lat2) / 2;\n\t\t\tvar G = (lat1 - lat2) / 2;\n\t\t\tvar l = (long1 - long2) / 2;\n\t\t\tvar S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\t\tvar C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\t\tvar w = Math.atan(Math.sqrt(S / C));\n\t\t\tvar D = 2 * w * radius;\n\t\t\tvar T = Math.sqrt(S * C) / w;\n\t\t\tvar H1 = (3 * T - 1) / (2 * C);\n\t\t\tvar H2 = (3 * T + 1) / (2 * S);\n\t\t\tvar s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\t\treturn s;\n\t\t}\n\t}\n);\n\nla.FlashMessage = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"timestamp\", \"type\", \"title\", \"message\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.App = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"owner\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\"],\n\n\t\tinsert: function (values) {\n\t\t\treturn this.globals.Login._insert(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.View = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.DataSource = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"app\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Record = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"],\n\n\t\tdelete: function () {\n\t\t\treturn this.app.globals.Login._delete(this);\n\t\t},\n\n\t\tupdate: function (values) {\n\t\t\treturn this.app.globals.Login._update(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tsearch: function search(search) {\n\t\t\tfor (var identifier in search) {\n\t\t\t\tvar fieldsearch = search[identifier];\n\t\t\t\tif (ul4._bool(fieldsearch)) {\n\t\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"values\")\n\t\t\t\treturn this._sparsevalues;\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"values\") {\n\t\t\t\tthis._sparsevalues = value;\n\t\t\t\tthis._values = null;\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis[name] = value;\n\t\t}\n\t}\n);\n\nObject.defineProperty(la.Record, \"values\", {\n\tget: function () {\n\t\tif (this._values === null) {\n\t\t\tthis._values = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.app.controls.forEach(function (control, id) {\n\t\t\t\tvar fieldvalue = self._sparsevalues.get(control.identifier);\n\t\t\t\tif (typeof (fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tself._values.set(id, fieldvalue);\n\t\t\t});\n\t\t}\n\t\treturn this._values;\n\t}\n});\n\nObject.defineProperty(la.Record, \"fields\", {\n\tget: function () {\n\t\tif (this._fields === null) {\n\t\t\tthis._fields = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.values.forEach(function (value, id) {\n\t\t\t\tvar field = la.Field.create(self.app.controls.get(id), self.app, value);\n\t\t\t\tself._fields.set(id, field);\n\t\t\t});\n\t\t}\n\t\treturn this._fields;\n\t}\n});\n\nla.Control = ul4._inherit(\n\tla.Base,\n\t{\n\t\ttype: null,\n\t\tsubtype: null,\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\t_logsearch: function _logsearch(value, search) {\n\t\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t\t},\n\n\t\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t\t// ``value`` is the value of the field\n\t\t// ``search`` is an object with information what we're searching for\n\t\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\t\tsearch: function search(value, search) {\n\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.BoolControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"bool\",\n\t\t__type__: \"BoolControl\",\n\n\t\t// ``search`` must by ``null``, ``false`` or ``true``\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.IntControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"int\",\n\t\t__type__: \"IntControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.NumberControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"number\",\n\t\t__type__: \"NumberControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"range\") {\n\t\t\t\tif (value === null)\n\t\t\t\t\treturn false;\n\t\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.StringControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"string\",\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (search.value === null || value === null)\n\t\t\t\t\treturn search.value === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.TextControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"text\",\n\t\t__type__: \"TextControl\"\n\t}\n);\n\nla.EmailControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"email\",\n\t\t__type__: \"EmailControl\"\n\t}\n);\n\nla.URLControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"url\",\n\t\t__type__: \"URLControl\"\n\t}\n);\n\nla.TelControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"tel\"\n\t}\n);\n\nla.PasswordControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"password\"\n\t}\n);\n\nla.TextAreaControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"textarea\",\n\t\t__type__: \"TextAreaControl\"\n\t}\n);\n\nla.DateControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"date\",\n\t\tsubtype: \"date\",\n\t\t__type__: \"DateControl\",\n\n\t\tasjson: function (value) {\n\t\t\tif (value instanceof Date) {\n\t\t\t\tvalue = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`;\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y\";\n\t\t},\n\n\t\t// searchvalue must be ``null``, a ``Date`` object or a string\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\n\t\t\tvar searchvalue = search.value;\n\t\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\t\tif (value !== null)\n\t\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn searchvalue === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (searchvalue === null || value === null)\n\t\t\t\t\treturn searchvalue === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.DatetimeMinuteControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimeminute\",\n\t\t__type__: \"DatetimeMinuteControl\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t\t}\n\t}\n);\n\nla.DatetimeSecondControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimesecond\",\n\t\t__type__: \"DatetimeMinuteSecond\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t\t}\n\t}\n);\n\nla.LookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"lookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupdata\"]),\n\n\t\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (this.lookupapp === null) {\n\t\t\t\tif (search.operator === \"equals\") {\n\t\t\t\t\tif (value === null)\n\t\t\t\t\t\treturn search.value === null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn value.key === search.value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (value === null || search.value === null)\n\t\t\t\t\treturn value === search.value;\n\t\t\t\telse\n\t\t\t\t\treturn value.search(search);\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.LookupSelectControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"LookupSelectControl\"\n\t}\n);\n\nla.LookupRadioControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"LookupRadioControl\"\n\t}\n);\n\nla.LookupChoiceControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"LookupChoiceControl\"\n\t}\n);\n\nla.AppLookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"applookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]),\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (value === null || search.value === null)\n\t\t\t\treturn value === search.value;\n\t\t\telse\n\t\t\t\treturn value.search(search);\n\t\t}\n\t}\n);\n\nla.AppLookupSelectControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"AppLookupSelectControl\"\n\t}\n);\n\nla.AppLookupRadioControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"AppLookupRadioControl\"\n\t}\n);\n\nla.AppLookupChoiceControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"AppLookupChoiceControl\"\n\t}\n);\n\nla.MultipleLookupControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\ttype: \"multiplelookup\",\n\n\t\t// search.value must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (this.lookupapp === null) {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].key === search.value)\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (search.value === null)\n\t\t\t\t\t\treturn value.length === 0;\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleLookupSelectControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleLookupSelectControl\"\n\t}\n);\n\nla.MultipleLookupCheckboxControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleLookupCheckboxControl\"\n\t}\n);\n\nla.MultipleAppLookupControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\ttype: \"multipleapplookup\",\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (search.value === null)\n\t\t\t\t\treturn value.length === 0;\n\t\t\t\telse {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleAppLookupSelectControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleAppLookupSelectControl\"\n\t}\n);\n\nla.MultipleAppLookupCheckboxControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleAppLookupCheckboxControl\"\n\t}\n);\n\nla.GeoControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"geo\",\n\n\n\t\tasjson: function (value) {\n\t\t\tif (la.Geo.isprotoof(value))\n\t\t\t\tvalue = `${value.lat}, ${value.long}, ${value.info}`;\n\t\t\treturn value;\n\t\t},\n\n\t\t__type__: \"GeoControl\"\n\t}\n);\n\nla.FileControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"file\",\n\t\t__type__: \"FileControl\"\n\t}\n);\n\nla.ButtonControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"button\",\n\t\t__type__: \"ButtonControl\"\n\t}\n);\n\nla.Field = ul4._inherit(\n\tla.Base,\n\t{\n\t\tcreate: function create(control, record, value) {\n\t\t\tvar field = la.Base.create.call(this);\n\t\t\tfield.control = control;\n\t\t\tfield.record = record;\n\t\t\tfield.value = value;\n\t\t\treturn field;\n\t\t},\n\n\t\tsearch: function search(searchvalue) {\n\t\t\treturn this.control.search(this.value, searchvalue);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.LookupItem = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"key\", \"label\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.User = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.File = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Geo = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"lat\", \"long\", \"info\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Attachment = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"record\", \"label\", \"active\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.NoteAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"noteattachment\",\n\t\t__type__: \"NoteAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.URLAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"urlattachment\",\n\t\t__type__: \"URLAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.FileAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"fileattachment\",\n\t\t__type__: \"FileAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.ImageAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"imageattachment\",\n\t\t__type__: \"ImageAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"])\n\t}\n);\n\nla.JSONAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"jsonattachment\",\n\t\t__type__: \"JSONAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"]),\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"value\")\n\t\t\t\treturn ul4._asjson(this.value);\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"value\")\n\t\t\t\tthis.value = ul4._fromjson(value);\n\t\t\telse\n\t\t\t\tthis[name] = value\n\t\t}\n\t}\n);\n\nla.Installation = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Category = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\tvar v = [];\n\t\t\tvar category = this;\n\t\t\twhile (category !== null) {\n\t\t\t\tv.splice(0, 0, category.identifier);\n\t\t\t\tcategory = category.parent;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.KeyView = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"key\", \"user\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.AppParameter = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"identifier\", \"description\", \"value\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"Globals\",\n\t\"App\",\n\t\"View\",\n\t\"DataSource\",\n\t\"Record\",\n\t\"BoolControl\",\n\t\"IntControl\",\n\t\"NumberControl\",\n\t\"TextControl\",\n\t\"EmailControl\",\n\t\"URLControl\",\n\t\"TelControl\",\n\t\"PasswordControl\",\n\t\"TextAreaControl\",\n\t\"DateControl\",\n\t\"DatetimeMinuteControl\",\n\t\"DatetimeSecondControl\",\n\t\"LookupControl\",\n\t\"LookupSelectControl\",\n\t\"LookupRadioControl\",\n\t\"LookupChoiceControl\",\n\t\"AppLookupControl\",\n\t\"AppLookupSelectControl\",\n\t\"AppLookupRadioControl\",\n\t\"AppLookupChoiceControl\",\n\t\"MultipleLookupControl\",\n\t\"MultipleLookupSelectControl\",\n\t\"MultipleLookupCheckboxControl\",\n\t\"MultipleAppLookupControl\",\n\t\"MultipleAppLookupSelectControl\",\n\t\"MultipleAppLookupCheckboxControl\",\n\t\"GeoControl\",\n\t\"FileControl\",\n\t\"ButtonControl\",\n\t\"Field\",\n\t\"LookupItem\",\n\t\"User\",\n\t\"File\",\n\t\"Geo\",\n\t\"NoteAttachment\",\n\t\"URLAttachment\",\n\t\"FileAttachment\",\n\t\"ImageAttachment\",\n\t\"JSONAttachment\",\n\t\"Installation\",\n\t\"Category\",\n\t\"KeyView\",\n\t\"AppParameter\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar object = la[name];\n\tul4on.register(\"de.livingapps.appdd.\" + name.toLowerCase(), object);\n}\n\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4, ul4on } from './modules/ul4';\n\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nlet nodejs: any = {};\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4on.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new nodejs.https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["define","amd","module","exports","ul4","ul4on","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","argument","set","_emptymap","_setmap","key","value","__proto__","_makeset","this","_Set","create","add","register","name","obj","ul4onname","dumps","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_clone","_level","_strings2index","_ids2index","_backrefs","_line","line","oldindent","push","join","type","Math","round","index","_str_repr","_iscolor","r","g","b","a","_isdate","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","_typeof","isa","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","decoder","pos","backrefs","readchar","charAt","readcharoreof","readblackchar","re_white","c","match","read","result","substring","backup","readnumber","re_digits","parseFloat","NaN","_repr","_beginfakeloading","oldpos","_endfakeloading","_readescape","escapechar","chars","codepoint","parseInt","isNaN","String","fromCharCode","typecode","delimiter","c2","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","proto","ul4onload","loadcontent","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_simpleclone","F","__prototype__","Proto","_nextid","_extend","attrs","_simpleinherit","baseobj","_inherit","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","_type","s","toString","cause","_internal_call","context","f","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","repr","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_unpackvar","lvalue","newvalue","iter","_iter","item","ValueError","concat","_formatsource","out","finalout","level","needlf","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","get","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","items","_lt","__lt__","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","escape","code","charCodeAt","test","_lpad","_date_repr","year","month","day","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","__repr__","_ascii","_date_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","__type__","_istemplate","_isfunction","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","Object","call","_isexception","Error","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","_strip","root","JSON","parse","replace","Function","_asul4on","_fromul4on","_format_date","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","_yearday","_week","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","isprotoof","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","decname","arg","prefix","argObject","expose","options","Context","vars","indents","_output","inheritvars","withindent","replaceoutput","clone","getoutput","Exception","__getattr__","attrname","InternalException","ReturnException","exception","BreakException","ContinueException","SyntaxError","LValueRequiredError","operation","message","LocationError","location","_templateprefix","template","parenttemplate","first","_template","Tag","tag","_outerpos","_innerpos","templateprefix","outerpos","innerpos","source","suffix","text","underline","lineno","colno","AST","ast","_handle_eval","_eval","_handle_eval_set","_eval_set","_handle_eval_modify","_eval_modify","_ul4onattrs","__setitem__","TextAST","_text","IndentAST","_maketext","LineEndAST","tagpos","codepos","tago","CodeAST","ConstAST","constant","ItemArgBase","_handle_eval_list","_eval_list","_handle_eval_dict","_eval_dict","_handle_eval_call","_eval_call","SeqItemAST","seqitem","UnpackSeqItemAST","unpackseqitem","DictItemAST","dictitem","UnpackDictItemAST","unpackdictitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","ListCompAST","varname","container","condition","listcomp","localcontext","varitems","DictAST","dict","DictCompAST","SetAST","SetCompAST","setcomp","GenExprAST","genexp","VarAST","variable","_get","_modify","functions","_ido","UnaryAST","unary","typename","_do","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","ifexpr","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","binary","ItemAST","__getitem__","splice","NotSubscriptableError","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","_append","SubAST","__sub__","__rsub__","_date_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","_date","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","div","mod","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","attr","object","sub","end","_count","_find","_rfind","old","new_","count","_replace","_lstrip","_rstrip","sep","_split","_rsplit","keepends","_splitlines","_capitalize","_join","_startswith","_endswith","_insert","_pop","_weekday","firstweekday","_mimeformat","_isoformat","default_","_items","_values","_update","_clear","realresult","__setattr__","oldvalue","CallAST","_makeargs","RenderAST","render","SliceAST","index1","index2","SetVarAST","changevar","ModifyVarAST","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","BlockAST","block","endtag","content","ForBlockAST","for_","_str_varname","WhileBlockAST","while_","cond","BreakAST","ContinueAST","CondBlockAST","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","Template","whitespace","startdelim","enddelim","docpos","_jsfunction","_asts","SignatureAST","closure","TemplateClosure","_renderbound","_rendersbound","renders","doc","_callbound","params","param","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","lower","heigher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshhold","pow","_md5","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","microsecond","_timedelta","_monthdelta","_hls","h","l","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","part","lastIndexOf","startpos","lineendlen","endpos","lastIndex","resultlist","d","yearday","jan1weekday","_isleap","leap","others","clear","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","td","total_microseconds","total_seconds","minutes","hours","_add","millisecond","myValue","otherValue","hasSeconds","hasMicroseconds","md","targetmonth","classes","la","Base","_dumpUL4ONAttr","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","Globals","geodist","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","insert","globals","Login","id","View","DataSource","identifier","Record","delete","app","_delete","update","search","fieldsearch","fields","_sparsevalues","_fields","defineProperty","controls","control","fieldvalue","field","Field","Control","subtype","_logsearch","BoolControl","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","formatstring","language","searchvalue","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","lookupapp","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","Geo","info","FileControl","ButtonControl","record","LookupItem","label","User","firstname","lastname","email","File","url","filename","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","undefined","hostName","httpsAgent","templateName","commonjs","Agent","auth_token","session","ident"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sources":["../es2015/modules/ul4.js","../es2015/modules/livingapi.js","../../src/livingsdk.ts"],"sourcesContent":["/*!\n * UL4/UL4ON JavaScript Library\n * http://www.livinglogic.de/Python/ul4c/\n * http://www.livinglogic.de/Python/ul4on/\n *\n * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany\n * Copyright 2011-2017 by Walter Dörwald\n *\n * All Rights Reserved\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*jslint vars: true */\n\n\nexport let ul4 = {};\nexport let ul4on = {};\n\nul4.version = \"41\";\n\n//\n// UL4ON\n//\n\nul4on._registry = {};\n\nul4on._havemap = (typeof (Map) === \"function\" && typeof (Map.prototype.forEach) === \"function\");\n\nul4on._havemapconstructor = false;\n\nif (ul4on._havemap) {\n\ttry {\n\t\tif (new Map([[1, 2]]).size == 1)\n\t\t\tul4on._havemapconstructor = true;\n\t}\n\tcatch (error) {\n\t}\n}\n\nul4on._haveset = (typeof (Set) === \"function\" && typeof (Set.prototype.forEach) === \"function\");\n\nul4on._havesetconstructor = false;\n\nif (ul4on._haveset) {\n\ttry {\n\t\tif (new Set([1, 2]).size == 2)\n\t\t\tul4on._havesetconstructor = true;\n\t}\n\tcatch (error) {\n\t}\n}\n\n// Function used for making maps, when the Map constructor doesn't work\nul4on._makemap = function _makemap() {\n\tvar map = new Map();\n\n\tfor (var i = 0; i < arguments.length; ++i) {\n\t\tvar argument = arguments[i];\n\t\tmap.set(argument[0], argument[1]);\n\t}\n\treturn map;\n};\n\n// Function that creates en empty Map (if supported) or an empty object\nul4on._emptymap = function _emptymap() {\n\treturn ul4on._havemap ? new Map() : {};\n};\n\n// Function that adds a (key, value) item to an object (or map)\nif (ul4on._havemap) {\n\tul4on._setmap = function _setmap(map, key, value) {\n\t\tif (map.__proto__ === Map.prototype)\n\t\t\tmap.set(key, value);\n\t\telse\n\t\t\tmap[key] = value;\n\t};\n}\nelse {\n\tul4on._setmap = function _setmap(map, key, value) {\n\t\tmap[key] = value;\n\t};\n}\n\n// Function used for making sets, when the Set constructor doesn't work (or we don't have sets)\nif (ul4on._haveset) {\n\tul4on._makeset = function _makeset() {\n\t\tvar set = this._haveset ? new Set() : ul4._Set.create();\n\n\t\tfor (var i = 0; i < arguments.length; ++i)\n\t\t\tset.add(arguments[i]);\n\t\treturn set;\n\t};\n}\nelse {\n\tul4on._makeset = function _makeset() {\n\t\tvar set = ul4._Set.create();\n\n\t\tfor (var i = 0; i < arguments.length; ++i)\n\t\t\tset.add(arguments[i]);\n\t\treturn set;\n\t};\n}\n\n// Register the object ``obj`` under the name ``name`` with the UL4ON machinery\nul4on.register = function register(name, obj) {\n\tobj.ul4onname = name;\n\tul4on._registry[name] = function () { return obj.create(); };\n},\n\n\t// Return a string that contains the object ``obj`` in the UL4ON serialization format\n\tul4on.dumps = function dumps(obj, indent) {\n\t\tvar encoder = ul4on.Encoder.create(indent);\n\t\tencoder.dump(obj);\n\t\treturn encoder.finish();\n\t},\n\n\t// Load an object from the string ``data``.\n\t// ``data`` must contain the object in the UL4ON serialization format\n\t// ``registry`` may be null or a dictionary mapping type names to objects with a create method\n\tul4on.loads = function loads(data, registry) {\n\t\tvar decoder = ul4on.Decoder.create(data, registry);\n\t\treturn decoder.load();\n\t},\n\n\t// Helper \"class\" for encoding\n\tul4on.Encoder = {\n\t\t// Create a new Encoder object\n\t\tcreate: function create(indent) {\n\t\t\tvar encoder = ul4._clone(this);\n\t\t\tencoder.indent = indent || null;\n\t\t\tencoder.data = [];\n\t\t\tencoder._level = 0;\n\t\t\tencoder._strings2index = {};\n\t\t\tencoder._ids2index = {};\n\t\t\tencoder._backrefs = 0;\n\t\t\treturn encoder;\n\t\t},\n\n\t\t_line: function _line(line) {\n\t\t\tvar i, oldindent;\n\n\t\t\tif (this.indent !== null) {\n\t\t\t\tfor (i = 0; i < this._level; ++i)\n\t\t\t\t\tthis.data.push(this.indent);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (this.data.length)\n\t\t\t\t\tthis.data.push(\" \");\n\t\t\t}\n\t\t\tthis.data.push(line);\n\n\t\t\tif (arguments.length > 1) {\n\t\t\t\toldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (i = 1; i < arguments.length; ++i)\n\t\t\t\t\tthis.dump(arguments[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t},\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish: function finish() {\n\t\t\treturn this.data.join(\"\");\n\t\t},\n\n\t\tdump: function dump(obj) {\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof (obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof (obj) == \"number\") {\n\t\t\t\tvar type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof (obj) == \"string\") {\n\t\t\t\tvar index = this._strings2index[obj];\n\t\t\t\tif (typeof (index) !== \"undefined\") {\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tthis._line(\"S\" + ul4._str_repr(obj));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.slice))\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump) {\n\t\t\t\tif (obj.__id__) {\n\t\t\t\t\tvar index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof (index) != \"undefined\") {\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (obj.__id__)\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj)) {\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var i in obj)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj)) {\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj)) {\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var key in obj) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj)) {\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow \"can't handle object\";\n\t\t}\n\t};\n\n// Helper \"class\" for decoding\nul4on.Decoder = {\n\t// Creates a new decoder for reading from the string ``data``\n\tcreate: function create(data, registry) {\n\t\tvar decoder = ul4._clone(this);\n\t\tdecoder.data = data;\n\t\tdecoder.pos = 0;\n\t\tdecoder.backrefs = [];\n\t\tdecoder.registry = typeof (registry) === \"undefined\" ? null : registry;\n\t\treturn decoder;\n\t},\n\n\t// Read a character from the buffer\n\treadchar: function readchar() {\n\t\tif (this.pos >= this.data.length)\n\t\t\tthrow \"UL4 decoder at EOF\";\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read a character from the buffer (return null on eof)\n\treadcharoreof: function readcharoreof() {\n\t\tif (this.pos >= this.data.length)\n\t\t\treturn null;\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read next not-whitespace character from the buffer\n\treadblackchar: function readblackchar() {\n\t\tvar re_white = /\\s/;\n\n\t\tfor (; ;) {\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow \"UL4 decoder at EOF\";\n\t\t\tvar c = this.data.charAt(this.pos++);\n\t\t\tif (!c.match(re_white))\n\t\t\t\treturn c;\n\t\t}\n\t},\n\n\t// Read ``size`` characters from the buffer\n\tread: function read(size) {\n\t\tif (this.pos + size > this.length)\n\t\t\tsize = this.length - this.pos;\n\t\tvar result = this.data.substring(this.pos, this.pos + size);\n\t\tthis.pos += size;\n\t\treturn result;\n\t},\n\n\t// \"unread\" one character\n\tbackup: function backup() {\n\t\t--this.pos;\n\t},\n\n\t// Read a number from the buffer\n\treadnumber: function readnumber() {\n\t\tvar re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\tfor (; ;) {\n\t\t\tvar c = this.readcharoreof();\n\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\tvalue += c;\n\t\t\telse {\n\t\t\t\tvar result = parseFloat(value);\n\t\t\t\tif (result == NaN)\n\t\t\t\t\tthrow \"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t},\n\n\t_beginfakeloading: function _beginfakeloading() {\n\t\tvar oldpos = this.backrefs.length;\n\t\tthis.backrefs.push(null);\n\t\treturn oldpos;\n\t},\n\n\t_endfakeloading: function _endfakeloading(oldpos, value) {\n\t\tthis.backrefs[oldpos] = value;\n\t},\n\n\t_readescape: function _readescape(escapechar, length) {\n\t\tvar chars = this.read(length);\n\t\tif (chars.length != length)\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\tvar codepoint = parseInt(chars, 16);\n\t\tif (isNaN(codepoint))\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\treturn String.fromCharCode(codepoint);\n\t},\n\n\t// Load the next object from the buffer\n\tload: function load() {\n\t\tvar typecode = this.readblackchar();\n\t\tvar result;\n\t\tswitch (typecode) {\n\t\t\tcase \"^\":\n\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\tcase \"n\":\n\t\t\tcase \"N\":\n\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\treturn null;\n\t\t\tcase \"b\":\n\t\t\tcase \"B\":\n\t\t\t\tresult = this.readchar();\n\t\t\t\tif (result === \"T\")\n\t\t\t\t\tresult = true;\n\t\t\t\telse if (result === \"F\")\n\t\t\t\t\tresult = false;\n\t\t\t\telse\n\t\t\t\t\tthrow \"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos;\n\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"i\":\n\t\t\tcase \"I\":\n\t\t\tcase \"f\":\n\t\t\tcase \"F\":\n\t\t\t\tresult = this.readnumber();\n\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"s\":\n\t\t\tcase \"S\":\n\t\t\t\tresult = [];\n\t\t\t\tvar delimiter = this.readblackchar();\n\t\t\t\tfor (; ;) {\n\t\t\t\t\tvar c = this.readchar();\n\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (c == \"\\\\\") {\n\t\t\t\t\t\tvar c2 = this.readchar();\n\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tresult.push(c);\n\t\t\t\t}\n\t\t\t\tresult = result.join(\"\");\n\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"c\":\n\t\t\tcase \"C\":\n\t\t\t\tresult = ul4.Color.create();\n\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._r = this.load();\n\t\t\t\tresult._g = this.load();\n\t\t\t\tresult._b = this.load();\n\t\t\t\tresult._a = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"z\":\n\t\t\tcase \"Z\":\n\t\t\t\tresult = new Date();\n\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\tresult.setDate(1);\n\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\tresult.setDate(this.load());\n\t\t\t\tresult.setHours(this.load());\n\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\tresult.setMilliseconds(this.load() / 1000);\n\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"t\":\n\t\t\tcase \"T\":\n\t\t\t\tresult = ul4.TimeDelta.create();\n\t\t\t\tresult._days = this.load();\n\t\t\t\tresult._seconds = this.load();\n\t\t\t\tresult._microseconds = this.load();\n\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"r\":\n\t\t\tcase \"R\":\n\t\t\t\tresult = ul4.slice.create();\n\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult.start = this.load();\n\t\t\t\tresult.stop = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"m\":\n\t\t\tcase \"M\":\n\t\t\t\tresult = ul4.MonthDelta.create();\n\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._months = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"l\":\n\t\t\tcase \"L\":\n\t\t\t\tresult = [];\n\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.push(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"d\":\n\t\t\tcase \"D\":\n\t\t\tcase \"e\":\n\t\t\tcase \"E\":\n\t\t\t\tif (!ul4on._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\tthrow \"ordered dictionaries are not supported!\";\n\t\t\t\tresult = ul4on._emptymap();\n\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tvar key = this.load();\n\t\t\t\t\tvar value = this.load();\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"y\":\n\t\t\tcase \"Y\":\n\t\t\t\tresult = ul4on._makeset();\n\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.add(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"o\":\n\t\t\tcase \"O\":\n\t\t\t\tvar oldpos;\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\tvar name = this.load();\n\t\t\t\tvar proto;\n\t\t\t\tif (this.registry !== null) {\n\t\t\t\t\tproto = this.registry[name];\n\t\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\tthrow \"can't load object of type \" + ul4._repr(name);\n\t\t\t\tresult = proto();\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\tresult.ul4onload(this);\n\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\tthrow \"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\tdefault:\n\t\t\t\tthrow \"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t}\n\t},\n\n\t// Return an iterator for loading the content of a object\n\tloadcontent: function load(loadcontent) {\n\t\tlet self = this;\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\tself.backup();\n\t\t\t\tif (typecode == \")\")\n\t\t\t\t\treturn { done: true };\n\t\t\t\telse\n\t\t\t\t\treturn { done: false, value: self.load() };\n\t\t\t}\n\t\t};\n\t}\n};\n\n\n//\n// UL4\n//\n\n// REs for parsing JSON\nul4._rvalidchars = /^[\\],:{}\\s]*$/;\nul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n/// Helper functions\n\n// Crockford style object creation\nul4._simpleclone = function _simpleclone(obj) {\n\tfunction F() { };\n\tF.prototype = obj;\n\tvar result = new F();\n\treturn result;\n};\n\n// Crockford style object creation + prototype chain + object ids\nul4._clone = function _clone(obj) {\n\tvar result = ul4._simpleclone(obj);\n\tresult.__prototype__ = obj;\n\tresult.__id__ = ul4.Proto._nextid++;\n\treturn result;\n};\n\n// Adds attributes from on object to another and returns it\nul4._extend = function _extend(obj, attrs) {\n\tfor (var name in attrs)\n\t\tobj[name] = attrs[name];\n\treturn obj;\n};\n\n// Clone an object via ``_simpleclone`` and extend it\nul4._simpleinherit = function _simpleinherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._simpleclone(baseobj), attrs);\n};\n\n// Clone an object via ``_clone`` and extend it\nul4._inherit = function _inherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._clone(baseobj), attrs);\n};\n\n// Convert a map to an object\nul4._map2object = function _map2object(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar newobj = {};\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (typeof (key) !== \"string\")\n\t\t\t\tthrow ul4.TypeError.create(\"keys must be strings\");\n\t\t\tnewobj[key] = value;\n\t\t});\n\t\treturn newobj;\n\t}\n\treturn obj;\n};\n\n// Clip a number to the range [0;max)\nul4._bound = function _bound(value, upper) {\n\tif (value < 0)\n\t\treturn 0;\n\telse if (value > upper)\n\t\treturn upper;\n\telse\n\t\treturn value;\n};\n\n// Create a pretty stacktrace from an exception\nul4._stacktrace = function _stacktrace(exc) {\n\tvar output = ul4._type(exc);\n\tvar s = exc.toString();\n\tif (s)\n\t\toutput += \": \" + s;\n\tif (exc.cause)\n\t\toutput += \"\\n\\n\" + ul4._stacktrace(exc.cause);\n\treturn output;\n};\n\n// Call a function ``f`` with UL4 argument handling\nul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) {\n\tvar finalargs;\n\tif (needsobject) {\n\t\tif (signature === null) {\n\t\t\tif (args.length)\n\t\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = [kwargs];\n\t\t}\n\t\telse\n\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t}\n\telse {\n\t\tif (signature === null)\n\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t}\n\tif (needscontext)\n\t\tfinalargs.unshift(context);\n\treturn f.apply(functioncontext, finalargs);\n};\n\nul4._callfunction = function _callfunction(context, f, args, kwargs) {\n\tvar name = f._ul4_name || f.name;\n\tif (typeof (f._ul4_signature) === \"undefined\" || typeof (f._ul4_needsobject) === \"undefined\" || typeof (f._ul4_needscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", \"function \" + ul4.repr(f) + \" is not callable by UL4\");\n\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n}\n\nul4._callobject = function _callobject(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_callsignature) === \"undefined\" || typeof (obj._ul4_callneedsobject) === \"undefined\" || typeof (obj._ul4_callneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", ul4.type(obj) + \" object is not callable by UL4\");\n\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n}\n\nul4._callrender = function _callrender(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_rendersignature) === \"undefined\" || typeof (obj._ul4_renderneedsobject) === \"undefined\" || typeof (obj._ul4_renderneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"render\", ul4.type(obj) + \" object is not renderable by UL4\");\n\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n}\n\nul4._call = function _call(context, f, args, kwargs) {\n\tif (typeof (f) === \"function\")\n\t\treturn ul4._callfunction(context, f, args, kwargs);\n\telse if (f && typeof (f.__call__) === \"function\")\n\t\treturn ul4._callobject(context, f, args, kwargs);\n\telse\n\t\tthrow ul4.TypeError.create(\"call\", ul4._type(f) + \" is not callable\");\n}\n\nul4._unpackvar = function _unpackvar(lvalue, value) {\n\tif (!ul4._islist(lvalue))\n\t\treturn [[lvalue, value]];\n\telse {\n\t\tvar newvalue = [];\n\t\tvar iter = ul4._iter(value);\n\n\t\tfor (var i = 0; ; ++i) {\n\t\t\tvar item = iter.next();\n\n\t\t\tif (item.done) {\n\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t}\n\t\t}\n\t\treturn newvalue;\n\t}\n};\n\nul4._formatsource = function _formatsource(out) {\n\tvar finalout = [];\n\tvar level = 0, needlf = false;\n\tfor (var i = 0; i < out.length; ++i) {\n\t\tif (typeof (out[i]) === \"number\") {\n\t\t\tlevel += out[i];\n\t\t\tneedlf = true;\n\t\t}\n\t\telse {\n\t\t\tif (needlf) {\n\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\tfor (var j = 0; j < level; ++j)\n\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\tneedlf = false;\n\t\t\t}\n\t\t\tfinalout.push(out[i]);\n\t\t}\n\t}\n\tif (needlf)\n\t\tfinalout.push(\"\\n\");\n\treturn finalout.join(\"\");\n};\n\n// Compare ``obj1`` and ``obj2`` if they have the same value\nul4._eq = function _eq(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__eq__) === \"function\")\n\t\treturn obj1.__eq__(obj2);\n\telse if (obj2 && typeof (obj2.__eq__) === \"function\")\n\t\treturn obj2.__eq__(obj1);\n\telse if (obj1 === null)\n\t\treturn obj2 === null;\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 == obj2\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 == obj2;\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.length != obj2.length)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isobject(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.hasOwnProperty(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.has(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tvar result = true;\n\t\t\tobj2.forEach(function (value, key) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\tresult = false;\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._ismap(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!result)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isset(obj1)) {\n\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\tif (ul4._isset(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse\n\t\treturn obj1 === obj2;\n};\n\n// Compare ``obj1`` and ``obj2`` if they don't have the same value\nul4._ne = function _ne(obj1, obj2) {\n\tif (obj1 && typeof (obj1.__ne__) === \"function\")\n\t\treturn obj1.__ne__(obj2);\n\telse if (obj2 && typeof (obj2.__ne__) === \"function\")\n\t\treturn obj2.__ne__(obj1);\n\telse\n\t\treturn !ul4._eq(obj1, obj2);\n}\n\nul4._unorderable = function _unorderable(operator, obj1, obj2) {\n\tthrow ul4.TypeError.create(operator, \"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n};\n\n// Return:\n// -1 when ``obj1 < obj2``,\n// 0 when ``obj1 == obj2``,\n// 1 when ``obj1 > obj2``,\n// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n// raise TypeError if objects are uncomparable\n// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\nul4._cmp = function _cmp(operator, obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2)) {\n\t\t\tvar v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t}\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn 0;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn 1;\n\t\t\t\tvar res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t}\n\t}\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\telse\n\t\tul4._unorderable(operator, obj1, obj2);\n}\n\n// Return whether ``obj1 < obj2``\nul4._lt = function _lt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__lt__) === \"function\")\n\t\treturn obj1.__lt__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() < obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length < obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1)) {\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<\", obj1, obj2);\n};\n\n// Return whether ``obj1 <= obj2``\nul4._le = function _le(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__le__) === \"function\")\n\t\treturn obj1.__le__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length <= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<=\", obj1, obj2);\n};\n\n// Return whether ``obj1 > obj2``\nul4._gt = function _gt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__gt__) === \"function\")\n\t\treturn obj1.__gt__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() > obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length > obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">\", obj1, obj2);\n};\n\n// Return whether ``obj1 >= obj2``\nul4._ge = function _ge(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__ge__) === \"function\")\n\t\treturn obj1.__ge__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length >= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">=\", obj1, obj2);\n};\n\n// Return an iterator for ``obj``\nul4._iter = function _iter(obj) {\n\tif (typeof (obj) === \"string\" || ul4._islist(obj)) {\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\treturn { value: obj[this.index++], done: false };\n\t\t\t\telse\n\t\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isiter(obj))\n\t\treturn obj;\n\telse if (obj !== null && typeof (obj.__iter__) === \"function\")\n\t\treturn obj.__iter__();\n\telse if (ul4._ismap(obj)) {\n\t\tvar keys = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tkeys.push(key);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isset(obj)) {\n\t\tvar values = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tvalues.push(value);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: values[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isul4set(obj)) {\n\t\treturn ul4._iter(obj.items);\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar keys = [];\n\t\tfor (var key in obj)\n\t\t\tkeys.push(key);\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\tthrow ul4.TypeError.create(\"iter\", ul4._type(obj) + \" object is not iterable\");\n};\n\nul4._str_repr = function _str_repr(str, ascii) {\n\tvar result = \"\";\n\tvar squote = false, dquote = false;\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tif (c == '\"') {\n\t\t\tdquote = true;\n\t\t\tif (squote)\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (c == \"'\") {\n\t\t\tsquote = true;\n\t\t\tif (dquote)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\tvar quote = (squote && !dquote) ? '\"' : \"'\";\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase '\"':\n\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\tbreak;\n\t\t\tcase \"'\":\n\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tvar escape;\n\t\t\t\tif (code < 32)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\tescape = 4;\n\t\t\t\telse\n\t\t\t\t\tescape = 8;\n\n\t\t\t\tif (escape === 0)\n\t\t\t\t\tresult += c;\n\t\t\t\telse if (escape === 2)\n\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\telse if (escape === 4)\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn quote + result + quote;\n};\n\nul4._date_repr = function _date_repr(obj, ascii) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tvar result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\tresult += \")\";\n\n\treturn result;\n};\n\nul4._map_repr = function _map_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\n\tvar i = 0;\n\tobj.forEach(function (value, key) {\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(value, ascii));\n\t});\n\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._list_repr = function _list_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"[\");\n\tfor (var i = 0; i < obj.length; ++i) {\n\t\tif (i !== 0)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(obj[i], ascii));\n\t}\n\tv.push(\"]\");\n\treturn v.join(\"\");\n};\n\nul4._set_repr = function _set_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tif (!obj.size)\n\t\tv.push(\"/\");\n\telse {\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._object_repr = function _object_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tvar i = 0;\n\tfor (var key in obj) {\n\t\tif (!obj.hasOwnProperty(key))\n\t\t\tcontinue;\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._repr_internal = function _repr_internal(obj, ascii) {\n\tif (obj === null)\n\t\treturn \"None\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_repr(obj, ascii);\n\telse if (typeof (obj) === \"number\")\n\t\treturn \"\" + obj;\n\telse if (typeof (obj) === \"function\")\n\t\tif (obj._ul4_name || obj.name)\n\t\t\treturn \"\";\n\t\telse\n\t\t\treturn \"\";\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_repr(obj, ascii);\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj, ascii);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj, ascii);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj, ascii);\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj, ascii);\n\treturn \"?\";\n};\n\n// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\nul4._repr = function _repr(obj) {\n\treturn ul4._repr_internal(obj, false);\n}\n\nul4._ascii = function _ascii(obj) {\n\treturn ul4._repr_internal(obj, true);\n}\n\nul4._date_str = function _date_str(obj) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\n\tvar result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\tif (ms)\n\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\treturn result;\n};\n\nul4._str = function _str(obj) {\n\tif (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (obj === null)\n\t\treturn \"\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn obj;\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj.toString();\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_str(obj);\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj);\n\telse if (typeof (obj) === \"object\" && typeof (obj.__str__) === \"function\")\n\t\treturn obj.__str__();\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj);\n\treturn \"?\";\n};\n\n// Convert ``obj`` to bool, according to its \"truth value\"\nul4._bool = function _bool(obj) {\n\tif (typeof (obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\treturn false;\n\telse {\n\t\tif (typeof (obj) === \"object\", typeof (obj.__bool__) === \"function\")\n\t\t\treturn obj.__bool__();\n\t\tif (ul4._islist(obj))\n\t\t\treturn obj.length !== 0;\n\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\treturn obj.size != 0;\n\t\telse if (ul4._isobject(obj)) {\n\t\t\tfor (var key in obj) {\n\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\nul4._int = function _int(obj, base) {\n\tvar result;\n\tif (base !== null) {\n\t\tif (typeof (obj) !== \"string\" || !ul4._isint(base))\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"int() requires a string and an integer\");\n\t\tresult = parseInt(obj, base);\n\t\tif (result.toString() == \"NaN\")\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\treturn result;\n\t}\n\telse {\n\t\tif (typeof (obj) == \"string\") {\n\t\t\tresult = parseInt(obj);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse if (typeof (obj) == \"number\")\n\t\t\treturn Math.floor(obj);\n\t\telse if (obj === true)\n\t\t\treturn 1;\n\t\telse if (obj === false)\n\t\t\treturn 0;\n\t\tthrow ul4.TypeError.create(\"int()\", \"int() argument must be a string or a number\");\n\t}\n};\n\n// Convert ``obj`` to a float\nul4._float = function _float(obj) {\n\tif (typeof (obj) === \"string\")\n\t\treturn parseFloat(obj);\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj;\n\telse if (obj === true)\n\t\treturn 1.0;\n\telse if (obj === false)\n\t\treturn 0.0;\n\tthrow ul4.TypeError.create(\"float()\", \"float() argument must be a string or a number\");\n};\n\n// Convert ``obj`` to a list\nul4._list = function _list(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = [];\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.push(value.value);\n\t}\n};\n\n// Convert ``obj`` to a set\nul4._set = function _set(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.add(value.value);\n\t}\n};\n\n// Return the length of ``sequence``\nul4._len = function _len(sequence) {\n\tif (typeof (sequence) == \"string\" || ul4._islist(sequence))\n\t\treturn sequence.length;\n\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\treturn sequence.size;\n\telse if (ul4._isobject(sequence)) {\n\t\tvar i = 0;\n\t\tfor (var key in sequence)\n\t\t\t++i;\n\t\treturn i;\n\t}\n\tthrow ul4.TypeError.create(\"len\", \"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n};\n\nul4._type = function _type(obj) {\n\tif (obj === null)\n\t\treturn \"none\";\n\telse if (obj === false || obj === true)\n\t\treturn \"bool\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"undefined\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn \"str\";\n\telse if (typeof (obj) === \"number\")\n\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\telse if (ul4._islist(obj))\n\t\treturn \"list\";\n\telse if (ul4._isset(obj))\n\t\treturn \"set\";\n\telse if (ul4._isdate(obj))\n\t\treturn \"date\";\n\telse if (typeof (obj.__type__) !== \"undefined\")\n\t\treturn obj.__type__;\n\telse if (ul4._istimedelta(obj))\n\t\treturn \"timedelta\";\n\telse if (ul4._isdict(obj))\n\t\treturn \"dict\";\n\telse if (ul4._istemplate(obj))\n\t\treturn \"template\";\n\telse if (ul4._isfunction(obj))\n\t\treturn \"function\";\n\treturn null;\n};\n\n\n// Return whether any of the items in ``iterable`` are true\nul4._any = function _any(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn false;\n\t\t\tif (ul4._bool(item.value))\n\t\t\t\treturn true;\n\t\t}\n\t}\n};\n\n// Return whether all of the items in ``iterable`` are true\nul4._all = function _all(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn true;\n\t\t\tif (!ul4._bool(item.value))\n\t\t\t\treturn false;\n\t\t}\n\t}\n};\n\n// Check if ``obj`` is undefined\nul4._isundefined = function _isundefined(obj) {\n\treturn typeof (obj) === \"undefined\";\n};\n\n\n// Check if ``obj`` is *not* undefined\nul4._isdefined = function _isdefined(obj) {\n\treturn typeof (obj) !== \"undefined\";\n};\n\n// Check if ``obj`` is ``None``\nul4._isnone = function _isnone(obj) {\n\treturn obj === null;\n};\n\n// Check if ``obj`` is a boolean\nul4._isbool = function _isbool(obj) {\n\treturn typeof (obj) == \"boolean\";\n};\n\n// Check if ``obj`` is a int\nul4._isint = function _isint(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) == obj;\n};\n\n// Check if ``obj`` is a float\nul4._isfloat = function _isfloat(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) != obj;\n};\n\n// Check if ``obj`` is a string\nul4._isstr = function _isstr(obj) {\n\treturn typeof (obj) == \"string\";\n};\n\n// Check if ``obj`` is a date\nul4._isdate = function _isdate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n};\n\n// Check if ``obj`` is a color\nul4._iscolor = function _iscolor(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Color));\n};\n\n// Check if ``obj`` is a timedelta object\nul4._istimedelta = function _istimedelta(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.TimeDelta));\n};\n\n// Check if ``obj`` is a monthdelta object\nul4._ismonthdelta = function _ismonthdelta(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.MonthDelta);\n};\n\n// Check if ``obj`` is a template\nul4._istemplate = function _istemplate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\");\n};\n\n// Check if ``obj`` is a function\nul4._isfunction = function _isfunction(obj) {\n\treturn typeof (obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\"));\n};\n\n// Check if ``obj`` is a list\nul4._islist = function _islist(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n};\n\n// Check if ``obj`` is a set\nul4._isset = function _isset(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n};\n\n// Check if ``obj`` is an exception (at least a UL4 exception)\nul4._isexception = function _isexception(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Error);\n};\n\nul4._isul4set = function _isul4set(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4._Set);\n};\n\n// Check if ``obj`` is an iterator\nul4._isiter = function _isiter(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.next) === \"function\";\n};\n\n// Check if ``obj`` is a JS object\nul4._isobject = function _isobject(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof (obj.__type__) === \"undefined\";\n};\n\n// Check if ``obj`` is a map\nul4._ismap = function _ismap(obj) {\n\tif (ul4on._havemap)\n\t\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\treturn false;\n};\n\n// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\nul4._isdict = function _isdict(obj) {\n\treturn ul4._isobject(obj) || ul4._ismap(obj);\n};\n\n\n// Repeat string ``str`` ``rep`` times\nul4._str_repeat = function _str_repeat(str, rep) {\n\tvar result = \"\";\n\tfor (; rep > 0; --rep)\n\t\tresult += str;\n\treturn result;\n};\n\nul4._list_repeat = function _list_repeat(list, rep) {\n\tvar result = [];\n\tfor (; rep > 0; --rep)\n\t\tfor (var i = 0; i < list.length; ++i)\n\t\t\tresult.push(list[i]);\n\treturn result;\n};\n\nul4._str_json = function _str_json(str) {\n\tvar result = \"\";\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tresult += '\\\\\"';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\tresult += c;\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn '\"' + result + '\"';\n};\n\n// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\nul4._asjson = function _asjson(obj) {\n\tif (obj === null)\n\t\treturn \"null\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"{}.undefined\";\n\telse if (obj === false)\n\t\treturn \"false\";\n\telse if (obj === true)\n\t\treturn \"true\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_json(obj);\n\telse if (typeof (obj) === \"number\") {\n\t\treturn \"\" + obj;\n\t}\n\telse if (ul4._islist(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"[\");\n\t\tfor (var i = 0; i < obj.length; ++i) {\n\t\t\tif (i != 0)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._ismap(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(value));\n\t\t});\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tfor (var key in obj) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isdate(obj)) {\n\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t}\n\telse if (ul4._istimedelta(obj)) {\n\t\treturn \"ul4.TimeDelta.create(\" + obj.days + \", \" + obj.seconds + \", \" + obj.microseconds + \")\";\n\t}\n\telse if (ul4._ismonthdelta(obj)) {\n\t\treturn \"ul4.MonthDelta.create(\" + obj.months + \")\";\n\t}\n\telse if (ul4._iscolor(obj)) {\n\t\treturn \"ul4.Color.create(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t}\n\telse if (ul4._istemplate(obj)) {\n\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t}\n\tthrow ul4.TypeError.create(\"asjson()\", \"asjson() requires a serializable object\");\n};\n\n// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\nul4._fromjson = function _fromjson(string) {\n\t// The following is from jQuery's parseJSON function\n\tstring = ul4._strip(string, null);\n\tif (root.JSON && root.JSON.parse)\n\t\treturn root.JSON.parse(string);\n\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\treturn (new Function(\"return \" + string))();\n\tthrow ul4.TypeError.create(\"fromjson()\", \"invalid JSON\");\n};\n\n// Encodes ``obj`` in the UL4 Object Notation format\nul4._asul4on = function _asul4on(obj) {\n\treturn ul4on.dumps(obj);\n};\n\n// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\nul4._fromul4on = function _fromul4on(string) {\n\treturn ul4on.loads(string);\n};\n\nul4._format_date = function _format_date(obj, fmt, lang) {\n\tvar translations = {\n\t\tde: {\n\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\ten: {\n\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\txf: \"%m/%d/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p \"\n\t\t},\n\t\tfr: {\n\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tes: {\n\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\txf: \"%d/%m/%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tit: {\n\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tda: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsv: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t},\n\t\tnl: {\n\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\txf: \"%d-%m-%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tpt: {\n\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tcs: {\n\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tsk: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tpl: {\n\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t},\n\t\thr: {\n\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsr: {\n\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y.\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t},\n\t\tro: {\n\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\thu: {\n\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t},\n\t\ttr: {\n\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tru: {\n\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tzh: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t},\n\t\tko: {\n\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t},\n\t\tja: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t}\n\t};\n\n\tvar translation = translations[lang];\n\n\tvar firstday;\n\n\tvar result = [];\n\tvar inspec = false;\n\tfor (var i = 0; i < fmt.length; ++i) {\n\t\tvar c = fmt[i];\n\t\tif (inspec) {\n\t\t\tswitch (c) {\n\t\t\t\tcase \"a\":\n\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"A\":\n\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"B\":\n\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"H\":\n\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"I\":\n\t\t\t\t\tc = ul4._lpad(((obj.getHours() - 1) % 12) + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"j\":\n\t\t\t\t\tc = ul4._lpad(ul4._yearday(obj), \"0\", 3);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"m\":\n\t\t\t\t\tc = ul4._lpad(obj.getMonth() + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"M\":\n\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"p\":\n\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"S\":\n\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"U\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 6), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"w\":\n\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"W\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 0), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"x\":\n\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"X\":\n\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"y\":\n\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"z\":\n\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\t\t// Time zone name\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.push(c);\n\t\t\tinspec = false;\n\t\t}\n\t\telse {\n\t\t\tif (c == \"%\")\n\t\t\t\tinspec = true;\n\t\t\telse\n\t\t\t\tresult.push(c);\n\t\t}\n\t}\n\treturn result.join(\"\");\n};\n\nul4._format_int = function _format_int(obj, fmt, lang) {\n\tvar work = fmt;\n\n\t// Defaults\n\tvar fill = ' ';\n\tvar align = '>'; // '<', '>', '=' or '^'\n\tvar sign = '-'; // '+', '-' or ' '\n\tvar alternate = false;\n\tvar minimumwidth = 0;\n\tvar type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t// Determine output type\n\tif (/[bcdoxXn]$/.test(work)) {\n\t\ttype = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract minimum width\n\tif (/\\d+$/.test(work)) {\n\t\tvar minimumwidthStr = /\\d+$/.exec(work);\n\t\twork = work.replace(/\\d+$/, \"\");\n\t\tif (/^0/.test(minimumwidthStr)) {\n\t\t\talign = '=';\n\t\t\tfill = '0';\n\t\t}\n\t\tminimumwidth = parseInt(minimumwidthStr);\n\t}\n\n\t// Alternate form?\n\tif (/#$/.test(work)) {\n\t\talternate = true;\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Determine sign\n\tif (/[+ -]$/.test(work)) {\n\t\tif (type == 'c')\n\t\t\tthrow ul4.ValueError.create(\"sign not allowed for integer format type 'c'\");\n\t\tsign = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract fill and align char\n\tif (work.length >= 3)\n\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\telse if (work.length == 2) {\n\t\tif (/[<>=^]$/.test(work)) {\n\t\t\talign = work[1];\n\t\t\tfill = work[0];\n\t\t}\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\telse if (work.length == 1) {\n\t\tif (/^[<>=^]$/.test(work))\n\t\t\talign = work;\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\n\t// Basic number formatting\n\tvar neg = obj < 0;\n\n\tif (neg)\n\t\tobj = -obj;\n\n\tvar output;\n\tswitch (type) {\n\t\tcase 'b':\n\t\t\toutput = obj.toString(2);\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tif (neg || obj > 65535)\n\t\t\t\tthrow ul4.ValueError.create(\"value out of bounds for c format\");\n\t\t\toutput = String.fromCharCode(obj);\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t\tcase 'o':\n\t\t\toutput = obj.toString(8);\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\toutput = obj.toString(16);\n\t\t\tbreak;\n\t\tcase 'X':\n\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\tbreak;\n\t\tcase 'n':\n\t\t\t// FIXME: locale formatting\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t}\n\n\t// The rest of the formatting\n\tif (align === '=') {\n\t\tif (neg || sign !== '-')\n\t\t\t--minimumwidth;\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\tminimumwidth -= 2;\n\n\t\tif (output.length < minimumwidth)\n\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\toutput = \"0\" + type + output;\n\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t}\n\telse {\n\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\toutput = \"0\" + type + output;\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t\tif (output.length < minimumwidth) {\n\t\t\tif (align == '<')\n\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth - output.length);\n\t\t\telse if (align == '>')\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\t\t\telse // if (align == '^')\n\t\t\t{\n\t\t\t\tvar pad = minimumwidth - output.length;\n\t\t\t\tvar padBefore = Math.floor(pad / 2);\n\t\t\t\tvar padAfter = pad - padBefore;\n\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n};\n\n// Format ``obj`` using the format string ``fmt`` in the language ``lang``\nul4._format = function _format(obj, fmt, lang) {\n\tif (typeof (lang) === \"undefined\" || lang === null)\n\t\tlang = \"en\";\n\telse {\n\t\tvar translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null };\n\t\tlang = lang.toLowerCase();\n\t\tif (typeof (translations[lang]) === \"undefined\") {\n\t\t\tlang = lang.split(/_/)[0];\n\t\t\tif (typeof (translations[lang]) === \"undefined\")\n\t\t\t\tlang = \"en\";\n\t\t}\n\t}\n\tif (ul4._isdate(obj))\n\t\treturn ul4._format_date(obj, fmt, lang);\n\telse if (ul4._isint(obj))\n\t\treturn ul4._format_int(obj, fmt, lang);\n\telse if (obj === true)\n\t\treturn ul4._format_int(1, fmt, lang);\n\telse if (obj === false)\n\t\treturn ul4._format_int(0, fmt, lang);\n};\n\nul4._lpad = function _lpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = pad + string;\n\treturn string;\n};\n\nul4._rpad = function _rpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = string + pad;\n\treturn string;\n};\n\nul4.Proto = {\n\t__prototype__: null,\n\t__id__: 0,\n\t_nextid: 1,\n\tisa: function isa(type) {\n\t\tif (this === type)\n\t\t\treturn true;\n\t\tif (this.__prototype__ === null)\n\t\t\treturn false;\n\t\treturn this.__prototype__.isa(type);\n\t},\n\n\tisprotoof: function isprotoof(obj) {\n\t\twhile (true) {\n\t\t\tif (obj === null || Object.prototype.toString.call(obj) !== \"[object Object]\" || typeof (obj.__prototype__) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\tif (obj === this)\n\t\t\t\treturn true;\n\t\t\tobj = obj.__prototype__;\n\t\t}\n\t},\n\n\t// equality comparison of objects defaults to identity comparison\n\t__eq__: function __eq__(other) {\n\t\treturn this === other;\n\t},\n\n\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t// ``__ne__`` will be synthesized from that\n\t__ne__: function __ne__(other) {\n\t\treturn !this.__eq__(other);\n\t},\n\n\t// For other comparison operators, each method has to be implemented:\n\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t// ``>=`` calls ``__ge__``\n\n\t__bool__: function __bool__() {\n\t\treturn true;\n\t}\n};\n\nul4.Signature = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create() {\n\t\t\tvar signature = ul4._clone(this);\n\t\t\tsignature.args = [];\n\t\t\tsignature.argNames = {};\n\t\t\tsignature.remargs = null;\n\t\t\tsignature.remkwargs = null;\n\n\t\t\tvar nextDefault = false;\n\t\t\tvar lastArgname = null;\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tvar argName = arguments[i];\n\t\t\t\tif (nextDefault) {\n\t\t\t\t\tsignature.args.push({ name: lastArgname, defaultValue: argName });\n\t\t\t\t\tsignature.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (argName.substr(argName.length - 1) === \"=\") {\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length - 1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tsignature.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tsignature.remargs = argName.substr(1);\n\t\t\t\t\telse {\n\t\t\t\t\t\tsignature.args.push({ name: argName });\n\t\t\t\t\t\tsignature.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn signature;\n\t\t},\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray: function bindArray(name, args, kwargs) {\n\t\t\tvar finalargs = [];\n\t\t\tvar decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\t\t\t\tif (i < args.length) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null) {\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length) {\n\t\t\t\t\tvar prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow ul4.ArgumentError.create(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null) {\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key]) {\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tvar remkwargs = {};\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tremkwargs[key] = kwargs[key];\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t},\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject: function bindObject(name, args, kwargs) {\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tvar argObject = {};\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\treturn this.toString();\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar v = [];\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t}\n);\n\n// Adds name and signature to a function/method and makes the method callable in templates\nul4.expose = function expose(signature, options, f) {\n\tif (typeof (f) === \"undefined\") {\n\t\tf = options;\n\t\toptions = {};\n\t}\n\tif (options.name)\n\t\tf._ul4_name = options.name;\n\tif (ul4._islist(signature))\n\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\tf._ul4_signature = signature;\n\tf._ul4_needsobject = options.needsobject || false;\n\tf._ul4_needscontext = options.needscontext || false;\n\n\treturn f;\n};\n\nul4.Context = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(vars) {\n\t\t\tif (vars === null || typeof (vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = vars;\n\t\t\tcontext.indents = [];\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars: function inheritvars() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = ul4._simpleclone(this.vars);\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent: function withindent(indent) {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tif (indent !== null) {\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput: function replaceoutput() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\tclone: function clone(vars) {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\toutput: function output(value) {\n\t\t\tthis._output.push(value);\n\t\t},\n\n\t\tgetoutput: function getoutput() {\n\t\t\treturn this._output.join(\"\");\n\t\t},\n\n\t\tget: function get(name) {\n\t\t\treturn this.vars[name];\n\t\t},\n\n\t\tset: function set(name, value) {\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t}\n);\n\n/// Exceptions\n\nul4.Exception = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Exception\",\n\t\t\"cause\": null,\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Exceptions used internally by UL4 for flow control\nul4.InternalException = ul4._inherit(ul4.Exception, {});\n\n// Control flow exceptions\nul4.ReturnException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ReturnException\",\n\n\t\tcreate: function create(result) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.result = result;\n\t\t\treturn exception;\n\t\t}\n\t}\n);\n\nul4.BreakException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.BreakException\"\n\t}\n);\n\nul4.ContinueException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ContinueException\"\n\t}\n);\n\n// Real exceptions raised by various parts of UL4\nul4.SyntaxError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.SyntaxError\"\n\t}\n);\n\nul4.LValueRequiredError = ul4._inherit(\n\tul4.SyntaxError,\n\t{\n\t\t__type__: \"ul4.LValueRequiredError\",\n\n\t\ttoString: function toString() {\n\t\t\treturn \"lvalue required!\";\n\t\t}\n\t}\n);\n\nul4.TypeError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.TypeError\",\n\n\t\tcreate: function create(operation, message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.operation = operation;\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ValueError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ValueError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ArgumentError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ArgumentError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\n/// Exception that wraps other exceptions while they bubble up the stack\nul4.LocationError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.LocationError\",\n\n\t\tcreate: function create(location, cause) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.location = location;\n\t\t\texception.cause = cause;\n\t\t\treturn exception;\n\t\t},\n\n\t\t_templateprefix: function (template) {\n\t\t\tvar out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tvar first = true;\n\t\t\twhile (template != null) {\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name !== null ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t},\n\n\t\t_template: function _template() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.template;\n\t\t\telse\n\t\t\t\treturn this.location.tag.template;\n\t\t},\n\n\t\t_outerpos: function _outerpos() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.pos;\n\t\t\telse {\n\t\t\t\tvar tag = this.location.tag;\n\t\t\t\tif (tag === null) // A top level template as no tag\n\t\t\t\t\treturn this.location.pos;\n\t\t\t\telse\n\t\t\t\t\treturn tag.pos;\n\t\t\t}\n\t\t},\n\n\t\t_innerpos: function _innerpos() {\n\t\t\treturn this.location.pos;\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar template = this._template();\n\t\t\tvar templateprefix = this._templateprefix(template);\n\t\t\tvar outerpos = this._outerpos();\n\t\t\tvar innerpos = this._innerpos();\n\n\t\t\tvar prefix = template.source.substring(outerpos.start, innerpos.start);\n\t\t\tvar code = template.source.substring(innerpos.start, innerpos.stop);\n\t\t\tvar suffix = template.source.substring(innerpos.stop, outerpos.stop);\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\t\t\tvar text = prefix + code + suffix;\n\t\t\tvar underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\t// find line numbers\n\t\t\tvar lineno = 1, colno = 1;\n\t\t\tfor (var i = 0; i < innerpos.start; ++i) {\n\t\t\t\tif (template.source[i] === \"\\n\") {\n\t\t\t\t\t++lineno;\n\t\t\t\t\tcolno = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++colno;\n\t\t\t}\n\n\t\t\tpos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + lineno + \"; col \" + colno;\n\n\t\t\treturn templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tcase \"template\":\n\t\t\t\t\treturn this._template;\n\t\t\t\tcase \"outerpos\":\n\t\t\t\t\treturn this._outerpos;\n\t\t\t\tcase \"innerpos\":\n\t\t\t\t\treturn this._innerpos;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n\n/// Classes for the syntax tree\nul4.AST = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(pos) {\n\t\t\tvar ast = ul4._clone(this);\n\t\t\tast.pos = pos;\n\t\t\treturn ast;\n\t\t},\n\t\t__str__: function __str__() {\n\t\t\tvar out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\tvar out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_handle_eval_modify: function _handle_eval_modify(context, operator, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t},\n\t\t_str: function _str(out) {\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this[this._ul4onattrs[i]]);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tthis[this._ul4onattrs[i]] = decoder.load();\n\t\t},\n\t\t__setitem__: function __setitem__(attrname, value) {\n\t\t\tthrow ul4.TypeError.create(\"mutate\", \"object is immutable\");\n\t\t},\n\t\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\t\t_ul4onattrs: [\"pos\"]\n\t}\n);\n\nul4.TextAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, pos) {\n\t\t\tvar text = ul4.AST.create.call(this, pos);\n\t\t\ttext.template = template;\n\t\t\treturn text;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"template\"]),\n\t\t_text: function _text() {\n\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.IndentAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\tcreate: function create(template, pos, text) {\n\t\t\tvar indent = ul4.TextAST.create.call(this, template, pos);\n\t\t\tindent._maketext(text);\n\t\t\treturn indent;\n\t\t},\n\t\t_maketext: function _maketext(text) {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tif (text === null)\n\t\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\telse\n\t\t\t\t\tthis.text = text;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.text = null;\n\t\t},\n\t\t_text: function _text() {\n\t\t\tif (this.text === null)\n\t\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\telse\n\t\t\t\treturn this.text;\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < context.indents.length; ++i)\n\t\t\t\tcontext.output(context.indents[i]);\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.TextAST.ul4ondump.call(this, encoder);\n\n\t\t\tif (this.text === this.template.source.substring(this.pos.start, this.pos.stop))\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this.text);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext(decoder.load());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.LineEndAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.Tag = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, tag, tagpos, codepos) {\n\t\t\tvar tago = ul4.AST.create.call(this, tagpos);\n\t\t\ttago.template = template;\n\t\t\ttago.tag = tag;\n\t\t\ttago.codepos = codepos;\n\t\t\ttago._maketext();\n\t\t\treturn tago;\n\t\t},\n\t\t_maketext: function _maketext() {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\tthis.code = this.template.source.substring(this.codepos.start, this.codepos.stop);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.text = null;\n\t\t\t\tthis.code = null;\n\t\t\t}\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.AST.ul4ondump.call(this, encoder);\n\t\t\tencoder.dump(this.template);\n\t\t\tencoder.dump(this.tag);\n\t\t\tencoder.dump(this.codepos);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\tthis.template = decoder.load();\n\t\t\tthis.tag = decoder.load();\n\t\t\tthis.codepos = decoder.load();\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext();\n\t\t}\n\t}\n);\n\nul4.CodeAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar code = ul4.AST.create.call(this, pos);\n\t\t\tcode.tag = tag;\n\t\t\treturn code;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"tag\"]),\n\t\t_str: function _str(out) {\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t}\n\t}\n);\n\nul4.ConstAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar constant = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tconstant.value = value;\n\t\t\treturn constant;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this.value;\n\t\t}\n\t}\n);\n\nul4.ItemArgBase = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_handle_eval_list: function _handle_eval_list(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_dict: function _handle_eval_dict(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_call: function _handle_eval_call(context, args, kwargs) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.SeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar seqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tseqitem.value = value;\n\t\t\treturn seqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t}\n);\n\n\nul4.UnpackSeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackseqitem.value = value;\n\t\t\treturn unpackseqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.DictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, key, value) {\n\t\t\tvar dictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tdictitem.key = key;\n\t\t\tdictitem.value = value;\n\t\t\treturn dictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"key\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar key = this.key._handle_eval(context);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tul4on._setmap(result, key, value);\n\t\t}\n\t}\n);\n\nul4.UnpackDictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackdictitem.item = item;\n\t\t\treturn unpackdictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item)\n\t\t\t\t\tul4on._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.PosArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t}\n);\n\nul4.KeywordArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, name, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.name = name;\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"name\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + this.name);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t}\n);\n\nul4.UnpackListArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\targs.push.apply(args, item);\n\t\t}\n\t}\n);\n\nul4.UnpackDictArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ListAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar list = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlist.items = [];\n\t\t\treturn list;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = [];\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_list(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ListCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.item = item;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = [];\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar dict = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tdict.items = [];\n\t\t\treturn dict;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._emptymap();\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_dict(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, key, value, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.key = key;\n\t\t\tlistcomp.value = value;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._emptymap();\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) {\n\t\t\t\t\tvar key = this.key._handle_eval(localcontext);\n\t\t\t\t\tvar value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar set = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tset.items = [];\n\t\t\treturn set;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_set(context, result);\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar setcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsetcomp.item = item;\n\t\t\tsetcomp.container = container;\n\t\t\tsetcomp.condition = condition;\n\t\t\treturn setcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.GenExprAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar genexp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tgenexp.item = item;\n\t\t\tgenexp.varname = varname;\n\t\t\tgenexp.container = container;\n\t\t\tgenexp.condition = condition;\n\t\t\treturn genexp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\t\t\tvar iter = ul4._iter(container);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar self = this;\n\n\t\t\tvar result = {\n\t\t\t\tnext: function () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tvar varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) {\n\t\t\t\t\t\t\tvar value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn { value: value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.VarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, name) {\n\t\t\tvar variable = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tvariable.name = name;\n\t\t\treturn variable;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"name\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this._get(context, this.name);\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthis._set(context, this.name, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t},\n\t\t_get: function _get(context, name) {\n\t\t\tvar result = context.get(name);\n\t\t\tif (typeof (result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t},\n\t\t_set: function _set(context, name, value) {\n\t\t\tcontext.set(name, value);\n\t\t},\n\t\t_modify: function _modify(context, operator, name, value) {\n\t\t\tvar newvalue = operator._ido(context.get(name), value)\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t}\n);\n\nul4.UnaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj) {\n\t\t\tvar unary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tunary.obj = obj;\n\t\t\treturn unary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t}\n);\n\n// Negation\nul4.NegAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\tif (obj !== null && typeof (obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t}\n);\n\n// Bitwise not\nul4.BitNotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn -obj - 1;\n\t\t}\n\t}\n);\n\n// Not\nul4.NotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t}\n);\n\n// If expression\nul4.IfAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, objif, objcond, objelse) {\n\t\t\tvar ifexpr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tifexpr.objif = objif;\n\t\t\tifexpr.objcond = objcond;\n\t\t\tifexpr.objelse = objelse;\n\t\t\treturn ifexpr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result;\n\t\t\tvar condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ReturnAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = this.obj._handle_eval(context);\n\t\t\tthrow ul4.ReturnException.create(result);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintXAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.BinaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj1, obj2) {\n\t\t\tvar binary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tbinary.obj1 = obj1;\n\t\t\tbinary.obj2 = obj2;\n\t\t\treturn binary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj1\", \"obj2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.type);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Item access and assignment: dict[key], list[index], string[index], color[index]\nul4.ItemAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t},\n\t\t_get: function _get(container, key) {\n\t\t\tif (typeof (container) === \"string\" || ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof (start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof (stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__getitem__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\treturn container[key];\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"[]\", ul4._type(container) + \" object is not subscriptable\");\n\t\t},\n\t\t_set: function _set(container, key, value) {\n\t\t\tif (ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop - start); // Remove old element\n\t\t\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.NotSubscriptableError.create(container);\n\t\t},\n\t\t_modify: function _modify(operator, container, key, value) {\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t}\n);\n\n// Identifty test operator ``is``\nul4.IsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t}\n);\n\n// Inverted tdentifty test operator ``is not``\nul4.IsNotAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t}\n);\n\n// Comparison operator ==\nul4.EQAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator !=\nul4.NEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <\nul4.LTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <=\nul4.LEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >\nul4.GTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >=\nul4.GEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Containment test: string in string, obj in list, key in dict, value in rgb\nul4.ContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\tif (typeof (obj) === \"string\" && typeof (container) === \"string\") {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container)) {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof (container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container)) {\n\t\t\t\tfor (var key in container) {\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container)) {\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"in\", ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t}\n);\n\n// Inverted containment test\nul4.NotContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\treturn !ul4.ContainsAST._do(obj, container);\n\t\t}\n\t}\n);\n\n// Addition: num + num, string + string\nul4.AddAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tvar result = [];\n\t\t\t\tul4._append(result, obj1);\n\t\t\t\tul4._append(result, obj2);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tul4._append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Substraction: num - num\nul4.SubAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t},\n\t\t_date_sub: function _date_sub(obj1, obj2) {\n\t\t\tvar swap = (obj2 > obj1);\n\n\t\t\tif (swap) {\n\t\t\t\tvar t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tvar year1 = obj1.getFullYear();\n\t\t\tvar yearday1 = ul4._yearday(obj1);\n\t\t\tvar year2 = obj2.getFullYear();\n\t\t\tvar yearday2 = ul4._yearday(obj2);\n\n\t\t\tvar diffdays = 0;\n\n\t\t\twhile (year1 > year2) {\n\t\t\t\tdiffdays += ul4._yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tvar hours1 = obj1.getHours();\n\t\t\tvar minutes1 = obj1.getMinutes();\n\t\t\tvar seconds1 = obj1.getSeconds();\n\t\t\tvar hours2 = obj2.getHours();\n\t\t\tvar minutes2 = obj2.getMinutes();\n\t\t\tvar seconds2 = obj2.getSeconds();\n\n\t\t\tvar diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tvar diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap) {\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Multiplication: num * num, int * str, str * int, int * list, list * int\nul4.MulAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1)) {\n\t\t\t\tif (typeof (obj2) === \"string\") {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2)) {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2)) {\n\t\t\t\tif (typeof (obj1) === \"string\") {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1)) {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2)) {\n\t\t\t\tif (obj2 > 0) {\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++])\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Truncating division\nul4.FloorDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"//\", ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// \"Real\" division\nul4.TrueDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn obj1 / obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Modulo\nul4.ModAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar div = Math.floor(obj1 / obj2);\n\t\t\tvar mod = obj1 - div * obj2;\n\n\t\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) {\n\t\t\t\tmod += obj2;\n\t\t\t\t--div;\n\t\t\t}\n\t\t\treturn obj1 - div * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise left shift\nul4.ShiftLeftAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise right shift\nul4.ShiftRightAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise and\nul4.BitAndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise exclusive or\nul4.BitXOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise or\nul4.BitOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\nul4.AndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.OrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.AttrAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, attrname) {\n\t\t\tvar attr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tattr.obj = obj;\n\t\t\tattr.attrname = attrname;\n\t\t\treturn attr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"attrname\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t},\n\t\t_get: function _get(object, attrname) {\n\t\t\tif (typeof (object) === \"string\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\treturn ul4.expose([\"old\", \"new\", \"count=\", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); });\n\t\t\t\t\tcase \"strip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function strip(chars) { return ul4._strip(object, chars); });\n\t\t\t\t\tcase \"lstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function lstrip(chars) { return ul4._lstrip(object, chars); });\n\t\t\t\t\tcase \"rstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function rstrip(chars) { return ul4._rstrip(object, chars); });\n\t\t\t\t\tcase \"split\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function split(sep, count) { return ul4._split(object, sep, count); });\n\t\t\t\t\tcase \"rsplit\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); });\n\t\t\t\t\tcase \"splitlines\":\n\t\t\t\t\t\treturn ul4.expose([\"keepends=\", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); });\n\t\t\t\t\tcase \"lower\":\n\t\t\t\t\t\treturn ul4.expose([], function lower() { return object.toLowerCase(); });\n\t\t\t\t\tcase \"upper\":\n\t\t\t\t\t\treturn ul4.expose([], function upper() { return object.toUpperCase(); });\n\t\t\t\t\tcase \"capitalize\":\n\t\t\t\t\t\treturn ul4.expose([], function capitalize() { return ul4._capitalize(object); });\n\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\treturn ul4.expose([\"iterable\"], function join(iterable) { return ul4._join(object, iterable); });\n\t\t\t\t\tcase \"startswith\":\n\t\t\t\t\t\treturn ul4.expose([\"prefix\"], function startswith(prefix) { return ul4._startswith(object, prefix); });\n\t\t\t\t\tcase \"endswith\":\n\t\t\t\t\t\treturn ul4.expose([\"suffix\"], function endswith(suffix) { return ul4._endswith(object, suffix); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._islist(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"append\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function append(items) { return ul4._append(object, items); });\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\treturn ul4.expose([\"pos\", \"*items\"], function insert(pos, items) { return ul4._insert(object, pos, items); });\n\t\t\t\t\tcase \"pop\":\n\t\t\t\t\t\treturn ul4.expose([\"pos=\", -1], function pop(pos) { return ul4._pop(object, pos); });\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isdate(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"weekday\":\n\t\t\t\t\t\treturn ul4.expose([], function weekday() { return ul4._weekday(object); });\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\treturn ul4.expose([\"firstweekday=\", null], function week(firstweekday) { return ul4._week(object, firstweekday); });\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\treturn ul4.expose([], function day() { return object.getDate(); });\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\treturn ul4.expose([], function month() { return object.getMonth() + 1; });\n\t\t\t\t\tcase \"year\":\n\t\t\t\t\t\treturn ul4.expose([], function year() { return object.getFullYear(); });\n\t\t\t\t\tcase \"hour\":\n\t\t\t\t\t\treturn ul4.expose([], function hour() { return object.getHours(); });\n\t\t\t\t\tcase \"minute\":\n\t\t\t\t\t\treturn ul4.expose([], function minute() { return object.getMinutes(); });\n\t\t\t\t\tcase \"second\":\n\t\t\t\t\t\treturn ul4.expose([], function second() { return object.getSeconds(); });\n\t\t\t\t\tcase \"microsecond\":\n\t\t\t\t\t\treturn ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; });\n\t\t\t\t\tcase \"mimeformat\":\n\t\t\t\t\t\treturn ul4.expose([], function mimeformat() { return ul4._mimeformat(object); });\n\t\t\t\t\tcase \"isoformat\":\n\t\t\t\t\t\treturn ul4.expose([], function isoformat() { return ul4._isoformat(object); });\n\t\t\t\t\tcase \"yearday\":\n\t\t\t\t\t\treturn ul4.expose([], function yearday() { return ul4._yearday(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn object.get(attrname);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isset(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Object.prototype.toString.call(object) === \"[object Object]\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar result;\n\t\t\t\t\t\tif (object && typeof (object.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\t\t\t\tresult = object.__getattr__(attrname);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult = object[attrname];\n\t\t\t\t\t\tif (typeof (result) !== \"function\")\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\tvar realresult = function () {\n\t\t\t\t\t\t\treturn result.apply(object, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\t\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\t\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\t\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\t\t\t\treturn realresult;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"get\", ul4._type(object) + \" object has no readable attributes\");\n\t\t},\n\t\t_set: function _set(object, attrname, value) {\n\t\t\tif (typeof (object) === \"object\" && typeof (object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value)\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"set\", ul4._type(object) + \" object has no writable attributes\");\n\t\t},\n\t\t_modify: function _modify(operator, object, attrname, value) {\n\t\t\tvar oldvalue = this._get(object, attrname);\n\t\t\tvar newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t}\n);\n\nul4.CallAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar call = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tcall.obj = obj;\n\t\t\tcall.args = args;\n\t\t\treturn call;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"args\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_makeargs: function _makeargs(context) {\n\t\t\tvar args = [], kwargs = {};\n\t\t\tfor (var i = 0; i < this.args.length; ++i)\n\t\t\t\tthis.args[i]._handle_eval_call(context, args, kwargs);\n\t\t\treturn { args: args, kwargs: kwargs };\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar args = this._makeargs(context);\n\t\t\tvar result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.RenderAST = ul4._inherit(\n\tul4.CallAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar render = ul4.CallAST.create.call(this, tag, pos, obj, args);\n\t\t\trender.indent = null;\n\t\t\treturn render;\n\t\t},\n\t\t_ul4onattrs: ul4.CallAST._ul4onattrs.concat([\"indent\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null) {\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent._text()));\n\t\t\t}\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\tvar localcontext = context.withindent(this.indent !== null ? this.indent._text() : null);\n\t\t\tvar obj = this.obj._handle_eval(localcontext);\n\t\t\tvar args = this._makeargs(localcontext);\n\n\t\t\ttry {\n\t\t\t\tvar result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Slice object\nul4.slice = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(start, stop) {\n\t\t\tvar slice = ul4._clone(this);\n\t\t\tslice.start = start;\n\t\t\tslice.stop = stop;\n\t\t\treturn slice;\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \")\";\n\t\t}\n\t}\n);\n\n\n// List/String slice\nul4.SliceAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, index1, index2) {\n\t\t\tvar slice = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tslice.index1 = index1;\n\t\t\tslice.index2 = index2;\n\t\t\treturn slice;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"index1\", \"index2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tvar index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn ul4.slice.create(index1, index2);\n\t\t}\n\t}\n);\n\n\nul4.SetVarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, lvalue, value) {\n\t\t\tvar changevar = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tchangevar.lvalue = lvalue;\n\t\t\tchangevar.value = value;\n\t\t\treturn changevar;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"lvalue\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_set(context, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ModifyVarAST = ul4._inherit(\n\tul4.SetVarAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_modify(context, this._operator, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST });\n\nul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST });\n\nul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST });\n\nul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST });\n\nul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST });\n\nul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST });\n\nul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST });\n\nul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST });\n\nul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST });\n\nul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST });\n\nul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST });\n\nul4.BlockAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar block = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tblock.endtag = null;\n\t\t\tblock.content = [];\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"endtag\", \"content\"]),\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i)\n\t\t\t\tthis.content[i]._handle_eval(context);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tif (this.content.length) {\n\t\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\t\tthis.content[i]._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ForBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, varname, container) {\n\t\t\tvar for_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tfor_.varname = varname;\n\t\t\tfor_.container = container;\n\t\t\treturn for_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"varname\", \"container\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str_varname: function _str_varname(out, varname) {\n\t\t\tif (ul4._islist(varname)) {\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (var i = 0; i < varname.length; ++i) {\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(context, varitems[i][1]);\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.WhileBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar while_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\twhile_.condition = condition;\n\t\t\treturn while_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \"),\n\t\t\t\tthis.container._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\twhile (true) {\n\t\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \");\n\t\t\tul4.AST._str.call(this, out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.BreakAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.BreakException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.ContinueAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.ContinueException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.CondBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\tvar block = this.content[i];\n\t\t\t\tvar execute = block._execute(context);\n\t\t\t\tif (execute) {\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ConditionalBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar block = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tblock.condition = condition;\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\tvar result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"if\" });\n\nul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"else if\" });\n\nul4.ElseBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\"),\n\t\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\treturn true;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.Template = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) {\n\t\t\tvar template = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\ttemplate.source = source;\n\t\t\ttemplate.name = name;\n\t\t\ttemplate.whitespace = whitespace;\n\t\t\ttemplate.startdelim = startdelim;\n\t\t\ttemplate.enddelim = enddelim;\n\t\t\ttemplate.docpos = null;\n\t\t\ttemplate.signature = signature;\n\t\t\ttemplate._jsfunction = null;\n\t\t\ttemplate._asts = null;\n\t\t\ttemplate._ul4_callsignature = signature;\n\t\t\ttemplate._ul4_rendersignature = signature;\n\t\t\ttemplate.parenttemplate = null;\n\t\t\treturn template;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tvar signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this.source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || ul4.SignatureAST.isprotoof(this.signature))\n\t\t\t\tsignature = this.signature;\n\t\t\telse {\n\t\t\t\tsignature = [];\n\t\t\t\tfor (var i = 0; i < this.signature.args.length; ++i) {\n\t\t\t\t\tvar arg = this.signature.args[i];\n\t\t\t\t\tif (typeof (arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name + \"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tul4.BlockAST.ul4ondump.call(this, encoder);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tvar version = decoder.load();\n\t\t\tvar signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow ul4.ValueError.create(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow ul4.ValueError.create(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\t\t\tthis.name = decoder.load();\n\t\t\tthis.source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tul4.BlockAST.ul4onload.call(this, decoder);\n\t\t},\n\t\tloads: function loads(string) {\n\t\t\treturn ul4on.loads(string);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tvar closure = ul4.TemplateClosure.create(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\") {\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\tvar localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t},\n\t\trenders: function renders(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t},\n\t\tdoc: function doc() {\n\t\t\treturn this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null;\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"tag\":\n\t\t\t\t\treturn this.tag;\n\t\t\t\tcase \"endtag\":\n\t\t\t\t\treturn this.endtag;\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\t_callbound: function _callbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcall: function call(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__type__: \"ul4.Template\" // used by ``istemplate()``\n\t}\n);\n\nul4.SignatureAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar signature = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsignature.params = [];\n\t\t\treturn signature;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.CodeAST.ul4ondump.call(this, encoder);\n\n\t\t\tvar dump = [];\n\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.AST.ul4onload.call(this, decoder);\n\t\t\tvar dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (var i = 0; i < dump.length; ++i) {\n\t\t\t\tvar param = dump[i];\n\t\t\t\tif (typeof (param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar args = [];\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse {\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ul4.Signature.create.apply(ul4.Signature, args);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t}\n);\n\nul4.TemplateClosure = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(template, signature, vars) {\n\t\t\tvar closure = ul4._clone(this);\n\t\t\tclosure.template = template;\n\t\t\tclosure.signature = signature;\n\t\t\tclosure.vars = vars;\n\t\t\tclosure._ul4_callsignature = signature;\n\t\t\tclosure._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tclosure.name = template.name;\n\t\t\tclosure.tag = template.tag;\n\t\t\tclosure.endtag = template.endtag;\n\t\t\tclosure.source = template.source;\n\t\t\tclosure.startdelim = template.startdelim;\n\t\t\tclosure.enddelim = template.enddelim;\n\t\t\tclosure.docpos = template.docpos;\n\t\t\tclosure.content = template.content;\n\t\t\treturn closure;\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this.template._callbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\treturn this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t},\n\t\t__type__: \"ul4.TemplateClosure\" // used by ``istemplate()``\n\t}\n);\n\n// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\nul4._rgb = function _rgb(r, g, b, a) {\n\treturn this.Color.create(255 * r, 255 * g, 255 * b, 255 * a);\n};\n\n// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\nul4._xmlescape = function _xmlescape(obj) {\n\tobj = ul4._str(obj);\n\tobj = obj.replace(/&/g, \"&\");\n\tobj = obj.replace(//g, \">\");\n\tobj = obj.replace(/'/g, \"'\");\n\tobj = obj.replace(/\"/g, \""\");\n\treturn obj;\n};\n\n// Convert ``obj`` to a string suitable for output into a CSV file\nul4._csv = function _csv(obj) {\n\tif (obj === null)\n\t\treturn \"\";\n\telse if (typeof (obj) !== \"string\")\n\t\tobj = ul4._repr(obj);\n\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\treturn obj;\n};\n\n// Return a string containing one character with the codepoint ``i``\nul4._chr = function _chr(i) {\n\tif (typeof (i) != \"number\")\n\t\tthrow ul4.TypeError.create(\"chr()\", \"chr() requires an int\");\n\treturn String.fromCharCode(i);\n};\n\n// Return the codepoint for the one and only character in the string ``c``\nul4._ord = function _ord(c) {\n\tif (typeof (c) != \"string\" || c.length != 1)\n\t\tthrow ul4.TypeError.create(\"ord()\", \"ord() requires a string of length 1\");\n\treturn c.charCodeAt(0);\n};\n\n// Convert an integer to a hexadecimal string\nul4._hex = function _hex(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"hex()\", \"hex() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0x\" + number.toString(16).substr(1);\n\telse\n\t\treturn \"0x\" + number.toString(16);\n};\n\n// Convert an integer to a octal string\nul4._oct = function _oct(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"oct()\", \"oct() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0o\" + number.toString(8).substr(1);\n\telse\n\t\treturn \"0o\" + number.toString(8);\n};\n\n// Convert an integer to a binary string\nul4._bin = function _bin(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"bin()\", \"bin() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0b\" + number.toString(2).substr(1);\n\telse\n\t\treturn \"0b\" + number.toString(2);\n};\n\n// Return the minimum value\nul4._min = function _min(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"min() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"min() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value < result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the maximum value\nul4._max = function _max(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"max() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"max() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value > result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the of the values from the iterable starting with ``start`` (default ``0``)\nul4._sum = function _sum(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tstart += item.value;\n\t}\n\treturn start;\n};\n\n// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._first = function _first(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar item = ul4._iter(iterable).next();\n\treturn item.done ? defaultValue : item.value;\n};\n\n// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._last = function _last(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar value = defaultValue;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tvalue = item.value;\n\t}\n\treturn value;\n};\n\n// Return a sorted version of ``iterable``\nul4._sorted = function _sorted(context, iterable, key, reverse) {\n\tvar cmp;\n\tif (key === null) {\n\t\t// FIXME: stability\n\t\tif (reverse) {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\tvar result = ul4._list(iterable);\n\t\tresult.sort(cmp);\n\t\treturn result;\n\t}\n\telse {\n\t\tvar sort = [];\n\n\t\tfor (var i = 0, iter = ul4._iter(iterable); ; ++i) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvar keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\tsort.push([keyvalue, i, item.value]);\n\t\t}\n\t\tcmp = function cmp(s1, s2) {\n\t\t\tvar res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\tif (res)\n\t\t\t\treturn reverse ? -res : res;\n\t\t\tres = ul4._cmp(s1[1], s2[1]);\n\t\t\treturn reverse ? -res : res;\n\t\t}\n\n\t\tsort.sort(cmp);\n\n\t\tvar result = [];\n\t\tfor (var i = 0; i < sort.length; ++i) {\n\t\t\tresult.push(sort[i][2]);\n\t\t}\n\t\treturn result;\n\t}\n};\n\n// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step``\nul4._range = function _range(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required range() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar lower, higher;\n\tif (step === 0)\n\t\tthrow ul4.ValueError.create(\"range() requires a step argument != 0\");\n\telse if (step > 0) {\n\t\tlower = start;\n\t\theigher = stop;\n\t}\n\telse {\n\t\tlower = stop;\n\t\theigher = start;\n\t}\n\tvar length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0;\n\n\treturn {\n\t\tindex: 0,\n\t\tnext: function () {\n\t\t\tif (this.index >= length)\n\t\t\t\treturn { done: true };\n\t\t\treturn { value: start + (this.index++) * step, done: false };\n\t\t}\n\t};\n};\n\n// Return a iterable object returning a slice from the argument\nul4._slice = function _slice(args) {\n\tvar iterable, start, stop, step;\n\tif (args.length < 2)\n\t\tthrow ul4.ArgumentError.create(\"required slice() argument missing\");\n\telse if (args.length > 4)\n\t\tthrow ul4.ArgumentError.create(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 2) {\n\t\titerable = args[0];\n\t\tstart = 0;\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 4) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = args[3] !== null ? args[3] : 1;\n\t}\n\tif (start < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a start argument >= 0\");\n\tif (stop < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a stop argument >= 0\");\n\tif (step <= 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a step argument > 0\");\n\n\tvar next = start, count = 0;\n\tvar iter = ul4._iter(iterable);\n\treturn {\n\t\tnext: function () {\n\t\t\tvar result;\n\t\t\twhile (count < next) {\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t}\n\t\t\tif (stop !== null && count >= stop)\n\t\t\t\treturn { done: true };\n\t\t\tresult = iter.next();\n\t\t\tif (result.done)\n\t\t\t\treturn result;\n\t\t\t++count;\n\t\t\tnext += step;\n\t\t\tif (stop !== null && next > stop)\n\t\t\t\tnext = stop;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// ``%`` escape unsafe characters in the string ``string``\nul4._urlquote = function _urlquote(string) {\n\treturn encodeURIComponent(string);\n};\n\n// The inverse function of ``urlquote``\nul4._urlunquote = function _urlunquote(string) {\n\treturn decodeURIComponent(string);\n};\n\n// Return a reverse iterator over ``sequence``\nul4._reversed = function _reversed(sequence) {\n\tif (typeof (sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\tsequence = ul4._list(sequence);\n\treturn {\n\t\tindex: sequence.length - 1,\n\t\tnext: function () {\n\t\t\treturn this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true };\n\t\t}\n\t};\n};\n\n// Returns a random number in the interval ``[0;1[``\nul4._random = function _random() {\n\treturn Math.random();\n};\n\n// Return a randomly select item from ``range(start, stop, step)``\nul4._randrange = function _randrange(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required randrange() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar width = stop - start;\n\n\tvar value = Math.random();\n\n\tvar n;\n\tif (step > 0)\n\t\tn = Math.floor((width + step - 1) / step);\n\telse if (step < 0)\n\t\tn = Math.floor((width + step + 1) / step);\n\telse\n\t\tthrow ul4.ValueError.create(\"randrange() requires a step argument != 0\");\n\treturn start + step * Math.floor(value * n);\n};\n\n// Return a random item/char from the list/string ``sequence``\nul4._randchoice = function _randchoice(sequence) {\n\tvar iscolor = ul4._iscolor(sequence);\n\tif (typeof (sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\tthrow ul4.TypeError.create(\"randchoice() requires a string or list\");\n\tif (iscolor)\n\t\tsequence = ul4._list(sequence);\n\treturn sequence[Math.floor(Math.random() * sequence.length)];\n};\n\n// Round a number ``x`` to ``digits`` decimal places (may be negative)\nul4._round = function _round(x, digits) {\n\tif (typeof (digits) === \"undefined\")\n\t\tdigits = 0;\n\tif (digits) {\n\t\tvar threshhold = Math.pow(10, digits);\n\t\treturn Math.round(x * threshhold) / threshhold;\n\t}\n\telse\n\t\treturn Math.round(x);\n};\n\n// Return a hex-encode MD5 hash of the argument\n// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5\nul4._md5 = function _md5(string) {\n\treturn md5(string);\n};\n\n// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\nul4._enumerate = function _enumerate(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\treturn {\n\t\titer: ul4._iter(iterable),\n\t\tindex: start,\n\t\tnext: function () {\n\t\t\tvar item = this.iter.next();\n\t\t\treturn item.done ? item : { value: [this.index++, item.value], done: false };\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\nul4._isfirst = function _isfirst(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\treturn {\n\t\tnext: function () {\n\t\t\tvar item = iter.next();\n\t\t\tvar result = item.done ? item : { value: [isfirst, item.value], done: false };\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\nul4._islast = function _islast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._isfirstlast = function _isfirstlast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._enumfl = function _enumfl(iterable, start) {\n\tvar iter = ul4._iter(iterable);\n\tvar i = start;\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [i++, isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\nul4._zip = function _zip(iterables) {\n\tvar result;\n\tif (iterables.length) {\n\t\tvar iters = [];\n\t\tfor (var i = 0; i < iterables.length; ++i)\n\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tvar items = [];\n\t\t\t\tfor (var i = 0; i < iters.length; ++i) {\n\t\t\t\t\tvar item = iters[i].next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\treturn item;\n\t\t\t\t\titems.push(item.value);\n\t\t\t\t}\n\t\t\t\treturn { value: items, done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n};\n\n// Return the absolute value for the number ``number``\nul4._abs = function _abs(number) {\n\tif (number !== null && typeof (number.__abs__) === \"function\")\n\t\treturn number.__abs__();\n\treturn Math.abs(number);\n};\n\n// Return a ``Date`` object from the arguments passed in\nul4._date = function _date(year, month, day, hour, minute, second, microsecond) {\n\tif (typeof (hour) === \"undefined\")\n\t\thour = 0;\n\n\tif (typeof (minute) === \"undefined\")\n\t\tminute = 0;\n\n\tif (typeof (second) === \"undefined\")\n\t\tsecond = 0;\n\n\tif (typeof (microsecond) === \"undefined\")\n\t\tmicrosecond = 0;\n\n\treturn new Date(year, month - 1, day, hour, minute, second, microsecond / 1000);\n};\n\n// Return a ``TimeDelta`` object from the arguments passed in\nul4._timedelta = function _timedelta(days, seconds, microseconds) {\n\treturn this.TimeDelta.create(days, seconds, microseconds);\n};\n\n// Return a ``MonthDelta`` object from the arguments passed in\nul4._monthdelta = function _monthdelta(months) {\n\treturn this.MonthDelta.create(months);\n};\n\n// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\nul4._hls = function _hls(h, l, s, a) {\n\tvar _v = function (m1, m2, hue) {\n\t\thue = hue % 1.0;\n\t\tif (hue < 1 / 6)\n\t\t\treturn m1 + (m2 - m1) * hue * 6.0;\n\t\telse if (hue < 0.5)\n\t\t\treturn m2;\n\t\telse if (hue < 2 / 3)\n\t\t\treturn m1 + (m2 - m1) * (2 / 3 - hue) * 6.0;\n\t\treturn m1;\n\t};\n\n\tvar m1, m2;\n\tif (typeof (a) === \"undefined\")\n\t\ta = 1;\n\tif (s === 0.0)\n\t\treturn ul4._rgb(l, l, l, a);\n\tif (l <= 0.5)\n\t\tm2 = l * (1.0 + s);\n\telse\n\t\tm2 = l + s - (l * s);\n\tm1 = 2.0 * l - m2;\n\treturn ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a);\n};\n\n// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\nul4._hsv = function _hsv(h, s, v, a) {\n\tif (s === 0.0)\n\t\treturn ul4._rgb(v, v, v, a);\n\tvar i = Math.floor(h * 6.0);\n\tvar f = (h * 6.0) - i;\n\tvar p = v * (1.0 - s);\n\tvar q = v * (1.0 - s * f);\n\tvar t = v * (1.0 - s * (1.0 - f));\n\tswitch (i % 6) {\n\t\tcase 0:\n\t\t\treturn ul4._rgb(v, t, p, a);\n\t\tcase 1:\n\t\t\treturn ul4._rgb(q, v, p, a);\n\t\tcase 2:\n\t\t\treturn ul4._rgb(p, v, t, a);\n\t\tcase 3:\n\t\t\treturn ul4._rgb(p, q, v, a);\n\t\tcase 4:\n\t\t\treturn ul4._rgb(t, p, v, a);\n\t\tcase 5:\n\t\t\treturn ul4._rgb(v, p, q, a);\n\t}\n};\n\n// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\nul4._get = function _get(container, key, defaultvalue) {\n\tif (ul4._ismap(container)) {\n\t\tif (container.has(key))\n\t\t\treturn container.get(key);\n\t\treturn defaultvalue;\n\t}\n\telse if (ul4._isobject(container)) {\n\t\tvar result = container[key];\n\t\tif (typeof (result) === \"undefined\")\n\t\t\treturn defaultvalue;\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"get()\", \"get() requires a dict\");\n};\n\n// Return a ``Date`` object for the current time\nul4.now = function now() {\n\treturn new Date();\n};\n\n// Return a ``Date`` object for the current time in UTC\nul4.utcnow = function utcnow() {\n\tvar now = new Date();\n\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n};\n\nul4.functions = {\n\trepr: ul4.expose([\"obj\"], { name: \"repr\" }, ul4._repr),\n\tascii: ul4.expose([\"obj\"], { name: \"ascii\" }, ul4._ascii),\n\tstr: ul4.expose([\"obj=\", \"\"], { name: \"str\" }, ul4._str),\n\tint: ul4.expose([\"obj=\", 0, \"base=\", null], { name: \"int\" }, ul4._int),\n\tfloat: ul4.expose([\"obj=\", 0.0], { name: \"float\" }, ul4._float),\n\tlist: ul4.expose([\"iterable=\", []], { name: \"list\" }, ul4._list),\n\tset: ul4.expose([\"iterable=\", []], { name: \"set\" }, ul4._set),\n\tbool: ul4.expose([\"obj=\", false], { name: \"bool\" }, ul4._bool),\n\tlen: ul4.expose([\"sequence\"], { name: \"len\" }, ul4._len),\n\ttype: ul4.expose([\"obj\"], { name: \"type\" }, ul4._type),\n\tformat: ul4.expose([\"obj\", \"fmt\", \"lang=\", null], { name: \"format\" }, ul4._format),\n\tany: ul4.expose([\"iterable\"], { name: \"any\" }, ul4._any),\n\tall: ul4.expose([\"iterable\"], { name: \"all\" }, ul4._all),\n\tzip: ul4.expose([\"*iterables\"], { name: \"zip\" }, ul4._zip),\n\tisundefined: ul4.expose([\"obj\"], { name: \"isundefined\" }, ul4._isundefined),\n\tisdefined: ul4.expose([\"obj\"], { name: \"isdefined\" }, ul4._isdefined),\n\tisnone: ul4.expose([\"obj\"], { name: \"isnone\" }, ul4._isnone),\n\tisbool: ul4.expose([\"obj\"], { name: \"isbool\" }, ul4._isbool),\n\tisint: ul4.expose([\"obj\"], { name: \"isint\" }, ul4._isint),\n\tisfloat: ul4.expose([\"obj\"], { name: \"isfloat\" }, ul4._isfloat),\n\tisstr: ul4.expose([\"obj\"], { name: \"isstr\" }, ul4._isstr),\n\tisdate: ul4.expose([\"obj\"], { name: \"isdate\" }, ul4._isdate),\n\tiscolor: ul4.expose([\"obj\"], { name: \"iscolor\" }, ul4._iscolor),\n\tistimedelta: ul4.expose([\"obj\"], { name: \"istimedelta\" }, ul4._istimedelta),\n\tismonthdelta: ul4.expose([\"obj\"], { name: \"ismonthdelta\" }, ul4._ismonthdelta),\n\tistemplate: ul4.expose([\"obj\"], { name: \"istemplate\" }, ul4._istemplate),\n\tisfunction: ul4.expose([\"obj\"], { name: \"isfunction\" }, ul4._isfunction),\n\tislist: ul4.expose([\"obj\"], { name: \"islist\" }, ul4._islist),\n\tisset: ul4.expose([\"obj\"], { name: \"isset\" }, ul4on._haveset ? ul4._isset : ul4._isul4set),\n\tisdict: ul4.expose([\"obj\"], { name: \"isdict\" }, ul4._isdict),\n\tisexception: ul4.expose([\"obj\"], { name: \"isexception\" }, ul4._isexception),\n\tasjson: ul4.expose([\"obj\"], { name: \"asjson\" }, ul4._asjson),\n\tfromjson: ul4.expose([\"string\"], { name: \"fromjson\" }, ul4._fromjson),\n\tasul4on: ul4.expose([\"obj\"], { name: \"asul4on\" }, ul4._asul4on),\n\tfromul4on: ul4.expose([\"string\"], { name: \"fromul4on\" }, ul4._fromul4on),\n\tnow: ul4.expose([], ul4.now),\n\tutcnow: ul4.expose([], ul4.utcnow),\n\tenumerate: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumerate\" }, ul4._enumerate),\n\tisfirst: ul4.expose([\"iterable\"], { name: \"isfirst\" }, ul4._isfirst),\n\tislast: ul4.expose([\"iterable\"], { name: \"islast\" }, ul4._islast),\n\tisfirstlast: ul4.expose([\"iterable\"], { name: \"isfirstlast\" }, ul4._isfirstlast),\n\tenumfl: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumfl\" }, ul4._enumfl),\n\tabs: ul4.expose([\"number\"], { name: \"abs\" }, ul4._abs),\n\tdate: ul4.expose([\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], { name: \"date\" }, ul4._date),\n\ttimedelta: ul4.expose([\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], { name: \"timedelta\" }, ul4._timedelta),\n\tmonthdelta: ul4.expose([\"months=\", 0], { name: \"monthdelta\" }, ul4._monthdelta),\n\trgb: ul4.expose([\"r\", \"g\", \"b\", \"a=\", 1.0], { name: \"rgb\" }, ul4._rgb),\n\thls: ul4.expose([\"h\", \"l\", \"s\", \"a=\", 1.0], { name: \"hls\" }, ul4._hls),\n\thsv: ul4.expose([\"h\", \"s\", \"v\", \"a=\", 1.0], { name: \"hsv\" }, ul4._hsv),\n\txmlescape: ul4.expose([\"obj\"], { name: \"xmlescape\" }, ul4._xmlescape),\n\tcsv: ul4.expose([\"obj\"], { name: \"csv\" }, ul4._csv),\n\tchr: ul4.expose([\"i\"], { name: \"chr\" }, ul4._chr),\n\tord: ul4.expose([\"c\"], { name: \"ord\" }, ul4._ord),\n\thex: ul4.expose([\"number\"], { name: \"hex\" }, ul4._hex),\n\toct: ul4.expose([\"number\"], { name: \"oct\" }, ul4._oct),\n\tbin: ul4.expose([\"number\"], { name: \"bin\" }, ul4._bin),\n\tmin: ul4.expose([\"*obj\"], { name: \"min\" }, ul4._min),\n\tmax: ul4.expose([\"*obj\"], { name: \"max\" }, ul4._max),\n\tsum: ul4.expose([\"iterable\", \"start=\", 0], { name: \"sum\" }, ul4._sum),\n\tfirst: ul4.expose([\"iterable\", \"default=\", null], { name: \"first\" }, ul4._first),\n\tlast: ul4.expose([\"iterable\", \"default=\", null], { name: \"last\" }, ul4._last),\n\tsorted: ul4.expose([\"iterable\", \"key=\", null, \"reverse=\", false], { name: \"sorted\", needscontext: true }, ul4._sorted),\n\trange: ul4.expose([\"*args\"], { name: \"range\" }, ul4._range),\n\tslice: ul4.expose([\"*args\"], { name: \"slice\" }, ul4._slice),\n\turlquote: ul4.expose([\"string\"], { name: \"urlquote\" }, ul4._urlquote),\n\turlunquote: ul4.expose([\"string\"], { name: \"urlunquote\" }, ul4._urlunquote),\n\treversed: ul4.expose([\"sequence\"], { name: \"reversed\" }, ul4._reversed),\n\trandom: ul4.expose([], { name: \"random\" }, ul4._random),\n\trandrange: ul4.expose([\"*args\"], { name: \"randrange\" }, ul4._randrange),\n\trandchoice: ul4.expose([\"sequence\"], { name: \"randchoice\" }, ul4._randchoice),\n\tround: ul4.expose([\"x\", \"digit=\", 0], { name: \"round\" }, ul4._round),\n\tmd5: ul4.expose([\"string\"], { name: \"md5\" }, ul4._md5)\n};\n\n// Functions implementing UL4 methods\nul4._replace = function _replace(string, old, new_, count) {\n\tif (count === null)\n\t\tcount = string.length;\n\n\tvar result = [];\n\twhile (string.length) {\n\t\tvar pos = string.indexOf(old);\n\t\tif (pos === -1 || !count--) {\n\t\t\tresult.push(string);\n\t\t\tbreak;\n\t\t}\n\t\tresult.push(string.substr(0, pos));\n\t\tresult.push(new_);\n\t\tstring = string.substr(pos + old.length);\n\t}\n\treturn result.join(\"\");\n};\n\nul4._strip = function _strip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"strip()\", \"strip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._lstrip = function _lstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"lstrip()\", \"lstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\treturn string;\n};\n\nul4._rstrip = function _rstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rstrip()\", \"rstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._split = function _split(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"split()\", \"split() requires a string\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.indexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.push(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(string.substr(0, pos));\n\t\t\t\tstring = string.substr(pos + sep.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._lstrip(string, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.push(part);\n\t\t\t\tstring = string.substr(part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._rsplit = function _rsplit(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rsplit()\", \"rsplit() requires a string as second argument\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.lastIndexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.unshift(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.unshift(string.substr(pos + sep.length));\n\t\t\t\tstring = string.substr(0, pos);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._rstrip(string, null, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse {\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\tpart = part[part.length - 1];\n\t\t\t\t}\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.unshift(part);\n\t\t\t\tstring = string.substr(0, string.length - part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._splitlines = function _splitlines(string, keepends) {\n\tvar lookingAtLineEnd = function lookingAtLineEnd() {\n\t\tvar c = string[pos];\n\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\treturn 1;\n\t\tif (c === '\\r') {\n\t\t\tif (pos == length - 1)\n\t\t\t\treturn 1;\n\t\t\tif (string[pos + 1] === '\\n')\n\t\t\t\treturn 2;\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tvar result = [], length = string.length;\n\n\tfor (var pos = 0, startpos = 0; ;) {\n\t\tif (pos >= length) {\n\t\t\tif (startpos != pos)\n\t\t\t\tresult.push(string.substring(startpos));\n\t\t\treturn result;\n\t\t}\n\t\tvar lineendlen = lookingAtLineEnd();\n\t\tif (!lineendlen)\n\t\t\t++pos;\n\t\telse {\n\t\t\tvar endpos = pos + (keepends ? lineendlen : 0);\n\t\t\tresult.push(string.substring(startpos, endpos));\n\t\t\tpos += lineendlen;\n\t\t\tstartpos = pos;\n\t\t}\n\t}\n};\n\nul4._count = function _count(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\n\tvar isstr = ul4._isstr(obj);\n\n\tif (isstr && !sub.length) {\n\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\treturn 0;\n\t\tvar result = end - start + 1;\n\t\tif (result > obj.length + 1)\n\t\t\tresult = obj.length + 1;\n\t\treturn result;\n\t}\n\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tvar count = 0;\n\tif (ul4._islist(obj)) {\n\t\tfor (var i = start; i < end; ++i) {\n\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t++count;\n\t\t}\n\t\treturn count;\n\t}\n\telse // string\n\t{\n\t\tvar lastIndex = start;\n\n\t\tfor (; ;) {\n\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\tif (lastIndex == -1)\n\t\t\t\tbreak;\n\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\tbreak;\n\t\t\t++count;\n\t\t\tlastIndex += sub.length;\n\t\t}\n\t\treturn count;\n\t}\n};\n\nul4._find = function _find(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.indexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._rfind = function _rfind(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.lastIndexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._capitalize = function _capitalize(obj) {\n\tif (typeof (obj) != \"string\")\n\t\tthrow ul4.TypeError.create(\"capitalize()\", \"capitalize() requires a string\");\n\n\tif (obj.length)\n\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\treturn obj;\n};\n\nul4._items = function _items(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push([key, value]);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push([key, obj[key]]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"items()\", \"items() requires a dict\");\n};\n\nul4._values = function _values(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push(value);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push(obj[key]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"values()\", \"values() requires a dict\");\n};\n\nul4._join = function _join(sep, iterable) {\n\tvar resultlist = [];\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tresultlist.push(item.value);\n\t}\n\treturn resultlist.join(sep);\n};\n\nul4._startswith = function _startswith(string, prefix) {\n\tif (typeof (prefix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"startswith()\", \"startswith() argument must be string\");\n\n\treturn string.substr(0, prefix.length) === prefix;\n};\n\nul4._endswith = function _endswith(string, suffix) {\n\tif (typeof (suffix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"endswith()\", \"endswith() argument must be string\");\n\n\treturn string.substr(string.length - suffix.length) === suffix;\n};\n\nul4._isoformat = function _isoformat(obj) {\n\tif (!ul4._isdate(obj))\n\t\tthrow ul4.TypeError.create(\"isoformat()\", \"isoformat() requires a date\");\n\n\tvar result = obj.getFullYear() + \"-\" + ul4._lpad((obj.getMonth() + 1).toString(), \"0\", 2) + \"-\" + ul4._lpad(obj.getDate().toString(), \"0\", 2);\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\treturn result;\n};\n\nul4._mimeformat = function _mimeformat(obj) {\n\tvar weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\tvar monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\treturn weekdayname[ul4._weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n};\n\nul4._weekday = function _weekday(obj) {\n\tvar d = obj.getDay();\n\treturn d ? d - 1 : 6;\n};\n\nul4._week = function _week(obj, firstweekday) {\n\tif (firstweekday === null)\n\t\tfirstweekday = 0;\n\telse\n\t\tfirstweekday %= 7;\n\n\tvar yearday = ul4._yearday(obj) + 6;\n\tvar jan1 = new Date(obj.getFullYear(), 0, 1);\n\tvar jan1weekday = jan1.getDay();\n\tif (--jan1weekday < 0)\n\t\tjan1weekday = 6;\n\n\twhile (jan1weekday != firstweekday) {\n\t\t--yearday;\n\t\tif (++jan1weekday == 7)\n\t\t\tjan1weekday = 0;\n\t}\n\treturn Math.floor(yearday / 7);\n};\n\nul4._isleap = function _isleap(obj) {\n\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n};\n\nul4._yearday = function _yearday(obj) {\n\tvar leap = ul4._isleap(obj) ? 1 : 0;\n\tvar day = obj.getDate();\n\tswitch (obj.getMonth()) {\n\t\tcase 0:\n\t\t\treturn day;\n\t\tcase 1:\n\t\t\treturn 31 + day;\n\t\tcase 2:\n\t\t\treturn 31 + 28 + leap + day;\n\t\tcase 3:\n\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\tcase 4:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\tcase 5:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\tcase 6:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\tcase 7:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\tcase 8:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\tcase 9:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\tcase 10:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\tcase 11:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t}\n};\n\nul4._append = function _append(obj, items) {\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.push(items[i]);\n\treturn null;\n};\n\nul4._insert = function _insert(obj, pos, items) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.splice(pos++, 0, items[i]);\n\treturn null;\n};\n\nul4._pop = function _pop(obj, pos) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tvar result = obj[pos];\n\tobj.splice(pos, 1);\n\treturn result;\n};\n\nul4._update = function _update(obj, others, kwargs) {\n\tif (!ul4._isdict(obj))\n\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict\");\n\tfor (var i = 0; i < others.length; ++i) {\n\t\tvar other = others[i];\n\t\tif (ul4._ismap(other)) {\n\t\t\tother.forEach(function (value, key) {\n\t\t\t\tul4on._setmap(obj, key, value);\n\t\t\t});\n\t\t}\n\t\telse if (ul4._isobject(other)) {\n\t\t\tfor (var key in other)\n\t\t\t\tul4on._setmap(obj, key, other[key]);\n\t\t}\n\t\telse if (ul4._islist(other)) {\n\t\t\tfor (var j = 0; j < other.length; ++j) {\n\t\t\t\tif (!ul4._islist(other[j]) || (other[j].length != 2))\n\t\t\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\tul4on._setmap(obj, other[j][0], other[j][1]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t}\n\tfor (var key in kwargs)\n\t\tul4on._setmap(obj, key, kwargs[key]);\n\treturn null;\n};\n\nul4._clear = function _clear(obj) {\n\tif (ul4._ismap(obj))\n\t\tobj.clear();\n\telse if (ul4._isset(obj))\n\t\tobj.clear();\n\telse if (ul4._isobject(obj)) {\n\t\tfor (var key in obj)\n\t\t\tdelete obj[key];\n\t}\n\telse\n\t\tthrow ul4.TypeError.create(\"clear()\", \"clear() requires a dict or set\");\n\treturn null;\n};\n\nul4.Color = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Color\",\n\n\t\tcreate: function create(r, g, b, a) {\n\t\t\tvar c = ul4._clone(this);\n\t\t\tc._r = typeof (r) !== \"undefined\" ? r : 0;\n\t\t\tc._g = typeof (g) !== \"undefined\" ? g : 0;\n\t\t\tc._b = typeof (b) !== \"undefined\" ? b : 0;\n\t\t\tc._a = typeof (a) !== \"undefined\" ? a : 255;\n\t\t\treturn c;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a / 255) + \")\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__iter__: function __iter__() {\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function () {\n\t\t\t\t\tif (this.index == 0) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._r, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._g, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._b, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._a, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"r\":\n\t\t\t\t\treturn ul4.expose([], function r() { return self._r; });\n\t\t\t\tcase \"g\":\n\t\t\t\t\treturn ul4.expose([], function g() { return self._g; });\n\t\t\t\tcase \"b\":\n\t\t\t\t\treturn ul4.expose([], function b() { return self._b; });\n\t\t\t\tcase \"a\":\n\t\t\t\t\treturn ul4.expose([], function a() { return self._a; });\n\t\t\t\tcase \"lum\":\n\t\t\t\t\treturn ul4.expose([], function lum() { return self.lum(); });\n\t\t\t\tcase \"hls\":\n\t\t\t\t\treturn ul4.expose([], function hls() { return self.hls(); });\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\treturn ul4.expose([], function hlsa() { return self.hlsa(); });\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\treturn ul4.expose([], function hsv() { return self.hsv(); });\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\treturn ul4.expose([], function hsva() { return self.hsva(); });\n\t\t\t\tcase \"witha\":\n\t\t\t\t\treturn ul4.expose([\"a\"], function witha(a) { return self.witha(a); });\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function withlum(lum) { return self.withlum(lum); });\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function abslum(lum) { return self.abslum(lum); });\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function rellum(lum) { return self.rellum(lum); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__getitem__: function __getitem__(key) {\n\t\t\tvar orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._iscolor(other))\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t},\n\n\t\tr: ul4.expose([], function r() { return this._r; }),\n\n\t\tg: ul4.expose([], function g() { return this._g; }),\n\n\t\tb: ul4.expose([], function b() { return this._b; }),\n\n\t\ta: ul4.expose([], function a() { return this._a; }),\n\n\t\tlum: ul4.expose([], function lum() { return this.hls()[1]; }),\n\n\t\thls: ul4.expose([],\n\t\t\tfunction hls() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar h, l, s;\n\t\t\t\tvar rc, gc, bc;\n\n\t\t\t\tl = (minc + maxc) / 2.0;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, l, 0.0];\n\t\t\t\tif (l <= 0.5)\n\t\t\t\t\ts = (maxc - minc) / (maxc + minc);\n\t\t\t\telse\n\t\t\t\t\ts = (maxc - minc) / (2.0 - maxc - minc);\n\t\t\t\trc = (maxc - r) / (maxc - minc);\n\t\t\t\tgc = (maxc - g) / (maxc - minc);\n\t\t\t\tbc = (maxc - b) / (maxc - minc);\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, l, s];\n\t\t\t}\n\t\t),\n\n\t\thlsa: ul4.expose([],\n\t\t\tfunction hlsa() {\n\t\t\t\tvar hls = this.hls();\n\t\t\t\treturn hls.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\thsv: ul4.expose([],\n\t\t\tfunction hsv() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar v = maxc;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, 0.0, v];\n\t\t\t\tvar s = (maxc - minc) / maxc;\n\t\t\t\tvar rc = (maxc - r) / (maxc - minc);\n\t\t\t\tvar gc = (maxc - g) / (maxc - minc);\n\t\t\t\tvar bc = (maxc - b) / (maxc - minc);\n\t\t\t\tvar h;\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\t\t),\n\n\t\thsva: ul4.expose([],\n\t\t\tfunction hsva() {\n\t\t\t\tvar hsv = this.hsv();\n\t\t\t\treturn hsv.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\twitha: ul4.expose([\"a\"],\n\t\t\tfunction witha(a) {\n\t\t\t\tif (typeof (a) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\treturn ul4.Color.create(this._r, this._g, this._b, a);\n\t\t\t}\n\t\t),\n\n\t\twithlum: ul4.expose([\"lum\"],\n\t\t\tfunction withlum(lum) {\n\t\t\t\tif (typeof (lum) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\tvar hlsa = this.hlsa();\n\t\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t\t}\n\t\t)\n\t}\n);\n\nul4.TimeDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.TimeDelta\",\n\n\t\tcreate: function create(days, seconds, microseconds) {\n\t\t\tvar td = ul4._clone(this);\n\t\t\tif (typeof (days) === \"undefined\")\n\t\t\t\tdays = 0;\n\t\t\tif (typeof (seconds) === \"undefined\")\n\t\t\t\tseconds = 0;\n\t\t\tif (typeof (microseconds) === \"undefined\")\n\t\t\t\tmicroseconds = 0;\n\n\t\t\tvar total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST._do(total_microseconds, 1000000);\n\t\t\tvar total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0) {\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\ttd._microseconds = microseconds;\n\t\t\ttd._seconds = seconds;\n\t\t\ttd._days = days;\n\n\t\t\treturn td;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._microseconds) {\n\t\t\t\tif (!this._seconds) {\n\t\t\t\t\tif (!this._days)\n\t\t\t\t\t\treturn \"timedelta()\";\n\t\t\t\t\treturn \"timedelta(\" + this._days + \")\";\n\t\t\t\t}\n\t\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \")\";\n\t\t\t}\n\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \", \" + this._microseconds + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tvar v = [];\n\t\t\tif (this._days) {\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tvar seconds = this._seconds % 60;\n\t\t\tvar minutes = Math.floor(this._seconds / 60);\n\t\t\tvar hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds) {\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds);\n\t\t},\n\n\t\t_add: function _add(date, days, seconds, microseconds) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth();\n\t\t\tvar day = date.getDate() + days;\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds() + seconds;\n\t\t\tvar millisecond = date.getMilliseconds() + microseconds / 1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (ul4._istimedelta(other)) {\n\t\t\t\tvar myValue = this._days;\n\t\t\t\tvar otherValue = other._days;\n\t\t\t\tvar hasSeconds = this._seconds || other._seconds;\n\t\t\t\tvar hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds) {\n\t\t\t\t\tmyValue = myValue * 86400 + this._seconds;\n\t\t\t\t\totherValue = otherValue * 86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds) {\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue / otherValue;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"days\":\n\t\t\t\t\treturn ul4.expose([], function days() { return self._days; });\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\treturn ul4.expose([], function seconds() { return self._seconds; });\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\treturn ul4.expose([], function microseconds() { return self._microseconds; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tdays: function days() {\n\t\t\treturn this._days;\n\t\t},\n\n\t\tseconds: function seconds() {\n\t\t\treturn this._seconds;\n\t\t},\n\n\t\tmicroseconds: function microseconds() {\n\t\t\treturn this._microseconds;\n\t\t}\n\t}\n);\n\nul4.MonthDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.MonthDelta\",\n\n\t\tcreate: function create(months) {\n\t\t\tvar md = ul4._clone(this);\n\t\t\tmd._months = typeof (months) !== \"undefined\" ? months : 0;\n\t\t\treturn md;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._months) {\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._months !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._months < 0 ? ul4.MonthDelta.create(-this._months) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.MonthDelta.create(-this._months);\n\t\t},\n\n\t\t_add: function _add(date, months) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth() + months;\n\t\t\tvar day = date.getDate();\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds();\n\t\t\tvar millisecond = date.getMilliseconds();\n\n\t\t\twhile (true) {\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tvar targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tvar result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months - other._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__floordiv__: function __floordiv__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"months\":\n\t\t\t\t\treturn ul4.expose([], function months() { return self._months; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tmonths: function months() {\n\t\t\treturn this._months;\n\t\t}\n\t}\n);\n\n// When we don't have a real ``Set`` type, emulate one that supports strings\nul4._Set = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4._Set\",\n\n\t\tcreate: function create() {\n\t\t\tvar set = ul4._clone(this);\n\t\t\tset.items = {};\n\t\t\tset.add.apply(set, arguments);\n\t\t\treturn set;\n\t\t},\n\n\t\tadd: function add() {\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tthis.items[arguments[i]] = true;\n\t\t\t}\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { self.add.apply(self, items); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__contains__: function __contains__(item) {\n\t\t\treturn this.items[item] || false;\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar v = [];\n\t\t\tv.push(\"{\");\n\t\t\tvar i = 0;\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__eq__: function (other) {\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Substract the number of items that ``other`` has\n\t\t\t\tfor (var item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t},\n\n\t\t__le__: function (other) {\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__ge__: function (other) {\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar result = true;\n\t\t\t\tother.forEach(function (value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in other.items) {\n\t\t\t\t\tif (!this.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"TextAST\",\n\t\"IndentAST\",\n\t\"LineEndAST\",\n\t\"Tag\",\n\t\"ConstAST\",\n\t\"SeqItemAST\",\n\t\"UnpackSeqItemAST\",\n\t\"DictItemAST\",\n\t\"UnpackDictItemAST\",\n\t\"PosArgAST\",\n\t\"KeywordArgAST\",\n\t\"UnpackListArgAST\",\n\t\"UnpackDictArgAST\",\n\t\"ListAST\",\n\t\"ListCompAST\",\n\t\"DictAST\",\n\t\"DictCompAST\",\n\t\"SetAST\",\n\t\"SetCompAST\",\n\t\"GenExprAST\",\n\t\"VarAST\",\n\t\"NotAST\",\n\t\"NegAST\",\n\t\"BitNotAST\",\n\t\"IfAST\",\n\t\"ReturnAST\",\n\t\"PrintAST\",\n\t\"PrintXAST\",\n\t\"ItemAST\",\n\t\"IsAST\",\n\t\"IsNotAST\",\n\t\"EQAST\",\n\t\"NEAST\",\n\t\"LTAST\",\n\t\"LEAST\",\n\t\"GTAST\",\n\t\"GEAST\",\n\t\"NotContainsAST\",\n\t\"ContainsAST\",\n\t\"AddAST\",\n\t\"SubAST\",\n\t\"MulAST\",\n\t\"FloorDivAST\",\n\t\"TrueDivAST\",\n\t\"ModAST\",\n\t\"ShiftLeftAST\",\n\t\"ShiftRightAST\",\n\t\"BitAndAST\",\n\t\"BitXOrAST\",\n\t\"BitOrAST\",\n\t\"AndAST\",\n\t\"OrAST\",\n\t\"SliceAST\",\n\t\"AttrAST\",\n\t\"CallAST\",\n\t\"RenderAST\",\n\t\"SetVarAST\",\n\t\"AddVarAST\",\n\t\"SubVarAST\",\n\t\"MulVarAST\",\n\t\"TrueDivVarAST\",\n\t\"FloorDivVarAST\",\n\t\"ModVarAST\",\n\t\"ShiftLeftVarAST\",\n\t\"ShiftRightVarAST\",\n\t\"BitAndVarAST\",\n\t\"BitXOrVarAST\",\n\t\"BitOrVarAST\",\n\t\"ForBlockAST\",\n\t\"WhileBlockAST\",\n\t\"BreakAST\",\n\t\"ContinueAST\",\n\t\"CondBlockAST\",\n\t\"IfBlockAST\",\n\t\"ElIfBlockAST\",\n\t\"ElseBlockAST\",\n\t\"SignatureAST\",\n\t\"Template\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar ul4onname = name;\n\tif (ul4onname.substr(ul4onname.length - 3) === \"AST\")\n\t\tul4onname = ul4onname.substr(0, ul4onname.length - 3);\n\tul4onname = ul4onname.toLowerCase();\n\tvar object = ul4[name];\n\tobject.typename = name;\n\tobject.type = ul4onname;\n\tul4on.register(\"de.livinglogic.ul4.\" + ul4onname, object);\n}\n","import { ul4, ul4on } from './ul4';\n\nlet la = {};\n\n\nla.Base = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function () {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\treturn this[name];\n\t\t},\n\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0, iter = decoder.loadcontent(); ; ++i) {\n\t\t\t\tvar iteritem = iter.next();\n\t\t\t\tif (iteritem.done)\n\t\t\t\t\tbreak;\n\t\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t\t}\n\t\t\tfor (; i < this._ul4onattrs.length; ++i) {\n\t\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t\t\t}\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tthis[name] = value;\n\t\t},\n\n\t\t_setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) {\n\t\t\tthis[name] = null;\n\t\t}\n\t}\n);\n\nla.Globals = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\t\tgeodist: function geodist(geo1, geo2) {\n\t\t\tvar sqsin = function sqsin(x) { x = Math.sin(x); return x * x };\n\t\t\tvar sqcos = function sqsos(x) { x = Math.cos(x); return x * x };\n\t\t\tvar deg2rad = Math.PI / 180; // Conversion factor degree -> radians\n\t\t\tvar radius = 6378.137; // Equatorial radius of earth in km\n\t\t\tvar flat = 1 / 298.257223563; // Earth flattening\n\n\t\t\tvar lat1 = geo1.lat * deg2rad;\n\t\t\tvar long1 = geo1.long * deg2rad;\n\t\t\tvar lat2 = geo2.lat * deg2rad;\n\t\t\tvar long2 = geo2.long * deg2rad;\n\t\t\tvar F = (lat1 + lat2) / 2;\n\t\t\tvar G = (lat1 - lat2) / 2;\n\t\t\tvar l = (long1 - long2) / 2;\n\t\t\tvar S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\t\tvar C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\t\tvar w = Math.atan(Math.sqrt(S / C));\n\t\t\tvar D = 2 * w * radius;\n\t\t\tvar T = Math.sqrt(S * C) / w;\n\t\t\tvar H1 = (3 * T - 1) / (2 * C);\n\t\t\tvar H2 = (3 * T + 1) / (2 * S);\n\t\t\tvar s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\t\treturn s;\n\t\t}\n\t}\n);\n\nla.FlashMessage = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"timestamp\", \"type\", \"title\", \"message\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.App = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"owner\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\"],\n\n\t\tinsert: function (values) {\n\t\t\treturn this.globals.Login._insert(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.View = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.DataSource = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"app\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Record = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"],\n\n\t\tdelete: function () {\n\t\t\treturn this.app.globals.Login._delete(this);\n\t\t},\n\n\t\tupdate: function (values) {\n\t\t\treturn this.app.globals.Login._update(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tsearch: function search(search) {\n\t\t\tfor (var identifier in search) {\n\t\t\t\tvar fieldsearch = search[identifier];\n\t\t\t\tif (ul4._bool(fieldsearch)) {\n\t\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"values\")\n\t\t\t\treturn this._sparsevalues;\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"values\") {\n\t\t\t\tthis._sparsevalues = value;\n\t\t\t\tthis._values = null;\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis[name] = value;\n\t\t}\n\t}\n);\n\nObject.defineProperty(la.Record, \"values\", {\n\tget: function () {\n\t\tif (this._values === null) {\n\t\t\tthis._values = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.app.controls.forEach(function (control, id) {\n\t\t\t\tvar fieldvalue = self._sparsevalues.get(control.identifier);\n\t\t\t\tif (typeof (fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tself._values.set(id, fieldvalue);\n\t\t\t});\n\t\t}\n\t\treturn this._values;\n\t}\n});\n\nObject.defineProperty(la.Record, \"fields\", {\n\tget: function () {\n\t\tif (this._fields === null) {\n\t\t\tthis._fields = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.values.forEach(function (value, id) {\n\t\t\t\tvar field = la.Field.create(self.app.controls.get(id), self.app, value);\n\t\t\t\tself._fields.set(id, field);\n\t\t\t});\n\t\t}\n\t\treturn this._fields;\n\t}\n});\n\nla.Control = ul4._inherit(\n\tla.Base,\n\t{\n\t\ttype: null,\n\t\tsubtype: null,\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\t_logsearch: function _logsearch(value, search) {\n\t\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t\t},\n\n\t\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t\t// ``value`` is the value of the field\n\t\t// ``search`` is an object with information what we're searching for\n\t\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\t\tsearch: function search(value, search) {\n\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.BoolControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"bool\",\n\t\t__type__: \"BoolControl\",\n\n\t\t// ``search`` must by ``null``, ``false`` or ``true``\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.IntControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"int\",\n\t\t__type__: \"IntControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.NumberControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"number\",\n\t\t__type__: \"NumberControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"range\") {\n\t\t\t\tif (value === null)\n\t\t\t\t\treturn false;\n\t\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.StringControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"string\",\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (search.value === null || value === null)\n\t\t\t\t\treturn search.value === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.TextControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"text\",\n\t\t__type__: \"TextControl\"\n\t}\n);\n\nla.EmailControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"email\",\n\t\t__type__: \"EmailControl\"\n\t}\n);\n\nla.URLControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"url\",\n\t\t__type__: \"URLControl\"\n\t}\n);\n\nla.TelControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"tel\"\n\t}\n);\n\nla.PasswordControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"password\"\n\t}\n);\n\nla.TextAreaControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"textarea\",\n\t\t__type__: \"TextAreaControl\"\n\t}\n);\n\nla.DateControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"date\",\n\t\tsubtype: \"date\",\n\t\t__type__: \"DateControl\",\n\n\t\tasjson: function (value) {\n\t\t\tif (value instanceof Date) {\n\t\t\t\tvalue = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`;\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y\";\n\t\t},\n\n\t\t// searchvalue must be ``null``, a ``Date`` object or a string\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\n\t\t\tvar searchvalue = search.value;\n\t\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\t\tif (value !== null)\n\t\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn searchvalue === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (searchvalue === null || value === null)\n\t\t\t\t\treturn searchvalue === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.DatetimeMinuteControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimeminute\",\n\t\t__type__: \"DatetimeMinuteControl\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t\t}\n\t}\n);\n\nla.DatetimeSecondControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimesecond\",\n\t\t__type__: \"DatetimeMinuteSecond\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t\t}\n\t}\n);\n\nla.LookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"lookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupdata\"]),\n\n\t\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (this.lookupapp === null) {\n\t\t\t\tif (search.operator === \"equals\") {\n\t\t\t\t\tif (value === null)\n\t\t\t\t\t\treturn search.value === null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn value.key === search.value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (value === null || search.value === null)\n\t\t\t\t\treturn value === search.value;\n\t\t\t\telse\n\t\t\t\t\treturn value.search(search);\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.LookupSelectControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"LookupSelectControl\"\n\t}\n);\n\nla.LookupRadioControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"LookupRadioControl\"\n\t}\n);\n\nla.LookupChoiceControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"LookupChoiceControl\"\n\t}\n);\n\nla.AppLookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"applookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]),\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (value === null || search.value === null)\n\t\t\t\treturn value === search.value;\n\t\t\telse\n\t\t\t\treturn value.search(search);\n\t\t}\n\t}\n);\n\nla.AppLookupSelectControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"AppLookupSelectControl\"\n\t}\n);\n\nla.AppLookupRadioControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"AppLookupRadioControl\"\n\t}\n);\n\nla.AppLookupChoiceControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"AppLookupChoiceControl\"\n\t}\n);\n\nla.MultipleLookupControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\ttype: \"multiplelookup\",\n\n\t\t// search.value must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (this.lookupapp === null) {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].key === search.value)\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (search.value === null)\n\t\t\t\t\t\treturn value.length === 0;\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleLookupSelectControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleLookupSelectControl\"\n\t}\n);\n\nla.MultipleLookupCheckboxControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleLookupCheckboxControl\"\n\t}\n);\n\nla.MultipleAppLookupControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\ttype: \"multipleapplookup\",\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (search.value === null)\n\t\t\t\t\treturn value.length === 0;\n\t\t\t\telse {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleAppLookupSelectControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleAppLookupSelectControl\"\n\t}\n);\n\nla.MultipleAppLookupCheckboxControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleAppLookupCheckboxControl\"\n\t}\n);\n\nla.GeoControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"geo\",\n\n\n\t\tasjson: function (value) {\n\t\t\tif (la.Geo.isprotoof(value))\n\t\t\t\tvalue = `${value.lat}, ${value.long}, ${value.info}`;\n\t\t\treturn value;\n\t\t},\n\n\t\t__type__: \"GeoControl\"\n\t}\n);\n\nla.FileControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"file\",\n\t\t__type__: \"FileControl\"\n\t}\n);\n\nla.ButtonControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"button\",\n\t\t__type__: \"ButtonControl\"\n\t}\n);\n\nla.Field = ul4._inherit(\n\tla.Base,\n\t{\n\t\tcreate: function create(control, record, value) {\n\t\t\tvar field = la.Base.create.call(this);\n\t\t\tfield.control = control;\n\t\t\tfield.record = record;\n\t\t\tfield.value = value;\n\t\t\treturn field;\n\t\t},\n\n\t\tsearch: function search(searchvalue) {\n\t\t\treturn this.control.search(this.value, searchvalue);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.LookupItem = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"key\", \"label\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.User = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.File = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Geo = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"lat\", \"long\", \"info\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Attachment = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"record\", \"label\", \"active\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.NoteAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"noteattachment\",\n\t\t__type__: \"NoteAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.URLAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"urlattachment\",\n\t\t__type__: \"URLAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.FileAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"fileattachment\",\n\t\t__type__: \"FileAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.ImageAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"imageattachment\",\n\t\t__type__: \"ImageAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"])\n\t}\n);\n\nla.JSONAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"jsonattachment\",\n\t\t__type__: \"JSONAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"]),\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"value\")\n\t\t\t\treturn ul4._asjson(this.value);\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"value\")\n\t\t\t\tthis.value = ul4._fromjson(value);\n\t\t\telse\n\t\t\t\tthis[name] = value\n\t\t}\n\t}\n);\n\nla.Installation = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Category = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\tvar v = [];\n\t\t\tvar category = this;\n\t\t\twhile (category !== null) {\n\t\t\t\tv.splice(0, 0, category.identifier);\n\t\t\t\tcategory = category.parent;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.KeyView = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"key\", \"user\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.AppParameter = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"identifier\", \"description\", \"value\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"Globals\",\n\t\"App\",\n\t\"View\",\n\t\"DataSource\",\n\t\"Record\",\n\t\"BoolControl\",\n\t\"IntControl\",\n\t\"NumberControl\",\n\t\"TextControl\",\n\t\"EmailControl\",\n\t\"URLControl\",\n\t\"TelControl\",\n\t\"PasswordControl\",\n\t\"TextAreaControl\",\n\t\"DateControl\",\n\t\"DatetimeMinuteControl\",\n\t\"DatetimeSecondControl\",\n\t\"LookupControl\",\n\t\"LookupSelectControl\",\n\t\"LookupRadioControl\",\n\t\"LookupChoiceControl\",\n\t\"AppLookupControl\",\n\t\"AppLookupSelectControl\",\n\t\"AppLookupRadioControl\",\n\t\"AppLookupChoiceControl\",\n\t\"MultipleLookupControl\",\n\t\"MultipleLookupSelectControl\",\n\t\"MultipleLookupCheckboxControl\",\n\t\"MultipleAppLookupControl\",\n\t\"MultipleAppLookupSelectControl\",\n\t\"MultipleAppLookupCheckboxControl\",\n\t\"GeoControl\",\n\t\"FileControl\",\n\t\"ButtonControl\",\n\t\"Field\",\n\t\"LookupItem\",\n\t\"User\",\n\t\"File\",\n\t\"Geo\",\n\t\"NoteAttachment\",\n\t\"URLAttachment\",\n\t\"FileAttachment\",\n\t\"ImageAttachment\",\n\t\"JSONAttachment\",\n\t\"Installation\",\n\t\"Category\",\n\t\"KeyView\",\n\t\"AppParameter\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar object = la[name];\n\tul4on.register(\"de.livingapps.appdd.\" + name.toLowerCase(), object);\n}\n\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4, ul4on } from './modules/ul4';\nimport * as https from 'https';\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4on.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["ul4","ul4on","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","argument","set","_emptymap","_setmap","key","value","__proto__","_makeset","this","_Set","create","add","register","name","obj","ul4onname","dumps","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_clone","_level","_strings2index","_ids2index","_backrefs","_line","line","oldindent","push","join","type","Math","round","index","_str_repr","_iscolor","r","g","b","a","_isdate","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","_typeof","isa","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","decoder","pos","backrefs","readchar","charAt","readcharoreof","readblackchar","re_white","c","match","read","result","substring","backup","readnumber","re_digits","parseFloat","NaN","_repr","_beginfakeloading","oldpos","_endfakeloading","_readescape","escapechar","chars","codepoint","parseInt","isNaN","String","fromCharCode","typecode","delimiter","c2","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","proto","ul4onload","loadcontent","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_simpleclone","F","__prototype__","Proto","_nextid","_extend","attrs","_simpleinherit","baseobj","_inherit","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","_type","s","toString","cause","_internal_call","context","f","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","repr","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_unpackvar","lvalue","newvalue","iter","_iter","item","ValueError","concat","_formatsource","out","finalout","level","needlf","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","get","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","items","_lt","__lt__","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","escape","code","charCodeAt","test","_lpad","_date_repr","year","month","day","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","__repr__","_ascii","_date_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","__type__","_istemplate","_isfunction","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","Object","call","_isexception","Error","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","_strip","root","JSON","parse","replace","Function","_asul4on","_fromul4on","_format_date","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","_yearday","_week","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","isprotoof","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","decname","arg","prefix","argObject","expose","options","Context","vars","indents","_output","inheritvars","withindent","replaceoutput","clone","getoutput","Exception","__getattr__","attrname","InternalException","ReturnException","exception","BreakException","ContinueException","SyntaxError","LValueRequiredError","operation","message","LocationError","location","_templateprefix","template","parenttemplate","first","_template","Tag","tag","_outerpos","_innerpos","templateprefix","outerpos","innerpos","source","suffix","text","underline","lineno","colno","AST","ast","_handle_eval","_eval","_handle_eval_set","_eval_set","_handle_eval_modify","_eval_modify","_ul4onattrs","__setitem__","TextAST","_text","IndentAST","_maketext","LineEndAST","tagpos","codepos","tago","CodeAST","ConstAST","constant","ItemArgBase","_handle_eval_list","_eval_list","_handle_eval_dict","_eval_dict","_handle_eval_call","_eval_call","SeqItemAST","seqitem","UnpackSeqItemAST","unpackseqitem","DictItemAST","dictitem","UnpackDictItemAST","unpackdictitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","ListCompAST","varname","container","condition","listcomp","localcontext","varitems","DictAST","dict","DictCompAST","SetAST","SetCompAST","setcomp","GenExprAST","genexp","VarAST","variable","_get","_modify","functions","_ido","UnaryAST","unary","typename","_do","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","ifexpr","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","binary","ItemAST","__getitem__","splice","NotSubscriptableError","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","_append","SubAST","__sub__","__rsub__","_date_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","_date","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","div","mod","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","attr","object","sub","end","_count","_find","_rfind","old","new_","count","_replace","_lstrip","_rstrip","sep","_split","_rsplit","keepends","_splitlines","_capitalize","_join","_startswith","_endswith","_insert","_pop","_weekday","firstweekday","_mimeformat","_isoformat","default_","_items","_values","_update","_clear","realresult","__setattr__","oldvalue","CallAST","_makeargs","RenderAST","render","SliceAST","index1","index2","SetVarAST","changevar","ModifyVarAST","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","BlockAST","block","endtag","content","ForBlockAST","for_","_str_varname","WhileBlockAST","while_","cond","BreakAST","ContinueAST","CondBlockAST","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","Template","whitespace","startdelim","enddelim","docpos","_jsfunction","_asts","SignatureAST","closure","TemplateClosure","_renderbound","_rendersbound","renders","doc","_callbound","params","param","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","lower","heigher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshhold","pow","_md5","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","microsecond","_timedelta","_monthdelta","_hls","h","l","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","part","lastIndexOf","startpos","lineendlen","endpos","lastIndex","resultlist","d","yearday","jan1weekday","_isleap","leap","others","clear","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","td","total_microseconds","total_seconds","minutes","hours","_add","millisecond","myValue","otherValue","hasSeconds","hasMicroseconds","md","targetmonth","classes","la","Base","_dumpUL4ONAttr","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","Globals","geodist","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","insert","globals","Login","id","View","DataSource","identifier","Record","delete","app","_delete","update","search","fieldsearch","fields","_sparsevalues","_fields","defineProperty","controls","control","fieldvalue","field","Field","Control","subtype","_logsearch","BoolControl","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","formatstring","language","searchvalue","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","lookupapp","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","Geo","info","FileControl","ButtonControl","record","LookupItem","label","User","firstname","lastname","email","File","url","filename","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","username","loginRequired","_userName","ecdhCurve","commonjs","ident","undefined","httpsAgent"],"mappings":"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"} \ No newline at end of file From 4c78e3142d7f8b72676987e478c48b7d7e8a74b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Mon, 6 May 2019 13:43:55 +0200 Subject: [PATCH 40/43] basic setup --- dist/es2015/livingsdk.js | 4 +- dist/es2015/livingsdk.js.map | 2 +- dist/es2015/modules/livingapi.js | 1570 ++-- dist/es2015/modules/ul4.js | 14225 ++++++++++++++++------------- dist/umd/livingsdk.js | 2 +- dist/umd/livingsdk.js.map | 2 +- package-lock.json | 119 +- package.json | 3 +- rollup.config.js | 31 +- src/livingsdk.ts | 4 +- src/modules/livingapi.js | 1570 ++-- src/modules/ul4.js | 14225 ++++++++++++++++------------- 12 files changed, 17950 insertions(+), 13807 deletions(-) diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index a2ccdc9..e4eef44 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -1,6 +1,6 @@ import axios from 'axios'; import livingApi from './modules/livingapi'; -import { ul4on } from './modules/ul4'; +import { ul4 } from './modules/ul4'; import * as https from 'https'; let commonjs = (typeof module === 'object' && module.exports); export class LivingSDK { @@ -49,7 +49,7 @@ export class LivingSDK { }) .then((res) => { let dump; - dump = ul4on.loads(res.data); + dump = ul4.loads(res.data); dump.get('globals').Login = this; return dump; }); diff --git a/dist/es2015/livingsdk.js.map b/dist/es2015/livingsdk.js.map index 8ad3fe1..56ce0af 100644 --- a/dist/es2015/livingsdk.js.map +++ b/dist/es2015/livingsdk.js.map @@ -1 +1 @@ -{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index d5c70f4..7c80aa1 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -1,898 +1,1092 @@ -import { ul4, ul4on } from './ul4'; +import { ul4 } from './ul4'; let la = {}; -la.Base = ul4._inherit( - ul4.Proto, +la.Base = class Base extends ul4.Proto +{ + constructor() { - create: function () { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); - }, + super(); + } - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - return this[name]; - }, - - ul4onload: function ul4onload(decoder) { - for (var i = 0, iter = decoder.loadcontent(); ; ++i) { - var iteritem = iter.next(); - if (iteritem.done) - break; - if (i < this._ul4onattrs.length) - this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); - } - for (; i < this._ul4onattrs.length; ++i) { - this._setDefaultUL4ONAttr(this._ul4onattrs[i]); - } - }, + ul4ondump(encoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + } - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - this[name] = value; - }, + _dumpUL4ONAttr(name) + { + return this[name]; + } - _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) { - this[name] = null; + ul4onload(decoder) + { + let i = 0; + for (let iter = decoder.loadcontent(); ; ++i) + { + let iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); } + for (; i < this._ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); } -); - -la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() { - return ""; - }, - - // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) - geodist: function geodist(geo1, geo2) { - var sqsin = function sqsin(x) { x = Math.sin(x); return x * x }; - var sqcos = function sqsos(x) { x = Math.cos(x); return x * x }; - var deg2rad = Math.PI / 180; // Conversion factor degree -> radians - var radius = 6378.137; // Equatorial radius of earth in km - var flat = 1 / 298.257223563; // Earth flattening - - var lat1 = geo1.lat * deg2rad; - var long1 = geo1.long * deg2rad; - var lat2 = geo2.lat * deg2rad; - var long2 = geo2.long * deg2rad; - var F = (lat1 + lat2) / 2; - var G = (lat1 - lat2) / 2; - var l = (long1 - long2) / 2; - var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); - var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); - var w = Math.atan(Math.sqrt(S / C)); - var D = 2 * w * radius; - var T = Math.sqrt(S * C) / w; - var H1 = (3 * T - 1) / (2 * C); - var H2 = (3 * T + 1) / (2 * S); - var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); - return s; - } + + _loadUL4ONAttr(name, value) + { + this[name] = value; } -); -la.FlashMessage = ul4._inherit( - la.Base, + _setDefaultUL4ONAttr(name) { - _ul4onattrs: ["timestamp", "type", "title", "message"], + this[name] = null; + } - __repr__: function repr() { - return ""; + __getattr__(name) + { + if (this._ul4attrs.has(name)) + { + let value = this[name]; + if (typeof(value) === "function") + { + let realvalue = value.bind(this); + realvalue._ul4_name = value._ul4_name || value.name; + realvalue._ul4_signature = value._ul4_signature; + realvalue._ul4_needsobject = value._ul4_needsobject; + realvalue._ul4_needscontext = value._ul4_needscontext; + return realvalue; + } + return value; } + throw new ul4.AttributeError(this, name); } -); -la.App = ul4._inherit( - la.Base, + __repr__() { - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], - - insert: function (values) { - return this.globals.Login._insert(this, values); - }, + return ""; + } +}; - __repr__: function repr() { - return ""; - } +la.Handler = class Handler +{ + save(record) + { } -); -la.View = ul4._inherit( - la.Base, + delete(record) { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + } +}; - __repr__: function repr() { - return ""; - } +la.Globals = class Globals extends la.Base +{ + constructor() + { + super(); + this.version = null; + this.platform = null; + this.user = null; + this.maxdbactions = null; + this.maxtemplateruntime = null; + this.flashmessages = null; + this.handler = new la.Handler(); } -); -la.DataSource = ul4._inherit( - la.Base, + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + static geodist(geo1, geo2) { - _ul4onattrs: ["id", "identifier", "app", "apps"], + let sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; + let sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; + const deg2rad = Math.PI/180; // Conversion factor degree -> radians + const radius = 6378.137; // Equatorial radius of earth in km + const flat = 1/298.257223563; // Earth flattening + + const lat1 = geo1.lat * deg2rad; + const long1 = geo1.long * deg2rad; + const lat2 = geo2.lat * deg2rad; + const long2 = geo2.long * deg2rad; + const F = (lat1 + lat2)/2; + const G = (lat1 - lat2)/2; + const l = (long1 - long2)/2; + const S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + const C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + const w = Math.atan(Math.sqrt(S/C)); + const D = 2 * w * radius; + const T = Math.sqrt(S*C)/w; + const H1 = (3*T-1)/(2*C); + const H2 = (3*T+1)/(2*S); + const s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; + } - __repr__: function repr() { - return ""; - } + __repr__() + { + return ""; } -); +}; + +la.Globals.prototype._ul4onattrs = ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"]; +la.Globals.prototype._ul4attrs = ul4._makeset("version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"); -la.Record = ul4._inherit( - la.Base, +la.FlashMessage = class FlashMessage extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + return ""; + } +}; - delete: function () { - return this.app.globals.Login._delete(this); - }, +la.FlashMessage.prototype._ul4onattrs = ["timestamp", "type", "title", "message"]; +la.FlashMessage.prototype._ul4attrs = ul4._makeset("timestamp", "type", "title", "message"); - update: function (values) { - return this.app.globals.Login._update(this, values); - }, +la.App = class App extends la.Base +{ + __repr__() + { + return ""; + } - __repr__: function repr() { - return ""; - }, + insert(values={}) + { + let record = this.__call__(values); + this.globals.handler.save(this); + this.globals.Login._insert(this, values); + return record; + } - search: function search(search) { - for (var identifier in search) { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } + __call__(values={}) + { + let record = new la.Record(this); + if (ul4._ismap(values)) + { + for (let [key, value] of values.entries()) + { + if (!record.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = value; } - return true; - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - if (name === "values") - return this._sparsevalues; - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - if (name === "values") { - this._sparsevalues = value; - this._values = null; - this._fields = null; + } + else if (ul4._isobject(values)) + { + for (let key in values) + { + if (!record.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = values[key]; } - else - this[name] = value; } + else + throw new ul4.TypeError("values must be an object or a Map"); + return record; } -); -Object.defineProperty(la.Record, "values", { - get: function () { - if (this._values === null) { - this._values = ul4on._havemap ? new Map() : {}; - var self = this; - this.app.controls.forEach(function (control, id) { - var fieldvalue = self._sparsevalues.get(control.identifier); - if (typeof (fieldvalue) === "undefined") - fieldvalue = null; - self._values.set(id, fieldvalue); - }); + __getattr__(name) + { + if (name.startsWith("c_")) + { + if (!this.controls.has(name.substr(2))) + throw new ul4.AttributeError(this, name); + return this.controls.get(name.substr(2)); } - return this._values; + else + return super.__getattr__(name); } -}); - -Object.defineProperty(la.Record, "fields", { - get: function () { - if (this._fields === null) { - this._fields = ul4on._havemap ? new Map() : {}; - var self = this; - this.values.forEach(function (value, id) { - var field = la.Field.create(self.app.controls.get(id), self.app, value); - self._fields.set(id, field); - }); - } - return this._fields; +}; + +la.App.prototype._ul4onattrs = ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "createdby", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier", "basetable", "primarykey", "insertprocedure", "updateprocedure", "deleteprocedure", "templates", "createdat", "updatedat", "updatedby"]; +la.App.prototype._ul4attrs = ul4._makeset("id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "createdat", "createdby", "updatedat", "updatedby", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier", "insert"); +ul4.expose(la.App.prototype.__call__, ["**values"], {"needsobject": true}); +ul4.expose(la.App.prototype.insert, ["**values"], {"needsobject": true}); + +la.View = class View extends la.Base +{ + __repr__() + { + return ""; } -}); +}; + +la.View.prototype._ul4onattrs = ["id", "name", "app", "order", "width", "height", "start", "end"]; +la.View.prototype._ul4attrs = ul4._makeset("id", "name", "app", "order", "width", "height", "start", "end"); -la.Control = ul4._inherit( - la.Base, +la.DataSourceData = class DataSourceData extends la.Base +{ + __repr__() { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], + return ""; + } +}; - __repr__: function repr() { - return ""; - }, +la.DataSourceData.prototype._ul4onattrs = ["id", "identifier", "app", "apps"]; +la.DataSourceData.prototype._ul4attrs = ul4._makeset("id", "identifier", "app", "apps"); - asjson: function (value) { - return value; - }, +la.Record = class Record extends la.Base +{ + constructor(app) + { + super(); + this.id = null; + this.app = app; + this.createdat = null; + this.createdby = null; + this.updatedat = null; + this.updatedby = null; + this.updatecount = 0; + this._sparsevalues = new Map(); + this._values = null; + this._fields = null; + this.children = new Map(); + this.attachments = null; + this.errors = []; + this._is_deleted = false; + } - _logsearch: function _logsearch(value, search) { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, + - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) { - return false; + __repr__() + { + let v = ["") + return v.join(""); } -); -la.BoolControl = ul4._inherit( - la.Control, + get values() { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; + if (this._values === null) + { + this._values = ul4._havemap ? new Map() : {}; + for (let [identifier, control] of this.app.controls.entries()) + { + let fieldvalue = this._sparsevalues.get(identifier); + if (typeof(fieldvalue) === "undefined") + fieldvalue = null; + this._values.set(identifier, fieldvalue); + } } + return this._values; } -); -la.IntControl = ul4._inherit( - la.Control, + get fields() { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; + if (this._fields === null) + { + this._fields = ul4._havemap ? new Map() : {}; + for (let [identifier, value] of this.values.entries()) + { + let field = new la.Field(this.app.controls.get(identifier), this, value); + this._fields.set(identifier, field); + } } + return this._fields; } -); -la.NumberControl = ul4._inherit( - la.Control, + is_dirty() { - type: "number", - __type__: "NumberControl", + if (this.id === null) + return true; + for (let field of this.fields.values()) + { + if (field.is_dirty()) + return true; + } + return false; + } - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "range") { - if (value === null) - return false; - return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); - } - else - return false; + has_errors() + { + if (this.errors.length !== 0) + return true; + for (let field of this.fields.values()) + { + if (field.has_errors()) + return true; } + return false; } -); -la.StringControl = ul4._inherit( - la.Control, + delete() { - type: "string", + return this.app.globals.handler.delete(this); + } - asjson: function (value) { - return value; - }, + save() + { + this.app.globals.handler.save(this); + } - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; + update(values={}) + { + if (ul4._ismap(values)) + { + for (let [key, value] of values.entries()) + { + if (!this.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + fields.get(key).value = value; + } + } + else if (ul4._isobject(values)) + { + for (let key in values) + { + if (!this.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = values[key]; } } + else + throw new ul4.TypeError("values must be an object or a Map"); + + this.app.globals.handler.save(this); } -); -la.TextControl = ul4._inherit( - la.StringControl, + search(search) { - subtype: "text", - __type__: "TextControl" + for (let identifier in search) + { + let fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) + { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; + } + } + return true; } -); -la.EmailControl = ul4._inherit( - la.StringControl, + _dumpUL4ONAttr(name) { - subtype: "email", - __type__: "EmailControl" + if (name === "values") + return this._sparsevalues; + else + return this[name]; } -); -la.URLControl = ul4._inherit( - la.StringControl, + _loadUL4ONAttr(name, value) { - subtype: "url", - __type__: "URLControl" + if (name === "values") + { + this._sparsevalues = value; + this._values = null; + this._fields = null; + } + else + this[name] = value; } -); -la.TelControl = ul4._inherit( - la.StringControl, + __getattr__(name) { - subtype: "tel" + if (name.startsWith("c_")) + return this.children.get(name.substr(2)) + else if (name.startsWith("f_")) + return this.fields.get(name.substr(2)) + else if (name.startsWith("v_")) + return this.values.get(name.substr(2)) + else + return this[name]; } -); -la.PasswordControl = ul4._inherit( - la.StringControl, + __setattr__(name, value) + { + if (name.startsWith("c_")) + this.children[name.substr(2)] = value; + else if (name.startsWith("v_")) + this.fields.get(name.substr(2)).value = value; + else + throw new ul4.AttributeError(this, name); + } +}; + +la.Record.prototype._ul4onattrs = ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"]; +la.Record.prototype._ul4attrs = ul4._makeset("id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"); +ul4.expose(la.Record.prototype.is_dirty, []); +ul4.expose(la.Record.prototype.has_errors, []); +ul4.expose(la.Record.prototype.delete, []); +ul4.expose(la.Record.prototype.save, []); +ul4.expose(la.Record.prototype.update, ["**values"], {"needsobject": true}); + +la.Control = class Control extends la.Base +{ + __repr__() { - subtype: "password" + return ""; } -); -la.TextAreaControl = ul4._inherit( - la.StringControl, + _logsearch(value, search) { - subtype: "textarea", - __type__: "TextAreaControl" + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); } -); -la.DateControl = ul4._inherit( - la.Control, + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search(value, search) { - type: "date", - subtype: "date", - __type__: "DateControl", + return false; + } +}; - asjson: function (value) { - if (value instanceof Date) { - value = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, +la.Control.prototype.type = null; +la.Control.prototype.subtype = null; +la.Control.prototype._ul4onattrs = ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"]; +la.Control.prototype._ul4attrs = ul4._makeset("id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"); - formatstring: function formatstring(language) { - language = language || this.app.language; +la.BoolControl = class BoolControl extends la.Control +{ + // ``search`` must by ``null``, ``false`` or ``true`` + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } +}; - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, +la.BoolControl.prototype.type = "bool"; - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) { - this._logsearch(value, search); +la.IntControl = class IntControl extends la.Control +{ + // ``search.value`` must by ``null`` or an integer + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } +}; - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); +la.IntControl.prototype.type = "int"; - if (search.operator === "equals") - return searchvalue === value; - else if (search.operator === "contains") { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } - else +la.NumberControl = class NumberControl extends la.Control +{ + // ``search.value`` must by ``null`` or an integer + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") + { + if (value === null) return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); } + else + return false; } -); - -la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", +}; - formatstring: function formatstring(language) { - language = language || this.app.language; +la.NumberControl.prototype.type = "number"; - if (language === "de") - return "%d.%m.%Y %H:%M"; +la.StringControl = class StringControl extends la.Control +{ + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") + { + if (search.value === null || value === null) + return search.value === value; else - return "%m/%d/%Y %H:%M"; + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; } } -); +}; -la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", +la.StringControl.prototype.type = "string"; - formatstring: function formatstring(language) { - language = language || this.app.language; +la.TextControl = class TextControl extends la.StringControl +{ +}; - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } - } -); +la.TextControl.prototype.subtype = "text"; -la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), +la.EmailControl = class EmailControl extends la.StringControl +{ +}; - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (this.lookupapp === null) { - if (search.operator === "equals") { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } - else - return false; - } - else { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } - } -); +la.EmailControl.prototype.subtype = "email"; -la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } -); +la.URLControl = class URLControl extends la.StringControl +{ +}; -la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } -); +la.URLControl.prototype.subtype = "url"; -la.LookupChoiceControl = ul4._inherit( - la.LookupControl, +la.TelControl = class TelControl extends la.StringControl +{ +}; + +la.TelControl.prototype.subtype = "tel"; + +la.PasswordControl = class PasswordControl extends la.StringControl +{ +}; + +la.PasswordControl.prototype.subtype = "password"; + +la.TextAreaControl = class TextAreaControl extends la.StringControl +{ +}; + +la.TextAreaControl.prototype.subtype = "textarea"; +la.TextAreaControl.prototype._ul4onattrs = la.StringControl.prototype._ul4onattrs.concat(["encrypted"]); +la.TextAreaControl.prototype._ul4attrs = ul4._makeset(...la.StringControl.prototype._ul4attrs, "encrypted"); + +la.DateControl = class DateControl extends la.Control +{ + formatstring(language) { - subtype: "choice", - __type__: "LookupChoiceControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; } -); -la.AppLookupControl = ul4._inherit( - la.Control, + // searchvalue must be ``null``, a ``Date`` object or a string + search(value, search) { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (value === null || search.value === null) - return value === search.value; + this._logsearch(value, search); + + let searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") + { + if (searchvalue === null || value === null) + return searchvalue === value; else - return value.search(search); + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; } + else + return false; } -); +}; -la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } -); +la.DateControl.prototype.type = "date"; +la.DateControl.prototype.subtype = "date"; -la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, +la.DatetimeMinuteControl = class DatetimeMinuteControl extends la.DateControl +{ + formatstring(language) { - subtype: "radio", - __type__: "AppLookupRadioControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; } -); +}; -la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, +la.DatetimeMinuteControl.prototype.subtype = "datetimeminute"; + +la.DatetimeSecondControl = class DatetimeSecondControl extends la.DateControl +{ + formatstring(language) { - subtype: "choice", - __type__: "AppLookupChoiceControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; } -); +}; -la.MultipleLookupControl = ul4._inherit( - la.LookupControl, +la.DatetimeSecondControl.prototype.subtype = "datetimesecond"; + +la.LookupControl = class LookupControl extends la.Control +{ + // ``search.value`` must be ``null`` or a ``LookupItem`` key + search(value, search) { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (search.operator === "equals") { - if (this.lookupapp === null) { - for (var i = 0; i < value.length; ++i) { - if (value[i].key === search.value) - return true; - } - return false; - } - else { - if (search.value === null) - return value.length === 0; - else { - for (var i = 0; i < value.length; ++i) { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - } + if (search.operator === "equals") + { + if (value === null) + return search.value === null; else - return false; + return value.key === search.value; } + else + return false; } -); +}; -la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, +la.LookupControl.prototype.type = "lookup"; +la.LookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat(["lookupdata"]); +la.LookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, "lookupdata"); + +la.LookupSelectControl = class LookupSelectControl extends la.LookupControl +{ +}; + +la.LookupSelectControl.prototype.subtype = "select"; + +la.LookupRadioControl = class LookupRadioControl extends la.LookupControl +{ +}; + +la.LookupRadioControl.prototype.subtype = "radio"; + +la.LookupChoiceControl = class LookupChoiceControl extends la.LookupControl +{ +}; + +la.LookupChoiceControl.prototype.subtype = "choice"; + +la.AppLookupControl = class AppLookupControl extends la.Control +{ + // ``search.value`` must be an object containing the search criteria for the referenced record + search(value, search) { - subtype: "select", - __type__: "MultipleLookupSelectControl" + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); } -); +}; -la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, +la.AppLookupControl.prototype.type = "applookup"; +la.AppLookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat(["lookupapp", "lookupcontrols"]); +la.AppLookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, "lookupapp", "lookupcontrols"); + +la.AppLookupSelectControl = class AppLookupSelectControl extends la.AppLookupControl +{ +}; + +la.AppLookupSelectControl.prototype.subtype = "select"; + +la.AppLookupRadioControl = class AppLookupRadioControl extends la.AppLookupControl +{ +}; + +la.AppLookupRadioControl.prototype.subtype = "radio"; + +la.AppLookupChoiceControl = class AppLookupChoiceControl extends la.AppLookupControl +{ +}; + +la.AppLookupChoiceControl.prototype.subtype = "choice"; + +la.MultipleLookupControl = class MultipleLookupControl extends la.LookupControl +{ + // search.value must be ``null`` or a ``LookupItem`` key + search(value, search) { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" + if (search.operator === "equals") + { + for (let item of value) + { + if (item.key === search.value) + return true; + } + return false; + } + else + return false; } -); +}; -la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, +la.MultipleLookupControl.prototype.subtype = "multiplelookup"; + +la.MultipleLookupSelectControl = class MultipleLookupSelectControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupSelectControl.prototype.subtype = "select"; + +la.MultipleLookupCheckboxControl = class MultipleLookupCheckboxControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupCheckboxControl.prototype.subtype = "checkbox"; + +la.MultipleLookupChoiceControl = class MultipleLookupChoiceControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupChoiceControl.prototype.subtype = "choice"; + +la.MultipleAppLookupControl = class MultipleAppLookupControl extends la.AppLookupControl +{ + // ``search.value`` must be an object containing the search criteria for the referenced record + search(value, search) { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (search.operator === "equals") { - if (search.value === null) - return value.length === 0; - else { - for (var i = 0; i < value.length; ++i) { - if (value[i].search(search.value)) - return true; - } - return false; - } - } + if (search.operator === "equals") + { + if (search.value === null) + return value.length === 0; else + { + for (let item of value) + { + if (item.search(search.value)) + return true; + } return false; + } } + else + return false; } -); +}; -la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } -); +la.MultipleAppLookupControl.prototype.type = "multipleapplookup"; -la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } -); +la.MultipleAppLookupSelectControl = class MultipleAppLookupSelectControl extends la.MultipleAppLookupControl +{ +}; -la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", +la.MultipleAppLookupSelectControl.prototype.subtype = "select"; +la.MultipleAppLookupCheckboxControl = class MultipleAppLookupCheckboxControl extends la.MultipleAppLookupControl +{ +}; - asjson: function (value) { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - }, +la.MultipleAppLookupCheckboxControl.prototype.subtype = "checkbox"; - __type__: "GeoControl" - } -); +la.MultipleAppLookupChoiceControl = class MultipleAppLookupChoiceControl extends la.MultipleAppLookupControl +{ +}; + +la.MultipleAppLookupChoiceControl.prototype.subtype = "choice"; -la.FileControl = ul4._inherit( - la.Control, +la.GeoControl = class GeoControl extends la.Control +{ +}; + +la.GeoControl.prototype.type = "geo"; + +la.FileControl = class FileControl extends la.Control +{ +}; + +la.FileControl.prototype.type = "file"; + +la.ButtonControl = class ButtonControl extends la.Control +{ +}; + +la.ButtonControl.prototype.type = "button"; + +la.Field = class Field extends la.Base +{ + constructor(control, record, value) { - type: "file", - __type__: "FileControl" + super(); + this.control = control; + this.record = record; + this._value = value; + this._dirty = false; + this.errors = []; } -); -la.ButtonControl = ul4._inherit( - la.Control, + get value() { - type: "button", - __type__: "ButtonControl" + return this._value; } -); -la.Field = ul4._inherit( - la.Base, + set value(value) { - create: function create(control, record, value) { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, + let oldvalue = this._value; - search: function search(searchvalue) { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() { - return ""; + if (ul4._ne(oldvalue, value)) + { + this.record.values.set(this.control.identifier, value); + this._value = value; + this._dirty = true; } } -); -la.LookupItem = ul4._inherit( - la.Base, + is_empty() { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() { - return ""; - } + return this._value === null || (ul4._islist(this._value) && this._value.length === 0); } -); -la.User = ul4._inherit( - la.Base, + is_dirty() { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() { - return ""; - } + return this._dirty; } -); -la.File = ul4._inherit( - la.Base, + has_errors() { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() { - return ""; - } + return this.errors.length !== 0; } -); -la.Geo = ul4._inherit( - la.Base, + search(searchvalue) { - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() { - return ""; - } + return this.control.search(this.value, searchvalue); } -); -la.Attachment = ul4._inherit( - la.Base, + __repr__() { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() { - return ""; - } + let s = ""; } -); +}; + +la.LookupItem.prototype._ul4onattrs = ["key", "label"]; +la.LookupItem.prototype._ul4attrs = ul4._makeset("key", "label"); -la.URLAttachment = ul4._inherit( - la.Attachment, +la.User = class User extends la.Base +{ + __repr__() { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + return ""; } -); +}; -la.FileAttachment = ul4._inherit( - la.Attachment, +la.User.prototype._ul4onattrs = ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"]; +la.User.prototype._ul4attrs = ul4._makeset("_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"); + +la.File = class File extends la.Base +{ + __repr__() { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + return ""; } -); +}; + +la.File.prototype._ul4onattrs = ["id", "url", "filename", "mimetype", "width", "height", "internalid", "createdat", "size"]; +la.File.prototype._ul4attrs = ul4._makeset("id", "url", "filename", "mimetype", "width", "height", "size", "createdat"); -la.ImageAttachment = ul4._inherit( - la.Attachment, +la.Geo = class Geo extends la.Base +{ + constructor(lat, long, info) { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + super(); + this.lat = lat; + this.long = long; + this.info = info; } -); -la.JSONAttachment = ul4._inherit( - la.Attachment, + __repr__() { - type: "jsonattachment", - __type__: "JSONAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - if (name === "value") - return ul4._asjson(this.value); - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - if (name === "value") - this.value = ul4._fromjson(value); - else - this[name] = value - } + return ""; } -); +}; -la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], +la.Geo.prototype._ul4onattrs = ["lat", "long", "info"]; +la.Geo.prototype._ul4attrs = ul4._makeset("lat", "long", "info"); - __repr__: function repr() { - return ""; - } +la.Attachment = class Attachment extends la.Base +{ + __repr__() + { + return ""; } -); +}; + +la.Attachment.prototype._ul4onattrs = ["id", "record", "label", "active"]; +la.Attachment.prototype._ul4attrs = ul4._makeset("id", "record", "label", "active"); + +la.NoteAttachment = class NoteAttachment extends la.Attachment +{ +}; + +la.NoteAttachment.prototype.type = "noteattachment"; +la.NoteAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.NoteAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); + +la.URLAttachment = class URLAttachment extends la.Attachment +{ +}; + +la.URLAttachment.prototype.type = "urlattachment"; +la.URLAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.URLAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); -la.Category = ul4._inherit( - la.Base, +la.FileAttachment = class FileAttachment extends la.Attachment +{ +}; + +la.FileAttachment.prototype.type = "fileattachment"; +la.FileAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.FileAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); + +la.ImageAttachment = class ImageAttachment extends la.Attachment +{ +}; + +la.ImageAttachment.prototype.type = "imageattachment"; +la.ImageAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]); +la.ImageAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "original", "thumb", "small", "medium", "large"); + +la.JSONAttachment = class JSONAttachment extends la.Attachment +{ + _dumpUL4ONAttr(name) { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + } - __repr__: function repr() { - var v = []; - var category = this; - while (category !== null) { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } + _loadUL4ONAttr(name, value) + { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value } -); +}; + +la.JSONAttachment.prototype.type = "jsonattachment"; +la.JSONAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.JSONAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); -la.KeyView = ul4._inherit( - la.Base, +la.Installation = class Installation extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], + return ""; + } +}; + +la.Installation.prototype._ul4onattrs = ["id", "name"]; +la.Installation.prototype._ul4attrs = ul4._makeset("id", "name"); - __repr__: function repr() { - return ""; +la.Category = class Category extends la.Base +{ + __repr__() + { + let v = []; + let category = this; + while (category !== null) + { + v.splice(0, 0, category.identifier); + category = category.parent; } + return ""; } -); +}; + +la.Category.prototype._ul4onattrs = ["id", "identifier", "name", "order", "parent", "children", "apps"]; +la.Category.prototype._ul4attrs = ul4._makeset("id", "identifier", "name", "order", "parent", "children", "apps"); -la.AppParameter = ul4._inherit( - la.Base, +la.KeyView = class KeyView extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], + return ""; + } +}; - __repr__: function repr() { - return ""; - } +la.KeyView.prototype._ul4onattrs = ["id", "identifier", "name", "key", "user"]; +la.KeyView.prototype._ul4attrs = ul4._makeset("id", "identifier", "name", "key", "user"); + +la.AppParameter = class AppParameter extends la.Base +{ + __repr__() + { + return ""; } -); - -var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "AppLookupControl", - "AppLookupSelectControl", - "AppLookupRadioControl", - "AppLookupChoiceControl", - "MultipleLookupControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "MultipleAppLookupControl", - "MultipleAppLookupSelectControl", - "MultipleAppLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" +}; + +la.AppParameter.prototype._ul4onattrs = ["id", "app", "identifier", "description", "value"]; +la.AppParameter.prototype._ul4attrs = ul4._makeset("id", "app", "identifier", "description", "value"); + +let classes = [ + la.Globals, + la.App, + la.View, + la.DataSourceData, + la.Record, + la.BoolControl, + la.IntControl, + la.NumberControl, + la.TextControl, + la.EmailControl, + la.URLControl, + la.TelControl, + la.PasswordControl, + la.TextAreaControl, + la.DateControl, + la.DatetimeMinuteControl, + la.DatetimeSecondControl, + la.LookupControl, + la.LookupSelectControl, + la.LookupRadioControl, + la.LookupChoiceControl, + la.AppLookupControl, + la.AppLookupSelectControl, + la.AppLookupRadioControl, + la.AppLookupChoiceControl, + la.MultipleLookupControl, + la.MultipleLookupSelectControl, + la.MultipleLookupCheckboxControl, + la.MultipleLookupChoiceControl, + la.MultipleAppLookupControl, + la.MultipleAppLookupSelectControl, + la.MultipleAppLookupCheckboxControl, + la.MultipleAppLookupChoiceControl, + la.GeoControl, + la.FileControl, + la.ButtonControl, + la.Field, + la.LookupItem, + la.User, + la.File, + la.Geo, + la.NoteAttachment, + la.URLAttachment, + la.FileAttachment, + la.ImageAttachment, + la.JSONAttachment, + la.Installation, + la.Category, + la.KeyView, + la.AppParameter ]; -for (var i = 0; i < classes.length; ++i) { - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); +for (let constructor of classes) +{ + // Register under the old name + ul4.register("de.livingapps.appdd." + constructor.name.toLowerCase(), constructor); + // Register under the new name + ul4.register("de.livinglogic.livingapi." + constructor.name.toLowerCase(), constructor); } - export default la; \ No newline at end of file diff --git a/dist/es2015/modules/ul4.js b/dist/es2015/modules/ul4.js index 95ff35b..d8c3be2 100644 --- a/dist/es2015/modules/ul4.js +++ b/dist/es2015/modules/ul4.js @@ -3,8 +3,8 @@ * http://www.livinglogic.de/Python/ul4c/ * http://www.livinglogic.de/Python/ul4on/ * - * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany - * Copyright 2011-2017 by Walter Dörwald + * Copyright 2011-2018 by LivingLogic AG, Bayreuth/Germany + * Copyright 2011-2018 by Walter Dörwald * * All Rights Reserved * @@ -28,3687 +28,5334 @@ */ /*jslint vars: true */ +export let ul4 = {}; +let iscommon = (typeof module === 'object' && module.exports); -export let ul4 = {}; -export let ul4on = {}; + ul4.version = "46"; -ul4.version = "41"; + // + // UL4ON + // -// -// UL4ON -// + ul4._registry = {}; -ul4on._registry = {}; + ul4._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); -ul4on._havemap = (typeof (Map) === "function" && typeof (Map.prototype.forEach) === "function"); + ul4._havemapconstructor = (function () + { + if (ul4._havemap) + { + try + { + if (new Map([[1, 2]]).size == 1) + return true; + } + catch (error) + { + } + } + return false; + })(); -ul4on._havemapconstructor = false; + ul4._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); -if (ul4on._havemap) { - try { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) { - } -} + ul4._havesetconstructor = (function () + { + if (ul4._haveset) + { + try + { + if (new Set([1, 2]).size == 2) + return true; + } + catch (error) + { + } + return false; + } + else + return false; + })(); -ul4on._haveset = (typeof (Set) === "function" && typeof (Set.prototype.forEach) === "function"); + // helper functions that work with Maps and objects + if (ul4._havemap) + { + ul4._makemap = function _makemap(...items) + { + let map = new Map(); -ul4on._havesetconstructor = false; + for (let i = 0; i < items.length; ++i) + { + let [key, value] = items[i]; + map.set(key, value); + } + return map; + }; -if (ul4on._haveset) { - try { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) { - } -} + ul4._setmap = function _setmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; -// Function used for making maps, when the Map constructor doesn't work -ul4on._makemap = function _makemap() { - var map = new Map(); + ul4._emptymap = function _emptymap() + { + return new Map(); + }; - for (var i = 0; i < arguments.length; ++i) { - var argument = arguments[i]; - map.set(argument[0], argument[1]); + ul4._getmap = function _getmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + return map.get(key); + else + return map[key]; + }; } - return map; -}; - -// Function that creates en empty Map (if supported) or an empty object -ul4on._emptymap = function _emptymap() { - return ul4on._havemap ? new Map() : {}; -}; - -// Function that adds a (key, value) item to an object (or map) -if (ul4on._havemap) { - ul4on._setmap = function _setmap(map, key, value) { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else + else + { + ul4._makemap = function _makemap(...items) + { + let map = {}; + + for (let i = 0; i < items.length; ++i) + { + let [key, value] = items[i]; + map[key] = value; + } + return map; + }; + + ul4._setmap = function _setmap(map, key, value) + { map[key] = value; - }; -} -else { - ul4on._setmap = function _setmap(map, key, value) { - map[key] = value; - }; -} + }; -// Function used for making sets, when the Set constructor doesn't work (or we don't have sets) -if (ul4on._haveset) { - ul4on._makeset = function _makeset() { - var set = this._haveset ? new Set() : ul4._Set.create(); + ul4._emptymap = function _emptymap() + { + return {}; + }; - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; -} -else { - ul4on._makeset = function _makeset() { - var set = ul4._Set.create(); + ul4._getmap = function _getmap(map, key, value) + { + return map[key]; + }; + } + + // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) + if (ul4._haveset) + { + ul4._emptyset = function _emptyset() + { + return new Set(); + }; + } + else + { + ul4._emptyset = function _emptyset() + { + return new ul4._Set(); + }; + } + + ul4._makeset = function _makeset(...items) + { + let set = ul4._emptyset(); - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); + for (let i = 0; i < items.length; ++i) + set.add(items[i]); return set; }; -} -// Register the object ``obj`` under the name ``name`` with the UL4ON machinery -ul4on.register = function register(name, obj) { - obj.ul4onname = name; - ul4on._registry[name] = function () { return obj.create(); }; -}, + // Register the constructor function ``f`` under the name ``name`` with the UL4ON machinery + ul4.register = function register(name, f) + { + f.prototype.ul4onname = name; + ul4._registry[name] = f; + }; // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) { - var encoder = ul4on.Encoder.create(indent); + ul4.dumps = function dumps(obj, indent) + { + let encoder = new ul4.Encoder(indent); encoder.dump(obj); return encoder.finish(); - }, + }; // Load an object from the string ``data``. // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) { - var decoder = ul4on.Decoder.create(data, registry); + // ``registry`` may be null or a dictionary mapping type names to constructor functions + ul4.loads = function loads(data, registry) + { + let decoder = new ul4.Decoder(data, registry); return decoder.load(); - }, + }; - // Helper "class" for encoding - ul4on.Encoder = { + // Helper class for encoding + ul4.Encoder = class Encoder + { // Create a new Encoder object - create: function create(indent) { - var encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line) { - var i, oldindent; - - if (this.indent !== null) { - for (i = 0; i < this._level; ++i) + constructor(indent=null) + { + this.indent = indent; + this.data = []; + this._level = 0; + this._strings2index = {}; + this._ids2index = {}; + this._backrefs = 0; + } + + _line(line, ...args) + { + if (this.indent !== null) + { + for (let i = 0; i < this._level; ++i) this.data.push(this.indent); } - else { + else + { if (this.data.length) this.data.push(" "); } this.data.push(line); - if (arguments.length > 1) { - oldindent = this.indent; + if (args.length) + { + let oldindent = this.indent; this.indent = null; - for (i = 1; i < arguments.length; ++i) - this.dump(arguments[i]); + for (let i = 0; i < args.length; ++i) + this.dump(args[i]); this.indent = oldindent; } if (this.indent !== null) this.data.push("\n"); - }, + } // Return the complete string written to the buffer - finish: function finish() { + finish() + { return this.data.join(""); - }, + } - dump: function dump(obj) { + dump(obj) + { if (obj === null) this._line("n"); - else if (typeof (obj) == "boolean") + else if (typeof(obj) == "boolean") this._line(obj ? "bT" : "bF"); - else if (typeof (obj) == "number") { - var type = (Math.round(obj) == obj) ? "i" : "f"; + else if (typeof(obj) == "number") + { + let type = (Math.round(obj) == obj) ? "i" : "f"; this._line(type + obj); } - else if (typeof (obj) == "string") { - var index = this._strings2index[obj]; - if (typeof (index) !== "undefined") { + else if (typeof(obj) == "string") + { + let index = this._strings2index[obj]; + if (typeof(index) !== "undefined") + { this._line("^" + index); } - else { + else + { this._strings2index[obj] = this._backrefs++; - this._line("S" + ul4._str_repr(obj)); + let dump = ul4._str_repr(obj).replace("<", "\\x3c"); + this._line("S" + dump); } } else if (ul4._iscolor(obj)) this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + this._line("x", obj.year(), obj.month(), obj.day()); + else if (ul4._isdatetime(obj)) + this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); else if (ul4._istimedelta(obj)) this._line("t", obj.days(), obj.seconds(), obj.microseconds()); else if (ul4._ismonthdelta(obj)) this._line("m", obj.months()); - else if (typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.slice)) + else if (obj instanceof ul4.slice) this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) { - if (obj.__id__) { - var index = this._ids2index[obj.__id__]; - if (typeof (index) != "undefined") { + else if (obj.ul4onname && obj.ul4ondump) + { + if (obj.__id__) + { + let index = this._ids2index[obj.__id__]; + if (typeof(index) != "undefined") + { this._line("^" + index); return; } - } - if (obj.__id__) this._ids2index[obj.__id__] = this._backrefs++; + } this._line("O", obj.ul4onname); ++this._level; obj.ul4ondump(this); --this._level; this._line(")"); } - else if (ul4._islist(obj)) { + else if (ul4._islist(obj)) + { this._line("l"); ++this._level; - for (var i in obj) + for (let i = 0; i < obj.length; ++i) this.dump(obj[i]); --this._level; this._line("]"); } - else if (ul4._ismap(obj)) { + else if (ul4._ismap(obj)) + { this._line("e"); ++this._level; - obj.forEach(function (value, key) { + obj.forEach(function(value, key) { this.dump(key); this.dump(value); }, this); --this._level; this._line("}"); } - else if (ul4._isdict(obj)) { + else if (ul4._isdict(obj)) + { this._line("d"); ++this._level; - for (var key in obj) { + for (let key in obj) + { this.dump(key); this.dump(obj[key]); } --this._level; this._line("}"); } - else if (ul4._isset(obj)) { + else if (ul4._isset(obj)) + { this._line("y"); ++this._level; - obj.forEach(function (value) { + obj.forEach(function(value) { this.dump(value); }, this); --this._level; this._line("}"); } else - throw "can't handle object"; + throw new ul4.ValueError("can't create UL4ON dump of object " + ul4._repr(obj)); } }; -// Helper "class" for decoding -ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) { - var decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof (registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, + // Helper class for decoding + ul4.Decoder = class Decoder + { + // Creates a new decoder for reading from the string ``data`` + constructor(data, registry) + { + this.data = data; + this.pos = 0; + this.backrefs = []; + this.registry = typeof(registry) === "undefined" ? null : registry; + this.stack = []; // Use for informative error messages + } + + // Read a character from the buffer + readchar() + { + if (this.pos >= this.data.length) + throw new ul4.ValueError("UL4 decoder at EOF"); + return this.data.charAt(this.pos++); + } - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, + // Read a character from the buffer (return null on eof) + readcharoreof() + { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + } - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() { - var re_white = /\s/; + // Read next not-whitespace character from the buffer + readblackchar() + { + let re_white = /\s/; - for (; ;) { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - var c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; + for (;;) + { + if (this.pos >= this.data.length) + throw new ul4.ValueError("UL4 decoder at EOF at position " + this.pos + " with path " + this.stack.join("/")); + let c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } } - }, - // Read ``size`` characters from the buffer - read: function read(size) { - if (this.pos + size > this.length) - size = this.length - this.pos; - var result = this.data.substring(this.pos, this.pos + size); - this.pos += size; - return result; - }, + // Read ``size`` characters from the buffer + read(size) + { + if (this.pos+size > this.length) + size = this.length-this.pos; + let result = this.data.substring(this.pos, this.pos+size); + this.pos += size; + return result; + } - // "unread" one character - backup: function backup() { - --this.pos; - }, + // "unread" one character + backup() + { + --this.pos; + } - // Read a number from the buffer - readnumber: function readnumber() { - var re_digits = /[-+0123456789.eE]/, value = ""; - for (; ;) { - var c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else { - var result = parseFloat(value); - if (result == NaN) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; + // Read a number from the buffer + readnumber() + { + let re_digits = /[-+0123456789.eE]/, value = ""; + for (;;) + { + let c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else + { + let result = parseFloat(value); + if (isNaN(result)) + throw new ul4.ValueError("invalid number, got " + ul4._repr("value") + " at position " + this.pos + " with path " + this.stack.join("/")); + return result; + } } } - }, - _beginfakeloading: function _beginfakeloading() { - var oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, + _beginfakeloading() + { + let oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + } - _endfakeloading: function _endfakeloading(oldpos, value) { - this.backrefs[oldpos] = value; - }, + _endfakeloading(oldpos, value) + { + this.backrefs[oldpos] = value; + } - _readescape: function _readescape(escapechar, length) { - var chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - var codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, + _readescape(escapechar, length) + { + let chars = this.read(length); + if (chars.length != length) + throw new ul4.ValueError("broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos + " with path " + this.stack.join("/")); + let codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw new ul4.ValueError("broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos + " with path " + this.stack.join("/")); + return String.fromCharCode(codepoint); + } - // Load the next object from the buffer - load: function load() { - var typecode = this.readblackchar(); - var result; - switch (typecode) { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - var delimiter = this.readblackchar(); - for (; ;) { - var c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") { - var c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); + // Load the next object from the buffer + load() + { + let typecode = this.readblackchar(); + let result; + switch (typecode) + { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw new ul4.ValueError("wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos + " with path " + this.stack.join("/")); + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + let delimiter = this.readblackchar(); + for (;;) + { + let c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") + { + let c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } else - result.push("\\" + c2); + result.push(c); } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load() / 1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (; ;) { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (; ;) { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - var key = this.load(); - var value = this.load(); - ul4on._setmap(result, key, value); + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = new ul4.Color(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "x": + case "X": + { + let year = this.load(); + let month = this.load(); + let day = this.load(); + result = new ul4.Date(year, month, day); + if (typecode === "X") + this.backrefs.push(result); + return result; } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (; ;) { + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load()/1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = new ul4.TimeDelta(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = new ul4.slice(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = new ul4.MonthDelta(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + this.stack.push("list"); + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "]") + break; + this.backup(); + result.push(this.load()); + } + this.stack.pop(); + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4._havemap && (typecode == "e" || typecode == "E")) + throw new ul4.ValueError("ordered dictionaries are not supported at position " + this.pos + " with path " + this.stack.join("/")); + result = ul4._emptymap(); + this.stack.push(typecode === "d" || typecode === "D" ? "dict" : "odict"); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + break; + this.backup(); + let key = this.load(); + let value = this.load(); + ul4._setmap(result, key, value); + } + this.stack.pop(); + return result; + case "y": + case "Y": + this.stack.push("set"); + result = ul4._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + break; + this.backup(); + result.add(this.load()); + } + this.stack.pop(); + return result; + case "o": + case "O": + { + let oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + let name = this.load(); + this.stack.push(name); + let constructor; + if (this.registry !== null) + { + constructor = this.registry[name]; + if (typeof(constructor) === "undefined") + constructor = ul4._registry[name]; + } + else + constructor = ul4._registry[name]; + if (typeof(constructor) === "undefined") + throw new ul4.ValueError("can't load object of type " + ul4._repr(name) + " at position " + this.pos + " with path " + this.stack.join("/")); + result = new constructor(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - var oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - var name = this.load(); - var proto; - if (this.registry !== null) { - proto = this.registry[name]; - if (typeof (proto) === "undefined") - proto = ul4on._registry[name]; + if (typecode !== ")") + throw new ul4.ValueError("object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos + " with path " + this.stack.join("/")); + this.stack.pop(); + return result; } - else - proto = ul4on._registry[name]; - if (typeof (proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + default: + throw new ul4.ValueError("unknown typecode " + ul4._repr(typecode) + " at position " + this.pos + " with path " + this.stack.join("/")); + } } - }, - // Return an iterator for loading the content of a object - loadcontent: function load(loadcontent) { - let self = this; - return { - next: function () { - let typecode = self.readblackchar(); - self.backup(); - if (typecode == ")") - return { done: true }; - else - return { done: false, value: self.load() }; - } - }; - } -}; - - -// -// UL4 -// - -// REs for parsing JSON -ul4._rvalidchars = /^[\],:{}\s]*$/; -ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; -ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; -ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - -/// Helper functions - -// Crockford style object creation -ul4._simpleclone = function _simpleclone(obj) { - function F() { }; - F.prototype = obj; - var result = new F(); - return result; -}; - -// Crockford style object creation + prototype chain + object ids -ul4._clone = function _clone(obj) { - var result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; -}; - -// Adds attributes from on object to another and returns it -ul4._extend = function _extend(obj, attrs) { - for (var name in attrs) - obj[name] = attrs[name]; - return obj; -}; - -// Clone an object via ``_simpleclone`` and extend it -ul4._simpleinherit = function _simpleinherit(baseobj, attrs) { - return ul4._extend(ul4._simpleclone(baseobj), attrs); -}; - -// Clone an object via ``_clone`` and extend it -ul4._inherit = function _inherit(baseobj, attrs) { - return ul4._extend(ul4._clone(baseobj), attrs); -}; - -// Convert a map to an object -ul4._map2object = function _map2object(obj) { - if (ul4._ismap(obj)) { - var newobj = {}; - obj.forEach(function (value, key) { - if (typeof (key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; -}; - -// Clip a number to the range [0;max) -ul4._bound = function _bound(value, upper) { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; -}; - -// Create a pretty stacktrace from an exception -ul4._stacktrace = function _stacktrace(exc) { - var output = ul4._type(exc); - var s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; -}; - -// Call a function ``f`` with UL4 argument handling -ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) { - var finalargs; - if (needsobject) { - if (signature === null) { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; + // Return an iterator for loading the content of a object + loadcontent() + { + let self = this; + return { + next: function() + { + let typecode = self.readblackchar(); + // Always "unread" the typecode even at the end + // so that at the end of a call to ul4onload() + // the next input is the "end of object" marker + // no matter whether ul4onload() uses loadcontent() or not. + self.backup(); + if (typecode == ")") + return {done: true}; + else + return {done: false, value: self.load()}; + } + }; } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); -}; - -ul4._callfunction = function _callfunction(context, f, args, kwargs) { - var name = f._ul4_name || f.name; - if (typeof (f._ul4_signature) === "undefined" || typeof (f._ul4_needsobject) === "undefined" || typeof (f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); -} - -ul4._callobject = function _callobject(context, obj, args, kwargs) { - if (typeof (obj._ul4_callsignature) === "undefined" || typeof (obj._ul4_callneedsobject) === "undefined" || typeof (obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); -} - -ul4._callrender = function _callrender(context, obj, args, kwargs) { - if (typeof (obj._ul4_rendersignature) === "undefined" || typeof (obj._ul4_renderneedsobject) === "undefined" || typeof (obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); -} - -ul4._call = function _call(context, f, args, kwargs) { - if (typeof (f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof (f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); -} + }; -ul4._unpackvar = function _unpackvar(lvalue, value) { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else { - var newvalue = []; - var iter = ul4._iter(value); + // + // UL4 + // - for (var i = 0; ; ++i) { - var item = iter.next(); + // REs for parsing JSON + ul4._rvalidchars = /^[\],:{}\s]*$/; + ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - if (item.done) { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } -}; + /// Helper functions + + // Clone an object and extend it + ul4._inherit = function _inherit(baseobj, attrs) + { + return Object.assign(Object.create(baseobj), attrs); + }; -ul4._formatsource = function _formatsource(out) { - var finalout = []; - var level = 0, needlf = false; - for (var i = 0; i < out.length; ++i) { - if (typeof (out[i]) === "number") { - level += out[i]; - needlf = true; + // Convert a map to an object + ul4._map2object = function _map2object(obj) + { + if (ul4._ismap(obj)) + { + let newobj = {}; + obj.forEach(function(value, key){ + if (typeof(key) !== "string") + throw new ul4.TypeError("keys must be strings"); + newobj[key] = value; + }); + return newobj; } - else { - if (needlf) { - finalout.push("\n"); - for (var j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; + return obj; + }; + + // Clip a number to the range [0;max) + ul4._bound = function _bound(value, upper) + { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; + }; + + // Create a pretty stacktrace from an exception + ul4._stacktrace = function _stacktrace(exc) + { + let output = (exc instanceof ul4.Exception ? exc.constructor.name + ": " : "") + exc.toString(); + if (exc.context) + output = ul4._stacktrace(exc.context) + "\n\n" + output; + return output; + }; + + // Call a function ``f`` with UL4 argument handling + ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) + { + let finalargs; + if (needsobject) + { + if (signature === null) + { + if (args.length) + throw new ul4.ArgumentError(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; } - finalout.push(out[i]); + else + finalargs = [signature.bindObject(name, args, kwargs)]; } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); -}; - -// Compare ``obj1`` and ``obj2`` if they have the same value -ul4._eq = function _eq(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof (obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 == obj2 - else - return false; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); else - return false; - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } + { + if (signature === null) + throw new ul4.ArgumentError(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); + }; + + ul4._callfunction = function _callfunction(context, f, args, kwargs) + { + let name = f._ul4_name || f.name; + if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); + }; + + ul4._callobject = function _callobject(context, obj, args, kwargs) + { + if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(obj) + " is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); + }; + + ul4._callrender = function _callrender(context, obj, args, kwargs) + { + if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(obj) + " is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); + }; + + ul4._call = function _call(context, f, args, kwargs) + { + if (typeof(f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof(f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); else - return false; - } - else if (ul4._isobject(obj1)) { - if (ul4._isobject(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) { - if (obj2.hasOwnProperty(key)) { - if (!ul4._eq(obj1[key], obj2[key])) - return false; + throw new ul4.TypeError(ul4._type(f) + " is not callable"); + }; + + ul4._unpackvar = function _unpackvar(lvalue, value) + { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else + { + let newvalue = []; + let iter = ul4._iter(value); + + for (let i = 0;;++i) + { + let item = iter.next(); + + if (item.done) + { + if (i === lvalue.length) + break; + else + throw new ul4.ValueError("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); } else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) { - if (obj2.has(key)) { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; + { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw new ul4.ValueError("too many values to unpack (expected " + lvalue.length + ")"); } - else - return false; } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - var result = true; - obj2.forEach(function (value, key) { - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; + return newvalue; } - else - return false; - } - else if (ul4._ismap(obj1)) { - if (ul4._isobject(obj2)) { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function (value, key) { - if (result) // Skip code, if result is already ``false`` + }; + + ul4._formatsource = function _formatsource(out) + { + let finalout = []; + let level = 0, needlf = false; + for (let i = 0; i < out.length; ++i) + { + let part = out[i]; + if (typeof(part) === "number") + { + level += part; + needlf = true; + } + else + { + if (needlf) { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; + finalout.push("\n"); + for (let j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; } - }); - if (!result) + finalout.push(part); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); + }; + + // Compare ``obj1`` and ``obj2`` if they have the same value + ul4._eq = function _eq(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof(obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 == obj2; + else + return false; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 == obj2; + else return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) { - if (!obj1.has(key)) + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) return false; + for (let i = 0; i < obj1.length; ++i) + { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; } - return true; + else + return false; } - else if (ul4._ismap(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) + else if (ul4._isobject(obj1)) + { + if (ul4._isobject(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (let key in obj1) + { + if (obj2.hasOwnProperty(key)) + { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + for (let key in obj2) + { + if (!obj1.hasOwnProperty(key)) + return false; + } return true; - if (obj1.size != obj2.size) + } + else if (ul4._ismap(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (let key in obj1) + { + if (obj2.has(key)) + { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + let result = true; + obj2.forEach(function(value, key) { + if (!obj1.hasOwnProperty(key)) + result = false; + }, this); + return result; + } + else return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function (value, key) { - if (result) // Skip code, if result is already ``false`` + } + else if (ul4._ismap(obj1)) + { + if (ul4._isobject(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + obj1.forEach(function(value, key) { + if (!obj2.hasOwnProperty(key)) + return false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + return false; + }, this); + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + for (let key in obj2) { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + let result = true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + obj1.forEach(function(value, key) { if (!obj2.has(key)) result = false; else if (!ul4._eq(obj1.get(key), obj2.get(key))) result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) + }); + return result; + } + else return false; - var result = true; - obj1.forEach(function (value) { - if (result) // Skip code, if result is already ``false`` - { + } + else if (ul4._isset(obj1)) + { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + let result = true; + obj1.forEach(function(value) { if (!obj2.has(value)) result = false; - } - }); - return result; + }); + return result; + } + else + return false; } else - return false; - } - else - return obj1 === obj2; -}; - -// Compare ``obj1`` and ``obj2`` if they don't have the same value -ul4._ne = function _ne(obj1, obj2) { - if (obj1 && typeof (obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof (obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); -} - -ul4._unorderable = function _unorderable(operator, obj1, obj2) { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); -}; - -// Return: -// -1 when ``obj1 < obj2``, -// 0 when ``obj1 == obj2``, -// 1 when ``obj1 > obj2``, -// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) -// raise TypeError if objects are uncomparable -// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= -// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - -ul4._cmp = function _cmp(operator, obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) { - var v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); + return obj1 === obj2; + }; + + // Compare ``obj1`` and ``obj2`` if they don't have the same value + ul4._ne = function _ne(obj1, obj2) + { + if (obj1 && typeof(obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof(obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); + }; + + ul4._unorderable = function _unorderable(operator, obj1, obj2) + { + throw new ul4.TypeError("unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); + }; + + // Return: + // -1 when ``obj1 < obj2``, + // 0 when ``obj1 == obj2``, + // 1 when ``obj1 > obj2``, + // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) + // raise TypeError if objects are uncomparable + // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= + // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + + ul4._cmp = function _cmp(operator, obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); } - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return 0; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return 1; - var res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + { + let v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return 0; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return 1; + let res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; } + return obj2.length > obj1.length ? -1 : 0; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + if (ul4._isset(obj2) || ul4._isul4set(obj2)) + { + let in1only = false; + let in2only = false; + + for (let iter = _iter(obj1);;) + { + let item = iter.next(); + if (item.done) break; - } - } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { + if (!obj2.has(item.value)) + { in1only = true; break; } } - for (var value in obj2.items) { - if (!obj1.items[value]) { + for (let iter = _iter(obj2);;) + { + let item = iter.next(); + if (item.done) + break; + if (!obj1.has(item.value)) + { in2only = true; break; } } + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } } } - else - ul4._unorderable(operator, obj1, obj2); + return ul4._unorderable(operator, obj1, obj2); + }; - if (in1only) { - if (in2only) - return null; - else - return 1; - } - else { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); -} - -// Return whether ``obj1 < obj2`` -ul4._lt = function _lt(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 < obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) + // Return whether ``obj1 < obj2`` + ul4._lt = function _lt(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 < obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; } - return obj1.length < obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) { - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1)) + { + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + for (let key in obj1) + { + if (!obj2.has(obj1[key])) + in1only = true; + } + for (let key in obj2) + { + if (!obj1.has(obj2[key])) + in2only = true; } } - } - } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let key in obj1) + { + if (!obj2.items[obj1[key]]) + in1only = true; + } + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } - } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + for (let key in obj2) + { + if (!obj1.items[obj2[key]]) + in2only = true; + } + } + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); -}; - -// Return whether ``obj1 <= obj2`` -ul4._le = function _le(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length <= obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable("<", obj1, obj2); + }; + + // Return whether ``obj1 <= obj2`` + ul4._le = function _le(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); } + return obj1.length <= obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); -}; - -// Return whether ``obj1 > obj2`` -ul4._gt = function _gt(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 > obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length > obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable("<=", obj1, obj2); + }; + + // Return whether ``obj1 > obj2`` + ul4._gt = function _gt(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 > obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); } + return obj1.length > obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; - } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + { + in2only = true; + } + }); } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); -}; - -// Return whether ``obj1 >= obj2`` -ul4._ge = function _ge(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length >= obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable(">", obj1, obj2); + }; + + // Return whether ``obj1 >= obj2`` + ul4._ge = function _ge(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); } + return obj1.length >= obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value, key) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; - else - return 1; - } - else { - if (in2only) - return -1; else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); -}; + ul4._unorderable(operator, obj1, obj2); -// Return an iterator for ``obj`` -ul4._iter = function _iter(obj) { - if (typeof (obj) === "string" || ul4._islist(obj)) { - return { - index: 0, - next: function () { - if (this.index < obj.length) - return { value: obj[this.index++], done: false }; + if (in1only) + { + if (in2only) + return null; else - return { done: true }; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof (obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) { - var keys = []; - obj.forEach(function (value, key) { - keys.push(key); - }); - return { - index: 0, - next: function () { - if (this.index >= keys.length) - return { done: true }; - return { value: keys[this.index++], done: false }; - } - }; - } - else if (ul4._isset(obj)) { - var values = []; - obj.forEach(function (value, key) { - values.push(value); - }); - return { - index: 0, - next: function () { - if (this.index >= values.length) - return { done: true }; - return { value: values[this.index++], done: false }; + return 1; } - }; - } - else if (ul4._isul4set(obj)) { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) { - var keys = []; - for (var key in obj) - keys.push(key); - return { - index: 0, - next: function () { - if (this.index >= keys.length) - return { done: true }; - return { value: keys[this.index++], done: false }; + else + { + if (in2only) + return -1; + else + return 0; } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); -}; - -ul4._str_repr = function _str_repr(str, ascii) { - var result = ""; - var squote = false, dquote = false; - - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - if (c == '"') { - dquote = true; - if (squote) - break; - } - else if (c == "'") { - squote = true; - if (dquote) - break; } - } - - // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes - var quote = (squote && !dquote) ? '"' : "'"; + ul4._unorderable(">=", obj1, obj2); + }; - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - switch (c) { - case '"': - result += (quote == c) ? '\\"' : c; - break; - case "'": - result += (quote == c) ? "\\'" : c; - break; - case "\\": - result += "\\\\"; - break; - case "\t": - result += "\\t"; - break; - case "\n": - result += "\\n"; - break; - case "\r": - result += "\\r"; - break; - default: - var code = str.charCodeAt(i); - var escape; - if (code < 32) - escape = 2; - else if (code < 0x7f) - escape = 0; - else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) - escape = 0; - else if (code <= 0xff) - escape = 2; - else if (code <= 0xffff) - escape = 4; - else - escape = 8; - - if (escape === 0) - result += c; - else if (escape === 2) - result += "\\x" + ul4._lpad(code.toString(16), "0", 2); - else if (escape === 4) - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - else - result += "\\U" + ul4._lpad(code.toString(16), "0", 8); - break; + // Return an iterator for ``obj`` + ul4._iter = function _iter(obj) + { + if (typeof(obj) === "string" || ul4._islist(obj)) + { + return { + index: 0, + next: function() + { + if (this.index < obj.length) + return {value: obj[this.index++], done: false}; + else + return {done: true}; + } + }; } - } - return quote + result + quote; -}; - -ul4._date_repr = function _date_repr(obj, ascii) { - var year = obj.getFullYear(); - var month = obj.getMonth() + 1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - var result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); - - if (hour || minute || second || ms) { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - result += ")"; - - return result; -}; - -ul4._map_repr = function _map_repr(obj, ascii) { - var v = []; - v.push("{"); - - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._repr_internal(key, ascii)); - v.push(": "); - v.push(ul4._repr_internal(value, ascii)); - }); + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof(obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) + { + let keys = []; + obj.forEach(function(value, key) { + keys.push(key); + }); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + else if (ul4._isset(obj)) + { + let values = []; + obj.forEach(function(item) { + values.push(item); + }); + return { + index: 0, + next: function() + { + if (this.index >= values.length) + return {done: true}; + return {value: values[this.index++], done: false}; + } + }; + } + else if (ul4._isul4set(obj)) + { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) + { + let keys = []; + for (let key in obj) + keys.push(key); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + throw new ul4.TypeError(ul4._type(obj) + " object is not iterable"); + }; - v.push("}"); - return v.join(""); -}; - -ul4._list_repr = function _list_repr(obj, ascii) { - var v = []; - v.push("["); - for (var i = 0; i < obj.length; ++i) { - if (i !== 0) - v.push(", "); - v.push(ul4._repr_internal(obj[i], ascii)); - } - v.push("]"); - return v.join(""); -}; - -ul4._set_repr = function _set_repr(obj, ascii) { - var v = []; - v.push("{"); - if (!obj.size) - v.push("/"); - else { - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._repr_internal(value, ascii)); - }); - } - v.push("}"); - return v.join(""); -}; - -ul4._object_repr = function _object_repr(obj, ascii) { - var v = []; - v.push("{"); - var i = 0; - for (var key in obj) { - if (!obj.hasOwnProperty(key)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr_internal(key, ascii)); - v.push(": "); - v.push(ul4._repr_internal(obj[key], ascii)); - } - v.push("}"); - return v.join(""); -}; - -ul4._repr_internal = function _repr_internal(obj, ascii) { - if (obj === null) - return "None"; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof (obj) === "string") - return ul4._str_repr(obj, ascii); - else if (typeof (obj) === "number") - return "" + obj; - else if (typeof (obj) === "function") - if (obj._ul4_name || obj.name) - return ""; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof (obj) === "undefined") - return ""; - else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; -}; - -// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` -ul4._repr = function _repr(obj) { - return ul4._repr_internal(obj, false); -} - -ul4._ascii = function _ascii(obj) { - return ul4._repr_internal(obj, true); -} - -ul4._date_str = function _date_str(obj) { - var year = obj.getFullYear(); - var month = obj.getMonth() + 1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - - var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; -}; - -ul4._str = function _str(obj) { - if (typeof (obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof (obj) === "string") - return obj; - else if (typeof (obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof (obj) === "object" && typeof (obj.__str__) === "function") - return obj.__str__(); - else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; -}; - -// Convert ``obj`` to bool, according to its "truth value" -ul4._bool = function _bool(obj) { - if (typeof (obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else { - if (typeof (obj) === "object", typeof (obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) { - for (var key in obj) { - if (!obj.hasOwnProperty(key)) - continue; - return true; + ul4._str_repr = function _str_repr(str, ascii) + { + let result = ""; + let squote = false, dquote = false; + + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + if (c == '"') + { + dquote = true; + if (squote) + break; + } + else if (c == "'") + { + squote = true; + if (dquote) + break; } - return false; } - return true; - } -}; - -// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) -ul4._int = function _int(obj, base) { - var result; - if (base !== null) { - if (typeof (obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); + + // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes + let quote = (squote && !dquote) ? '"' : "'"; + + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + switch (c) + { + case '"': + result += (quote == c) ? '\\"' : c; + break; + case "'": + result += (quote == c) ? "\\'" : c; + break; + case "\\": + result += "\\\\"; + break; + case "\t": + result += "\\t"; + break; + case "\n": + result += "\\n"; + break; + case "\r": + result += "\\r"; + break; + default: + let code = c.charCodeAt(0); + let escape; + if (code < 32) + escape = 2; + else if (code < 0x7f) + escape = 0; + else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) + escape = 0; + else if (code <= 0xff) + escape = 2; + else if (code <= 0xffff) + escape = 4; + else + escape = 8; + + if (escape === 0) + result += c; + else if (escape === 2) + result += "\\x" + ul4._lpad(code.toString(16), "0", 2); + else if (escape === 4) + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + else + result += "\\U" + ul4._lpad(code.toString(16), "0", 8); + break; + } + } + return quote + result + quote; + }; + + ul4._date_repr = function _date_repr(obj, ascii) + { + let year = obj._date.getFullYear(); + let month = obj._date.getMonth()+1; + let day = obj._date.getDate(); + let result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + ")"; return result; - } - else { - if (typeof (obj) == "string") { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; + }; + + ul4._datetime_repr = function _datetime_repr(obj, ascii) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + let result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + "T"; + + if (hour || minute || second || ms) + { + result += ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2); + if (second || ms) + { + result += ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } } - else if (typeof (obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } -}; + result += ")"; -// Convert ``obj`` to a float -ul4._float = function _float(obj) { - if (typeof (obj) === "string") - return parseFloat(obj); - else if (typeof (obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); -}; - -// Convert ``obj`` to a list -ul4._list = function _list(obj) { - var iter = ul4._iter(obj); - - var result = []; - for (; ;) { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } -}; + return result; + }; -// Convert ``obj`` to a set -ul4._set = function _set(obj) { - var iter = ul4._iter(obj); + ul4._map_repr = function _map_repr(obj, ascii) + { + let v = []; + v.push("{"); - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (; ;) { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } -}; - -// Return the length of ``sequence`` -ul4._len = function _len(sequence) { - if (typeof (sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); -}; - -ul4._type = function _type(obj) { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof (obj) === "undefined") - return "undefined"; - else if (typeof (obj) === "string") - return "str"; - else if (typeof (obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof (obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; -}; - - -// Return whether any of the items in ``iterable`` are true -ul4._any = function _any(iterable) { - if (typeof (iterable) == "string") { - for (var i = 0; i < iterable.length; ++i) { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else { - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } -}; + let i = 0; + obj.forEach(function(value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(value, ascii)); + }); -// Return whether all of the items in ``iterable`` are true -ul4._all = function _all(iterable) { - if (typeof (iterable) == "string") { - for (var i = 0; i < iterable.length; ++i) { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else { - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } -}; - -// Check if ``obj`` is undefined -ul4._isundefined = function _isundefined(obj) { - return typeof (obj) === "undefined"; -}; - - -// Check if ``obj`` is *not* undefined -ul4._isdefined = function _isdefined(obj) { - return typeof (obj) !== "undefined"; -}; - -// Check if ``obj`` is ``None`` -ul4._isnone = function _isnone(obj) { - return obj === null; -}; - -// Check if ``obj`` is a boolean -ul4._isbool = function _isbool(obj) { - return typeof (obj) == "boolean"; -}; - -// Check if ``obj`` is a int -ul4._isint = function _isint(obj) { - return (typeof (obj) == "number") && Math.round(obj) == obj; -}; - -// Check if ``obj`` is a float -ul4._isfloat = function _isfloat(obj) { - return (typeof (obj) == "number") && Math.round(obj) != obj; -}; - -// Check if ``obj`` is a string -ul4._isstr = function _isstr(obj) { - return typeof (obj) == "string"; -}; - -// Check if ``obj`` is a date -ul4._isdate = function _isdate(obj) { - return Object.prototype.toString.call(obj) == "[object Date]"; -}; - -// Check if ``obj`` is a color -ul4._iscolor = function _iscolor(obj) { - return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Color)); -}; - -// Check if ``obj`` is a timedelta object -ul4._istimedelta = function _istimedelta(obj) { - return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.TimeDelta)); -}; - -// Check if ``obj`` is a monthdelta object -ul4._ismonthdelta = function _ismonthdelta(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.MonthDelta); -}; - -// Check if ``obj`` is a template -ul4._istemplate = function _istemplate(obj) { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); -}; - -// Check if ``obj`` is a function -ul4._isfunction = function _isfunction(obj) { - return typeof (obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); -}; - -// Check if ``obj`` is a list -ul4._islist = function _islist(obj) { - return Object.prototype.toString.call(obj) == "[object Array]"; -}; - -// Check if ``obj`` is a set -ul4._isset = function _isset(obj) { - return Object.prototype.toString.call(obj) == "[object Set]"; -}; - -// Check if ``obj`` is an exception (at least a UL4 exception) -ul4._isexception = function _isexception(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Error); -}; - -ul4._isul4set = function _isul4set(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4._Set); -}; - -// Check if ``obj`` is an iterator -ul4._isiter = function _isiter(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.next) === "function"; -}; - -// Check if ``obj`` is a JS object -ul4._isobject = function _isobject(obj) { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof (obj.__type__) === "undefined"; -}; - -// Check if ``obj`` is a map -ul4._ismap = function _ismap(obj) { - if (ul4on._havemap) - return obj !== null && typeof (obj) === "object" && typeof (obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - return false; -}; - -// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) -ul4._isdict = function _isdict(obj) { - return ul4._isobject(obj) || ul4._ismap(obj); -}; - - -// Repeat string ``str`` ``rep`` times -ul4._str_repeat = function _str_repeat(str, rep) { - var result = ""; - for (; rep > 0; --rep) - result += str; - return result; -}; - -ul4._list_repeat = function _list_repeat(list, rep) { - var result = []; - for (; rep > 0; --rep) - for (var i = 0; i < list.length; ++i) - result.push(list[i]); - return result; -}; - -ul4._str_json = function _str_json(str) { - var result = ""; - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - switch (c) { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - default: - var code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; -}; - -// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) -ul4._asjson = function _asjson(obj) { - if (obj === null) - return "null"; - else if (typeof (obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof (obj) === "string") - return ul4._str_json(obj); - else if (typeof (obj) === "number") { - return "" + obj; - } - else if (ul4._islist(obj)) { - var v = []; + v.push("}"); + return v.join(""); + }; + + ul4._list_repr = function _list_repr(obj, ascii) + { + let v = []; v.push("["); - for (var i = 0; i < obj.length; ++i) { - if (i != 0) + for (let i = 0; i < obj.length; ++i) + { + let item = obj[i]; + if (i) v.push(", "); - v.push(ul4._asjson(obj[i])); + v.push(ul4._repr_internal(item, ascii)); } v.push("]"); return v.join(""); - } - else if (ul4._ismap(obj)) { - var v = []; + }; + + ul4._set_repr = function _set_repr(obj, ascii) + { + let v = []; v.push("{"); - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); + if (!obj.size) + v.push("/"); + else + { + let i = 0; + obj.forEach(function(value) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(value, ascii)); + }); + } v.push("}"); return v.join(""); - } - else if (ul4._isobject(obj)) { - var v = []; + }; + + ul4._object_repr = function _object_repr(obj, ascii) + { + let v = []; v.push("{"); - var i = 0; - for (var key in obj) { + let i = 0; + for (let key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; if (i++) v.push(", "); - v.push(ul4._asjson(key)); + v.push(ul4._repr_internal(key, ascii)); v.push(": "); - v.push(ul4._asjson(obj[key])); + v.push(ul4._repr_internal(obj[key], ascii)); } v.push("}"); return v.join(""); - } - else if (ul4._isdate(obj)) { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); -}; - -// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object -ul4._fromjson = function _fromjson(string) { - // The following is from jQuery's parseJSON function - string = ul4._strip(string, null); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); -}; - -// Encodes ``obj`` in the UL4 Object Notation format -ul4._asul4on = function _asul4on(obj) { - return ul4on.dumps(obj); -}; - -// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object -ul4._fromul4on = function _fromul4on(string) { - return ul4on.loads(string); -}; - -ul4._format_date = function _format_date(obj, fmt, lang) { - var translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - var translation = translations[lang]; - - var firstday; - - var result = []; - var inspec = false; - for (var i = 0; i < fmt.length; ++i) { - var c = fmt[i]; - if (inspec) { - switch (c) { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours() - 1) % 12) + 1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth() + 1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; + }; + + ul4._repr_internal = function _repr_internal(obj, ascii) + { + if (obj === null) + return "None"; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return ul4._str_repr(obj, ascii); + else if (typeof(obj) === "number") + return "" + obj; + else if (typeof(obj) === "function") + if (obj._ul4_name || obj.name) + return ""; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (ul4._isdatetime(obj)) + return ul4._datetime_repr(obj, ascii); + else if (typeof(obj) === "undefined") + return ""; + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; + }; + + // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` + ul4._repr = function _repr(obj) + { + return ul4._repr_internal(obj, false); + }; + + ul4._ascii = function _ascii(obj) + { + return ul4._repr_internal(obj, true); + }; + + ul4._date_str = function _date_str(obj) + { + let year = obj._date.getFullYear(); + let month = obj._date.getMonth()+1; + let day = obj._date.getDate(); + + return year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); + }; + + ul4._datetime_str = function _datetime_str(obj) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + + let result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2); + if (second || ms) + { + result += ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; + }; + + ul4._str = function _str(obj) + { + if (typeof(obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return obj; + else if (typeof(obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._isdatetime(obj)) + return ul4._datetime_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") + return obj.__str__(); + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; + }; + + // Convert ``obj`` to bool, according to its "truth value" + ul4._bool = function _bool(obj) + { + if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else + { + if (typeof(obj) === "object", typeof(obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) + { + for (let key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } + }; + + // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) + ul4._int = function _int(obj, base) + { + let result; + if (base !== null) + { + if (typeof(obj) !== "string" || !ul4._isint(base)) + throw new ul4.TypeError("int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw new ul4.TypeError("invalid literal for int()"); + return result; + } + else + { + if (typeof(obj) == "string") + { + result = parseInt(obj); + if (result.toString() == "NaN") + throw new ul4.TypeError("invalid literal for int()"); + return result; + } + else if (typeof(obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw new ul4.TypeError("int() argument must be a string or a number"); + } + }; + + // Convert ``obj`` to a float + ul4._float = function _float(obj) + { + if (typeof(obj) === "string") + return parseFloat(obj); + else if (typeof(obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw new ul4.TypeError("float() argument must be a string or a number"); + }; + + // Convert ``obj`` to a list + ul4._list = function _list(obj) + { + let iter = ul4._iter(obj); + + let result = []; + for (;;) + { + let value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } + }; + + // Convert ``obj`` to a set + ul4._set = function _set(obj) + { + let iter = ul4._iter(obj); + + let result = ul4._emptyset(); + for (;;) + { + let value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } + }; + + // Return the length of ``sequence`` + ul4._len = function _len(sequence) + { + if (typeof(sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) + { + let i = 0; + for (let key in sequence) + ++i; + return i; + } + throw new ul4.TypeError("object of type '" + ul4._type(sequence) + "' has no len()"); + }; + + ul4._type = function _type(obj) + { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (typeof(obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (typeof(obj) === "function") + return "function"; + else + { + if (typeof(obj.ul4type) === "function") + return obj.ul4type(); + else + return ul4.Protocol.get(obj).ul4type(obj); + } + }; + + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + ul4._mod = function _mod(obj1, obj2) + { + let div = Math.floor(obj1 / obj2); + let mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) + { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + + // Return the attribute with the name ``attrname`` of the object ``obj`` + // If ``obj`` doesn't have such an attribute, return ``default_`` + ul4._getattr = function _getattr(obj, attrname, default_=null) + { + let proto = ul4.Protocol.get(obj); + try + { + return proto.getattr(obj, attrname); + } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === obj) + return default_; + else + throw exc; + } + }; + + // Return wether the object ``obj`` has an attribute with the name ``attrname`` + ul4._hasattr = function _hasattr(obj, attrname) + { + let proto = ul4.Protocol.get(obj); + return proto.hasattr(obj, attrname); + }; + + // Return the names of the attributes of the object ``obj`` as a set. + ul4._dir = function _dir(obj) + { + let proto = ul4.Protocol.get(obj); + return proto.dir(); + }; + + // Return whether any of the items in ``iterable`` are true + ul4._any = function _any(iterable) + { + if (typeof(iterable) == "string") + { + for (let i = 0; i < iterable.length; ++i) + { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } + }; + + // Return whether all of the items in ``iterable`` are true + ul4._all = function _all(iterable) + { + if (typeof(iterable) == "string") + { + for (let i = 0; i < iterable.length; ++i) + { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } + }; + + // Check if ``obj`` is undefined + ul4._isundefined = function _isundefined(obj) + { + return typeof(obj) === "undefined"; + }; + + + // Check if ``obj`` is *not* undefined + ul4._isdefined = function _isdefined(obj) + { + return typeof(obj) !== "undefined"; + }; + + // Check if ``obj`` is ``None`` + ul4._isnone = function _isnone(obj) + { + return obj === null; + }; + + // Check if ``obj`` is a boolean + ul4._isbool = function _isbool(obj) + { + return typeof(obj) == "boolean"; + }; + + // Check if ``obj`` is a int + ul4._isint = function _isint(obj) + { + return (typeof(obj) == "number") && Math.round(obj) == obj; + }; + + // Check if ``obj`` is a float + ul4._isfloat = function _isfloat(obj) + { + return (typeof(obj) == "number") && Math.round(obj) != obj; + }; + + // Check if ``obj`` is a string + ul4._isstr = function _isstr(obj) + { + return typeof(obj) == "string"; + }; + + // Check if ``obj`` is a datetime + ul4._isdatetime = function _isdate(obj) + { + return Object.prototype.toString.call(obj) == "[object Date]"; + }; + + ul4._isdate = function _isdate(obj) + { + return (obj instanceof ul4.Date); + }; + + // Check if ``obj`` is a color + ul4._iscolor = function _iscolor(obj) + { + return (obj instanceof ul4.Color); + }; + + // Check if ``obj`` is a timedelta object + ul4._istimedelta = function _istimedelta(obj) + { + return (obj instanceof ul4.TimeDelta); + }; + + // Check if ``obj`` is a monthdelta object + ul4._ismonthdelta = function _ismonthdelta(obj) + { + return (obj instanceof ul4.MonthDelta); + }; + + // Check if ``obj`` is a template + ul4._istemplate = function _istemplate(obj) + { + return (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure); + }; + + // Check if ``obj`` is a function + ul4._isfunction = function _isfunction(obj) + { + return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure)); + }; + + // Check if ``obj`` is a list + ul4._islist = function _islist(obj) + { + return Object.prototype.toString.call(obj) == "[object Array]"; + }; + + // Check if ``obj`` is a set + ul4._isset = function _isset(obj) + { + return Object.prototype.toString.call(obj) == "[object Set]"; + }; + + // Check if ``obj`` is an exception (at least a UL4 exception) + ul4._isexception = function _isexception(obj) + { + return (obj instanceof ul4.Exception); + }; + + ul4._isul4set = function _isul4set(obj) + { + return (obj instanceof ul4._Set); + }; + + ul4._isanyset = function _isanyset(obj) + { + return (ul4._isset(obj) || ul4._isul4set(obj)); + }; + + // Check if ``obj`` is an iterator + ul4._isiter = function _isiter(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; + }; + + // Check if ``obj`` is a JS object + ul4._isobject = function _isobject(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined" && !(obj instanceof ul4.Proto); + }; + + if (ul4._havemap) + { + // Check if ``obj`` is a ``Map`` + ul4._ismap = function _ismap(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + }; + + // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj) || ul4._ismap(obj); + }; + } + else + { + ul4._ismap = function _ismap(obj) + { + return false; + }; + + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj); + }; + } + + // Repeat string ``str`` ``rep`` times + ul4._str_repeat = function _str_repeat(str, rep) + { + let result = ""; + for (; rep>0; --rep) + result += str; + return result; + }; + + ul4._list_repeat = function _list_repeat(list, rep) + { + let result = []; + for (; rep>0; --rep) + for (let i = 0; i < list.length; ++i) + result.push(list[i]); + return result; + }; + + ul4._str_json = function _str_json(str) + { + let result = ""; + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + switch (c) + { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + case '<': + result += '\\u003c'; + break; + default: + let code = c.charCodeAt(0); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; + }; + + // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) + ul4._asjson = function _asjson(obj) + { + if (obj === null) + return "null"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof(obj) === "string") + return ul4._str_json(obj); + else if (typeof(obj) === "number") + { + return "" + obj; + } + else if (ul4._islist(obj)) + { + let v = []; + v.push("["); + for (let i = 0; i < obj.length; ++i) + { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) + { + let v = []; + v.push("{"); + let i = 0; + obj.forEach(function(value, key) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) + { + let v = []; + v.push("{"); + let i = 0; + for (let key in obj) + { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) + { + return "new ul4.Date(" + obj._date.getFullYear() + ", " + (obj._date.getMonth()+1) + ", " + obj._date.getDate() + ")"; + } + else if (ul4._isdatetime(obj)) + { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) + { + return "new ul4.TimeDelta(" + obj._days + ", " + obj._seconds + ", " + obj._microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) + { + return "new ul4.MonthDelta(" + obj._months + ")"; + } + else if (ul4._iscolor(obj)) + { + return "new ul4.Color(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) + { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw new ul4.TypeError("asjson() requires a serializable object"); + }; + + // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object + ul4._fromjson = function _fromjson(string) + { + // The following is from jQuery's parseJSON function + string = ul4.StrProtocol.strip(string); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw new ul4.TypeError("invalid JSON"); + }; + + // Encodes ``obj`` in the UL4 Object Notation format + ul4._asul4on = function _asul4on(obj) + { + return ul4.dumps(obj); + }; + + // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object + ul4._fromul4on = function _fromul4on(string) + { + return ul4.loads(string); + }; + + ul4._format_datetime = function _format_datetime(obj, fmt, lang) + { + let translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p" + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + let translation = translations[lang]; + + let result = []; + let inspec = false; + for (let i = 0; i < fmt.length; ++i) + { + let c = fmt[i]; + if (inspec) + { + switch (c) + { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4.DateTimeProtocol.yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth()+1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week4format(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week4format(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else + { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); + }; + + ul4._format_int = function _format_int(obj, fmt, lang) + { + let work = fmt; + + // Defaults + let fill = ' '; + let align = '>'; // '<', '>', '=' or '^' + let sign = '-'; // '+', '-' or ' ' + let alternate = false; + let minimumwidth = 0; + let type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) + { + type = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract minimum width + if (/\d+$/.test(work)) + { + let minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) + { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) + { + alternate = true; + work = work.substring(0, work.length-1); + } + + // Determine sign + if (/[+ -]$/.test(work)) + { + if (type == 'c') + throw new ul4.ValueError("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract fill and align char + if (work.length >= 3) + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) + { + if (/[<>=^]$/.test(work)) + { + align = work[1]; + fill = work[0]; + } + else + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) + { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + let neg = obj < 0; + + if (neg) + obj = -obj; + + let output; + switch (type) + { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw new ul4.ValueError("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') + { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else + { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) + { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth-output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + else // if (align == '^') + { + let pad = minimumwidth - output.length; + let padBefore = Math.floor(pad/2); + let padAfter = pad-padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; + }; + + // Format ``obj`` using the format string ``fmt`` in the language ``lang`` + ul4._format = function _format(obj, fmt, lang) + { + if (typeof(lang) === "undefined" || lang === null) + lang = "en"; + else + { + let translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; + lang = lang.toLowerCase(); + if (typeof(translations[lang]) === "undefined") + { + lang = lang.split(/_/)[0]; + if (typeof(translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_datetime(obj._date, fmt, lang); + if (ul4._isdatetime(obj)) + return ul4._format_datetime(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); + }; + + ul4._lpad = function _lpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; + }; + + ul4._rpad = function _rpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; + }; + + // This is outside of ``Proto`` on purpose + // This way reactive frameworks like ``Vue.js`` don't get to see it + // and complain about mutating render functions when those create new objects. + let _nextid = 1; + + ul4.Proto = class Proto + { + constructor() + { + this.__id__ = _nextid++; + } + + ul4type() + { + return this.constructor.name; + } + + // equality comparison of objects defaults to identity comparison + __eq__(other) + { + return this === other; + } + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__(other) + { + return !this.__eq__(other); + } + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__() + { + return true; + } + }; + + ul4.Signature = class Signature extends ul4.Proto + { + constructor(...args) + { + super(); + this.args = []; + this.argNames = {}; + this.remargs = null; + this.remkwargs = null; + + let nextDefault = false; + let lastArgname = null; + for (let i = 0; i < args.length; ++i) + { + let argName = args[i]; + if (nextDefault) + { + this.args.push({name: lastArgname, defaultValue: argName}); + this.argNames[lastArgname] = true; + nextDefault = false; + } + else + { + if (argName.substr(argName.length-1) === "=") + { + lastArgname = argName.substr(0, argName.length-1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + this.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + this.remargs = argName.substr(1); + else + { + this.args.push({name: argName}); + this.argNames[argName] = true; + } + } + } + } + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray(name, args, kwargs) + { + let finalargs = []; + let decname = name !== null ? name + "() " : ""; + + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + if (i < args.length) + { + if (kwargs.hasOwnProperty(arg.name)) + throw new ul4.ArgumentError(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else + { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else + { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw new ul4.ArgumentError("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) + { + // No, but we have them -> complain + if (args.length > this.args.length) + { + let prefix = name === null ? "expected" : name + "() expects"; + throw new ul4.ArgumentError(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else + { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) + { + // No => complain about unknown ones + for (let key in kwargs) + { + if (!this.argNames[key]) + { + if (name === null) + throw new ul4.ArgumentError("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw new ul4.ArgumentError(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else + { + // Yes => Put the unknown ones into an object and add that to the arguments array + let remkwargs = ul4._emptymap(); + for (let key in kwargs) + { + if (!this.argNames[key]) + ul4._setmap(remkwargs, key, kwargs[key]); + } + finalargs.push(remkwargs); + } + + return finalargs; + } + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject(name, args, kwargs) + { + args = this.bindArray(name, args, kwargs); + let argObject = {}; + let i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + } + + __repr__() + { + return ""; + } + + __str__() + { + return this.toString(); + } + + toString() + { + let v = []; + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + }; + + // When we don't have a real ``Set`` type, emulate one that supports strings + ul4._Set = class _Set + { + constructor(...items) + { + this.items = {}; + this.add(...items); + } + + add(...items) + { + for (let i = 0; i < items.length; ++i) + this.items[items[i]] = true; + } + + clear() + { + this.items = {}; + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { + case "add": + return ul4.expose(function add(items){ self.add(...items); }, ["*items"]); + default: + throw new ul4.AttributeError(this, attrname); + } + } + + __contains__(item) + { + return this.items[item] || false; + } + + has(item) + { + return this.items[item] || false; + } + + __bool__() + { + for (let item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + } + + __repr__() + { + let v = []; + v.push("{"); + let i = 0; + for (let item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + } + + __eq__(other) + { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Subtract the number of items that ``other`` has + for (let item in other.items) + --count; + return count == 0; + } + else + return false; + } + + __le__(other) + { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + } + + __ge__(other) + { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) + { + other.forEach(function(value) { + if (!this.items[value]) + return false; + }, this); + return true; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let key in other.items) + { + if (!this.items[key]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + }; + + ul4._Set.prototype.__type__ = "set"; + + // Adds name and signature to a function/method and makes the method callable in templates + ul4.expose = function expose(f, signature, options) + { + options = options || {}; + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = new ul4.Signature(...signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + }; + + // Protocol objects for all builtin types + // These objects are singleton, so we replace the constructor with the prototype object afterwards + ul4.Protocol = class Protocol + { + ul4type() + { + return this.constructor.name; + } + + dir() + { + return this.attrs; + } + + get(obj) + { + if (ul4._isstr(obj)) + return ul4.StrProtocol; + else if (ul4._islist(obj)) + return ul4.ListProtocol; + else if (ul4._isdate(obj)) + return ul4.DateProtocol; + else if (ul4._isset(obj)) + return ul4.SetProtocol; + else if (ul4._ismap(obj)) + return ul4.MapProtocol; + else if (ul4._isdatetime(obj)) + return ul4.DateTimeProtocol; + else if (ul4._isobject(obj)) + return ul4.ObjectProtocol; + else + return ul4.Protocol; + } + + getattr(obj, attrname) + { + if (obj === null || typeof(obj) === "undefined") + throw new ul4.AttributeError(obj, attrname); + else if (typeof(obj.__getattr__) === "function") + return obj.__getattr__(attrname); + else if (this.attrs.has(attrname)) + { + let attr = this[attrname]; + let realattr = function realattr(...args) { + return attr.apply(this, [obj, ...args]); + }; + realattr.name = attr.name; + realattr._ul4_name = attr._ul4_name || attr.name; + realattr._ul4_signature = attr._ul4_signature; + realattr._ul4_needsobject = attr._ul4_needsobject; + realattr._ul4_needscontext = attr._ul4_needscontext; + return realattr; + } + else + throw new ul4.AttributeError(obj, attrname); + } + + hasattr(obj, attrname) + { + if (obj === null || typeof(obj) === "undefined") + return false; + else if (typeof(obj.__getattr__) === "function") + { + try + { + obj.__getattr__(attrname); + return true; + } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === object) + return false; + else + throw exc; + } + } + else + return this.attrs.has(attrname); + } + }; + + ul4.Protocol = ul4.Protocol.prototype; + ul4.Protocol.attrs = ul4._emptyset(); + + ul4.StrProtocol = class StrProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "str"; + } + + count(obj, sub, start=null, end=null) + { + return ul4._count(obj, sub, start, end); + } + + find(obj, sub, start=null, end=null) + { + return ul4._find(obj, sub, start, end); + } + + rfind(obj, sub, start=null, end=null) + { + return ul4._rfind(obj, sub, start, end); + } + + replace(obj, old, new_, count=null) + { + if (count === null) + count = obj.length; + + let result = []; + while (obj.length) + { + let pos = obj.indexOf(old); + if (pos === -1 || !count--) + { + result.push(obj); + break; + } + result.push(obj.substr(0, pos)); + result.push(new_); + obj = obj.substr(pos + old.length); + } + return result.join(""); + } + + strip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("strip() requires a string argument"); + + while (obj && chars.indexOf(obj[0]) >= 0) + obj = obj.substr(1); + while (obj && chars.indexOf(obj[obj.length-1]) >= 0) + obj = obj.substr(0, obj.length-1); + return obj; + } + + lstrip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("lstrip() requires a string argument"); + + while (obj && chars.indexOf(obj[0]) >= 0) + obj = obj.substr(1); + return obj; + } + + rstrip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("rstrip() requires a string argument"); + + while (obj && chars.indexOf(obj[obj.length-1]) >= 0) + obj = obj.substr(0, obj.length-1); + return obj; + } + + split(obj, sep=null, count=null) + { + if (sep !== null && typeof(sep) !== "string") + throw new ul4.TypeError("split() requires a string"); + + if (count === null) + { + let result = obj.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + let result = []; + while (obj.length) + { + let pos = obj.indexOf(sep); + if (pos === -1 || !count--) + { + result.push(obj); + break; + } + result.push(obj.substr(0, pos)); + obj = obj.substr(pos + sep.length); + } + return result; + } + else + { + let result = []; + while (obj.length) + { + obj = ul4.StrProtocol.lstrip(obj, null); + let part; + if (!count--) + part = obj; // Take the rest of the string + else + part = obj.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + obj = obj.substr(part.length); + } + return result; + } + } + } + + rsplit(obj, sep=null, count=null) + { + if (sep !== null && typeof(sep) !== "string") + throw new ul4.TypeError("rsplit() requires a string as second argument"); + + if (count === null) + { + let result = obj.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + let result = []; + while (obj.length) + { + let pos = obj.lastIndexOf(sep); + if (pos === -1 || !count--) + { + result.unshift(obj); + break; + } + result.unshift(obj.substr(pos+sep.length)); + obj = obj.substr(0, pos); + } + return result; + } + else + { + let result = []; + while (obj.length) + { + obj = ul4.StrProtocol.rstrip(obj); + let part; + if (!count--) + part = obj; // Take the rest of the string + else + { + part = obj.split(/[ \n\r\t]+/); + part = part[part.length-1]; + } + if (part.length) + result.unshift(part); + obj = obj.substr(0, obj.length-part.length); + } + return result; + } + } + } + + splitlines(obj, keepends=false) + { + let pos = 0; + let lookingAtLineEnd = function lookingAtLineEnd() + { + let c = obj[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') + { + if (pos == length-1) + return 1; + if (obj[pos+1] === '\n') + return 2; + return 1; + } + return 0; + }; + + let result = [], length = obj.length; + + for (pos = 0, startpos = 0;;) + { + if (pos >= length) + { + if (startpos != pos) + result.push(obj.substring(startpos)); + return result; + } + let lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else + { + let endpos = pos + (keepends ? lineendlen : 0); + result.push(obj.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } + } + + lower(obj) + { + return obj.toLowerCase(); + } + + upper(obj) + { + return obj.toUpperCase(); + } + + capitalize(obj) + { + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; + } + + join(obj, iterable) + { + let resultlist = []; + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(obj); + } + + startswith(obj, prefix) + { + if (typeof(prefix) === "string") + return obj.substr(0, prefix.length) === prefix; + else if (ul4._islist(prefix)) + { + for (let i = 0; i < prefix.length; ++i) + { + let singlepre = prefix[i]; + if (obj.substr(0, singlepre.length) === singlepre) + return true; + } + return false; + } + else + throw new ul4.TypeError("startswith() argument must be string"); + } + + endswith(obj, suffix) + { + if (typeof(suffix) === "string") + return obj.substr(obj.length-suffix.length) === suffix; + else if (ul4._islist(suffix)) + { + for (let i = 0; i < suffix.length; ++i) + { + let singlesuf = suffix[i]; + if (obj.substr(obj.length-singlesuf.length) === singlesuf) + return true; + } + return false; + } + else + throw new ul4.TypeError("endswith() argument must be string or list of strings"); + } + }; + + ul4.StrProtocol = ul4.StrProtocol.prototype; + ul4.StrProtocol.attrs = ul4._makeset( + "split", + "rsplit", + "splitlines", + "strip", + "lstrip", + "rstrip", + "upper", + "lower", + "capitalize", + "startswith", + "endswith", + "replace", + "count", + "find", + "rfind", + "join" + ); + + ul4.expose(ul4.StrProtocol.count, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.find, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.rfind, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.replace, ["old", "new", "count=", null]); + ul4.expose(ul4.StrProtocol.strip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.lstrip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.rstrip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.split, ["sep=", null, "count=", null]); + ul4.expose(ul4.StrProtocol.rsplit, ["sep=", null, "count=", null]); + ul4.expose(ul4.StrProtocol.splitlines, ["keepends=", false]); + ul4.expose(ul4.StrProtocol.lower, []); + ul4.expose(ul4.StrProtocol.upper, []); + ul4.expose(ul4.StrProtocol.capitalize, []); + ul4.expose(ul4.StrProtocol.join, ["iterable"]); + ul4.expose(ul4.StrProtocol.startswith, ["prefix"]); + ul4.expose(ul4.StrProtocol.endswith, ["suffix"]); + + ul4.ListProtocol = class ListProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "list"; + } + + append(obj, items) + { + for (let i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; + } + + insert(obj, pos, items) + { + if (pos < 0) + pos += obj.length; + + for (let i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; + } + + pop(obj, pos) + { + if (pos < 0) + pos += obj.length; + + let result = obj[pos]; + obj.splice(pos, 1); + return result; + } + + count(obj, sub, start=null, end=null) + { + return ul4._count(obj, sub, start, end); + } + + find(obj, sub, start=null, end=null) + { + return ul4._find(obj, sub, start, end); + } + + rfind(obj, sub, start=null, end=null) + { + return ul4._rfind(obj, sub, start, end); + } + }; + + ul4.ListProtocol = ul4.ListProtocol.prototype; + ul4.ListProtocol.attrs = ul4._makeset( + "append", + "insert", + "pop", + "count", + "find", + "rfind" + ); + + ul4.expose(ul4.ListProtocol.append, ["*items"]); + ul4.expose(ul4.ListProtocol.insert, ["pos", "*items"]); + ul4.expose(ul4.ListProtocol.pop, ["pos=", -1]); + ul4.expose(ul4.ListProtocol.count, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.ListProtocol.find, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.ListProtocol.rfind, ["sub", "start=", null, "end=", null]); + + ul4.MapProtocol = class MapProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "dict"; + } + + getattr(obj, attrname) + { + if (this.attrs.has(attrname)) + { + let attr = this[attrname]; + let realattr = function realattr(...args) { + return attr.apply(this, [obj, ...args]); + }; + realattr.name = attr.name; + realattr._ul4_name = attr._ul4_name || attr.name; + realattr._ul4_signature = attr._ul4_signature; + realattr._ul4_needsobject = attr._ul4_needsobject; + realattr._ul4_needscontext = attr._ul4_needscontext; + return realattr; + } + else + return obj.get(attrname); + } + + get(obj, key, default_=null) + { + if (obj.has(key)) + return obj.get(key); + return default_; + } + + items(obj) + { + let result = []; + obj.forEach(function(value, key) { + result.push([key, value]); + }); + return result; + } + + values(obj) + { + let result = []; + obj.forEach(function(value, key) { + result.push(value); + }); + return result; + } + + update(obj, other, kwargs) + { + return ul4._update(obj, other, kwargs); + } + + clear(obj) + { + obj.clear(); + return null; + } + }; + + ul4.MapProtocol = ul4.MapProtocol.prototype; + ul4.MapProtocol.attrs = ul4._makeset("get", "items", "values", "update", "clear"); + + ul4.expose(ul4.MapProtocol.get, ["key", "default=", null]); + ul4.expose(ul4.MapProtocol.items, []); + ul4.expose(ul4.MapProtocol.values, []); + ul4.expose(ul4.MapProtocol.update, ["*other", "**kwargs"]); + ul4.expose(ul4.MapProtocol.clear, []); + + ul4.SetProtocol = class SetProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "set"; + } + + add(obj, items) + { + for (let i = 0; i < items.length; ++i) + { + obj.add(items[i]); } - result.push(c); - inspec = false; } - else { - if (c == "%") - inspec = true; - else - result.push(c); + + clear(obj) + { + obj.clear(); + return null; } - } - return result.join(""); -}; - -ul4._format_int = function _format_int(obj, fmt, lang) { - var work = fmt; - - // Defaults - var fill = ' '; - var align = '>'; // '<', '>', '=' or '^' - var sign = '-'; // '+', '-' or ' ' - var alternate = false; - var minimumwidth = 0; - var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) { - type = work.substring(work.length - 1); - work = work.substring(0, work.length - 1); - } + }; + + ul4.SetProtocol = ul4.SetProtocol.prototype; + ul4.SetProtocol.attrs = ul4._makeset("add", "clear"); - // Extract minimum width - if (/\d+$/.test(work)) { - var minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) { - align = '='; - fill = '0'; + ul4.expose(ul4.SetProtocol.add, ["*items"]); + ul4.expose(ul4.SetProtocol.clear, []); + + ul4.DateProtocol = class DateProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "date"; } - minimumwidth = parseInt(minimumwidthStr); - } - // Alternate form? - if (/#$/.test(work)) { - alternate = true; - work = work.substring(0, work.length - 1); - } + weekday(obj) + { + return ul4.DateTimeProtocol.weekday(obj._date); + } - // Determine sign - if (/[+ -]$/.test(work)) { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length - 1); - work = work.substring(0, work.length - 1); - } + calendar(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateTimeProtocol.calendar(obj._date, firstweekday, mindaysinfirstweek); + } - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) { - if (/[<>=^]$/.test(work)) { - align = work[1]; - fill = work[0]; + week(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1]; } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - // Basic number formatting - var neg = obj < 0; - - if (neg) - obj = -obj; - - var output; - switch (type) { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } + day(obj) + { + return obj._date.getDate(); + } - // The rest of the formatting - if (align === '=') { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; + month(obj) + { + return obj._date.getMonth()+1; + } - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + year(obj) + { + return obj._date.getFullYear(); + } - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; + mimeformat(obj) + { + let weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + let monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + let d = obj._date; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth - output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth - output.length) + output; - else // if (align == '^') - { - var pad = minimumwidth - output.length; - var padBefore = Math.floor(pad / 2); - var padAfter = pad - padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } + return weekdayname[ul4.DateTimeProtocol.weekday(d)] + ", " + ul4._lpad(d.getDate(), "0", 2) + " " + monthname[d.getMonth()] + " " + d.getFullYear(); } - } - return output; -}; - -// Format ``obj`` using the format string ``fmt`` in the language ``lang`` -ul4._format = function _format(obj, fmt, lang) { - if (typeof (lang) === "undefined" || lang === null) - lang = "en"; - else { - var translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null }; - lang = lang.toLowerCase(); - if (typeof (translations[lang]) === "undefined") { - lang = lang.split(/_/)[0]; - if (typeof (translations[lang]) === "undefined") - lang = "en"; + + isoformat(obj) + { + let d = obj._date; + return d.getFullYear() + "-" + ul4._lpad((d.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(d.getDate().toString(), "0", 2); } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); -}; - -ul4._lpad = function _lpad(string, pad, len) { - if (typeof (string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; -}; - -ul4._rpad = function _rpad(string, pad, len) { - if (typeof (string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; -}; - -ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - isprotoof: function isprotoof(obj) { - while (true) { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof (obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; + yearday(obj) + { + return ul4.DateTimeProtocol.yearday(obj._date); } - }, + }; - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) { - return this === other; - }, + ul4.DateProtocol = ul4.DateProtocol.prototype; + ul4.DateProtocol.attrs = ul4._makeset("weekday", "week", "calendar", "day", "month", "year", "mimeformat", "isoformat", "yearday"); - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) { - return !this.__eq__(other); - }, + ul4.expose(ul4.DateProtocol.weekday, []); + ul4.expose(ul4.DateProtocol.calendar, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateProtocol.week, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateProtocol.day, []); + ul4.expose(ul4.DateProtocol.month, []); + ul4.expose(ul4.DateProtocol.year, []); + ul4.expose(ul4.DateProtocol.mimeformat, []); + ul4.expose(ul4.DateProtocol.isoformat, []); + ul4.expose(ul4.DateProtocol.yearday, []); - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` + ul4.DateTimeProtocol = class DatetimeProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "datetime"; + } - __bool__: function __bool__() { - return true; - } -}; - -ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create() { - var signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - var nextDefault = false; - var lastArgname = null; - for (var i = 0; i < arguments.length; ++i) { - var argName = arguments[i]; - if (nextDefault) { - signature.args.push({ name: lastArgname, defaultValue: argName }); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else { - if (argName.substr(argName.length - 1) === "=") { - lastArgname = argName.substr(0, argName.length - 1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else { - signature.args.push({ name: argName }); - signature.argNames[argName] = true; - } - } - } - return signature; - }, + weekday(obj) + { + let d = obj.getDay(); + return d ? d-1 : 6; + } - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) { - var finalargs = []; - var decname = name !== null ? name + "() " : ""; + calendar(obj, firstweekday=0, mindaysinfirstweek=4) + { + // Normalize parameters + firstweekday = ul4._mod(firstweekday, 7); + if (mindaysinfirstweek < 1) + mindaysinfirstweek = 1; + else if (mindaysinfirstweek > 7) + mindaysinfirstweek = 7; - for (var i = 0; i < this.args.length; ++i) { - var arg = this.args[i]; - if (i < args.length) { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } + // ``obj`` might be in the first week of the next year, or last week of + // the previous year, so we might have to try those too. + for (let offset = +1; offset >= -1; --offset) + { + let year = obj.getFullYear() + offset; + // ``refdate`` will always be in week 1 + let refDate = new Date(year, 0, mindaysinfirstweek); + // Go back to the start of ``refdate``s week (i.e. day 1 of week 1) + let weekDayDiff = ul4._mod(ul4.DateTimeProtocol.weekday(refDate) - firstweekday, 7); + let weekStartYear = refDate.getFullYear(); + let weekStartMonth = refDate.getMonth(); + let weekStartDay = refDate.getDate() - weekDayDiff; + let weekStart = new Date(weekStartYear, weekStartMonth, weekStartDay); + // Is our date ``obj`` at or after day 1 of week 1? + if (obj.getTime() >= weekStart.getTime()) + { + let diff = ul4.SubAST.prototype._do(obj, weekStart); + // Add 1, because the first week is week 1, not week 0 + let week = Math.floor(diff.days()/7) + 1; + return [year, week, ul4.DateTimeProtocol.weekday(obj)]; } } + } - // Do we accept additional positional arguments? - if (this.remargs === null) { - // No, but we have them -> complain - if (args.length > this.args.length) { - var prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } + week(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateTimeProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1]; + } - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) { - // No => complain about unknown ones - for (var key in kwargs) { - if (!this.argNames[key]) { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else { - // Yes => Put the unknown ones into an object and add that to the arguments array - var remkwargs = {}; - for (var key in kwargs) { - if (!this.argNames[key]) - remkwargs[key] = kwargs[key]; - } - finalargs.push(remkwargs); - } + day(obj) + { + return obj.getDate(); + } - return finalargs; - }, + month(obj) + { + return obj.getMonth()+1; + } - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) { - args = this.bindArray(name, args, kwargs); - var argObject = {}; - var i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, + year(obj) + { + return obj.getFullYear(); + } - __repr__: function __repr__() { - return ""; - }, + hour(obj) + { + return obj.getHours(); + } - __str__: function __str__() { - return this.toString(); - }, + minute(obj) + { + return obj.getMinutes(); + } - toString: function toString() { - var v = []; - for (var i = 0; i < this.args.length; ++i) { - var arg = this.args[i]; + second(obj) + { + return obj.getSeconds(); + } - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); + microsecond(obj) + { + return obj.getMilliseconds() * 1000; + } + + mimeformat(obj) + { + let weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + let monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4.DateTimeProtocol.weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; + } + + isoformat(obj) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + let result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; + } + + yearday(obj) + { + let leap = ul4._isleap(obj) ? 1 : 0; + let day = obj.getDate(); + switch (obj.getMonth()) + { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; } - } -); + }; -// Adds name and signature to a function/method and makes the method callable in templates -ul4.expose = function expose(signature, options, f) { - if (typeof (f) === "undefined") { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; -}; - -ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) { - if (vars === null || typeof (vars) === "undefined") + ul4.DateTimeProtocol = ul4.DateTimeProtocol.prototype; + ul4.DateTimeProtocol.attrs = ul4._makeset("weekday", "week", "calendar", "day", "month", "year", "hour", "minute", "second", "microsecond", "mimeformat", "isoformat", "yearday"); + + ul4.expose(ul4.DateTimeProtocol.weekday, []); + ul4.expose(ul4.DateTimeProtocol.calendar, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateTimeProtocol.week, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateTimeProtocol.day, []); + ul4.expose(ul4.DateTimeProtocol.month, []); + ul4.expose(ul4.DateTimeProtocol.year, []); + ul4.expose(ul4.DateTimeProtocol.hour, []); + ul4.expose(ul4.DateTimeProtocol.minute, []); + ul4.expose(ul4.DateTimeProtocol.second, []); + ul4.expose(ul4.DateTimeProtocol.microsecond, []); + ul4.expose(ul4.DateTimeProtocol.mimeformat, []); + ul4.expose(ul4.DateTimeProtocol.isoformat, []); + ul4.expose(ul4.DateTimeProtocol.yearday, []); + + ul4.ObjectProtocol = class ObjectProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "dict"; + } + + getattr(obj, attrname) + { + let result; + if (obj && typeof(obj.__getattr__) === "function") // test this before the generic object test + result = obj.__getattr__(attrname); + else + result = obj[attrname]; + if (typeof(result) !== "function") + return result; + let realresult = function(...args) { + // We can use ``apply`` here, as we know that ``obj`` is a real object. + return result.apply(obj, args); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + + get(obj, key, default_=null) + { + let result = obj[key]; + if (typeof(result) === "undefined") + return default_; + return result; + } + + items(obj) + { + let result = []; + for (let key in obj) + result.push([key, obj[key]]); + return result; + } + + values(obj) + { + let result = []; + for (let key in obj) + result.push(obj[key]); + return result; + } + + clear(obj) + { + for (let key in obj) + delete obj[key]; + } + }; + + ul4.ObjectProtocol = ul4.ObjectProtocol.prototype; + ul4.ObjectProtocol.attrs = ul4._makeset("get", "items", "values", "update", "clear"); + + ul4.expose(ul4.ObjectProtocol.get, ["key", "default=", null]); + ul4.expose(ul4.ObjectProtocol.items, []); + ul4.expose(ul4.ObjectProtocol.values, []); + ul4.expose(ul4.ObjectProtocol.clear, []); + + ul4.Context = class Context + { + constructor(vars) + { + if (vars === null || typeof(vars) === "undefined") vars = {}; - var context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, + this.vars = vars; + this.indents = []; + this.escapes = []; + this._output = []; + } /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. * This is used by the various comprehensions to avoid leaking loop variables. */ - inheritvars: function inheritvars() { - var context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); + inheritvars() + { + let context = Object.create(this); + context.vars = Object.create(this.vars); return context; - }, + } /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) { - var context = ul4._clone(this); - if (indent !== null) { + withindent(indent) + { + let context = Object.create(this); + if (indent !== null) + { context.indents = this.indents.slice(); context.indents.push(indent); } return context; - }, + } /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() { - var context = ul4._clone(this); + replaceoutput() + { + let context = Object.create(this); context._output = []; return context; - }, + } - clone: function clone(vars) { - return ul4._clone(this); - }, + clone(vars) + { + return Object.create(this); + } - output: function output(value) { + output(value) + { + for (let i = 0; i < this.escapes.length; ++i) + { + let escape = this.escapes[i]; + value = escape(value); + } this._output.push(value); - }, + } - getoutput: function getoutput() { + getoutput() + { return this._output.join(""); - }, + } - get: function get(name) { + get(name) + { return this.vars[name]; - }, + } - set: function set(name, value) { + set(name, value) + { this.vars[name] = value; } - } -); + }; -/// Exceptions + /// Exceptions -ul4.Exception = ul4._inherit( - ul4.Proto, + // Note that extending ``Error`` doesn't work, so we do it the "classic" way + ul4.Exception = function Exception(message, fileName, lineNumber) { - __type__: "ul4.Exception", - "cause": null, + let instance = new Error(message, fileName, lineNumber); + Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); + instance.__id__ = _nextid++; + instance.context = null; + return instance; + }; - __getattr__: function __getattr__(attrname) { - switch (attrname) { - case "cause": - return this.cause; - default: - return undefined; - } + ul4.Exception.prototype = Object.create(Error.prototype, { + constructor: { + value: Error, + enumerable: false, + writable: true, + configurable: true } - } -); + }); + + if (Object.setPrototypeOf) + Object.setPrototypeOf(ul4.Exception, Error); + else + ul4.Exception.__proto__ = Error; + + ul4.Exception.prototype.__getattr__ = function __getattr__(attrname) + { + switch (attrname) + { + case "context": + return this.context; + default: + throw new ul4.AttributeError(this, attrname); + } + }; + + // Exceptions used internally by UL4 for flow control + ul4.InternalException = class InternalException extends ul4.Exception + { + }; -// Exceptions used internally by UL4 for flow control -ul4.InternalException = ul4._inherit(ul4.Exception, {}); + // Control flow exceptions + ul4.ReturnException = class ReturnException extends ul4.InternalException + { + constructor(result) + { + super("return"); + this.result = result; + } + }; -// Control flow exceptions -ul4.ReturnException = ul4._inherit( - ul4.InternalException, + ul4.BreakException = class BreakException extends ul4.InternalException { - __type__: "ul4.ReturnException", + constructor() + { + super("break"); + } + }; - create: function create(result) { - var exception = ul4._clone(this); - exception.result = result; - return exception; + ul4.ContinueException = class ContinueException extends ul4.InternalException + { + constructor() + { + super("continue"); } - } -); + }; -ul4.BreakException = ul4._inherit( - ul4.InternalException, + // Real exceptions raised by various parts of UL4 + ul4.SyntaxError = class SyntaxError extends ul4.Exception { - __type__: "ul4.BreakException" - } -); + }; -ul4.ContinueException = ul4._inherit( - ul4.InternalException, + ul4.LValueRequiredError = class LValueRequiredError extends ul4.SyntaxError { - __type__: "ul4.ContinueException" - } -); + constructor() + { + super("lvalue required"); + } + }; -// Real exceptions raised by various parts of UL4 -ul4.SyntaxError = ul4._inherit( - ul4.Exception, + ul4.TypeError = class TypeError extends ul4.Exception { - __type__: "ul4.SyntaxError" - } -); + }; + + ul4.ValueError = class ValueError extends ul4.Exception + { + }; -ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, + ul4.ArgumentError = class ArgumentError extends ul4.Exception { - __type__: "ul4.LValueRequiredError", + }; - toString: function toString() { - return "lvalue required!"; + ul4.NotSubscriptableError = class NotSubscriptableError extends ul4.Exception + { + constructor(obj) + { + super("Object of type " + _type(obj) + " is not subscriptable"); + this.obj = obj; } - } -); -ul4.TypeError = ul4._inherit( - ul4.Exception, + toString() + { + return "Object of type " + _type(this.obj) + " is not subscriptable"; + } + }; + + ul4.ZeroDivisionError = class ZeroDivisionError extends ul4.Exception + { + constructor() + { + super("division by zero"); + } + }; + + ul4.IndexError = class IndexError extends ul4.Exception { - __type__: "ul4.TypeError", + constructor(obj, index) + { + super("index " + ul4._repr(index) + " out of range"); + this.obj = obj; + this.index = index; + } - create: function create(operation, message) { - var exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + toString() + { + return "index " + this.index + " out of range for " + ul4._type(this.obj); } - } -); + }; + + ul4.AttributeError = class AttributeError extends ul4.Exception + { + constructor(obj, attrname) + { + super("object of type " + ul4._type(obj) + " has no attribute " + ul4._repr(attrname)); + this.obj = obj; + this.attrname = attrname; + } + }; -ul4.ValueError = ul4._inherit( - ul4.Exception, + /// Exception that wraps other exceptions while they bubble up the stack + ul4.LocationError = class LocationError extends ul4.Exception { - __type__: "ul4.ValueError", + constructor(location) + { + super("nested exception in " + ul4._repr(location)); + this.location = location; + } + + _templateprefix() + { + let template = this.location.template; + let out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + let first = true; + while (template != null) + { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + } + + toString() + { + let template = this.location.template; + let templateprefix = this._templateprefix(); + + let prefix = this.location.sourceprefix; + let code = this.location.source; + let suffix = this.location.sourcesuffix; + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + + let text = prefix + code + suffix; + let underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + let pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + this.location.line + "; col " + this.location.col; + + let message = templateprefix + ": " + pos + "\n" + text + "\n" + underline; + return message; + } - create: function create(message) { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + __getattr__(attrname) + { + switch (attrname) + { + case "context": + return this.context; + case "location": + return this.location; + default: + throw new ul4.AttributeError(this, attrname); + } } - } -); + }; -ul4.ArgumentError = ul4._inherit( - ul4.Exception, + /// Classes for the syntax tree + ul4.AST = class AST extends ul4.Proto { - __type__: "ul4.ArgumentError", + constructor(template, pos) + { + super(); + this.template = template; + this.pos = pos; + this._line = null; + this._col = null; + } - create: function create(message) { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + get fullsource() + { + return this.template._source; } - } -); -/// Exception that wraps other exceptions while they bubble up the stack -ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", + get source() + { + return this.pos.of(this.template._source); + } - create: function create(location, cause) { - var exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, + get sourceprefix() + { + let outerstartpos = this.pos.start; + let innerstartpos = outerstartpos; + let source = this.fullsource; - _templateprefix: function (template) { - var out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - var first = true; - while (template != null) { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; + let maxprefix = 40; + let preprefix = "\u2026"; + while (maxprefix > 0) + { + // We arrived at the start of the source code + if (outerstartpos === 0) + { + preprefix = ""; + break; + } + // We arrived at the start of the line + if (source.charAt(outerstartpos-1) === "\n") + { + preprefix = ""; + break; + } + --maxprefix; + --outerstartpos; } - return out.join(""); - }, + return preprefix + source.substring(outerstartpos, innerstartpos); + } - _template: function _template() { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else { - var tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; + get sourcesuffix() + { + let outerstoppos = this.pos.stop; + let innerstoppos = outerstoppos; + let source = this.fullsource; + + let maxsuffix = 40; + let postsuffix = "\u2026"; + while (maxsuffix > 0) + { + // We arrived at the ed of the source code + if (outerstoppos >= source.length) + { + postsuffix = ""; + break; + } + // We arrived at the end of the line + if (source.charAt(outerstoppos) === "\n") + { + postsuffix = ""; + break; + } + --maxsuffix; + ++outerstoppos; } - }, + return source.substring(innerstoppos, outerstoppos) + postsuffix; + } - _innerpos: function _innerpos() { - return this.location.pos; - }, + get line() + { + if (this._line === null) + this._calculateLineCol(); + return this._line; + } - toString: function toString() { - var template = this._template(); - var templateprefix = this._templateprefix(template); - var outerpos = this._outerpos(); - var innerpos = this._innerpos(); + get col() + { + if (this._col === null) + this._calculateLineCol(); + return this._col; + } - var prefix = template.source.substring(outerpos.start, innerpos.start); - var code = template.source.substring(innerpos.start, innerpos.stop); - var suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - var text = prefix + code + suffix; - var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - var lineno = 1, colno = 1; - for (var i = 0; i < innerpos.start; ++i) { - if (template.source[i] === "\n") { - ++lineno; - colno = 1; + _calculateLineCol() + { + this._line = 1 + this._col = 1; + let stop = this.pos.start; + for (let i = 0; i < stop; ++i) + { + if (this.template.source[i] === "\n") + { + ++this._line; + this._col = 1; } else - ++colno; + ++this._col; } + } - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - return templateprefix + ": " + pos + "\n" + text + "\n" + underline; - }, - - __getattr__: function __getattr__(attrname) { - switch (attrname) { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - return undefined; - } + __getattr__(attrname) + { + if (attrname === "type" || attrname === "fullsource" || attrname === "source" || attrname === "sourceprefix" || attrname === "sourcesuffix" || attrname === "line" || attrname === "col") + return this[attrname]; + else if (this._ul4onattrs.indexOf(attrname) >= 0) + return this[attrname]; + throw new ul4.AttributeError(this, attrname); } - } -); + __setitem__(attrname, value) + { + throw new ul4.TypeError("object is immutable"); + } -/// Classes for the syntax tree -ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) { - var ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() { - var out = []; + __str__() + { + let out = []; this._str(out); return ul4._formatsource(out); - }, - __repr__: function __repr__() { - var out = []; + } + + __repr__() + { + let out = []; this._repr(out); return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) { - try { + } + + _decorate_exception(exc) + { + while (exc.context !== undefined && exc.context !== null) + exc = exc.context; + exc.context = new ul4.LocationError(this); + } + + _handle_eval(context) + { + try + { return this._eval(context); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_set: function _handle_eval_set(context, value) { - try { + } + + _handle_eval_set(context, value) + { + try + { return this._eval_set(context, value); } - catch (exc) { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _eval_set: function _eval_set(context, value) { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) { - try { + } + + _eval_set(context, value) + { + throw new ul4.LValueRequiredError(); + } + + _handle_eval_modify(context, operator, value) + { + try + { return this._eval_modify(context, operator, value); } - catch (exc) { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _eval_modify: function _eval_modify(context, operator, value) { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) { - }, - _str: function _str(out) { - }, - ul4ondump: function ul4ondump(encoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } -); - -ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) { - var text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) { - context.output(this._text()); - }, - _str: function _str(out) { + } + + _eval_modify(context, operator, value) + { + throw new ul4.LValueRequiredError(); + } + + _repr(out) + { + } + + _str(out) + { + out.push(this.source.replace(/\r?\n/g, ' ')); + } + + ul4ondump(encoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + { + let attrname = this._ul4onattrs[i]; + encoder.dump(this[attrname]); + } + } + + ul4onload(decoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + { + let attrname = this._ul4onattrs[i]; + this[attrname] = decoder.load(); + } + } + }; + + // used in ul4ondump/ul4ondump to automatically dump these attributes + ul4.AST.prototype._ul4onattrs = ["template", "pos"]; + + ul4.TextAST = class TextAST extends ul4.AST + { + constructor(template, pos) + { + super(template, pos); + } + + get text() + { + return this.source; + } + + _eval(context) + { + context.output(this.text); + } + + _str(out) + { out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); - -ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) { - var indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) { - if (typeof (this.template) !== "undefined") { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); + }; + + ul4.IndentAST = class IndentAST extends ul4.TextAST + { + constructor(template, pos, text) + { + super(template, pos); + this._text = text; + } + + get text() + { + if (typeof(this.template) !== "undefined") + return this._text === null ? this.source : this._text; else - return this.text; - }, - _eval: function _eval(context) { - for (var i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + return null; + } + + _eval(context) + { + for (let i = 0; i < context.indents.length; ++i) + { + let indent = context.indents[i]; + context.output(indent); + } + context.output(this.text); + } + + ul4ondump(encoder) + { + super.ul4ondump(encoder); + + if (this._text === this.source) encoder.dump(null); else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) { + encoder.dump(this._text); + } + + ul4onload(decoder) + { + super.ul4onload(decoder); + this._text = decoder.load(); + } + + _str(out) + { out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.LineEndAST = ul4._inherit( - ul4.TextAST, + ul4.LineEndAST = class LineEndAST extends ul4.TextAST { - _str: function _str(out) { + _str(out) + { out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); - -ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) { - var tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() { - if (typeof (this.template) !== "undefined") { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } -); + }; -ul4.CodeAST = ul4._inherit( - ul4.AST, + ul4.CodeAST = class CodeAST extends ul4.AST { - create: function create(tag, pos) { - var code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + }; + + ul4.ConstAST = class ConstAST extends ul4.CodeAST + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; } - } -); - -ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) { - var constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { + } + + _eval(context) + { return this.value; } - } -); + }; + + ul4.ConstAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["value"]); -ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, + ul4.ItemArgBase = class ItemArgBase extends ul4.CodeAST { - _handle_eval_list: function _handle_eval_list(context, result) { - try { + _handle_eval_list(context, result) + { + try + { return this._eval_list(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_set: function _handle_eval_set(context, result) { - try { + } + + _handle_eval_set(context, result) + { + try + { return this._eval_set(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) { - try { + } + + _handle_eval_dict(context, result) + { + try + { return this._eval_dict(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) { - try { + } + + _handle_eval_call(context, args, kwargs) + { + try + { return this._eval_call(context, args, kwargs); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } } - } -); - -ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) { - var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + }; + + ul4.SeqItemAST = class SeqItemAST extends ul4.ItemArgBase + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_list: function _eval_list(context, result) { - var value = this.value._handle_eval(context); + } + + _eval_list(context, result) + { + let value = this.value._handle_eval(context); result.push(value); - }, - _eval_set: function _eval_set(context, result) { - var value = this.value._handle_eval(context); + } + + _eval_set(context, result) + { + let value = this.value._handle_eval(context); result.add(value); } - } -); + }; + ul4.SeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); -ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, + ul4.UnpackSeqItemAST = class UnpackSeqItemAST extends ul4.ItemArgBase { - create: function create(tag, pos, value) { - var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_list: function _eval_list(context, result) { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + } + + _eval_list(context, result) + { + let value = this.value._handle_eval(context); + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; result.push(item.value); } - }, - _eval_set: function _eval_set(context, result) { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + } + + _eval_set(context, result) + { + let value = this.value._handle_eval(context); + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; result.add(item.value); } } - } -); - -ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) { - var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) { + }; + + ul4.UnpackSeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); + + ul4.DictItemAST = class DictItemAST extends ul4.ItemArgBase + { + constructor(template, pos, key, value) + { + super(template, pos); + this.key = key; + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_dict: function _eval_dict(context, result) { - var key = this.key._handle_eval(context); - var value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); } - } -); - -ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + + _eval_dict(context, result) + { + let key = this.key._handle_eval(context); + let value = this.value._handle_eval(context); + ul4._setmap(result, key, value); + } + }; + + ul4.DictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["key", "value"]), + + ul4.UnpackDictItemAST = class UnpackDictItemAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_dict: function _eval_dict(context, result) { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) { - for (var i = 0; i < item.length; ++i) { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); + } + + _eval_dict(context, result) + { + let item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (let i = 0; i < item.length; ++i) + { + let subitem = item[i]; + if (!ul4._islist(subitem) || subitem.length != 2) + throw new ul4.ArgumentError("** requires a list of (key, value) pairs"); + ul4._setmap(result, subitem[0], subitem[1]); } } - else if (ul4._ismap(item)) { - item.forEach(function (value, key) { - ul4on._setmap(result, key, value); + else if (ul4._ismap(item)) + { + item.forEach(function(value, key) { + ul4._setmap(result, key, value); }); } - else if (ul4._isobject(item)) { - for (var key in item) - ul4on._setmap(result, key, item[key]); + else if (ul4._isobject(item)) + { + for (let key in item) + ul4._setmap(result, key, item[key]); } } - } -); - -ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + }; + + ul4.UnpackDictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.PosArgAST = class PosArgAST extends ul4.ItemArgBase + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var value = this.value._handle_eval(context); + } + + _eval_call(context, args, kwargs) + { + let value = this.value._handle_eval(context); args.push(value); } - } -); - -ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) { + }; + + ul4.PosArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); + + ul4.KeywordArgAST = class KeywordArgAST extends ul4.ItemArgBase + { + constructor(template, pos, name, value) + { + super(template, pos); + this.name = name; + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { + } + + _eval_call(context, args, kwargs) + { if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - var value = this.value._handle_eval(context); + throw new ul4.ArgumentError("duplicate keyword argument " + this.name); + let value = this.value._handle_eval(context); kwargs[this.name] = value; } - } -); - -ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + }; + + ul4.KeywordArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["name", "value"]); + + ul4.UnpackListArgAST = class UnpackListArgAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var item = this.item._handle_eval(context); - args.push.apply(args, item); } - } -); - -ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + + _eval_call(context, args, kwargs) + { + let item = this.item._handle_eval(context); + args.push(...item); + } + }; + + ul4.UnpackListArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.UnpackDictArgAST = class UnpackDictArgAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) { - for (var i = 0; i < item.length; ++i) { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; + } + + _eval_call(context, args, kwargs) + { + let item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (let i = 0; i < item.length; ++i) + { + let subitem = item[i]; + if (!ul4._islist(subitem) || subitem.length != 2) + throw new ul4.ArgumentError("** requires a list of (key, value) pairs"); + let [key, value] = subitem; if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = value; } } - else if (ul4._ismap(item)) { - item.forEach(function (value, key) { + else if (ul4._ismap(item)) + { + item.forEach(function(value, key) { if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = value; }); } - else if (ul4._isobject(item)) { - for (var key in item) { + else if (ul4._isobject(item)) + { + for (let key in item) + { if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = item[key]; } } } - } -); - -ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { + }; + + ul4.UnpackDictArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.ListAST = class ListAST extends ul4.CodeAST + { + constructor(template, pos) + { + super(template, pos); + this.items = []; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var result = []; - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); + } + + _eval(context) + { + let result = []; + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_list(context, result); + } return result; } - } -); - -ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { + }; + + ul4.ListAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["items"]); + + ul4.ListCompAST = class ListCompAST extends ul4.CodeAST + { + constructor(template, pos, item, varname, container, condition) + { + super(template, pos); + this.item = item; + this.varname = varname; + this.container = container; + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } - var localcontext = context.inheritvars(); + _eval(context) + { + let container = this.container._handle_eval(context); - var result = []; - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + let localcontext = context.inheritvars(); + + let result = []; + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) result.push(this.item._handle_eval(localcontext)); } return result; } - } -); - -ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var result = ul4on._emptymap(); - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); + } + + _eval(context) + { + let result = ul4._emptyset(); + + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_set(context, result); + } + return result; } - } -); - -ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } - var localcontext = context.inheritvars(); + _eval(context) + { + let container = this.container._handle_eval(context); - var result = ul4on._emptymap(); + let localcontext = context.inheritvars(); - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + let result = ul4._emptyset(); + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) { - var key = this.key._handle_eval(localcontext); - var value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); } + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); } return result; } - } -); - -ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); + } + _eval(context) + { + let result = ul4._emptymap(); + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_dict(context, result); + } return result; } - } -); - -ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } + + _eval(context) + { + let container = this.container._handle_eval(context); + + let localcontext = context.inheritvars(); - var localcontext = context.inheritvars(); + let result = ul4._emptymap(); - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); + { + let key = this.key._handle_eval(localcontext); + let value = this.value._handle_eval(localcontext); + ul4._setmap(result, key, value); + } } return result; } - } -); - -ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { + }; + + ul4.DictCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]); + + ul4.GenExprAST = class GenExprAST extends ul4.CodeAST + { + constructor(template, pos, item, varname, container, condition) + { + super(template, pos); + this.item = item; + this.varname = varname; + this.container = container; + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); - var iter = ul4._iter(container); + } + + _eval(context) + { + let container = this.container._handle_eval(context); + let iter = ul4._iter(container); - var localcontext = context.inheritvars(); + let localcontext = context.inheritvars(); - var self = this; + let self = this; - var result = { - next: function () { - while (true) { - var item = iter.next(); + let result = { + next: function(){ + while (true) + { + let item = iter.next(); if (item.done) return item; - var varitems = ul4._unpackvar(self.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) { - var value = self.item._handle_eval(localcontext); - return { value: value, done: false }; + let varitems = ul4._unpackvar(self.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) + { + let value = self.item._handle_eval(localcontext); + return {value: value, done: false}; } } } @@ -3956,118 +5677,132 @@ ul4.GenExprAST = ul4._inherit( return result; } - } -); - -ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) { - var variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) { + }; + + ul4.GenExprAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["item", "varname", "container", "condition"]); + + ul4.VarAST = class VarAST extends ul4.CodeAST + { + constructor(template, pos, name) + { + super(template, pos); + this.name = name; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { + } + + _eval(context) + { return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) { + } + + _eval_set(context, value) + { this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { + } + + _eval_modify(context, operator, value) + { this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) { - var result = context.get(name); - if (typeof (result) === "undefined") + } + + _get(context, name) + { + let result = context.get(name); + if (typeof(result) === "undefined") result = ul4.functions[name]; return result; - }, - _set: function _set(context, name, value) { + } + + _set(context, name, value) + { context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) { - var newvalue = operator._ido(context.get(name), value) + } + + _modify(context, operator, name, value) + { + let newvalue = operator._ido(context.get(name), value); context.set(name, newvalue); } - } -); - -ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) { - var unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) { + }; + + ul4.VarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["name"]); + + ul4.UnaryAST = class UnaryAST extends ul4.CodeAST + { + constructor(template, pos, obj) + { + super(template, pos); + this.obj = obj; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" obj="); this.obj._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); return this._do(obj); } - } -); + }; + + ul4.UnaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj"]); -// Negation -ul4.NegAST = ul4._inherit( - ul4.UnaryAST, + // Negation + ul4.NegAST = class NegAST extends ul4.UnaryAST { - _do: function _do(obj) { - if (obj !== null && typeof (obj.__neg__) === "function") + _do(obj) + { + if (obj !== null && typeof(obj.__neg__) === "function") return obj.__neg__(); return -obj; } - } -); + }; -// Bitwise not -ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, + // Bitwise not + ul4.BitNotAST = class BitNotAST extends ul4.UnaryAST { - _do: function _do(obj) { - return -obj - 1; + _do(obj) + { + return -obj-1; } - } -); + }; -// Not -ul4.NotAST = ul4._inherit( - ul4.UnaryAST, + // Not + ul4.NotAST = class NotAST extends ul4.UnaryAST { - _do: function _do(obj) { + _do(obj) + { return !ul4._bool(obj); } - } -); - -// If expression -ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) { - var ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) { + }; + + // If expression + ul4.IfAST = class IfAST extends ul4.CodeAST + { + constructor(template, pos, objif, objcond, objelse) + { + super(template, pos); + this.objif = objif; + this.objcond = objcond; + this.objelse = objelse; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(+1); out.push("objif="); this.objif._repr(out); @@ -4079,138 +5814,160 @@ ul4.IfAST = ul4._inherit( this.objelse._repr(out); out.push(-1); out.push(">"); - }, - _eval: function _eval(context) { - var result; - var condvalue = this.objcond._handle_eval(context); + } + + _eval(context) + { + let result; + let condvalue = this.objcond._handle_eval(context); if (ul4._bool(condvalue)) result = this.objif._handle_eval(context); else result = this.objelse._handle_eval(context); return result; } - } -); + }; -ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, + ul4.IfAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["objif", "objcond", "objelse"]); + + ul4.ReturnAST = class ReturnAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) { + _eval(context) + { + let result = this.obj._handle_eval(context); + throw new ul4.ReturnException(result); + } + + _str(out) + { out.push("return "); this.obj._str(out); } - } -); + }; -ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, + ul4.PrintAST = class PrintAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var output = ul4._str(obj); + _eval(context) + { + let obj = this.obj._handle_eval(context); + let output = ul4._str(obj); context.output(output); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("print "); this.obj._str(out); } - } -); + }; -ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, + ul4.PrintXAST = class PrintXAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var output = ul4._xmlescape(obj); + _eval(context) + { + let obj = this.obj._handle_eval(context); + let output = ul4._xmlescape(obj); context.output(output); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("printx "); this.obj._str(out); } - } -); - -ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) { - var binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) { + }; + + ul4.BinaryAST = class BinaryAST extends ul4.CodeAST + { + constructor(template, pos, obj1, obj2) + { + super(template, pos); + this.obj1 = obj1; + this.obj2 = obj2; + } + + _repr(out) + { out.push("<"); - out.push(this.type); + out.push(this.constructor.name); out.push(" obj1="); this.obj1._repr(out); out.push(" obj2="); this.obj2._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return this._do(obj1, obj2); } - } -); + }; + + ul4.BinaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj1", "obj2"]); -// Item access and assignment: dict[key], list[index], string[index], color[index] -ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, + // Item access and assignment: dict[key], list[index], string[index], color[index] + ul4.ItemAST = class ItemAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - var result = this._get(obj1, obj2); + _do(obj1, obj2) + { + let result = this._get(obj1, obj2); return result; - }, - _eval_set: function _eval_set(context, value) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval_set(context, value) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval_modify(context, operator, value) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) { - if (typeof (container) === "string" || ul4._islist(container)) { - if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { - var start = key.start, stop = key.stop; - if (typeof (start) === "undefined" || start === null) + } + + _get(container, key) + { + if (typeof(container) === "string" || ul4._islist(container)) + { + if (key instanceof ul4.slice) + { + let start = key.start, stop = key.stop; + if (typeof(start) === "undefined" || start === null) start = 0; - if (typeof (stop) === "undefined" || stop === null) + if (typeof(stop) === "undefined" || stop === null) stop = container.length; return container.slice(start, stop); } - else { - var orgkey = key; + else + { + let orgkey = key; if (key < 0) key += container.length; + if (key < 0 || key >= container.length) + throw new ul4.IndexError(container, orgkey); return container[key]; } } - else if (container && typeof (container.__getitem__) === "function") // test this before the generic object test + else if (container && typeof(container.__getitem__) === "function") // objects without ``_getitem__`` don't support item access return container.__getitem__(key); else if (ul4._ismap(container)) return container.get(key); - else if (Object.prototype.toString.call(container) === "[object Object]") - return container[key]; else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) { - if (ul4._islist(container)) { - if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { - var start = key.start, stop = key.stop; + throw new ul4.TypeError(ul4._type(container) + " object is not subscriptable"); + } + + _set(container, key, value) + { + if (ul4._islist(container)) + { + if (key instanceof ul4.slice) + { + let start = key.start, stop = key.stop; if (start === null) start = 0; else if (start < 0) @@ -4229,293 +5986,315 @@ ul4.ItemAST = ul4._inherit( stop = container.length; if (stop < start) stop = start; - container.splice(start, stop - start); // Remove old element - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + container.splice(start, stop-start); // Remove old element + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; container.splice(start++, 0, item.value); } } - else { - var orgkey = key; + else + { + let orgkey = key; if (key < 0) key += container.length; + if (key < 0 || key >= container.length) + throw new ul4.IndexError(container, orgkey); container[key] = value; } } - else if (container && typeof (container.__setitem__) === "function") // test this before the generic object test + else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test container.__setitem__(key, value); else if (ul4._ismap(container)) container.set(key, value); - else if (Object.prototype.toString.call(container) === "[object Object]") + else if (ul4._isobject(container)) container[key] = value; else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) { + throw new ul4.NotSubscriptableError(container); + } + + _modify(operator, container, key, value) + { this._set(container, key, operator._ido(this._get(container, key), value)); } - } -); + }; -// Identifty test operator ``is`` -ul4.IsAST = ul4._inherit( - ul4.BinaryAST, + // Identifty test operator ``is`` + ul4.IsAST = class IsAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return obj1 === obj2; } - } -); + }; -// Inverted tdentifty test operator ``is not`` -ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, + // Inverted identity test operator ``is not`` + ul4.IsNotAST = class IsNotAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return obj1 !== obj2; } - } -); + }; -// Comparison operator == -ul4.EQAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator == + ul4.EQAST = class EQAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._eq(obj1, obj2); } - } -); + }; -// Comparison operator != -ul4.NEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator != + ul4.NEAST = class NEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._ne(obj1, obj2); } - } -); + }; -// Comparison operator < -ul4.LTAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator < + ul4.LTAST = class LTAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._lt(obj1, obj2); } - } -); + }; -// Comparison operator <= -ul4.LEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator <= + ul4.LEAST = class LEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._le(obj1, obj2); } - } -); + }; -// Comparison operator > -ul4.GTAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator > + ul4.GTAST = class GTAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._gt(obj1, obj2); } - } -); + }; -// Comparison operator >= -ul4.GEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator >= + ul4.GEAST = class GEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._ge(obj1, obj2); } - } -); + }; -// Containment test: string in string, obj in list, key in dict, value in rgb -ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, + // Containment test: string in string, obj in list, key in dict, value in rgb + ul4.ContainsAST = class ContainsAST extends ul4.BinaryAST { - _do: function _do(obj, container) { - if (typeof (obj) === "string" && typeof (container) === "string") { + _do(obj, container) + { + if (typeof(obj) === "string" && typeof(container) === "string") + { return container.indexOf(obj) !== -1; } - else if (ul4._islist(container)) { + else if (ul4._islist(container)) + { return container.indexOf(obj) !== -1; } - else if (container && typeof (container.__contains__) === "function") // test this before the generic object test + else if (container && typeof(container.__contains__) === "function") // test this before the generic object test return container.__contains__(obj); else if (ul4._ismap(container) || ul4._isset(container)) return container.has(obj); - else if (ul4._isobject(container)) { - for (var key in container) { + else if (ul4._isobject(container)) + { + for (let key in container) + { if (key === obj) return true; } return false; } - else if (ul4._iscolor(container)) { + else if (ul4._iscolor(container)) + { return container._r === obj || container._g === obj || container._b === obj || container._a === obj; } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + throw new ul4.TypeError(ul4._type(container) + " object is not iterable"); } - } -); + }; -// Inverted containment test -ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, + // Inverted containment test + ul4.NotContainsAST = class NotContainsAST extends ul4.BinaryAST { - _do: function _do(obj, container) { - return !ul4.ContainsAST._do(obj, container); + _do(obj, container) + { + return !ul4.ContainsAST.prototype._do(obj, container); } - } -); + }; -// Addition: num + num, string + string -ul4.AddAST = ul4._inherit( - ul4.BinaryAST, + // Addition: num + num, string + string + ul4.AddAST = class AddAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__add__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__add__) === "function") return obj1.__add__(obj2); - else if (obj2 && typeof (obj2.__radd__) === "function") + else if (obj2 && typeof(obj2.__radd__) === "function") return obj2.__radd__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) { - var result = []; - ul4._append(result, obj1); - ul4._append(result, obj2); - return result; - } + throw new ul4.TypeError(ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) + return [...obj1, ...obj2]; else return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) { - if (ul4._islist(obj1) && ul4._islist(obj2)) { - ul4._append(obj1, obj2); + } + + _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + ul4.ListProtocol.append(obj1, obj2); return obj1; } else return this._do(obj1, obj2); } - } -); + }; -// Substraction: num - num -ul4.SubAST = ul4._inherit( - ul4.BinaryAST, + // Substraction: num - num + ul4.SubAST = class SubAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__sub__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__sub__) === "function") return obj1.__sub__(obj2); - else if (obj2 && typeof (obj2.__rsub__) === "function") + else if (obj2 && typeof(obj2.__rsub__) === "function") return obj2.__rsub__(obj1); else if (ul4._isdate(obj1) && ul4._isdate(obj2)) return this._date_sub(obj1, obj2); + else if (ul4._isdatetime(obj1) && ul4._isdatetime(obj2)) + return this._datetime_sub(obj1, obj2); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + throw new ul4.TypeError(ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) { - var swap = (obj2 > obj1); + } + + _date_sub(obj1, obj2) + { + return this._datetime_sub(obj1._date, obj2._date); + } + + _datetime_sub(obj1, obj2) + { + let swap = (obj2 > obj1); - if (swap) { - var t = obj1; + if (swap) + { + let t = obj1; obj1 = obj2; obj2 = t; } // From now on obj1 is > than obj2 - var year1 = obj1.getFullYear(); - var yearday1 = ul4._yearday(obj1); - var year2 = obj2.getFullYear(); - var yearday2 = ul4._yearday(obj2); + let year1 = obj1.getFullYear(); + let yearday1 = ul4.DateTimeProtocol.yearday(obj1); + let year2 = obj2.getFullYear(); + let yearday2 = ul4.DateTimeProtocol.yearday(obj2); - var diffdays = 0; + let diffdays = 0; - while (year1 > year2) { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + while (year1 > year2) + { + diffdays += ul4.DateProtocol.yearday(ul4._date(year2, 12, 31)); ++year2; } diffdays += yearday1 - yearday2; - var hours1 = obj1.getHours(); - var minutes1 = obj1.getMinutes(); - var seconds1 = obj1.getSeconds(); - var hours2 = obj2.getHours(); - var minutes2 = obj2.getMinutes(); - var seconds2 = obj2.getSeconds(); + let hours1 = obj1.getHours(); + let minutes1 = obj1.getMinutes(); + let seconds1 = obj1.getSeconds(); + let hours2 = obj2.getHours(); + let minutes2 = obj2.getMinutes(); + let seconds2 = obj2.getSeconds(); - var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + let diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + let diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - if (swap) { + if (swap) + { diffdays = -diffdays; diffseconds = -diffseconds; diffmilliseconds = -diffmilliseconds; } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) { + return new ul4.TimeDelta(diffdays, diffseconds, 1000*diffmilliseconds); + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; + -// Multiplication: num * num, int * str, str * int, int * list, list * int -ul4.MulAST = ul4._inherit( - ul4.BinaryAST, + // Multiplication: num * num, int * str, str * int, int * list, list * int + ul4.MulAST = class MulAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__mul__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__mul__) === "function") return obj1.__mul__(obj2); - else if (obj2 && typeof (obj2.__rmul__) === "function") + else if (obj2 && typeof(obj2.__rmul__) === "function") return obj2.__rmul__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) { - if (typeof (obj2) === "string") { + throw new ul4.TypeError(ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) + { + if (typeof(obj2) === "string") + { if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._str_repeat(obj2, obj1); } - else if (ul4._islist(obj2)) { + else if (ul4._islist(obj2)) + { if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._list_repeat(obj2, obj1); } } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) { - if (typeof (obj1) === "string") { + else if (ul4._isint(obj2) || ul4._isbool(obj2)) + { + if (typeof(obj1) === "string") + { if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._str_repeat(obj1, obj2); } - else if (ul4._islist(obj1)) { + else if (ul4._islist(obj1)) + { if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._list_repeat(obj1, obj2); } } return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) { - if (ul4._islist(obj1) && ul4._isint(obj2)) { - if (obj2 > 0) { - var i = 0; - var targetsize = obj1.length * obj2; + } + + _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._isint(obj2)) + { + if (obj2 > 0) + { + let i = 0; + let targetsize = obj1.length * obj2; while (obj1.length < targetsize) - obj1.push(obj1[i++]) + obj1.push(obj1[i++]); } else obj1.splice(0, obj1.length); @@ -4524,79 +6303,77 @@ ul4.MulAST = ul4._inherit( else return this._do(obj1, obj2); } - } -); + }; -// Truncating division -ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, + // Truncating division + ul4.FloorDivAST = class FloorDivAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__floordiv__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__floordiv__) === "function") return obj1.__floordiv__(obj2); - else if (obj2 && typeof (obj2.__rfloordiv__) === "function") + else if (obj2 && typeof(obj2.__rfloordiv__) === "function") return obj2.__rfloordiv__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + throw new ul4.TypeError(ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + else if (typeof(obj1) === "number" && typeof(obj2) === "number" && obj2 === 0) + throw new ul4.ZeroDivisionError(); return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// "Real" division -ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, + // "Real" division + ul4.TrueDivAST = class TrueDivAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__truediv__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__truediv__) === "function") return obj1.__truediv__(obj2); - else if (obj2 && typeof (obj2.__rtruediv__) === "function") + else if (obj2 && typeof(obj2.__rtruediv__) === "function") return obj2.__rtruediv__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + throw new ul4.TypeError(ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + else if (typeof(obj1) === "number" && typeof(obj2) === "number" && obj2 === 0) + throw new ul4.ZeroDivisionError(); return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Modulo -ul4.ModAST = ul4._inherit( - ul4.BinaryAST, + // Modulo + ul4.ModAST = class ModAST extends ul4.BinaryAST { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) { - var div = Math.floor(obj1 / obj2); - var mod = obj1 - div * obj2; + _do(obj1, obj2) + { + return ul4._mod(obj1, obj2); + } - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) { + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise left shift -ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise left shift + ul4.ShiftLeftAST = class ShiftLeftAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); + return ul4.ShiftRightAST.prototype._do(obj1, -obj2); if (obj1 === false) obj1 = 0; else if (obj1 === true) @@ -4604,24 +6381,25 @@ ul4.ShiftLeftAST = ul4._inherit( while (obj2--) obj1 *= 2; return obj1; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise right shift -ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise right shift + ul4.ShiftRightAST = class ShiftRightAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); + return ul4.ShiftLeftAST.prototype._do(obj1, -obj2); if (obj1 === false) obj1 = 0; else if (obj1 === true) @@ -4629,554 +6407,597 @@ ul4.ShiftRightAST = ul4._inherit( while (obj2--) obj1 /= 2; return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise and -ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise and + ul4.BitAndAST = class BitAndAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise exclusive or -ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise exclusive or + ul4.BitXOrAST = class BitXOrAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise or -ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise or + ul4.BitOrAST = class BitOrAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -ul4.AndAST = ul4._inherit( - ul4.BinaryAST, + ul4.AndAST = class AndAST extends ul4.BinaryAST { - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); if (!ul4._bool(obj1)) return obj1; - var obj2 = this.obj2._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return obj2; } - } -); + }; -ul4.OrAST = ul4._inherit( - ul4.BinaryAST, + ul4.OrAST = class OrAST extends ul4.BinaryAST { - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); if (ul4._bool(obj1)) return obj1; - var obj2 = this.obj2._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return obj2; } - } -); - -ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) { - var attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) { + }; + + ul4.AttrAST = class AttrAST extends ul4.CodeAST + { + constructor(template, pos, obj, attrname) + { + super(template, pos); + this.obj = obj; + this.attrname = attrname; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var result = this._get(obj, this.attrname); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); + let result = this._get(obj, this.attrname); return result; - }, - _eval_set: function _eval_set(context, value) { - var obj = this.obj._handle_eval(context); + } + + _eval_set(context, value) + { + let obj = this.obj._handle_eval(context); this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { - var obj = this.obj._handle_eval(context); + } + + _eval_modify(context, operator, value) + { + let obj = this.obj._handle_eval(context); this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) { - if (typeof (object) === "string") { - switch (attrname) { - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); - case "replace": - return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); }); - case "strip": - return ul4.expose(["chars=", null], function strip(chars) { return ul4._strip(object, chars); }); - case "lstrip": - return ul4.expose(["chars=", null], function lstrip(chars) { return ul4._lstrip(object, chars); }); - case "rstrip": - return ul4.expose(["chars=", null], function rstrip(chars) { return ul4._rstrip(object, chars); }); - case "split": - return ul4.expose(["sep=", null, "count=", null], function split(sep, count) { return ul4._split(object, sep, count); }); - case "rsplit": - return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); }); - case "splitlines": - return ul4.expose(["keepends=", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); }); - case "lower": - return ul4.expose([], function lower() { return object.toLowerCase(); }); - case "upper": - return ul4.expose([], function upper() { return object.toUpperCase(); }); - case "capitalize": - return ul4.expose([], function capitalize() { return ul4._capitalize(object); }); - case "join": - return ul4.expose(["iterable"], function join(iterable) { return ul4._join(object, iterable); }); - case "startswith": - return ul4.expose(["prefix"], function startswith(prefix) { return ul4._startswith(object, prefix); }); - case "endswith": - return ul4.expose(["suffix"], function endswith(suffix) { return ul4._endswith(object, suffix); }); - default: - return undefined; - } - } - else if (ul4._islist(object)) { - switch (attrname) { - case "append": - return ul4.expose(["*items"], function append(items) { return ul4._append(object, items); }); - case "insert": - return ul4.expose(["pos", "*items"], function insert(pos, items) { return ul4._insert(object, pos, items); }); - case "pop": - return ul4.expose(["pos=", -1], function pop(pos) { return ul4._pop(object, pos); }); - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); - default: - return undefined; - } - } - else if (ul4._isdate(object)) { - switch (attrname) { - case "weekday": - return ul4.expose([], function weekday() { return ul4._weekday(object); }); - case "week": - return ul4.expose(["firstweekday=", null], function week(firstweekday) { return ul4._week(object, firstweekday); }); - case "day": - return ul4.expose([], function day() { return object.getDate(); }); - case "month": - return ul4.expose([], function month() { return object.getMonth() + 1; }); - case "year": - return ul4.expose([], function year() { return object.getFullYear(); }); - case "hour": - return ul4.expose([], function hour() { return object.getHours(); }); - case "minute": - return ul4.expose([], function minute() { return object.getMinutes(); }); - case "second": - return ul4.expose([], function second() { return object.getSeconds(); }); - case "microsecond": - return ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; }); - case "mimeformat": - return ul4.expose([], function mimeformat() { return ul4._mimeformat(object); }); - case "isoformat": - return ul4.expose([], function isoformat() { return ul4._isoformat(object); }); - case "yearday": - return ul4.expose([], function yearday() { return ul4._yearday(object); }); - default: - return undefined; - } - } - else if (ul4._ismap(object)) { - switch (attrname) { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items() { return ul4._items(object); }); - case "values": - return ul4.expose([], function values() { return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - return object.get(attrname); - } - } - else if (ul4._isset(object)) { - switch (attrname) { - case "add": - return ul4.expose(["*items"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - return undefined; - } + } + + _get(object, attrname) + { + let proto = ul4.Protocol.get(object); + try + { + return proto.getattr(object, attrname); } - else if (Object.prototype.toString.call(object) === "[object Object]") { - switch (attrname) { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items() { return ul4._items(object); }); - case "values": - return ul4.expose([], function values() { return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - var result; - if (object && typeof (object.__getattr__) === "function") // test this before the generic object test - result = object.__getattr__(attrname); - else - result = object[attrname]; - if (typeof (result) !== "function") - return result; - var realresult = function () { - return result.apply(object, arguments); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === object) + return undefined; + else + throw exc; } - throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); - }, - _set: function _set(object, attrname, value) { - if (typeof (object) === "object" && typeof (object.__setattr__) === "function") + } + + _set(object, attrname, value) + { + if (typeof(object) === "object" && typeof(object.__setattr__) === "function") object.__setattr__(attrname, value); else if (ul4._ismap(object)) - object.set(attrname, value) + object.set(attrname, value); else if (ul4._isobject(object)) object[attrname] = value; else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) { - var oldvalue = this._get(object, attrname); - var newvalue = operator._ido(oldvalue, value); + throw new ul4.TypeError(ul4._type(object) + " object has no writable attributes"); + } + + _modify(operator, object, attrname, value) + { + let oldvalue = this._get(object, attrname); + let newvalue = operator._ido(oldvalue, value); this._set(object, attrname, newvalue); } - } -); - -ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) { - var call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) { + }; + + ul4.AttrAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj", "attrname"]); + + ul4.CallAST = class CallAST extends ul4.CodeAST + { + constructor(template, pos, obj, args) + { + super(template, pos); + this.obj = obj; + this.args = args; + } + + _repr(out) + { out.push(""); - }, - _makeargs: function _makeargs(context) { - var args = [], kwargs = {}; - for (var i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return { args: args, kwargs: kwargs }; - }, - _handle_eval: function _handle_eval(context) { - try { + } + + _makeargs(context) + { + let args = [], kwargs = {}; + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + arg._handle_eval_call(context, args, kwargs); + } + return {args: args, kwargs: kwargs}; + } + + _handle_eval(context) + { + try + { return this._eval(context); } - catch (exc) { - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + this._decorate_exception(exc); throw exc; } - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var args = this._makeargs(context); - var result = ul4._call(context, obj, args.args, args.kwargs); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); + let args = this._makeargs(context); + let result = ul4._call(context, obj, args.args, args.kwargs); return result; } - } -); - -ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) { - var render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) { + }; + + ul4.CallAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj", "args"]); + + ul4.RenderAST = class RenderAST extends ul4.CallAST + { + constructor(template, pos, obj, args) + { + super(template, pos, obj, args); + this.indent = null; + } + + _repr(out) + { + out.push("<"); + out.push(this._reprname); out.push(""); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) { + out.push(this.tag.code.replace(/\r?\n/g, ' ')); + if (this.indent !== null) + { out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); + out.push(ul4._repr(this.indent.text)); } - }, - _handle_eval: function _handle_eval(context) { - var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - var obj = this.obj._handle_eval(localcontext); - var args = this._makeargs(localcontext); + } + + _handle_eval(context) + { + let localcontext = context.withindent(this.indent !== null ? this.indent.text : null); + let obj = this.obj._handle_eval(localcontext); + let args = this._makeargs(localcontext); + this._handle_additional_arguments(localcontext, args); - try { - var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + try + { + let result = ul4._callrender(localcontext, obj, args.args, args.kwargs); return result; } - catch (exc) { - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + this._decorate_exception(exc); throw exc; } } - } -); -// Slice object -ul4.slice = ul4._inherit( - ul4.Proto, + _handle_additional_arguments(context, args) + { + } + }; + + ul4.RenderAST.prototype._ul4onattrs = ul4.CallAST.prototype._ul4onattrs.concat(["indent"]); + ul4.RenderAST.prototype._reprname = "RenderAST"; + + ul4.RenderXAST = class RenderXAST extends ul4.RenderAST { - create: function create(start, stop) { - var slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + _handle_eval(context) + { + context.escapes.push(ul4._xmlescape); + + let result = null; + try + { + result = super._handle_eval(context); + } + finally + { + context.escapes.splice(context.escapes.length-1, 1); + } + return result; } - } -); + }; + + ul4.RenderBlockAST = class RenderBlockAST extends ul4.RenderAST + { + _handle_additional_arguments(context, args) + { + if (args.kwargs.hasOwnProperty("content")) + throw new ul4.ArgumentError("duplicate keyword argument content"); + let closure = new ul4.TemplateClosure(this.content, this.content.signature, context.vars); + args.kwargs.content = closure; + } + }; + + ul4.RenderBlockAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat(["content"]); + + ul4.RenderBlocksAST = class RenderBlocksAST extends ul4.RenderAST + { + _handle_additional_arguments(context, args) + { + let localcontext = context.inheritvars(); + ul4.BlockAST.prototype._eval.call(this, localcontext); + + for (let key in localcontext.vars) + { + if (localcontext.vars.hasOwnProperty(key)) + { + if (key in args.kwargs) + throw new ul4.ArgumentError("duplicate keyword argument " + key); + args.kwargs[key] = localcontext.get(key); + } + } + } + }; + + ul4.RenderBlocksAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat(["content"]); + + // Slice object + ul4.slice = class slice extends ul4.Proto + { + constructor(start, stop) + { + super(); + this.start = start; + this.stop = stop; + } + + of(string) + { + let start = this.start || 0; + let stop = this.stop === null ? string.length : this.stop; + return string.slice(start, stop); + } + + __repr__() + { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ", None)"; + } + + __getattr__(attrname) + { + switch (attrname) + { + case "start": + return this.start; + case "stop": + return this.stop; + default: + throw new ul4.AttributeError(this, attrname); + } + } + }; -// List/String slice -ul4.SliceAST = ul4._inherit( - ul4.CodeAST, + // List/String slice + ul4.SliceAST = class SliceAST extends ul4.CodeAST { - create: function create(tag, pos, index1, index2) { - var slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) { + constructor(template, pos, index1, index2) + { + super(template, pos); + this.index1 = index1; + this.index2 = index2; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); } - } -); + _eval(context) + { + let index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + let index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return new ul4.slice(index1, index2); + } + }; + + ul4.SliceAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["index1", "index2"]); -ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, + ul4.SetVarAST = class SetVarAST extends ul4.CodeAST { - create: function create(tag, pos, lvalue, value) { - var changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) { + constructor(template, pos, lvalue, value) + { + super(template, pos); + this.lvalue = lvalue; + this.value = value; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" lvalue="); out.push(ul4._repr(this.lvalue)); out.push(" value="); this.value._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) { - var item = items[i]; - item[0]._handle_eval_set(context, item[1]); + } + + _eval(context) + { + let value = this.value._handle_eval(context); + let items = ul4._unpackvar(this.lvalue, value); + for (let i = 0; i < items.length; ++i) + { + let [lvalue, value] = items[i]; + lvalue._handle_eval_set(context, value); } } - } -); + }; -ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, + ul4.SetVarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["lvalue", "value"]); + + ul4.ModifyVarAST = class ModifyVarAST extends ul4.SetVarAST { - _eval: function _eval(context) { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) { - var item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); + _eval(context) + { + let value = this.value._handle_eval(context); + let items = ul4._unpackvar(this.lvalue, value); + for (let i = 0; i < items.length; ++i) + { + let [lvalue, value] = items[i]; + lvalue._handle_eval_modify(context, this._operator, value); } } - } -); + }; + + ul4.AddVarAST = class AddVarAST extends ul4.ModifyVarAST + { + }; + + ul4.AddVarAST.prototype._operator = ul4.AddAST.prototype; + + ul4.SubVarAST = class SubVarAST extends ul4.ModifyVarAST + { + }; + + ul4.SubVarAST.prototype._operator = ul4.SubAST.prototype; -ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + ul4.MulVarAST = class MulVarAST extends ul4.ModifyVarAST + { + }; + + ul4.MulVarAST.prototype._operator = ul4.MulAST.prototype; + + ul4.TrueDivVarAST = class TrueDivVarAST extends ul4.ModifyVarAST + { + }; + + ul4.TrueDivVarAST.prototype._operator = ul4.TrueDivAST.prototype; + + ul4.FloorDivVarAST = class FloorDivVarAST extends ul4.ModifyVarAST + { + }; + + ul4.FloorDivVarAST.prototype._operator = ul4.FloorDivAST.prototype; + + ul4.ModVarAST = class ModVarAST extends ul4.ModifyVarAST + { + }; -ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + ul4.ModVarAST.prototype._operator = ul4.ModAST.prototype; + + ul4.ShiftLeftVarAST = class ShiftLeftVarAST extends ul4.ModifyVarAST + { + }; -ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + ul4.ShiftLeftVarAST.prototype._operator = ul4.ShiftLeftAST.prototype; -ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + ul4.ShiftRightVarAST = class ShiftRightVarAST extends ul4.ModifyVarAST + { + }; -ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + ul4.ShiftRightVarAST.prototype._operator = ul4.ShiftRightAST.prototype; -ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + ul4.BitAndVarAST = class BitAndVarAST extends ul4.ModifyVarAST + { + }; -ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + ul4.BitAndVarAST.prototype._operator = ul4.BitAndAST.prototype; -ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + ul4.BitXOrVarAST = class BitXOrVarAST extends ul4.ModifyVarAST + { + }; -ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + ul4.BitXOrVarAST.prototype._operator = ul4.BitXOrAST.prototype; -ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + ul4.BitOrVarAST = class BitOrVarAST extends ul4.ModifyVarAST + { + }; -ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + ul4.BitOrVarAST.prototype._operator = ul4.BitOrAST.prototype; -ul4.BlockAST = ul4._inherit( - ul4.CodeAST, + ul4.BlockAST = class BlockAST extends ul4.CodeAST { - create: function create(tag, pos) { - var block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) { - for (var i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) { - if (this.content.length) { - for (var i = 0; i < this.content.length; ++i) { - this.content[i]._str(out); + constructor(template, pos) + { + super(template, pos); + this.content = []; + } + + _eval(context) + { + for (let i = 0; i < this.content.length; ++i) + { + let item = this.content[i]; + item._handle_eval(context); + } + } + + _str(out) + { + if (this.content.length) + { + for (let i = 0; i < this.content.length; ++i) + { + let item = this.content[i]; + item._str(out); out.push(0); } } - else { + else + { out.push("pass"); out.push(0); } } - } -); - -ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) { - var for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) { + }; + + ul4.BlockAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["content"]); + + ul4.ForBlockAST = class ForBlockAST extends ul4.BlockAST + { + constructor(template, pos, varname, container) + { + super(template, pos); + this.varname = varname; + this.container = container; + } + + _repr(out) + { out.push(""); - }, - _str_varname: function _str_varname(out, varname) { - if (ul4._islist(varname)) { + } + + _str_varname(out, varname) + { + if (ul4._islist(varname)) + { out.push("("); - for (var i = 0; i < varname.length; ++i) { + for (let i = 0; i < varname.length; ++i) + { if (i) out.push(", "); this._str_varname(out, varname[i]); @@ -5187,248 +7008,314 @@ ul4.ForBlockAST = ul4._inherit( } else varname._str(out); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } + + _eval(context) + { + let container = this.container._handle_eval(context); - for (var iter = ul4._iter(container); ;) { - var value = iter.next(); + for (let iter = ul4._iter(container);;) + { + let value = iter.next(); if (value.done) break; - var varitems = ul4._unpackvar(this.varname, value.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try { + let varitems = ul4._unpackvar(this.varname, value.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(context, value); + } + try + { // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); + super._eval(context); } - catch (exc) { - if (exc === ul4.BreakException) + catch (exc) + { + if (exc instanceof ul4.BreakException) break; - else if (exc === ul4.ContinueException) + else if (exc instanceof ul4.ContinueException) ; else throw exc; } } - }, - _str: function _str(out) { + } + + _str(out) + { out.push("for "); this._str_varname(out, this.varname); out.push(" in "); this.container._str(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); } - } -); - -ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) { - var while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) { + }; + + ul4.ForBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["varname", "container"]); + + ul4.WhileBlockAST = class WhileBlockAST extends ul4.BlockAST + { + constructor(template, pos, condition) + { + super(template, pos); + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _str: function _str(out) { - out.push("while "), - this.container._repr(out); + } + + _str(out) + { + out.push("while "); + this.condition._repr(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _eval: function _eval(context) { - while (true) { - var cond = this.condition._handle_eval(context); + } + + _eval(context) + { + while (true) + { + let cond = this.condition._handle_eval(context); if (!ul4._bool(cond)) break; - try { + try + { // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); + // But we don't have to, as wrapping the original exception in ``Error`` has already been done by the lower levels + super._eval(context); } - catch (exc) { - if (exc === ul4.BreakException) + catch (exc) + { + if (exc instanceof ul4.BreakException) break; - else if (exc === ul4.ContinueException) + else if (exc instanceof ul4.ContinueException) ; else throw exc; } } - }, - _str: function _str(out) { - out.push("while "); - ul4.AST._str.call(this, out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); } - } -); + }; -ul4.BreakAST = ul4._inherit( - ul4.CodeAST, + ul4.WhileBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["condition"]); + + ul4.BreakAST = class BreakAST extends ul4.CodeAST { - _eval: function _eval(context) { - throw ul4.BreakException; - }, - _str: function _str(out) { + _eval(context) + { + throw new ul4.BreakException(); + } + + _str(out) + { out.push("break"); out.push(0); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, + ul4.ContinueAST = class ContinueAST extends ul4.CodeAST { - _eval: function _eval(context) { - throw ul4.ContinueException; - }, - _str: function _str(out) { + _eval(context) + { + throw new ul4.ContinueException(); + } + + _str(out) + { out.push("continue"); out.push(0); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, + ul4.CondBlockAST = class CondBlockAST extends ul4.BlockAST { - _eval: function _eval(context) { - for (var i = 0; i < this.content.length; ++i) { - var block = this.content[i]; - var execute = block._execute(context); - if (execute) { + _eval(context) + { + for (let i = 0; i < this.content.length; ++i) + { + let block = this.content[i]; + let execute = block._execute(context); + if (execute) + { block._handle_eval(context); break; } } } - } -); - -ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) { - var block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) { + }; + + ul4.ConditionalBlockAST = class ConditionalBlockAST extends ul4.BlockAST + { + constructor(template, pos, condition) + { + super(template, pos); + this.condition = condition; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" condition="); this.condition._repr(out); out.push(">"); - }, - _str: function _str(out) { + } + + _str(out) + { out.push(this._strname); out.push(" "); this.condition._str(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _execute: function _execute(context) { - var cond = this.condition._handle_eval(context); - var result = ul4._bool(cond); + } + + _execute(context) + { + let cond = this.condition._handle_eval(context); + let result = ul4._bool(cond); return result; } - } -); + }; + + ul4.ConditionalBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["condition"]); + + ul4.IfBlockAST = class IfBlockAST extends ul4.ConditionalBlockAST + { + }; + + ul4.IfBlockAST.prototype._strname = "if"; -ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "if" }); + ul4.ElIfBlockAST = class ElIfBlockAST extends ul4.ConditionalBlockAST + { + }; -ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "else if" }); + ul4.ElIfBlockAST.prototype._strname = "else if"; -ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, + ul4.ElseBlockAST = class ElseBlockAST extends ul4.BlockAST { - _repr: function _repr(out) { + _repr(out) + { out.push(""); - }, - _str: function _str(out) { - out.push("else:"), - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) { - return true; - }, - _str: function _str(out) { + } + + _str(out) + { out.push("else:"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); } - } -); - -ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) { - var template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) { - var signature; + + _execute(context) + { + return true; + } + }; + + ul4.Template = class Template extends ul4.BlockAST + { + constructor(template, pos, source, name, whitespace, startdelim, enddelim, signature) + { + super(template, pos); + this._source = source; + this.name = name; + this.whitespace = whitespace; + this.startdelim = startdelim; + this.enddelim = enddelim; + this.docpos = null; + this.signature = signature; + this._asts = null; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + this.parenttemplate = null; + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + let render = function render(context, vars){ self._renderbound(context, vars); }; + ul4.expose(render, this.signature, {needscontext: true, needsobject: true}); + return render; + case "renders": + let renders = function renders(context, vars){ return self._rendersbound(context, vars); }; + ul4.expose(renders, this.signature, {needscontext: true, needsobject: true}); + return renders; + default: + return super.__getattr__(attrname); + } + } + + ul4ondump(encoder) + { + let signature; encoder.dump(ul4.version); encoder.dump(this.name); - encoder.dump(this.source); + encoder.dump(this._source); encoder.dump(this.whitespace); encoder.dump(this.startdelim); encoder.dump(this.enddelim); encoder.dump(this.docpos); encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + if (this.signature === null || this.signature instanceof ul4.SignatureAST) signature = this.signature; - else { + else + { signature = []; - for (var i = 0; i < this.signature.args.length; ++i) { - var arg = this.signature.args[i]; - if (typeof (arg.defaultValue) === "undefined") + for (let i = 0; i < this.signature.args.length; ++i) + { + let arg = this.signature.args[i]; + if (typeof(arg.defaultValue) === "undefined") signature.push(arg.name); else - signature.push(arg.name + "=", arg.defaultValue); + signature.push(arg.name+"=", arg.defaultValue); } if (this.signature.remargs !== null) signature.push("*" + this.signature.remargs); @@ -5436,19 +7323,22 @@ ul4.Template = ul4._inherit( signature.push("**" + this.signature.remkwargs); } encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) { - var version = decoder.load(); - var signature; + super.ul4ondump(encoder); + } + + ul4onload(decoder) + { + let version = decoder.load(); + let signature; if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + throw new ul4.ValueError("UL4ON doesn't support templates in 'source' format in Javascript implementation"); if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + throw new ul4.ValueError("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); - this.source = decoder.load(); + this._source = decoder.load(); this.whitespace = decoder.load(); this.startdelim = decoder.load(); this.enddelim = decoder.load(); @@ -5456,1568 +7346,1463 @@ ul4.Template = ul4._inherit( this.parenttemplate = decoder.load(); signature = decoder.load(); if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); + signature = new ul4.Signature(...signature); this.signature = signature; this._ul4_callsignature = signature; this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) { - return ul4on.loads(string); - }, - _eval: function _eval(context) { - var signature = null; + super.ul4onload(decoder); + } + + loads(string) + { + return ul4.loads(string); + } + + _eval(context) + { + let signature = null; if (this.signature !== null) signature = this.signature._handle_eval(context); - var closure = ul4.TemplateClosure.create(this, signature, context.vars); + let closure = new ul4.TemplateClosure(this, signature, context.vars); context.set(this.name, closure); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push("") { + if (this.enddelim !== "?>") + { out.push(" enddelim="); out.push(ul4._repr(this.enddelim)); } out.push(">"); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("def "); out.push(this.name ? this.name : "unnamed"); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) { - var localcontext = context.clone(); + } + + _renderbound(context, vars) + { + let localcontext = context.clone(); localcontext.vars = vars; - try { - ul4.BlockAST._eval.call(this, localcontext); + try + { + ul4.BlockAST.prototype._eval.call(this, localcontext); } - catch (exc) { - if (!ul4.ReturnException.isprotoof(exc)) + catch (exc) + { + if (!(exc instanceof ul4.ReturnException)) throw exc; } - }, - __render__: function __render__(context, vars) { + } + + __render__(context, vars) + { this._renderbound(context, vars); - }, - render: function render(context, vars) { + } + + render(context, vars) + { this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) { - var localcontext = context.replaceoutput(); + } + + _rendersbound(context, vars) + { + let localcontext = context.replaceoutput(); this._renderbound(localcontext, vars); return localcontext.getoutput(); - }, - renders: function renders(vars) { + } + + renders(vars) + { vars = vars || {}; - var context = ul4.Context.create(); + let context = new ul4.Context(); if (this.signature !== null) vars = this.signature.bindObject(this.name, [], vars); return this._rendersbound(context, vars); - }, - doc: function doc() { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); - default: - return undefined; - } - }, - _callbound: function _callbound(context, vars) { - var localcontext = context.clone(); + } + + doc() + { + return this.docpos != null ? this.docpos.of(this._source) : null; + } + + _callbound(context, vars) + { + let localcontext = context.clone(); localcontext.vars = vars; - try { - ul4.BlockAST._eval.call(this, localcontext); + try + { + ul4.BlockAST.prototype._eval.call(this, localcontext); } - catch (exc) { - if (ul4.ReturnException.isprotoof(exc)) + catch (exc) + { + if (exc instanceof ul4.ReturnException) return exc.result; else throw exc; } return null; - }, - call: function call(vars) { + } + + call(vars) + { vars = vars || {}; - var context = ul4.Context.create(); + let context = new ul4.Context(); if (this.signature !== null) vars = this.signature.bindObject(this.name, [], vars); return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) { + } + + __call__(context, vars) + { return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } -); + } + + ul4type() + { + return "template"; + } + }; -ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, + ul4.Template.prototype._ul4_callneedsobject = true; + ul4.Template.prototype._ul4_callneedscontext = true; + ul4.Template.prototype._ul4_renderneedsobject = true; + ul4.Template.prototype._ul4_renderneedscontext = true; + + ul4.SignatureAST = class SignatureAST extends ul4.CodeAST { - create: function create(tag, pos) { - var signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) { - ul4.CodeAST.ul4ondump.call(this, encoder); + constructor(template, pos) + { + super(template, pos); + this.params = []; + } + + ul4ondump(encoder) + { + super.ul4ondump(encoder); - var dump = []; + let dump = []; - for (var i = 0; i < this.params.length; ++i) { - var param = this.params[i]; + for (let i = 0; i < this.params.length; ++i) + { + let param = this.params[i]; if (param[1] === null) dump.push(param[0]); else dump.push(param); } encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) { - ul4.AST.ul4onload.call(this, decoder); - var dump = decoder.load(); + } + + ul4onload(decoder) + { + super.ul4onload(decoder); + let dump = decoder.load(); this.params = []; - for (var i = 0; i < dump.length; ++i) { - var param = dump[i]; - if (typeof (param) === "string") + for (let i = 0; i < dump.length; ++i) + { + let param = dump[i]; + if (typeof(param) === "string") this.params.push([param, null]); else this.params.push(param); } - }, - _eval: function _eval(context) { - var args = []; - for (var i = 0; i < this.params.length; ++i) { - var param = this.params[i]; + } + + _eval(context) + { + let args = []; + for (let i = 0; i < this.params.length; ++i) + { + let param = this.params[i]; if (param[1] === null) args.push(param[0]); - else { + else + { args.push(param[0] + "="); args.push(param[1]._handle_eval(context)); } } - return ul4.Signature.create.apply(ul4.Signature, args); - }, - _repr: function _repr(out) { + return new ul4.Signature(...args); + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" params="); this.params._repr(out); out.push(">"); } - } -); - -ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) { - var closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; + }; + + ul4.TemplateClosure = class TemplateClosure extends ul4.Proto + { + constructor(template, signature, vars) + { + super(); + this.template = template; + this.signature = signature; + this.vars = vars; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + this.name = template.name; + this.tag = template.tag; + this.endtag = template.endtag; + this._source = template._source; + this.startdelim = template.startdelim; + this.enddelim = template.enddelim; + this.docpos = template.docpos; + this.content = template.content; + } + + __render__(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + render(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + __call__(context, vars) + { + return this.template._callbound(context, ul4._inherit(this.vars, vars)); + } + + _renderbound(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + _rendersbound(context, vars) + { + return this.template._rendersbound(context, ul4._inherit(this.vars, vars)); + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "render": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + let render = function render(context, vars){ self._renderbound(context, vars); }; + ul4.expose(render, this.signature, {needscontext: true, needsobject: true}); + return render; case "renders": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + let renders = function renders(context, vars){ return self._rendersbound(context, vars); }; + ul4.expose(renders, this.signature, {needscontext: true, needsobject: true}); + return renders; case "signature": return this.signature; default: return this.template.__getattr__(attrname); } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } -); - -// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` -ul4._rgb = function _rgb(r, g, b, a) { - return this.Color.create(255 * r, 255 * g, 255 * b, 255 * a); -}; - -// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference -ul4._xmlescape = function _xmlescape(obj) { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; -}; - -// Convert ``obj`` to a string suitable for output into a CSV file -ul4._csv = function _csv(obj) { - if (obj === null) - return ""; - else if (typeof (obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; -}; - -// Return a string containing one character with the codepoint ``i`` -ul4._chr = function _chr(i) { - if (typeof (i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); -}; - -// Return the codepoint for the one and only character in the string ``c`` -ul4._ord = function _ord(c) { - if (typeof (c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); -}; - -// Convert an integer to a hexadecimal string -ul4._hex = function _hex(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); -}; - -// Convert an integer to a octal string -ul4._oct = function _oct(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); -}; - -// Convert an integer to a binary string -ul4._bin = function _bin(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); -}; - -// Return the minimum value -ul4._min = function _min(obj) { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) { - var item = iter.next(); - if (item.done) { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; } - if (first || (item.value < result)) - result = item.value; - first = false; - } -}; - -// Return the maximum value -ul4._max = function _max(obj) { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) { - var item = iter.next(); - if (item.done) { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; + + ul4type() + { + return "template"; } - if (first || (item.value > result)) - result = item.value; - first = false; - } -}; - -// Return the of the values from the iterable starting with ``start`` (default ``0``) -ul4._sum = function _sum(iterable, start) { - if (typeof (start) === "undefined") - start = 0; - - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; -}; - -// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) -ul4._first = function _first(iterable, defaultValue) { - if (typeof (defaultValue) === "undefined") - defaultValue = null; - - var item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; -}; - -// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) -ul4._last = function _last(iterable, defaultValue) { - if (typeof (defaultValue) === "undefined") - defaultValue = null; - - var value = defaultValue; - - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; -}; - -// Return a sorted version of ``iterable`` -ul4._sorted = function _sorted(context, iterable, key, reverse) { - var cmp; - if (key === null) { - // FIXME: stability - if (reverse) { - cmp = function cmp(a, b) { - return -ul4._cmp("<=>", a, b); + }; + + ul4.TemplateClosure.prototype._ul4_callneedsobject = true; + ul4.TemplateClosure.prototype._ul4_callneedscontext = true; + ul4.TemplateClosure.prototype._ul4_renderneedsobject = true; + ul4.TemplateClosure.prototype._ul4_renderneedscontext = true; + + // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` + ul4._rgb = function _rgb(r, g, b, a) + { + return new this.Color(255*r, 255*g, 255*b, 255*a); + }; + + // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference + ul4._xmlescape = function _xmlescape(obj) + { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; + }; + + // Convert ``obj`` to a string suitable for output into a CSV file + ul4._csv = function _csv(obj) + { + if (obj === null) + return ""; + else if (typeof(obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; + }; + + // Return a string containing one character with the codepoint ``i`` + ul4._chr = function _chr(i) + { + if (typeof(i) != "number") + throw new ul4.TypeError("chr() requires an int"); + return String.fromCharCode(i); + }; + + // Return the codepoint for the one and only character in the string ``c`` + ul4._ord = function _ord(c) + { + if (typeof(c) != "string" || c.length != 1) + throw new ul4.TypeError("ord() requires a string of length 1"); + return c.charCodeAt(0); + }; + + // Convert an integer to a hexadecimal string + ul4._hex = function _hex(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); + }; + + // Convert an integer to a octal string + ul4._oct = function _oct(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); + }; + + // Convert an integer to a binary string + ul4._bin = function _bin(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); + }; + + // Return the minimum value + ul4._min = function _min(obj) + { + if (obj.length == 0) + throw new ul4.ArgumentError("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + let iter = ul4._iter(obj); + let result; + let first = true; + while (true) + { + let item = iter.next(); + if (item.done) + { + if (first) + throw new ul4.ValueError("min() argument is an empty sequence!"); + return result; } + if (first || (item.value < result)) + result = item.value; + first = false; + } + }; + + // Return the maximum value + ul4._max = function _max(obj) + { + if (obj.length == 0) + throw new ul4.ArgumentError("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + let iter = ul4._iter(obj); + let result; + let first = true; + while (true) + { + let item = iter.next(); + if (item.done) + { + if (first) + throw new ul4.ValueError("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } + }; + + // Return the of the values from the iterable starting with ``start`` (default ``0``) + ul4._sum = function _sum(iterable, start=0) + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; + }; + + // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._first = function _first(iterable, defaultValue=null) + { + let item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; + }; + + // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._last = function _last(iterable, defaultValue=null) + { + let value = defaultValue; + + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + value = item.value; } - else { - cmp = function cmp(a, b) { + return value; + }; + + // Return a sorted version of ``iterable`` + ul4._sorted = function _sorted(context, iterable, key=null, reverse=false) + { + if (key === null) + { + // FIXME: stability + let cmp = reverse ? function cmp(a, b) + { + return -ul4._cmp("<=>", a, b); + } : function cmp(a, b) + { return ul4._cmp("<=>", a, b); + }; + let result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else + { + let sort = []; + + for (let i = 0, iter = ul4._iter(iterable);;++i) + { + let item = iter.next(); + if (item.done) + break; + let keyvalue = ul4._call(context, key, [item.value], {}); + // For a stable sorting we have to use the nagative index if + // reverse sorting is specified + sort.push([keyvalue, reverse ? -i : i, item.value]); + } + cmp = function cmp(s1, s2) + { + let res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp("<=>", s1[1], s2[1]); + return reverse ? -res : res; + }; + + sort.sort(cmp); + + let result = []; + for (let i = 0; i < sort.length; ++i) + { + let item = sort[i]; + result.push(item[2]); } + return result; } - var result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else { - var sort = []; + }; - for (var i = 0, iter = ul4._iter(iterable); ; ++i) { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); + // Return a iterable object iterating from ``start`` up to (but not including) ``stop`` with a step size of ``step`` + ul4._range = function _range(args) + { + let start, stop, step; + if (args.length < 1) + throw new ul4.ArgumentError("required range() argument missing"); + else if (args.length > 3) + throw new ul4.ArgumentError("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + let lower, higher; + if (step === 0) + throw new ul4.ValueError("range() requires a step argument != 0"); + else if (step > 0) + { + lower = start; + higher = stop; } - cmp = function cmp(s1, s2) { - var res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; + else + { + lower = stop; + higher = start; } + let length = (lower < higher) ? Math.floor((higher - lower - 1)/Math.abs(step)) + 1 : 0; - sort.sort(cmp); + return { + index: 0, + next: function() + { + if (this.index >= length) + return {done: true}; + return {value: start + (this.index++) * step, done: false}; + } + }; + }; - var result = []; - for (var i = 0; i < sort.length; ++i) { - result.push(sort[i][2]); - } - return result; - } -}; - -// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` -ul4._range = function _range(args) { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) { - lower = start; - heigher = stop; - } - else { - lower = stop; - heigher = start; - } - var length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function () { - if (this.index >= length) - return { done: true }; - return { value: start + (this.index++) * step, done: false }; - } - }; -}; - -// Return a iterable object returning a slice from the argument -ul4._slice = function _slice(args) { - var iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - var next = start, count = 0; - var iter = ul4._iter(iterable); - return { - next: function () { - var result; - while (count < next) { + // Return a iterable object returning a slice from the argument + ul4._slice = function _slice(args) + { + let iterable, start, stop, step; + if (args.length < 2) + throw new ul4.ArgumentError("required slice() argument missing"); + else if (args.length > 4) + throw new ul4.ArgumentError("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) + { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw new ul4.ValueError("slice() requires a start argument >= 0"); + if (stop < 0) + throw new ul4.ValueError("slice() requires a stop argument >= 0"); + if (step <= 0) + throw new ul4.ValueError("slice() requires a step argument > 0"); + + let next = start, count = 0; + let iter = ul4._iter(iterable); + return { + next: function() { + let result; + while (count < next) + { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return {done: true}; result = iter.next(); if (result.done) return result; ++count; - } - if (stop !== null && count >= stop) - return { done: true }; - result = iter.next(); - if (result.done) + next += step; + if (stop !== null && next > stop) + next = stop; return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } + } + }; }; -}; - -// ``%`` escape unsafe characters in the string ``string`` -ul4._urlquote = function _urlquote(string) { - return encodeURIComponent(string); -}; - -// The inverse function of ``urlquote`` -ul4._urlunquote = function _urlunquote(string) { - return decodeURIComponent(string); -}; - -// Return a reverse iterator over ``sequence`` -ul4._reversed = function _reversed(sequence) { - if (typeof (sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length - 1, - next: function () { - return this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true }; - } - }; -}; - -// Returns a random number in the interval ``[0;1[`` -ul4._random = function _random() { - return Math.random(); -}; - -// Return a randomly select item from ``range(start, stop, step)`` -ul4._randrange = function _randrange(args) { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var width = stop - start; - var value = Math.random(); + // ``%`` escape unsafe characters in the string ``string`` + ul4._urlquote = function _urlquote(string) + { + return encodeURIComponent(string); + }; - var n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step * Math.floor(value * n); -}; - -// Return a random item/char from the list/string ``sequence`` -ul4._randchoice = function _randchoice(sequence) { - var iscolor = ul4._iscolor(sequence); - if (typeof (sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; -}; - -// Round a number ``x`` to ``digits`` decimal places (may be negative) -ul4._round = function _round(x, digits) { - if (typeof (digits) === "undefined") - digits = 0; - if (digits) { - var threshhold = Math.pow(10, digits); - return Math.round(x * threshhold) / threshhold; - } - else - return Math.round(x); -}; - -// Return a hex-encode MD5 hash of the argument -// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 -ul4._md5 = function _md5(string) { - return md5(string); -}; - -// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) -ul4._enumerate = function _enumerate(iterable, start) { - if (typeof (start) === "undefined") - start = 0; - - return { - iter: ul4._iter(iterable), - index: start, - next: function () { - var item = this.iter.next(); - return item.done ? item : { value: [this.index++, item.value], done: false }; - } - }; -}; - -// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) -ul4._isfirst = function _isfirst(iterable) { - var iter = ul4._iter(iterable); - var isfirst = true; - return { - next: function () { - var item = iter.next(); - var result = item.done ? item : { value: [isfirst, item.value], done: false }; - isfirst = false; - return result; - } + // The inverse function of ``urlquote`` + ul4._urlunquote = function _urlunquote(string) + { + return decodeURIComponent(string); }; -}; -// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) -ul4._islast = function _islast(iterable) { - var iter = ul4._iter(iterable); - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [item.done, lastitem.value], done: false }; - lastitem = item; - return result; - } + // Return a reverse iterator over ``sequence`` + ul4._reversed = function _reversed(sequence) + { + if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length-1, + next: function() { + return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; + } + }; }; -}; - -// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) -ul4._isfirstlast = function _isfirstlast(iterable) { - var iter = ul4._iter(iterable); - var isfirst = true; - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [isfirst, item.done, lastitem.value], done: false }; - lastitem = item; - isfirst = false; - return result; - } + + // Returns a random number in the interval ``[0;1[`` + ul4._random = function _random() + { + return Math.random(); }; -}; - -// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) -ul4._enumfl = function _enumfl(iterable, start) { - var iter = ul4._iter(iterable); - var i = start; - var isfirst = true; - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [i++, isfirst, item.done, lastitem.value], done: false }; - lastitem = item; - isfirst = false; - return result; + + // Return a randomly select item from ``range(start, stop, step)`` + ul4._randrange = function _randrange(args) + { + let start, stop, step; + if (args.length < 1) + throw new ul4.ArgumentError("required randrange() argument missing"); + else if (args.length > 3) + throw new ul4.ArgumentError("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + let width = stop-start; + + let value = Math.random(); + + let n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw new ul4.ValueError("randrange() requires a step argument != 0"); + return start + step*Math.floor(value * n); + }; + + // Return a random item/char from the list/string ``sequence`` + ul4._randchoice = function _randchoice(sequence) + { + let iscolor = ul4._iscolor(sequence); + if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw new ul4.TypeError("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; + }; + + // Round a number ``x`` to ``digits`` decimal places (may be negative) + ul4._round = function _round(x, digits=0) + { + if (digits) + { + let threshold = Math.pow(10, digits); + return Math.round(x*threshold)/threshold; } + else + return Math.round(x); }; -}; -// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) -ul4._zip = function _zip(iterables) { - var result; - if (iterables.length) { - var iters = []; - for (var i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); + // Return a hex-encode MD5 hash of the argument + // This uses the md5 function from https://github.com/blueimp/JavaScript-MD5 + if (iscommon) + { + ul4._md5 = function _md5(string) + { + let md5 = require('blueimp-md5'); + return md5(string); + }; + } + else + { + ul4._md5 = function _md5(string) + { + return md5(string); + }; + } + // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) + ul4._enumerate = function _enumerate(iterable, start=0) + { return { - next: function () { - var items = []; - for (var i = 0; i < iters.length; ++i) { - var item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return { value: items, done: false }; + iter: ul4._iter(iterable), + index: start, + next: function() { + let item = this.iter.next(); + return item.done ? item : {value: [this.index++, item.value], done: false}; } }; - } - else { + }; + + // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) + ul4._isfirst = function _isfirst(iterable) + { + let iter = ul4._iter(iterable); + let isfirst = true; return { - next: function () { - return { done: true }; + next: function() { + let item = iter.next(); + let result = item.done ? item : {value: [isfirst, item.value], done: false}; + isfirst = false; + return result; } }; - } -}; - -// Return the absolute value for the number ``number`` -ul4._abs = function _abs(number) { - if (number !== null && typeof (number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); -}; - -// Return a ``Date`` object from the arguments passed in -ul4._date = function _date(year, month, day, hour, minute, second, microsecond) { - if (typeof (hour) === "undefined") - hour = 0; - - if (typeof (minute) === "undefined") - minute = 0; - - if (typeof (second) === "undefined") - second = 0; - - if (typeof (microsecond) === "undefined") - microsecond = 0; - - return new Date(year, month - 1, day, hour, minute, second, microsecond / 1000); -}; - -// Return a ``TimeDelta`` object from the arguments passed in -ul4._timedelta = function _timedelta(days, seconds, microseconds) { - return this.TimeDelta.create(days, seconds, microseconds); -}; - -// Return a ``MonthDelta`` object from the arguments passed in -ul4._monthdelta = function _monthdelta(months) { - return this.MonthDelta.create(months); -}; - -// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) -ul4._hls = function _hls(h, l, s, a) { - var _v = function (m1, m2, hue) { - hue = hue % 1.0; - if (hue < 1 / 6) - return m1 + (m2 - m1) * hue * 6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2 / 3) - return m1 + (m2 - m1) * (2 / 3 - hue) * 6.0; - return m1; - }; - - var m1, m2; - if (typeof (a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0 + s); - else - m2 = l + s - (l * s); - m1 = 2.0 * l - m2; - return ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a); -}; - -// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) -ul4._hsv = function _hsv(h, s, v, a) { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - var i = Math.floor(h * 6.0); - var f = (h * 6.0) - i; - var p = v * (1.0 - s); - var q = v * (1.0 - s * f); - var t = v * (1.0 - s * (1.0 - f)); - switch (i % 6) { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } -}; - -// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` -ul4._get = function _get(container, key, defaultvalue) { - if (ul4._ismap(container)) { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) { - var result = container[key]; - if (typeof (result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); -}; - -// Return a ``Date`` object for the current time -ul4.now = function now() { - return new Date(); -}; - -// Return a ``Date`` object for the current time in UTC -ul4.utcnow = function utcnow() { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); -}; - -ul4.functions = { - repr: ul4.expose(["obj"], { name: "repr" }, ul4._repr), - ascii: ul4.expose(["obj"], { name: "ascii" }, ul4._ascii), - str: ul4.expose(["obj=", ""], { name: "str" }, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], { name: "int" }, ul4._int), - float: ul4.expose(["obj=", 0.0], { name: "float" }, ul4._float), - list: ul4.expose(["iterable=", []], { name: "list" }, ul4._list), - set: ul4.expose(["iterable=", []], { name: "set" }, ul4._set), - bool: ul4.expose(["obj=", false], { name: "bool" }, ul4._bool), - len: ul4.expose(["sequence"], { name: "len" }, ul4._len), - type: ul4.expose(["obj"], { name: "type" }, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], { name: "format" }, ul4._format), - any: ul4.expose(["iterable"], { name: "any" }, ul4._any), - all: ul4.expose(["iterable"], { name: "all" }, ul4._all), - zip: ul4.expose(["*iterables"], { name: "zip" }, ul4._zip), - isundefined: ul4.expose(["obj"], { name: "isundefined" }, ul4._isundefined), - isdefined: ul4.expose(["obj"], { name: "isdefined" }, ul4._isdefined), - isnone: ul4.expose(["obj"], { name: "isnone" }, ul4._isnone), - isbool: ul4.expose(["obj"], { name: "isbool" }, ul4._isbool), - isint: ul4.expose(["obj"], { name: "isint" }, ul4._isint), - isfloat: ul4.expose(["obj"], { name: "isfloat" }, ul4._isfloat), - isstr: ul4.expose(["obj"], { name: "isstr" }, ul4._isstr), - isdate: ul4.expose(["obj"], { name: "isdate" }, ul4._isdate), - iscolor: ul4.expose(["obj"], { name: "iscolor" }, ul4._iscolor), - istimedelta: ul4.expose(["obj"], { name: "istimedelta" }, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], { name: "ismonthdelta" }, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], { name: "istemplate" }, ul4._istemplate), - isfunction: ul4.expose(["obj"], { name: "isfunction" }, ul4._isfunction), - islist: ul4.expose(["obj"], { name: "islist" }, ul4._islist), - isset: ul4.expose(["obj"], { name: "isset" }, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], { name: "isdict" }, ul4._isdict), - isexception: ul4.expose(["obj"], { name: "isexception" }, ul4._isexception), - asjson: ul4.expose(["obj"], { name: "asjson" }, ul4._asjson), - fromjson: ul4.expose(["string"], { name: "fromjson" }, ul4._fromjson), - asul4on: ul4.expose(["obj"], { name: "asul4on" }, ul4._asul4on), - fromul4on: ul4.expose(["string"], { name: "fromul4on" }, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], { name: "enumerate" }, ul4._enumerate), - isfirst: ul4.expose(["iterable"], { name: "isfirst" }, ul4._isfirst), - islast: ul4.expose(["iterable"], { name: "islast" }, ul4._islast), - isfirstlast: ul4.expose(["iterable"], { name: "isfirstlast" }, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], { name: "enumfl" }, ul4._enumfl), - abs: ul4.expose(["number"], { name: "abs" }, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], { name: "date" }, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], { name: "timedelta" }, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], { name: "monthdelta" }, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], { name: "rgb" }, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], { name: "hls" }, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], { name: "hsv" }, ul4._hsv), - xmlescape: ul4.expose(["obj"], { name: "xmlescape" }, ul4._xmlescape), - csv: ul4.expose(["obj"], { name: "csv" }, ul4._csv), - chr: ul4.expose(["i"], { name: "chr" }, ul4._chr), - ord: ul4.expose(["c"], { name: "ord" }, ul4._ord), - hex: ul4.expose(["number"], { name: "hex" }, ul4._hex), - oct: ul4.expose(["number"], { name: "oct" }, ul4._oct), - bin: ul4.expose(["number"], { name: "bin" }, ul4._bin), - min: ul4.expose(["*obj"], { name: "min" }, ul4._min), - max: ul4.expose(["*obj"], { name: "max" }, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], { name: "sum" }, ul4._sum), - first: ul4.expose(["iterable", "default=", null], { name: "first" }, ul4._first), - last: ul4.expose(["iterable", "default=", null], { name: "last" }, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], { name: "sorted", needscontext: true }, ul4._sorted), - range: ul4.expose(["*args"], { name: "range" }, ul4._range), - slice: ul4.expose(["*args"], { name: "slice" }, ul4._slice), - urlquote: ul4.expose(["string"], { name: "urlquote" }, ul4._urlquote), - urlunquote: ul4.expose(["string"], { name: "urlunquote" }, ul4._urlunquote), - reversed: ul4.expose(["sequence"], { name: "reversed" }, ul4._reversed), - random: ul4.expose([], { name: "random" }, ul4._random), - randrange: ul4.expose(["*args"], { name: "randrange" }, ul4._randrange), - randchoice: ul4.expose(["sequence"], { name: "randchoice" }, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], { name: "round" }, ul4._round), - md5: ul4.expose(["string"], { name: "md5" }, ul4._md5) -}; - -// Functions implementing UL4 methods -ul4._replace = function _replace(string, old, new_, count) { - if (count === null) - count = string.length; - - var result = []; - while (string.length) { - var pos = string.indexOf(old); - if (pos === -1 || !count--) { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); -}; - -ul4._strip = function _strip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length - 1]) >= 0) - string = string.substr(0, string.length - 1); - return string; -}; - -ul4._lstrip = function _lstrip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; -}; - -ul4._rstrip = function _rstrip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length - 1]) >= 0) - string = string.substr(0, string.length - 1); - return string; -}; - -ul4._split = function _split(string, sep, count) { - if (sep !== null && typeof (sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length - 1].length) - result.splice(-1); - } - return result; - } - else { - if (sep !== null) { - var result = []; - while (string.length) { - var pos = string.indexOf(sep); - if (pos === -1 || !count--) { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); + }; + + // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) + ul4._islast = function _islast(iterable) + { + let iter = ul4._iter(iterable); + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [item.done, lastitem.value], done: false}; + lastitem = item; + return result; } - return result; - } - else { - var result = []; - while (string.length) { - string = ul4._lstrip(string, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); + }; + }; + + // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._isfirstlast = function _isfirstlast(iterable) + { + let iter = ul4._iter(iterable); + let isfirst = true; + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; } - return result; - } - } -}; + }; + }; + + // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._enumfl = function _enumfl(iterable, start=0) + { + let iter = ul4._iter(iterable); + let i = start; + let isfirst = true; + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; -ul4._rsplit = function _rsplit(string, sep, count) { - if (sep !== null && typeof (sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) + ul4._zip = function _zip(iterables) + { + let result; + if (iterables.length) + { + let iters = []; + for (let i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); - if (count === null) { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length - 1].length) - result.splice(-1); - } - return result; - } - else { - if (sep !== null) { - var result = []; - while (string.length) { - var pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) { - result.unshift(string); - break; + return { + next: function() { + let items = []; + for (let i = 0; i < iters.length; ++i) + { + let item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return {value: items, done: false}; } - result.unshift(string.substr(pos + sep.length)); - string = string.substr(0, pos); - } - return result; + }; } - else { - var result = []; - while (string.length) { - string = ul4._rstrip(string, null, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else { - part = string.split(/[ \n\r\t]+/); - part = part[part.length - 1]; + else + { + return { + next: function() { + return {done: true}; } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length - part.length); - } - return result; - } - } -}; - -ul4._splitlines = function _splitlines(string, keepends) { - var lookingAtLineEnd = function lookingAtLineEnd() { - var c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') { - if (pos == length - 1) - return 1; - if (string[pos + 1] === '\n') - return 2; - return 1; + }; } - return 0; }; - var result = [], length = string.length; + // Return the absolute value for the number ``number`` + ul4._abs = function _abs(number) + { + if (number !== null && typeof(number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); + }; + + // Return a ``Date`` object from the arguments passed in + ul4._date = function _date(year, month, day) + { + return new ul4.Date(year, month, day); + }; + + ul4._datetime = function _datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0) + { + return new Date(year, month-1, day, hour, minute, second, microsecond/1000); + }; - for (var pos = 0, startpos = 0; ;) { - if (pos >= length) { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; + // Return a ``TimeDelta`` object from the arguments passed in + ul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0) + { + return new this.TimeDelta(days, seconds, microseconds); + }; + + // Return a ``MonthDelta`` object from the arguments passed in + ul4._monthdelta = function _monthdelta(months=0) + { + return new this.MonthDelta(months); + }; + + // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) + ul4._hls = function _hls(h, l, s, a) + { + let _v = function(m1, m2, hue) + { + hue = hue % 1.0; + if (hue < 1/6) + return m1 + (m2-m1)*hue*6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2/3) + return m1 + (m2-m1)*(2/3-hue)*6.0; + return m1; + }; + + let m1, m2; + if (typeof(a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0+s); + else + m2 = l+s-(l*s); + m1 = 2.0*l - m2; + return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); + }; + + // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) + ul4._hsv = function _hsv(h, s, v, a) + { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + let i = Math.floor(h*6.0); + let f = (h*6.0) - i; + let p = v*(1.0 - s); + let q = v*(1.0 - s*f); + let t = v*(1.0 - s*(1.0-f)); + switch (i%6) + { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } + }; + + // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` + ul4._get = function _get(container, key, defaultvalue) + { + if (ul4._ismap(container)) + { + if (container.has(key)) + return container.get(key); + return defaultvalue; } - var lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else { - var endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; + else if (ul4._isobject(container)) + { + let result = container[key]; + if (typeof(result) === "undefined") + return defaultvalue; + return result; } - } -}; + throw new ul4.TypeError("get() requires a dict"); + }; + + // Return a ``Date`` object for the current time + ul4.now = function now() + { + return new Date(); + }; -ul4._count = function _count(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; + // Return a ``Date`` object for the current time in UTC + ul4.utcnow = function utcnow() + { + let now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + }; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; + // Return an ``ul4.Date`` object for today + ul4.today = function today() + { + let now = new Date(); + return new ul4.Date(now.getFullYear(), now.getMonth()+1, now.getDate()); + }; - var isstr = ul4._isstr(obj); + ul4.functions = { + repr: ul4._repr, + ascii: ul4._ascii, + str: ul4._str, + int: ul4._int, + float: ul4._float, + list: ul4._list, + set: ul4._set, + bool: ul4._bool, + len: ul4._len, + type: ul4._type, + format: ul4._format, + any: ul4._any, + all: ul4._all, + zip: ul4._zip, + getattr: ul4._getattr, + hasattr: ul4._hasattr, + dir: ul4._dir, + isundefined: ul4._isundefined, + isdefined: ul4._isdefined, + isnone: ul4._isnone, + isbool: ul4._isbool, + isint: ul4._isint, + isfloat: ul4._isfloat, + isstr: ul4._isstr, + isdate: ul4._isdate, + isdatetime: ul4._isdatetime, + iscolor: ul4._iscolor, + istimedelta: ul4._istimedelta, + ismonthdelta: ul4._ismonthdelta, + istemplate: ul4._istemplate, + isfunction: ul4._isfunction, + islist: ul4._islist, + isset: ul4._isanyset, + isdict: ul4._isdict, + isexception: ul4._isexception, + asjson: ul4._asjson, + fromjson: ul4._fromjson, + asul4on: ul4._asul4on, + fromul4on: ul4._fromul4on, + now: ul4.now, + utcnow: ul4.utcnow, + today: ul4.today, + enumerate: ul4._enumerate, + isfirst: ul4._isfirst, + islast: ul4._islast, + isfirstlast: ul4._isfirstlast, + enumfl: ul4._enumfl, + abs: ul4._abs, + date: ul4._date, + datetime: ul4._datetime, + timedelta: ul4._timedelta, + monthdelta: ul4._monthdelta, + rgb: ul4._rgb, + hls: ul4._hls, + hsv: ul4._hsv, + xmlescape: ul4._xmlescape, + csv: ul4._csv, + chr: ul4._chr, + ord: ul4._ord, + hex: ul4._hex, + oct: ul4._oct, + bin: ul4._bin, + min: ul4._min, + max: ul4._max, + sum: ul4._sum, + first: ul4._first, + last: ul4._last, + sorted: ul4._sorted, + range: ul4._range, + slice: ul4._slice, + urlquote: ul4._urlquote, + urlunquote: ul4._urlunquote, + reversed: ul4._reversed, + random: ul4._random, + randrange: ul4._randrange, + randchoice: ul4._randchoice, + round: ul4._round, + md5: ul4._md5 + }; - if (isstr && !sub.length) { - if (end < 0 || start > obj.length || start > end) - return 0; - var result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } + ul4.expose(ul4._repr, ["obj"], {name: "repr"}); + ul4.expose(ul4._ascii, ["obj"], {name: "ascii"}); + ul4.expose(ul4._str, ["obj=", ""], {name: "str"}); + ul4.expose(ul4._int, ["obj=", 0, "base=", null], {name: "int"}); + ul4.expose(ul4._float, ["obj=", 0.0], {name: "float"}); + ul4.expose(ul4._list, ["iterable=", []], {name: "list"}); + ul4.expose(ul4._set, ["iterable=", []], {name: "set"}); + ul4.expose(ul4._bool, ["obj=", false], {name: "bool"}); + ul4.expose(ul4._len, ["sequence"], {name: "len"}); + ul4.expose(ul4._type, ["obj"], {name: "type"}); + ul4.expose(ul4._format, ["obj", "fmt", "lang=", null], {name: "format"}); + ul4.expose(ul4._any, ["iterable"], {name: "any"}); + ul4.expose(ul4._all, ["iterable"], {name: "all"}); + ul4.expose(ul4._zip, ["*iterables"], {name: "zip"}); + ul4.expose(ul4._getattr, ["obj", "attrname", "default=", null], {name: "getattr"}); + ul4.expose(ul4._hasattr, ["obj", "attrname"], {name: "hasattr"}); + ul4.expose(ul4._dir, ["obj"], {name: "dir"}); + ul4.expose(ul4._isundefined, ["obj"], {name: "isundefined"}); + ul4.expose(ul4._isdefined, ["obj"], {name: "isdefined"}); + ul4.expose(ul4._isnone, ["obj"], {name: "isnone"}); + ul4.expose(ul4._isbool, ["obj"], {name: "isbool"}); + ul4.expose(ul4._isint, ["obj"], {name: "isint"}); + ul4.expose(ul4._isfloat, ["obj"], {name: "isfloat"}); + ul4.expose(ul4._isstr, ["obj"], {name: "isstr"}); + ul4.expose(ul4._isdate, ["obj"], {name: "isdate"}); + ul4.expose(ul4._isdatetime, ["obj"], {name: "isdatetime"}); + ul4.expose(ul4._iscolor, ["obj"], {name: "iscolor"}); + ul4.expose(ul4._istimedelta, ["obj"], {name: "istimedelta"}); + ul4.expose(ul4._ismonthdelta, ["obj"], {name: "ismonthdelta"}); + ul4.expose(ul4._istemplate, ["obj"], {name: "istemplate"}); + ul4.expose(ul4._isfunction, ["obj"], {name: "isfunction"}); + ul4.expose(ul4._islist, ["obj"], {name: "islist"}); + ul4.expose(ul4._isanyset, ["obj"], {name: "isset"}); + ul4.expose(ul4._isdict, ["obj"], {name: "isdict"}); + ul4.expose(ul4._isexception, ["obj"], {name: "isexception"}); + ul4.expose(ul4._asjson, ["obj"], {name: "asjson"}); + ul4.expose(ul4._fromjson, ["string"], {name: "fromjson"}); + ul4.expose(ul4._asul4on, ["obj"], {name: "asul4on"}); + ul4.expose(ul4._fromul4on, ["string"], {name: "fromul4on"}); + ul4.expose(ul4.now, []); + ul4.expose(ul4.utcnow, []); + ul4.expose(ul4.today, []); + ul4.expose(ul4._enumerate, ["iterable", "start=", 0], {name: "enumerate"}); + ul4.expose(ul4._isfirst, ["iterable"], {name: "isfirst"}); + ul4.expose(ul4._islast, ["iterable"], {name: "islast"}); + ul4.expose(ul4._isfirstlast, ["iterable"], {name: "isfirstlast"}); + ul4.expose(ul4._enumfl, ["iterable", "start=", 0], {name: "enumfl"}); + ul4.expose(ul4._abs, ["number"], {name: "abs"}); + ul4.expose(ul4._date, ["year", "month", "day"], {name: "date"}); + ul4.expose(ul4._datetime, ["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "datetime"}); + ul4.expose(ul4._timedelta, ["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}); + ul4.expose(ul4._monthdelta, ["months=", 0], {name: "monthdelta"}); + ul4.expose(ul4._rgb, ["r", "g", "b", "a=", 1.0], {name: "rgb"}); + ul4.expose(ul4._hls, ["h", "l", "s", "a=", 1.0], {name: "hls"}); + ul4.expose(ul4._hsv, ["h", "s", "v", "a=", 1.0], {name: "hsv"}); + ul4.expose(ul4._xmlescape, ["obj"], {name: "xmlescape"}); + ul4.expose(ul4._csv, ["obj"], {name: "csv"}); + ul4.expose(ul4._chr, ["i"], {name: "chr"}); + ul4.expose(ul4._ord, ["c"], {name: "ord"}); + ul4.expose(ul4._hex, ["number"], {name: "hex"}); + ul4.expose(ul4._oct, ["number"], {name: "oct"}); + ul4.expose(ul4._bin, ["number"], {name: "bin"}); + ul4.expose(ul4._min, ["*obj"], {name: "min"}); + ul4.expose(ul4._max, ["*obj"], {name: "max"}); + ul4.expose(ul4._sum, ["iterable", "start=", 0], {name: "sum"}); + ul4.expose(ul4._first, ["iterable", "default=", null], {name: "first"}); + ul4.expose(ul4._last, ["iterable", "default=", null], {name: "last"}); + ul4.expose(ul4._sorted, ["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}); + ul4.expose(ul4._range, ["*args"], {name: "range"}); + ul4.expose(ul4._slice, ["*args"], {name: "slice"}); + ul4.expose(ul4._urlquote, ["string"], {name: "urlquote"}); + ul4.expose(ul4._urlunquote, ["string"], {name: "urlunquote"}); + ul4.expose(ul4._reversed, ["sequence"], {name: "reversed"}); + ul4.expose(ul4._random, [], {name: "random"}); + ul4.expose(ul4._randrange, ["*args"], {name: "randrange"}); + ul4.expose(ul4._randchoice, ["sequence"], {name: "randchoice"}); + ul4.expose(ul4._round, ["x", "digit=", 0], {name: "round"}); + ul4.expose(ul4._md5, ["string"], {name: "md5"}); + + // Functions implementing UL4 methods + ul4._count = function _count(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + let isstr = ul4._isstr(obj); + + if (isstr && !sub.length) + { + if (end < 0 || start > obj.length || start > end) + return 0; + let result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); - var count = 0; - if (ul4._islist(obj)) { - for (var i = start; i < end; ++i) { - if (ul4._eq(obj[i], sub)) + let count = 0; + if (ul4._islist(obj)) + { + for (let i = start; i < end; ++i) + { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + let lastIndex = start; + + for (;;) + { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; ++count; + lastIndex += sub.length; + } + return count; } - return count; - } - else // string - { - var lastIndex = start; + }; - for (; ;) { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; + ul4._find = function _find(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); } - return count; - } -}; - -ul4._find = function _find(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) { - if (typeof (obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; -}; - -ul4._rfind = function _rfind(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) { - if (typeof (obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; -}; - -ul4._capitalize = function _capitalize(obj) { - if (typeof (obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; -}; - -ul4._items = function _items(obj) { - if (ul4._ismap(obj)) { - var result = []; - obj.forEach(function (value, key) { - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) { - var result = []; - for (var key in obj) - result.push([key, obj[key]]); + let result = obj.indexOf(sub); + if (result !== -1) + result += start; return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); -}; + }; -ul4._values = function _values(obj) { - if (ul4._ismap(obj)) { - var result = []; - obj.forEach(function (value, key) { - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) { - var result = []; - for (var key in obj) - result.push(obj[key]); + ul4._rfind = function _rfind(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + let result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); -}; - -ul4._join = function _join(sep, iterable) { - var resultlist = []; - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); -}; - -ul4._startswith = function _startswith(string, prefix) { - if (typeof (prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; -}; - -ul4._endswith = function _endswith(string, suffix) { - if (typeof (suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length - suffix.length) === suffix; -}; - -ul4._isoformat = function _isoformat(obj) { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth() + 1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - if (hour || minute || second || ms) { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; -}; - -ul4._mimeformat = function _mimeformat(obj) { - var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + }; - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; -}; + ul4._week4format = function _week(obj, firstweekday=null) + { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; -ul4._weekday = function _weekday(obj) { - var d = obj.getDay(); - return d ? d - 1 : 6; -}; + let yearday = ul4.DateTimeProtocol.yearday(obj)+6; + let jan1 = new Date(obj.getFullYear(), 0, 1); + let jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; -ul4._week = function _week(obj, firstweekday) { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - var yearday = ul4._yearday(obj) + 6; - var jan1 = new Date(obj.getFullYear(), 0, 1); - var jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday / 7); -}; - -ul4._isleap = function _isleap(obj) { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; -}; - -ul4._yearday = function _yearday(obj) { - var leap = ul4._isleap(obj) ? 1 : 0; - var day = obj.getDate(); - switch (obj.getMonth()) { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } -}; - -ul4._append = function _append(obj, items) { - for (var i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; -}; - -ul4._insert = function _insert(obj, pos, items) { - if (pos < 0) - pos += obj.length; - - for (var i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; -}; - -ul4._pop = function _pop(obj, pos) { - if (pos < 0) - pos += obj.length; - - var result = obj[pos]; - obj.splice(pos, 1); - return result; -}; - -ul4._update = function _update(obj, others, kwargs) { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (var i = 0; i < others.length; ++i) { - var other = others[i]; - if (ul4._ismap(other)) { - other.forEach(function (value, key) { - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) { - for (var key in other) - ul4on._setmap(obj, key, other[key]); + while (jan1weekday != firstweekday) + { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; } - else if (ul4._islist(other)) { - for (var j = 0; j < other.length; ++j) { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); + return Math.floor(yearday/7); + }; + + ul4._isleap = function _isleap(obj) + { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; + }; + + ul4._update = function _update(obj, others, kwargs) + { + if (!ul4._isdict(obj)) + throw new ul4.TypeError("update() requires a dict"); + for (let i = 0; i < others.length; ++i) + { + let other = others[i]; + if (ul4._ismap(other)) + { + other.forEach(function(value, key) { + ul4._setmap(obj, key, value); + }); } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - for (var key in kwargs) - ul4on._setmap(obj, key, kwargs[key]); - return null; -}; - -ul4._clear = function _clear(obj) { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) { - for (var key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; -}; - -ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r, g, b, a) { - var c = ul4._clone(this); - c._r = typeof (r) !== "undefined" ? r : 0; - c._g = typeof (g) !== "undefined" ? g : 0; - c._b = typeof (b) !== "undefined" ? b : 0; - c._a = typeof (a) !== "undefined" ? a : 255; - return c; - }, - - __repr__: function __repr__() { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) { + else if (ul4._isobject(other)) + { + for (let key in other) + ul4._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) + { + for (let i = 0; i < other.length; ++i) + { + let item = other[i]; + if (!ul4._islist(item) || (item.length != 2)) + throw new ul4.TypeError("update() requires a dict or a list of (key, value) pairs"); + ul4._setmap(obj, item[0], item[1]); + } + } + else + throw new ul4.TypeError("update() requires a dict or a list of (key, value) pairs"); + } + kwargs.forEach(function(value, key) { + ul4._setmap(obj, key, value); + }); + return null; + }; + + ul4.Color = class Color extends ul4.Proto + { + constructor(r=0, g=0, b=0, a=255) + { + super(); + this._r = r; + this._g = g; + this._b = b; + this._a = a; + } + + __repr__() + { + let r = ul4._lpad(this._r.toString(16), "0", 2); + let g = ul4._lpad(this._g.toString(16), "0", 2); + let b = ul4._lpad(this._b.toString(16), "0", 2); + let a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) + { if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) return "#" + r[0] + g[0] + b[0] + a[0]; else return "#" + r + g + b + a; } - else { + else + { if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) return "#" + r[0] + g[0] + b[0]; else return "#" + r + g + b; } - }, + } - __str__: function __str__() { - if (this._a !== 0xff) { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a / 255) + ")"; + __str__() + { + if (this._a !== 0xff) + { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; } - else { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); + else + { + let r = ul4._lpad(this._r.toString(16), "0", 2); + let g = ul4._lpad(this._g.toString(16), "0", 2); + let b = ul4._lpad(this._b.toString(16), "0", 2); if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) return "#" + r[0] + g[0] + b[0]; else return "#" + r + g + b; } - }, + } - __iter__: function __iter__() { + __iter__() + { return { obj: this, index: 0, - next: function () { - if (this.index == 0) { + next: function() { + if (this.index == 0) + { ++this.index; - return { value: this.obj._r, done: false }; + return {value: this.obj._r, done: false}; } - else if (this.index == 1) { + else if (this.index == 1) + { ++this.index; - return { value: this.obj._g, done: false }; + return {value: this.obj._g, done: false}; } - else if (this.index == 2) { + else if (this.index == 2) + { ++this.index; - return { value: this.obj._b, done: false }; + return {value: this.obj._b, done: false}; } - else if (this.index == 3) { + else if (this.index == 3) + { ++this.index; - return { value: this.obj._a, done: false }; + return {value: this.obj._a, done: false}; } else - return { done: true }; + return {done: true}; } }; - }, + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "r": - return ul4.expose([], function r() { return self._r; }); + let r = function r(){ return self._r; }; + ul4.expose(r, []); + return r; case "g": - return ul4.expose([], function g() { return self._g; }); + let g = function g(){ return self._g; }; + ul4.expose(g, []); + return g; case "b": - return ul4.expose([], function b() { return self._b; }); + let b = function b(){ return self._b; }; + ul4.expose(b, []); + return b; case "a": - return ul4.expose([], function a() { return self._a; }); + let a = function a(){ return self._a; }; + ul4.expose(a, []); + return a; case "lum": - return ul4.expose([], function lum() { return self.lum(); }); + let lum = function lum(){ return self.lum(); }; + ul4.expose(lum, []); + return lum; case "hls": - return ul4.expose([], function hls() { return self.hls(); }); + let hls = function hls(){ return self.hls(); }; + ul4.expose(hls, []); + return hls; case "hlsa": - return ul4.expose([], function hlsa() { return self.hlsa(); }); + let hlsa = function hlsa(){ return self.hlsa(); }; + ul4.expose(hlsa, []); + return hlsa; case "hsv": - return ul4.expose([], function hsv() { return self.hsv(); }); + let hsv = function hsv(){ return self.hsv(); }; + ul4.expose(hsv, []); + return hsv; case "hsva": - return ul4.expose([], function hsva() { return self.hsva(); }); + let hsva = function hsva(){ return self.hsva(); }; + ul4.expose(hsva, []); + return hsva; case "witha": - return ul4.expose(["a"], function witha(a) { return self.witha(a); }); + let witha = function witha(a){ return self.witha(a); }; + ul4.expose(witha, ["a"]); + return witha; case "withlum": - return ul4.expose(["lum"], function withlum(lum) { return self.withlum(lum); }); + let withlum = function withlum(lum){ return self.withlum(lum); }; + ul4.expose(withlum, ["lum"]); + return withlum; case "abslum": - return ul4.expose(["lum"], function abslum(lum) { return self.abslum(lum); }); + let abslum = function abslum(lum){ return self.abslum(lum); }; + ul4.expose(abslum, ["lum"]); + return abslum; case "rellum": - return ul4.expose(["lum"], function rellum(lum) { return self.rellum(lum); }); + let rellum = function rellum(lum){ return self.rellum(lum); }; + ul4.expose(rellum, ["lum"]); + return rellum; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - __getitem__: function __getitem__(key) { - var orgkey = key; + __getitem__(key) + { + let orgkey = key; if (key < 0) key += 4; - switch (key) { + switch (key) + { case 0: return this._r; case 1: @@ -7027,171 +8812,280 @@ ul4.Color = ul4._inherit( case 3: return this._a; default: - return undefined; + throw new ul4.IndexError(this, orgkey); } - }, + } - __eq__: function __eq__(other) { - if (ul4._iscolor(other)) + __eq__(other) + { + if (other instanceof ul4.Color) return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; return false; - }, + } - r: ul4.expose([], function r() { return this._r; }), + r() + { + return this._r; + } - g: ul4.expose([], function g() { return this._g; }), + g() + { + return this._g; + } - b: ul4.expose([], function b() { return this._b; }), + b() + { + return this._b; + } - a: ul4.expose([], function a() { return this._a; }), + a() + { + return this._a; + } - lum: ul4.expose([], function lum() { return this.hls()[1]; }), + lum() + { + return this.hls()[1]; + } - hls: ul4.expose([], - function hls() { - var r = this._r / 255.0; - var g = this._g / 255.0; - var b = this._b / 255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var h, l, s; - var rc, gc, bc; + hls() + { + let r = this._r/255.0; + let g = this._g/255.0; + let b = this._b/255.0; + let maxc = Math.max(r, g, b); + let minc = Math.min(r, g, b); + let h, l, s; + let rc, gc, bc; - l = (minc + maxc) / 2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc - minc) / (maxc + minc); - else - s = (maxc - minc) / (2.0 - maxc - minc); - rc = (maxc - r) / (maxc - minc); - gc = (maxc - g) / (maxc - minc); - bc = (maxc - b) / (maxc - minc); - if (r == maxc) - h = bc - gc; - else if (g == maxc) - h = 2.0 + rc - bc; - else - h = 4.0 + gc - rc; - h = (h / 6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() { - var hls = this.hls(); - return hls.concat(this._a / 255.0); - } - ), - - hsv: ul4.expose([], - function hsv() { - var r = this._r / 255.0; - var g = this._g / 255.0; - var b = this._b / 255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - var s = (maxc - minc) / maxc; - var rc = (maxc - r) / (maxc - minc); - var gc = (maxc - g) / (maxc - minc); - var bc = (maxc - b) / (maxc - minc); - var h; - if (r == maxc) - h = bc - gc; - else if (g == maxc) - h = 2.0 + rc - bc; - else - h = 4.0 + gc - rc; - h = (h / 6.0) % 1.0; - return [h, s, v]; - } - ), + l = (minc+maxc)/2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc-minc) / (maxc+minc); + else + s = (maxc-minc) / (2.0-maxc-minc); + rc = (maxc-r) / (maxc-minc); + gc = (maxc-g) / (maxc-minc); + bc = (maxc-b) / (maxc-minc); + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, l, s]; + } + + hlsa() + { + let hls = this.hls(); + return hls.concat(this._a/255.0); + } + + hsv() + { + let r = this._r/255.0; + let g = this._g/255.0; + let b = this._b/255.0; + let maxc = Math.max(r, g, b); + let minc = Math.min(r, g, b); + let v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + let s = (maxc-minc) / maxc; + let rc = (maxc-r) / (maxc-minc); + let gc = (maxc-g) / (maxc-minc); + let bc = (maxc-b) / (maxc-minc); + let h; + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, s, v]; + } - hsva: ul4.expose([], - function hsva() { - var hsv = this.hsv(); - return hsv.concat(this._a / 255.0); - } - ), + hsva() + { + let hsv = this.hsv(); + return hsv.concat(this._a/255.0); + } - witha: ul4.expose(["a"], - function witha(a) { - if (typeof (a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), + witha(a) + { + if (typeof(a) !== "number") + throw new ul4.TypeError("witha() requires a number"); + return new ul4.Color(this._r, this._g, this._b, a); + } - withlum: ul4.expose(["lum"], - function withlum(lum) { - if (typeof (lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - var hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } -); + withlum(lum) + { + if (typeof(lum) !== "number") + throw new ul4.TypeError("witha() requires a number"); + let hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + + ul4type() + { + return "color"; + } + }; -ul4.TimeDelta = ul4._inherit( - ul4.Proto, + ul4.expose(ul4.Color.prototype.r, []); + ul4.expose(ul4.Color.prototype.g, []); + ul4.expose(ul4.Color.prototype.b, []); + ul4.expose(ul4.Color.prototype.a, []); + ul4.expose(ul4.Color.prototype.lum, []); + ul4.expose(ul4.Color.prototype.hls, []); + ul4.expose(ul4.Color.prototype.hlsa, []); + ul4.expose(ul4.Color.prototype.hsv, []); + ul4.expose(ul4.Color.prototype.hsva, []); + ul4.expose(ul4.Color.prototype.witha, ["a"]); + ul4.expose(ul4.Color.prototype.withlum, ["lum"]); + + const _js_Date = Date; + + ul4.Date = class Date extends ul4.Proto { - __type__: "ul4.TimeDelta", + constructor(year, month, day) + { + super(); + this._date = new _js_Date(year, month-1, day); + } + + __repr__() + { + return '@(' + this.__str__() + ")"; + } + + __str__() + { + return ul4._lpad(this._date.getFullYear(), "0", 4) + "-" + ul4._lpad(this._date.getMonth()+1, "0", 2) + "-" + ul4._lpad(this._date.getDate(), "0", 2); + } + + __eq__(other) + { + if (other instanceof ul4.Date) + return this._date.getTime() === other._date.getTime(); + return false; + } + + __lt__(other) + { + if (other instanceof ul4.Date) + return this._date < other._date; + ul4._unorderable("<", this, other); + } + + __le__(other) + { + if (other instanceof ul4.Date) + return this._date <= other._date; + ul4._unorderable("<=", this, other); + } + + __gt__(other) + { + if (other instanceof ul4.Date) + return this._date > other._date; + ul4._unorderable(">", this, other); + } + + __ge__(other) + { + if (other instanceof ul4.Date) + return this._date >= other._date; + ul4._unorderable(">=", this, other); + } + + year() + { + return this._date.getFullYear(); + } + + month() + { + return this._date.getMonth()+1; + } + + day() + { + return this._date.getDate(); + } - create: function create(days, seconds, microseconds) { - var td = ul4._clone(this); - if (typeof (days) === "undefined") - days = 0; - if (typeof (seconds) === "undefined") - seconds = 0; - if (typeof (microseconds) === "undefined") - microseconds = 0; + ul4type() + { + return "date"; + } + }; - var total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds); - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - var total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); + ul4.TimeDelta = class TimeDelta extends ul4.Proto + { + constructor(days=0, seconds=0, microseconds=0) + { + super(); + let total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); + + microseconds = ul4.ModAST.prototype._do(total_microseconds, 1000000); + let total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST.prototype._do(total_seconds, 86400); days = Math.floor(total_seconds / 86400); - if (seconds < 0) { + if (seconds < 0) + { seconds += 86400; --days; } - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, + this._microseconds = microseconds; + this._seconds = seconds; + this._days = days; + } - __repr__: function __repr__() { - if (!this._microseconds) { - if (!this._seconds) { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; + __repr__() + { + let v = [], first = true; + v.push("timedelta("); + if (this._days) + { + v.push("days=" + this._days); + first = false; } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, + if (this._seconds) + { + if (!first) + v.push(", "); + v.push("seconds=" + this._seconds); + first = false; + } + if (this._microseconds) + { + if (!first) + v.push(", "); + v.push("microseconds=" + this._microseconds); + } + v.push(")"); + return v.join(""); + } - __str__: function __str__() { - var v = []; - if (this._days) { + __str__() + { + let v = []; + if (this._days) + { v.push(this._days + " day"); if (this._days !== -1 && this._days !== 1) v.push("s"); v.push(", "); } - var seconds = this._seconds % 60; - var minutes = Math.floor(this._seconds / 60); - var hours = Math.floor(minutes / 60); + let seconds = this._seconds % 60; + let minutes = Math.floor(this._seconds / 60); + let hours = Math.floor(minutes / 60); minutes = minutes % 60; v.push("" + hours); @@ -7199,29 +9093,35 @@ ul4.TimeDelta = ul4._inherit( v.push(ul4._lpad(minutes.toString(), "0", 2)); v.push(":"); v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) { + if (this._microseconds) + { v.push("."); v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); } return v.join(""); - }, + } - __bool__: function __bool__() { + __bool__() + { return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, + } - __abs__: function __abs__() { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, + __abs__() + { + return this._days < 0 ? new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds) : this; + } - __eq__: function __eq__(other) { - if (ul4._istimedelta(other)) + __eq__(other) + { + if (other instanceof ul4.TimeDelta) return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); return false; - }, + } - __lt__: function __lt__(other) { - if (ul4._istimedelta(other)) { + __lt__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days < other._days; if (this._seconds != other._seconds) @@ -7229,10 +9129,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds < other._microseconds; } ul4._unorderable("<", this, other); - }, + } - __le__: function __le__(other) { - if (ul4._istimedelta(other)) { + __le__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days < other._days; if (this._seconds != other._seconds) @@ -7240,10 +9142,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds <= other._microseconds; } ul4._unorderable("<=", this, other); - }, + } - __gt__: function __gt__(other) { - if (ul4._istimedelta(other)) { + __gt__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days > other._days; if (this._seconds != other._seconds) @@ -7251,10 +9155,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds > other._microseconds; } ul4._unorderable(">", this, other); - }, + } - __ge__: function __ge__(other) { - if (ul4._istimedelta(other)) { + __ge__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days > other._days; if (this._seconds != other._seconds) @@ -7262,494 +9168,443 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds >= other._microseconds; } ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate() + days; - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds() + seconds; - var millisecond = date.getMilliseconds() + microseconds / 1000; + } + + __neg__() + { + return new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds); + } + + adddate(date, days) + { + let year = date._date.getFullYear(); + let month = date._date.getMonth(); + let day = date._date.getDate() + days; + return new ul4.Date(year, month, day); + } + + _adddatetime(date, days, seconds, microseconds) + { + let year = date.getFullYear(); + let month = date.getMonth(); + let day = date.getDate() + days; + let hour = date.getHours(); + let minute = date.getMinutes(); + let second = date.getSeconds() + seconds; + let millisecond = date.getMilliseconds() + microseconds/1000; return new Date(year, month, day, hour, minute, second, millisecond); - }, + } - __add__: function __add__(other) { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + __add__(other) + { + if (other instanceof ul4.TimeDelta) + return new ul4.TimeDelta(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, + return this._adddate(other, this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._days, this._seconds, this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __radd__: function __radd__(other) { + __radd__(other) + { if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, + return this._adddate(other, this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._days, this._seconds, this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __sub__: function __sub__(other) { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, + __sub__(other) + { + if (other instanceof ul4.TimeDelta) + return new ul4.TimeDelta(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw new ul4.TypeError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } - __rsub__: function __rsub__(other) { + __rsub__(other) + { if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) { - var myValue = this._days; - var otherValue = other._days; - var hasSeconds = this._seconds || other._seconds; - var hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) { - myValue = myValue * 86400 + this._seconds; - otherValue = otherValue * 86400 + other._seconds; - if (hasMicroseconds) { + return this._adddate(other, -this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, -this._days, -this._seconds, -this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } + + __mul__(other) + { + if (typeof(other) === "number") + return new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other); + throw new ul4.TypeError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __rmul__(other) + { + if (typeof(other) === "number") + return new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other); + throw new ul4.TypeError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __truediv__(other) + { + if (typeof(other) === "number") + { + return new ul4.TimeDelta(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (other instanceof ul4.TimeDelta) + { + let myValue = this._days; + let otherValue = other._days; + let hasSeconds = this._seconds || other._seconds; + let hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) + { + myValue = myValue*86400+this._seconds; + otherValue = otherValue*86400 + other._seconds; + if (hasMicroseconds) + { myValue = myValue * 1000000 + this._microseconds; otherValue = otherValue * 1000000 + other._microseconds; } } - return myValue / otherValue; + return myValue/otherValue; } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, + throw new ul4.TypeError(ul4._type(this) + " / " + ul4._type(other) + " not supported"); + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "days": - return ul4.expose([], function days() { return self._days; }); + let days = function days(){ return self._days; }; + ul4.expose(days, []); + return days; case "seconds": - return ul4.expose([], function seconds() { return self._seconds; }); + let seconds = function seconds(){ return self._seconds; }; + ul4.expose(seconds, []); + return seconds; case "microseconds": - return ul4.expose([], function microseconds() { return self._microseconds; }); + let microseconds = function microseconds(){ return self._microseconds; }; + ul4.expose(microseconds, []); + return microseconds; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - days: function days() { + days() + { return this._days; - }, + } - seconds: function seconds() { + seconds() + { return this._seconds; - }, + } - microseconds: function microseconds() { + microseconds() + { return this._microseconds; } - } -); -ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", + ul4type() + { + return "timedelta"; + } + }; + - create: function create(months) { - var md = ul4._clone(this); - md._months = typeof (months) !== "undefined" ? months : 0; - return md; - }, + ul4.MonthDelta = class MonthDelta extends ul4.Proto + { + constructor(months=0) + { + super(); + this._months = months; + } - __repr__: function __repr__() { + __repr__() + { if (!this._months) return "monthdelta()"; return "monthdelta(" + this._months + ")"; - }, + } - __str__: function __str__() { - if (this._months) { + __str__() + { + if (this._months) + { if (this._months !== -1 && this._months !== 1) return this._months + " months"; return this._months + " month"; } return "0 months"; - }, + } + + toString() + { + return this.__str__(); + } - __bool__: function __bool__() { + __bool__() + { return this._months !== 0; - }, + } - __abs__: function __abs__() { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, + __abs__() + { + return this._months < 0 ? new ul4.MonthDelta(-this._months) : this; + } - __eq__: function __eq__(other) { - if (ul4._ismonthdelta(other)) + __eq__(other) + { + if (other instanceof MonthDelta) return this._months === other._months; return false; - }, + } - __lt__: function __lt__(other) { - if (ul4._ismonthdelta(other)) + __lt__(other) + { + if (other instanceof ul4.MonthDelta) return this._months < other._months; ul4._unorderable("<", this, other); - }, + } - __le__: function __le__(other) { - if (ul4._ismonthdelta(other)) + __le__(other) + { + if (other instanceof ul4.MonthDelta) return this._months <= other._months; ul4._unorderable("<=", this, other); - }, + } - __gt__: function __gt__(other) { - if (ul4._ismonthdelta(other)) + __gt__(other) + { + if (other instanceof ul4.MonthDelta) return this._months > other._months; ul4._unorderable(">", this, other); - }, + } - __ge__: function __ge__(other) { - if (ul4._ismonthdelta(other)) + __ge__(other) + { + if (other instanceof ul4.MonthDelta) return this._months >= other._months; ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) { - var year = date.getFullYear(); - var month = date.getMonth() + months; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds(); - var millisecond = date.getMilliseconds(); - - while (true) { + } + + __neg__() + { + return new ul4.MonthDelta(-this._months); + } + + _adddate(date, months) + { + let result = this._adddatetime(date._date, months); + return new ul4.Date(result.getFullYear(), result.getMonth()+1, result.getDate()); + } + + _adddatetime(date, months) + { + let year = date.getFullYear(); + let month = date.getMonth() + months; + let day = date.getDate(); + let hour = date.getHours(); + let minute = date.getMinutes(); + let second = date.getSeconds(); + let millisecond = date.getMilliseconds(); + + while (true) + { // As the month might be out of bounds, we have to find out, what the real target month is - var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - var result = new Date(year, month, day, hour, minute, second, millisecond); + let targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + let result = new Date(year, month, day, hour, minute, second, millisecond); if (result.getMonth() === targetmonth) return result; --day; } - }, + } - __add__: function __add__(other) { + __add__(other) + { if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); + return new ul4.MonthDelta(this._months + other._months); else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, + return this._adddate(other, this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._months); + throw new ul4.ArgumentError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __radd__: function __radd__(other) { + __radd__(other) + { if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, + return this._adddate(other, this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._months); + throw new ul4.ArgumentError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __sub__: function __sub__(other) { + __sub__(other) + { if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, + return new ul4.MonthDelta(this._months - other._months); + throw new ul4.ArgumentError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } - __rsub__: function __rsub__(other) { + __rsub__(other) + { if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); + return this._adddate(other, -this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, -this._months); + throw new ul4.ArgumentError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } + + __mul__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(this._months * Math.floor(other)); + throw new ul4.ArgumentError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __rmul__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(this._months * Math.floor(other)); + throw new ul4.ArgumentError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __floordiv__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(Math.floor(this._months / other)); else if (ul4._ismonthdelta(other)) return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, + throw new ul4.ArgumentError(ul4._type(this) + " // " + ul4._type(other) + " not supported"); + } - __truediv__: function __truediv__(other) { + __truediv__(other) + { if (ul4._ismonthdelta(other)) return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, + throw new ul4.ArgumentError(ul4._type(this) + " / " + ul4._type(other) + " not supported"); + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "months": - return ul4.expose([], function months() { return self._months; }); + let months = function months(){ return self._months; }; + ul4.expose(months, []); + return months; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - months: function months() { + months() + { return this._months; } - } -); - -// When we don't have a real ``Set`` type, emulate one that supports strings -ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create() { - var set = ul4._clone(this); - set.items = {}; - set.add.apply(set, arguments); - return set; - }, - - add: function add() { - for (var i = 0; i < arguments.length; ++i) { - this.items[arguments[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { - case "add": - return ul4.expose(["*items"], function add(items) { self.add.apply(self, items); }); - default: - return undefined; - } - }, - - __contains__: function __contains__(item) { - return this.items[item] || false; - }, - - __bool__: function __bool__() { - for (var item in this.items) { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - __repr__: function __repr__() { - var v = []; - v.push("{"); - var i = 0; - for (var item in this.items) { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function (other) { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) { - var count = 0; - for (var item in this.items) { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in this.items) { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (var item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function (other) { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) { - var count = 0; - for (var item in this.items) { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in this.items) { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function (other) { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) { - var result = true; - other.forEach(function (value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in other.items) { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); + ul4type() + { + return "monthdelta"; } - } -); - -var classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" -]; - -for (var i = 0; i < classes.length; ++i) { - var name = classes[i]; - var ul4onname = name; - if (ul4onname.substr(ul4onname.length - 3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length - 3); - ul4onname = ul4onname.toLowerCase(); - var object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); -} + }; + + const classes = [ + ul4.TextAST, + ul4.IndentAST, + ul4.LineEndAST, + ul4.ConstAST, + ul4.SeqItemAST, + ul4.UnpackSeqItemAST, + ul4.DictItemAST, + ul4.UnpackDictItemAST, + ul4.PosArgAST, + ul4.KeywordArgAST, + ul4.UnpackListArgAST, + ul4.UnpackDictArgAST, + ul4.ListAST, + ul4.ListCompAST, + ul4.DictAST, + ul4.DictCompAST, + ul4.SetAST, + ul4.SetCompAST, + ul4.GenExprAST, + ul4.VarAST, + ul4.NotAST, + ul4.NegAST, + ul4.BitNotAST, + ul4.IfAST, + ul4.ReturnAST, + ul4.PrintAST, + ul4.PrintXAST, + ul4.ItemAST, + ul4.IsAST, + ul4.IsNotAST, + ul4.EQAST, + ul4.NEAST, + ul4.LTAST, + ul4.LEAST, + ul4.GTAST, + ul4.GEAST, + ul4.NotContainsAST, + ul4.ContainsAST, + ul4.AddAST, + ul4.SubAST, + ul4.MulAST, + ul4.FloorDivAST, + ul4.TrueDivAST, + ul4.ModAST, + ul4.ShiftLeftAST, + ul4.ShiftRightAST, + ul4.BitAndAST, + ul4.BitXOrAST, + ul4.BitOrAST, + ul4.AndAST, + ul4.OrAST, + ul4.SliceAST, + ul4.AttrAST, + ul4.CallAST, + ul4.RenderAST, + ul4.RenderXAST, + ul4.RenderBlockAST, + ul4.RenderBlocksAST, + ul4.SetVarAST, + ul4.AddVarAST, + ul4.SubVarAST, + ul4.MulVarAST, + ul4.TrueDivVarAST, + ul4.FloorDivVarAST, + ul4.ModVarAST, + ul4.ShiftLeftVarAST, + ul4.ShiftRightVarAST, + ul4.BitAndVarAST, + ul4.BitXOrVarAST, + ul4.BitOrVarAST, + ul4.ForBlockAST, + ul4.WhileBlockAST, + ul4.BreakAST, + ul4.ContinueAST, + ul4.CondBlockAST, + ul4.IfBlockAST, + ul4.ElIfBlockAST, + ul4.ElseBlockAST, + ul4.SignatureAST, + ul4.Template + ]; + + for (let i = 0; i < classes.length; ++i) + { + let constructor = classes[i]; + let ul4onname = constructor.name; + if (ul4onname.substr(ul4onname.length-3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length-3); + ul4onname = ul4onname.toLowerCase(); + constructor.prototype.type = ul4onname; + ul4.register("de.livinglogic.ul4." + ul4onname, constructor); + } \ No newline at end of file diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index 24e5569..9eb87a6 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("core-js/modules/es6.array.last-index-of"),require("core-js/modules/es6.array.sort"),require("core-js/modules/es6.regexp.split"),require("core-js/modules/es6.regexp.replace"),require("core-js/modules/es6.array.index-of"),require("core-js/modules/es6.regexp.to-string"),require("core-js/modules/es6.date.to-string"),require("core-js/modules/es6.function.name"),require("core-js/modules/es6.regexp.match"),require("core-js/modules/es6.set"),require("core-js/modules/es6.array.for-each"),require("core-js/modules/web.dom.iterable"),require("core-js/modules/es6.array.iterator"),require("core-js/modules/es6.string.iterator"),require("core-js/modules/es6.map"),require("core-js/modules/es6.object.define-property"),require("core-js/modules/es6.regexp.search"),require("core-js/modules/es6.date.now"),require("core-js/modules/es6.promise"),require("axios"),require("https")):"function"==typeof define&&define.amd?define(["exports","core-js/modules/es6.array.last-index-of","core-js/modules/es6.array.sort","core-js/modules/es6.regexp.split","core-js/modules/es6.regexp.replace","core-js/modules/es6.array.index-of","core-js/modules/es6.regexp.to-string","core-js/modules/es6.date.to-string","core-js/modules/es6.function.name","core-js/modules/es6.regexp.match","core-js/modules/es6.set","core-js/modules/es6.array.for-each","core-js/modules/web.dom.iterable","core-js/modules/es6.array.iterator","core-js/modules/es6.string.iterator","core-js/modules/es6.map","core-js/modules/es6.object.define-property","core-js/modules/es6.regexp.search","core-js/modules/es6.date.now","core-js/modules/es6.promise","axios","https"],t):t(e.livingsdk={},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,e.axios,e.https)}(this,function(e,t,r,n,i,o,s,a,u,l,_,c,h,f,p,d,m,g,v,b,y,S){"use strict";function A(e){return(A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function T(e,t){for(var r=0;r=this.data.length)throw"UL4 decoder at EOF";return this.data.charAt(this.pos++)},readcharoreof:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)},readblackchar:function(){for(var e=/\s/;;){if(this.pos>=this.data.length)throw"UL4 decoder at EOF";var t=this.data.charAt(this.pos++);if(!t.match(e))return t}},read:function(e){this.pos+e>this.length&&(e=this.length-this.pos);var t=this.data.substring(this.pos,this.pos+e);return this.pos+=e,t},backup:function(){--this.pos},readnumber:function(){for(var e=/[-+0123456789.eE]/,t="";;){var r=this.readcharoreof();if(null===r||!r.match(e)){var n=parseFloat(t);if(NaN==n)throw"invalid number, got "+k._repr("value")+" at position "+this.pos;return n}t+=r}},_beginfakeloading:function(){var e=this.backrefs.length;return this.backrefs.push(null),e},_endfakeloading:function(e,t){this.backrefs[e]=t},_readescape:function(e,t){var r=this.read(t);if(r.length!=t)throw"broken escape "+k._repr("\\"+e+r)+" at position "+this.pos;var n=parseInt(r,16);if(isNaN(n))throw"broken escape "+k._repr("\\"+e+r)+" at position "+this.pos;return String.fromCharCode(n)},load:function(){var e,t=this.readblackchar();switch(t){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===t&&this.backrefs.push(null),null;case"b":case"B":if("T"===(e=this.readchar()))e=!0;else{if("F"!==e)throw"wrong value for boolean, expected 'T' or 'F', got "+k._repr(e)+" at position "+this.pos;e=!1}return"B"===t&&this.backrefs.push(e),e;case"i":case"I":case"f":case"F":return e=this.readnumber(),"I"!==t&&"F"!==t||this.backrefs.push(e),e;case"s":case"S":e=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var i=this.readchar();"\\"==i?e.push("\\"):"n"==i?e.push("\n"):"r"==i?e.push("\r"):"t"==i?e.push("\t"):"f"==i?e.push("\f"):"b"==i?e.push("\b"):"a"==i?e.push(""):"'"==i?e.push("'"):'"'==i?e.push('"'):"x"==i?e.push(this._readescape("x",2)):"u"==i?e.push(this._readescape("u",4)):"U"==i?e.push(this._readescape("U",8)):e.push("\\"+i)}else e.push(n)}return e=e.join(""),"S"===t&&this.backrefs.push(e),e;case"c":case"C":return e=k.Color.create(),"C"===t&&this.backrefs.push(e),e._r=this.load(),e._g=this.load(),e._b=this.load(),e._a=this.load(),e;case"z":case"Z":return(e=new Date).setFullYear(this.load()),e.setDate(1),e.setMonth(this.load()-1),e.setDate(this.load()),e.setHours(this.load()),e.setMinutes(this.load()),e.setSeconds(this.load()),e.setMilliseconds(this.load()/1e3),"Z"===t&&this.backrefs.push(e),e;case"t":case"T":return(e=k.TimeDelta.create())._days=this.load(),e._seconds=this.load(),e._microseconds=this.load(),"T"===t&&this.backrefs.push(e),e;case"r":case"R":return e=k.slice.create(),"R"===t&&this.backrefs.push(e),e.start=this.load(),e.stop=this.load(),e;case"m":case"M":return e=k.MonthDelta.create(),"M"===t&&this.backrefs.push(e),e._months=this.load(),e;case"l":case"L":for(e=[],"L"===t&&this.backrefs.push(e);;){if("]"===(t=this.readblackchar()))return e;this.backup(),e.push(this.load())}return e;case"d":case"D":case"e":case"E":if(!w._havemap&&("e"==t||"E"==t))throw"ordered dictionaries are not supported!";for(e=w._emptymap(),"D"!==t&&"E"!==t||this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup();var o=this.load(),s=this.load();w._setmap(e,o,s)}return e;case"y":case"Y":for(e=w._makeset(),"Y"===t&&this.backrefs.push(e);;){if("}"===(t=this.readblackchar()))return e;this.backup(),e.add(this.load())}return e;case"o":case"O":var a;"O"===t&&(a=this._beginfakeloading());var u,l=this.load();if(null!==this.registry?void 0===(u=this.registry[l])&&(u=w._registry[l]):u=w._registry[l],void 0===u)throw"can't load object of type "+k._repr(l);if(e=u(),"O"===t&&this._endfakeloading(a,e),e.ul4onload(this),")"!==(t=this.readblackchar()))throw"object terminator ')' for object of type '"+l+"' expected, got "+k._repr(t)+" at position "+this.pos;return e;default:throw"unknown typecode "+k._repr(t)+" at position "+this.pos}},loadcontent:function(e){var t=this;return{next:function(){var e=t.readblackchar();return t.backup(),")"==e?{done:!0}:{done:!1,value:t.load()}}}}},k._rvalidchars=/^[\],:{}\s]*$/,k._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,k._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,k._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,k._simpleclone=function(e){function t(){}return t.prototype=e,new t},k._clone=function(e){var t=k._simpleclone(e);return t.__prototype__=e,t.__id__=k.Proto._nextid++,t},k._extend=function(e,t){for(var r in t)e[r]=t[r];return e},k._simpleinherit=function(e,t){return k._extend(k._simpleclone(e),t)},k._inherit=function(e,t){return k._extend(k._clone(e),t)},k._map2object=function(e){if(k._ismap(e)){var r={};return e.forEach(function(e,t){if("string"!=typeof t)throw k.TypeError.create("keys must be strings");r[t]=e}),r}return e},k._bound=function(e,t){return e<0?0:t=r.length)return 1;var a=k._cmp(e,t[s],r[s]);if(a)return a}return r.length>t.length?-1:0}}else{if(k._isset(t)||k._isul4set(t)){var u=!1,l=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(u=!0)}),r.forEach(function(e){t.has(e)||(l=!0)});else if(k._isul4set(r))for(var _ in t.forEach(function(e){r.items[e]||(u=!0)}),r.items)if(!t.has(_)){l=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var _ in t.items)if(!r.has(_)){u=!0;break}r.forEach(function(e){t.items[e]||(l=!0)})}else if(k._isul4set(r)){for(var _ in t.items)if(!r.items[_]){u=!0;break}for(var _ in r.items)if(!t.items[_]){l=!0;break}}}else k._unorderable(e,t,r);return u?l?null:1:l?-1:0}k._unorderable(e,t,r)}},k._lt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return t=r.length)return!1;if(!k._eq(t[n],r[n]))return k._lt(t[n],r[n])}return t.length=r.length)return!1;if(!k._eq(t[n],r[n]))return k._lt(t[n],r[n])}return t.length<=r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable("<=",t,r)},k._gt=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__gt__)return t.__gt__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return rr.getTime()}else if(k._islist(t)){if(k._islist(r)){if(t===r)return!1;for(var n=0;n=r.length)return!0;if(!k._eq(t[n],r[n]))return k._gt(t[n],r[n])}return t.length>r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable(">",t,r)},k._ge=function(t,r){var e=["boolean","number"];if(t&&"function"==typeof t.__ge__)return t.__ge__(r);if(-1!=e.indexOf(A(t))){if(-1!=e.indexOf(A(r)))return r<=t}else if("string"==typeof t){if("string"==typeof r)return r<=t}else if(k._isdate(t)){if(k._isdate(r))return t.getTime()>=r.getTime()}else if(k._islist(t)){if(k._islist(r)){if(t===r)return!0;for(var n=0;n=r.length)return!0;if(!k._eq(t[n],r[n]))return k._gt(t[n],r[n])}return t.length>=r.length}}else if(k._isset(t)||k._isul4set(t)){var i=!1,o=!1;if(k._isset(r)){if(k._isset(r))t.forEach(function(e){r.has(e)||(i=!0)}),r.forEach(function(e){t.has(e)||(o=!0)});else if(k._isul4set(r))for(var s in t.forEach(function(e){r.items[e]||(i=!0)}),r.items)if(!t.has(s)){o=!0;break}}else if(k._isul4set(r)){if(k._isset(r)){for(var s in t.items)if(!r.has(s)){i=!0;break}r.forEach(function(e){t.items[e]||(o=!0)})}else if(k._isul4set(r)){for(var s in t.items)if(!r.items[s]){i=!0;break}for(var s in r.items)if(!t.items[s]){o=!0;break}}}else k._unorderable(operator,t,r);return i?o?null:1:o?-1:0}k._unorderable(">=",t,r)},k._iter=function(e){if("string"==typeof e||k._islist(e))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(k._isset(e)){var n=[];return e.forEach(function(e,t){n.push(e)}),{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}if(k._isul4set(e))return k._iter(e.items);if(k._isobject(e)){r=[];for(var t in e)r.push(t);return{index:0,next:function(){return this.index>=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}throw k.TypeError.create("iter",k._type(e)+" object is not iterable")},k._str_repr=function(e,t){for(var r="",n=!1,i=!1,o=0;o":"":k._isdate(e)?k._date_repr(e,t):void 0===e?"":"object"===A(e)&&"function"==typeof e.__repr__?e.__repr__():k._islist(e)?k._list_repr(e,t):k._ismap(e)?k._map_repr(e,t):k._isset(e)?k._set_repr(e,t):k._isobject(e)?k._object_repr(e,t):"?"},k._repr=function(e){return k._repr_internal(e,!1)},k._ascii=function(e){return k._repr_internal(e,!0)},k._date_str=function(e){var t=e.getFullYear(),r=e.getMonth()+1,n=e.getDate(),i=e.getHours(),o=e.getMinutes(),s=e.getSeconds(),a=e.getMilliseconds(),u=t+"-"+k._lpad(r.toString(),"0",2)+"-"+k._lpad(n.toString(),"0",2)+" "+k._lpad(i.toString(),"0",2)+":"+k._lpad(o.toString(),"0",2)+":"+k._lpad(s.toString(),"0",2);return a&&(u+="."+k._lpad(a.toString(),"0",3)+"000"),u},k._str=function(e){return void 0===e?"":null===e?"":!1===e?"False":!0===e?"True":"string"==typeof e?e:"number"==typeof e?e.toString():k._isdate(e)?k._date_str(e):k._islist(e)?k._list_repr(e):k._isset(e)?k._set_repr(e):k._ismap(e)?k._map_repr(e):"object"===A(e)&&"function"==typeof e.__str__?e.__str__():"object"===A(e)&&"function"==typeof e.__repr__?e.__repr__():k._isobject(e)?k._object_repr(e):"?"},k._bool=function(e){if(null==e||!1===e||0===e||""===e)return!1;if(A(e),"function"==typeof e.__bool__)return e.__bool__();if(k._islist(e))return 0!==e.length;if(k._ismap(e)||k._isset(e))return 0!=e.size;if(k._isobject(e)){for(var t in e)if(e.hasOwnProperty(t))return!0;return!1}return!0},k._int=function(e,t){var r;if(null!==t){if("string"!=typeof e||!k._isint(t))throw k.TypeError.create("int()","int() requires a string and an integer");if("NaN"==(r=parseInt(e,t)).toString())throw k.TypeError.create("int()","invalid literal for int()");return r}if("string"==typeof e){if("NaN"==(r=parseInt(e)).toString())throw k.TypeError.create("int()","invalid literal for int()");return r}if("number"==typeof e)return Math.floor(e);if(!0===e)return 1;if(!1===e)return 0;throw k.TypeError.create("int()","int() argument must be a string or a number")},k._float=function(e){if("string"==typeof e)return parseFloat(e);if("number"==typeof e)return e;if(!0===e)return 1;if(!1===e)return 0;throw k.TypeError.create("float()","float() argument must be a string or a number")},k._list=function(e){for(var t=k._iter(e),r=[];;){var n=t.next();if(n.done)return r;r.push(n.value)}},k._set=function(e){for(var t=k._iter(e),r=w._haveset?new Set:k._Set.create();;){var n=t.next();if(n.done)return r;r.add(n.value)}},k._len=function(e){if("string"==typeof e||k._islist(e))return e.length;if(k._ismap(e)||k._isset(e))return e.size;if(k._isobject(e)){var t=0;for(var r in e)++t;return t}throw k.TypeError.create("len","object of type '"+k._type(e)+"' has no len()")},k._type=function(e){return null===e?"none":!1===e||!0===e?"bool":void 0===e?"undefined":"string"==typeof e?"str":"number"==typeof e?Math.round(e)==e?"int":"float":k._islist(e)?"list":k._isset(e)?"set":k._isdate(e)?"date":void 0!==e.__type__?e.__type__:k._istimedelta(e)?"timedelta":k._isdict(e)?"dict":k._istemplate(e)?"template":k._isfunction(e)?"function":null},k._any=function(e){if("string"==typeof e){for(var t=0;t=^]$/.test(n))throw k.ValueError.create("illegal integer format string "+k._repr(t));o=n[1],i=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw k.ValueError.create("illegal integer format string "+k._repr(t));o=n}var c,h=e<0;switch(h&&(e=-e),l){case"b":c=e.toString(2);break;case"c":if(h||65535"==o)c=k._str_repeat(i,u-c.length)+c;else{var f=u-c.length,p=Math.floor(f/2),d=f-p;c=k._str_repeat(i,p)+c+k._str_repeat(i,d)}return c},k._format=function(e,t,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return k._isdate(e)?k._format_date(e,t,r):k._isint(e)?k._format_int(e,t,r):!0===e?k._format_int(1,t,r):!1===e?k._format_int(0,t,r):void 0},k._lpad=function(e,t,r){for("number"==typeof e&&(e=e.toString());e.lengththis.args.length){var a=null===e?"expected":e+"() expects";throw k.ArgumentError.create(a+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+t.length+" given")}}else n.push(t.slice(this.args.length));if(null===this.remkwargs){for(var u in r)if(!this.argNames[u])throw null===e?k.ArgumentError.create("an argument named "+k._repr(u)+" isn't supported"):k.ArgumentError.create(e+"() doesn't support an argument named "+k._repr(u))}else{var l={};for(var u in r)this.argNames[u]||(l[u]=r[u]);n.push(l)}return n},bindObject:function(e,t,r){t=this.bindArray(e,t,r);var n,i={};for(n=0;n"},__str__:function(){return this.toString()},toString:function(){for(var e=[],t=0;t")}}),k.IndentAST=k._inherit(k.TextAST,{create:function(e,t,r){var n=k.TextAST.create.call(this,e,t);return n._maketext(r),n},_maketext:function(e){void 0!==this.template?this.text=null===e?this.template.source.substring(this.pos.start,this.pos.stop):e:this.text=null},_text:function(){return null===this.text?this.template.source.substring(this.pos.start,this.pos.stop):this.text},_eval:function(e){for(var t=0;t")}}),k.LineEndAST=k._inherit(k.TextAST,{_str:function(e){e.push("lineend "),e.push(k._repr(this._text()))},_repr:function(e){e.push("")}}),k.Tag=k._inherit(k.AST,{create:function(e,t,r,n){var i=k.AST.create.call(this,r);return i.template=e,i.tag=t,i.codepos=n,i._maketext(),i},_maketext:function(){void 0!==this.template?(this.text=this.template.source.substring(this.pos.start,this.pos.stop),this.code=this.template.source.substring(this.codepos.start,this.codepos.stop)):(this.text=null,this.code=null)},ul4ondump:function(e){k.AST.ul4ondump.call(this,e),e.dump(this.template),e.dump(this.tag),e.dump(this.codepos)},ul4onload:function(e){k.TextAST.ul4onload.call(this,e),this.template=e.load(),this.tag=e.load(),this.codepos=e.load(),this._maketext()}}),k.CodeAST=k._inherit(k.AST,{create:function(e,t){var r=k.AST.create.call(this,t);return r.tag=e,r},_ul4onattrs:k.AST._ul4onattrs.concat(["tag"]),_str:function(e){e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," "))}}),k.ConstAST=k._inherit(k.CodeAST,{create:function(e,t,r){var n=k.CodeAST.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval:function(e){return this.value}}),k.ItemArgBase=k._inherit(k.CodeAST,{_handle_eval_list:function(e,t){try{return this._eval_list(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_set:function(e,t){try{return this._eval_set(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_dict:function(e,t){try{return this._eval_dict(e,t)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}},_handle_eval_call:function(e,t,r){try{return this._eval_call(e,t,r)}catch(e){throw k.InternalException.isprotoof(e)||k.LocationError.isprotoof(e)||(e=k.LocationError.create(this,e)),e}}}),k.SeqItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){var r=this.value._handle_eval(e);t.push(r)},_eval_set:function(e,t){var r=this.value._handle_eval(e);t.add(r)}}),k.UnpackSeqItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.value=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["value"]),_repr:function(e){e.push("")},_eval_list:function(e,t){for(var r=this.value._handle_eval(e),n=k._iter(r);;){var i=n.next();if(i.done)break;t.push(i.value)}},_eval_set:function(e,t){for(var r=this.value._handle_eval(e),n=k._iter(r);;){var i=n.next();if(i.done)break;t.add(i.value)}}}),k.DictItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r,n){var i=k.ItemArgBase.create.call(this,e,t);return i.key=r,i.value=n,i},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["key","value"]),_repr:function(e){e.push("")},_eval_dict:function(e,t){var r=this.key._handle_eval(e),n=this.value._handle_eval(e);w._setmap(t,r,n)}}),k.UnpackDictItemAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_dict:function(e,r){var t=this.item._handle_eval(e);if(k._islist(t))for(var n=0;n")},_eval_call:function(e,t,r){var n=this.value._handle_eval(e);t.push(n)}}),k.KeywordArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r,n){var i=k.ItemArgBase.create.call(this,e,t);return i.name=r,i.value=n,i},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["name","value"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){if(r.hasOwnProperty(this.name))throw k.ArgumentError.create("duplicate keyword argument "+this.name);var n=this.value._handle_eval(e);r[this.name]=n}}),k.UnpackListArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);t.push.apply(t,n)}}),k.UnpackDictArgAST=k._inherit(k.ItemArgBase,{create:function(e,t,r){var n=k.ItemArgBase.create.call(this,e,t);return n.item=r,n},_ul4onattrs:k.ItemArgBase._ul4onattrs.concat(["item"]),_repr:function(e){e.push("")},_eval_call:function(e,t,r){var n=this.item._handle_eval(e);if(k._islist(n))for(var i=0;i")},_eval:function(e){for(var t=[],r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=[],i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){for(var t=w._emptymap(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=w._emptymap(),i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){for(var t=w._haveset?new Set:k._Set.create(),r=0;r")},_eval:function(e){for(var t=this.container._handle_eval(e),r=e.inheritvars(),n=w._haveset?new Set:k._Set.create(),i=k._iter(t);;){var o=i.next();if(o.done)break;for(var s=k._unpackvar(this.varname,o.value),a=0;a")},_eval:function(e){var t=this.container._handle_eval(e),n=k._iter(t),i=e.inheritvars(),o=this;return{next:function(){for(;;){var e=n.next();if(e.done)return e;for(var t=k._unpackvar(o.varname,e.value),r=0;r")},_eval:function(e){return this._get(e,this.name)},_eval_set:function(e,t){this._set(e,this.name,t)},_eval_modify:function(e,t,r){this._modify(e,t,this.name,r)},_get:function(e,t){var r=e.get(t);return void 0===r&&(r=k.functions[t]),r},_set:function(e,t,r){e.set(t,r)},_modify:function(e,t,r,n){var i=t._ido(e.get(r),n);e.set(r,i)}}),k.UnaryAST=k._inherit(k.CodeAST,{create:function(e,t,r){var n=k.CodeAST.create.call(this,e,t);return n.obj=r,n},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["obj"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" obj="),this.obj._repr(e),e.push(">")},_eval:function(e){var t=this.obj._handle_eval(e);return this._do(t)}}),k.NegAST=k._inherit(k.UnaryAST,{_do:function(e){return null!==e&&"function"==typeof e.__neg__?e.__neg__():-e}}),k.BitNotAST=k._inherit(k.UnaryAST,{_do:function(e){return-e-1}}),k.NotAST=k._inherit(k.UnaryAST,{_do:function(e){return!k._bool(e)}}),k.IfAST=k._inherit(k.CodeAST,{create:function(e,t,r,n,i){var o=k.CodeAST.create.call(this,e,t);return o.objif=r,o.objcond=n,o.objelse=i,o},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["objif","objcond","objelse"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(1),e.push("objif="),this.objif._repr(e),e.push(0),e.push("objcond="),this.objcond._repr(e),e.push(0),e.push("objelse="),this.objelse._repr(e),e.push(-1),e.push(">")},_eval:function(e){var t=this.objcond._handle_eval(e);return k._bool(t)?this.objif._handle_eval(e):this.objelse._handle_eval(e)}}),k.ReturnAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e);throw k.ReturnException.create(t)},_str:function(e){e.push("return "),this.obj._str(e)}}),k.PrintAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=k._str(t);e.output(r)},_str:function(e){e.push("print "),this.obj._str(e)}}),k.PrintXAST=k._inherit(k.UnaryAST,{_eval:function(e){var t=this.obj._handle_eval(e),r=k._xmlescape(t);e.output(r)},_str:function(e){e.push("printx "),this.obj._str(e)}}),k.BinaryAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.obj1=r,i.obj2=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["obj1","obj2"]),_repr:function(e){e.push("<"),e.push(this.type),e.push(" obj1="),this.obj1._repr(e),e.push(" obj2="),this.obj2._repr(e),e.push(">")},_eval:function(e){var t=this.obj1._handle_eval(e),r=this.obj2._handle_eval(e);return this._do(t,r)}}),k.ItemAST=k._inherit(k.BinaryAST,{_do:function(e,t){return this._get(e,t)},_eval_set:function(e,t){var r=this.obj1._handle_eval(e),n=this.obj2._handle_eval(e);this._set(r,n,t)},_eval_modify:function(e,t,r){var n=this.obj1._handle_eval(e),i=this.obj2._handle_eval(e);this._modify(t,n,i,r)},_get:function(e,t){if("string"==typeof e||k._islist(e)){if("object"===A(t)&&"function"==typeof t.isa&&t.isa(k.slice)){var r=t.start,n=t.stop;return null==r&&(r=0),null==n&&(n=e.length),e.slice(r,n)}return t<0&&(t+=e.length),e[t]}if(e&&"function"==typeof e.__getitem__)return e.__getitem__(t);if(k._ismap(e))return e.get(t);if("[object Object]"===Object.prototype.toString.call(e))return e[t];throw k.TypeError.create("[]",k._type(e)+" object is not subscriptable")},_set:function(e,t,r){if(k._islist(e))if("object"===A(t)&&"function"==typeof t.isa&&t.isa(k.slice)){var n=t.start,i=t.stop;null===n?n=0:n<0&&(n+=e.length),n<0?n=0:n>e.length&&(n=e.length),null===i?i=e.length:i<0&&(i+=e.length),i<0?i=0:i>e.length&&(i=e.length),i")},_eval:function(e){var t=this.obj._handle_eval(e);return this._get(t,this.attrname)},_eval_set:function(e,t){var r=this.obj._handle_eval(e);this._set(r,this.attrname,t)},_eval_modify:function(e,t,r){var n=this.obj._handle_eval(e);this._modify(t,n,this.attrname,r)},_get:function(n,e){if("string"==typeof n)switch(e){case"count":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._count(n,e,t,r)});case"find":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._find(n,e,t,r)});case"rfind":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._rfind(n,e,t,r)});case"replace":return k.expose(["old","new","count=",null],function(e,t,r){return k._replace(n,e,t,r)});case"strip":return k.expose(["chars=",null],function(e){return k._strip(n,e)});case"lstrip":return k.expose(["chars=",null],function(e){return k._lstrip(n,e)});case"rstrip":return k.expose(["chars=",null],function(e){return k._rstrip(n,e)});case"split":return k.expose(["sep=",null,"count=",null],function(e,t){return k._split(n,e,t)});case"rsplit":return k.expose(["sep=",null,"count=",null],function(e,t){return k._rsplit(n,e,t)});case"splitlines":return k.expose(["keepends=",!1],function(e){return k._splitlines(n,e)});case"lower":return k.expose([],function(){return n.toLowerCase()});case"upper":return k.expose([],function(){return n.toUpperCase()});case"capitalize":return k.expose([],function(){return k._capitalize(n)});case"join":return k.expose(["iterable"],function(e){return k._join(n,e)});case"startswith":return k.expose(["prefix"],function(e){return k._startswith(n,e)});case"endswith":return k.expose(["suffix"],function(e){return k._endswith(n,e)});default:return}else if(k._islist(n))switch(e){case"append":return k.expose(["*items"],function(e){return k._append(n,e)});case"insert":return k.expose(["pos","*items"],function(e,t){return k._insert(n,e,t)});case"pop":return k.expose(["pos=",-1],function(e){return k._pop(n,e)});case"count":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._count(n,e,t,r)});case"find":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._find(n,e,t,r)});case"rfind":return k.expose(["sub","start=",null,"end=",null],function(e,t,r){return k._rfind(n,e,t,r)});default:return}else if(k._isdate(n))switch(e){case"weekday":return k.expose([],function(){return k._weekday(n)});case"week":return k.expose(["firstweekday=",null],function(e){return k._week(n,e)});case"day":return k.expose([],function(){return n.getDate()});case"month":return k.expose([],function(){return n.getMonth()+1});case"year":return k.expose([],function(){return n.getFullYear()});case"hour":return k.expose([],function(){return n.getHours()});case"minute":return k.expose([],function(){return n.getMinutes()});case"second":return k.expose([],function(){return n.getSeconds()});case"microsecond":return k.expose([],function(){return 1e3*n.getMilliseconds()});case"mimeformat":return k.expose([],function(){return k._mimeformat(n)});case"isoformat":return k.expose([],function(){return k._isoformat(n)});case"yearday":return k.expose([],function(){return k._yearday(n)});default:return}else if(k._ismap(n))switch(e){case"get":return k.expose(["key","default=",null],function(e,t){return k._get(n,e,t)});case"items":return k.expose([],function(){return k._items(n)});case"values":return k.expose([],function(){return k._values(n)});case"update":return k.expose(["*other","**kwargs"],function(e,t){return k._update(n,e,t)});case"clear":return k.expose([],function(){return k._clear(n)});default:return n.get(e)}else if(k._isset(n))switch(e){case"add":return k.expose(["*items"],function(e){for(var t=0;t")},_makeargs:function(e){for(var t=[],r={},n=0;n")},_str:function(e){e.push("render "),e.push(this.tag.source.substring(this.pos.start,this.pos.stop).replace(/\r?\n/g," ")),null!==this.indent&&(e.push(" with indent "),e.push(k._repr(this.indent._text())))},_handle_eval:function(e){var t=e.withindent(null!==this.indent?this.indent._text():null),r=this.obj._handle_eval(t),n=this._makeargs(t);try{return k._callrender(t,r,n.args,n.kwargs)}catch(e){throw e=k.LocationError.create(this,e)}}}),k.slice=k._inherit(k.Proto,{create:function(e,t){var r=k._clone(this);return r.start=e,r.stop=t,r},__repr__:function(){return"slice("+k._repr(this.start)+", "+k._repr(this.stop)+")"}}),k.SliceAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.index1=r,i.index2=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["index1","index2"]),_repr:function(e){e.push("")},_eval:function(e){var t=null!==this.index1?this.index1._handle_eval(e):null,r=null!==this.index2?this.index2._handle_eval(e):null;return k.slice.create(t,r)}}),k.SetVarAST=k._inherit(k.CodeAST,{create:function(e,t,r,n){var i=k.CodeAST.create.call(this,e,t);return i.lvalue=r,i.value=n,i},_ul4onattrs:k.CodeAST._ul4onattrs.concat(["lvalue","value"]),_repr:function(e){e.push("<"),e.push(this.typename),e.push(" lvalue="),e.push(k._repr(this.lvalue)),e.push(" value="),this.value._repr(e),e.push(">")},_eval:function(e){for(var t=this.value._handle_eval(e),r=k._unpackvar(this.lvalue,t),n=0;n")},_str_varname:function(e,t){if(k._islist(t)){e.push("(");for(var r=0;r")},_str:function(e){e.push("while "),this.container._repr(e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_eval:function(e){for(;;){var t=this.condition._handle_eval(e);if(!k._bool(t))break;try{k.BlockAST._eval.call(this,e)}catch(e){if(e===k.BreakException)break;if(e!==k.ContinueException)throw e}}}},"_str",function(e){e.push("while "),k.AST._str.call(this,e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)})),k.BreakAST=k._inherit(k.CodeAST,{_eval:function(e){throw k.BreakException},_str:function(e){e.push("break"),e.push(0)},_repr:function(e){e.push("")}}),k.ContinueAST=k._inherit(k.CodeAST,{_eval:function(e){throw k.ContinueException},_str:function(e){e.push("continue"),e.push(0)},_repr:function(e){e.push("")}}),k.CondBlockAST=k._inherit(k.BlockAST,{_eval:function(e){for(var t=0;t")},_str:function(e){e.push(this._strname),e.push(" "),this.condition._str(e),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){var t=this.condition._handle_eval(e);return k._bool(t)}}),k.IfBlockAST=k._inherit(k.ConditionalBlockAST,{_strname:"if"}),k.ElIfBlockAST=k._inherit(k.ConditionalBlockAST,{_strname:"else if"}),k.ElseBlockAST=k._inherit(k.BlockAST,x({_repr:function(e){e.push("")},_str:function(e){e.push("else:"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_execute:function(e){return!0}},"_str",function(e){e.push("else:"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)})),k.Template=k._inherit(k.BlockAST,{create:function(e,t,r,n,i,o,s,a){var u=k.BlockAST.create.call(this,e,t);return u.source=r,u.name=n,u.whitespace=i,u.startdelim=o,u.enddelim=s,u.docpos=null,u.signature=a,u._jsfunction=null,u._asts=null,u._ul4_callsignature=a,u._ul4_rendersignature=a,u.parenttemplate=null,u},ul4ondump:function(e){var t;if(e.dump(k.version),e.dump(this.name),e.dump(this.source),e.dump(this.whitespace),e.dump(this.startdelim),e.dump(this.enddelim),e.dump(this.docpos),e.dump(this.parenttemplate),null===this.signature||k.SignatureAST.isprotoof(this.signature))t=this.signature;else{t=[];for(var r=0;r"!==this.enddelim&&(e.push(" enddelim="),e.push(k._repr(this.enddelim))),e.push(">")},_str:function(e){e.push("def "),e.push(this.name?this.name:"unnamed"),e.push(":"),e.push(1),k.BlockAST._str.call(this,e),e.push(-1)},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,_renderbound:function(e,t){var r=e.clone();r.vars=t;try{k.BlockAST._eval.call(this,r)}catch(e){if(!k.ReturnException.isprotoof(e))throw e}},__render__:function(e,t){this._renderbound(e,t)},render:function(e,t){this._renderbound(e,t)},_rendersbound:function(e,t){var r=e.replaceoutput();return this._renderbound(r,t),r.getoutput()},renders:function(e){e=e||{};var t=k.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._rendersbound(t,e)},doc:function(){return null!=this.docpos?this.source.substring(this.docpos.start,this.docpos.stop):null},__getattr__:function(e){var r=this;switch(e){case"tag":return this.tag;case"endtag":return this.endtag;case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});default:return}},_callbound:function(e,t){var r=e.clone();r.vars=t;try{k.BlockAST._eval.call(this,r)}catch(e){if(k.ReturnException.isprotoof(e))return e.result;throw e}return null},call:function(e){e=e||{};var t=k.Context.create();return null!==this.signature&&(e=this.signature.bindObject(this.name,[],e)),this._callbound(t,e)},__call__:function(e,t){return this._callbound(e,t)},__type__:"ul4.Template"}),k.SignatureAST=k._inherit(k.CodeAST,{create:function(e,t){var r=k.CodeAST.create.call(this,e,t);return r.params=[],r},ul4ondump:function(e){k.CodeAST.ul4ondump.call(this,e);for(var t=[],r=0;r")}}),k.TemplateClosure=k._inherit(k.Proto,{create:function(e,t,r){var n=k._clone(this);return n.template=e,n.signature=t,n.vars=r,n._ul4_callsignature=t,n._ul4_rendersignature=t,n.name=e.name,n.tag=e.tag,n.endtag=e.endtag,n.source=e.source,n.startdelim=e.startdelim,n.enddelim=e.enddelim,n.docpos=e.docpos,n.content=e.content,n},_ul4_callneedsobject:!0,_ul4_callneedscontext:!0,_ul4_renderneedsobject:!0,_ul4_renderneedscontext:!0,__render__:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},render:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},__call__:function(e,t){return this.template._callbound(e,k._simpleinherit(this.vars,t))},_renderbound:function(e,t){this.template._renderbound(e,k._simpleinherit(this.vars,t))},_rendersbound:function(e,t){return this.template._rendersbound(e,k._simpleinherit(this.vars,t))},__getattr__:function(e){var r=this;switch(e){case"render":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){r._renderbound(e,t)});case"renders":return k.expose(this.signature,{needscontext:!0,needsobject:!0},function(e,t){return r._rendersbound(e,t)});case"signature":return this.signature;default:return this.template.__getattr__(e)}},__type__:"ul4.TemplateClosure"}),k._rgb=function(e,t,r,n){return this.Color.create(255*e,255*t,255*r,255*n)},k._xmlescape=function(e){return e=(e=(e=(e=(e=(e=k._str(e)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},k._csv=function(e){return null===e?"":("string"!=typeof e&&(e=k._repr(e)),-1===e.indexOf(",")&&-1===e.indexOf('"')&&-1===e.indexOf("\n")||(e='"'+e.replace(/"/g,'""')+'"'),e)},k._chr=function(e){if("number"!=typeof e)throw k.TypeError.create("chr()","chr() requires an int");return String.fromCharCode(e)},k._ord=function(e){if("string"!=typeof e||1!=e.length)throw k.TypeError.create("ord()","ord() requires a string of length 1");return e.charCodeAt(0)},k._hex=function(e){if("number"!=typeof e)throw k.TypeError.create("hex()","hex() requires an int");return e<0?"-0x"+e.toString(16).substr(1):"0x"+e.toString(16)},k._oct=function(e){if("number"!=typeof e)throw k.TypeError.create("oct()","oct() requires an int");return e<0?"-0o"+e.toString(8).substr(1):"0o"+e.toString(8)},k._bin=function(e){if("number"!=typeof e)throw k.TypeError.create("bin()","bin() requires an int");return e<0?"-0b"+e.toString(2).substr(1):"0b"+e.toString(2)},k._min=function(e){if(0==e.length)throw k.ArgumentError.create("min() requires at least 1 argument, 0 given");1==e.length&&(e=e[0]);for(var t,r=k._iter(e),n=!0;;){var i=r.next();if(i.done){if(n)throw k.ValueError.create("min() argument is an empty sequence!");return t}(n||i.valuet)&&(t=i.value),n=!1}},k._sum=function(e,t){void 0===t&&(t=0);for(var r=k._iter(e);;){var n=r.next();if(n.done)break;t+=n.value}return t},k._first=function(e,t){void 0===t&&(t=null);var r=k._iter(e).next();return r.done?t:r.value},k._last=function(e,t){void 0===t&&(t=null);for(var r=t,n=k._iter(e);;){var i=n.next();if(i.done)break;r=i.value}return r},k._sorted=function(e,t,r,n){var i;if(null===r)return i=n?function(e,t){return-k._cmp("<=>",e,t)}:function(e,t){return k._cmp("<=>",e,t)},(_=k._list(t)).sort(i),_;for(var o=[],s=0,a=k._iter(t);;++s){var u=a.next();if(u.done)break;var l=k._call(e,r,[u.value],{});o.push([l,s,u.value])}i=function(e,t){var r=k._cmp("<=>",e[0],t[0]);return r||(r=k._cmp(e[1],t[1])),n?-r:r},o.sort(i);var _=[];for(s=0;s=o?{done:!0}:{value:t+this.index++*n,done:!1}}}},k._slice=function(e){var t,r,n,i;if(e.length<2)throw k.ArgumentError.create("required slice() argument missing");if(4= 0");if(n<0)throw k.ValueError.create("slice() requires a stop argument >= 0");if(i<=0)throw k.ValueError.create("slice() requires a step argument > 0");var o=r,s=0,a=k._iter(t);return{next:function(){for(var e;se.length||ne.length+1&&(i=e.length+1),i}r=k._bound(r,e.length),n=k._bound(n,e.length);var o=0;if(k._islist(e)){for(var s=r;sn);)++o,a+=t.length;return o},k._find=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=k._bound(r,e.length),n=k._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.indexOf(t);return-1!==i&&(i+=r),i},k._rfind=function(e,t,r,n){r<0&&(r+=e.length),null===r&&(r=0),n<0&&(n+=e.length),null===n&&(n=e.length),r=k._bound(r,e.length),n=k._bound(n,e.length),0===r&&n===e.length||(e="string"==typeof e?e.substring(r,n):e.slice(r,n));var i=e.lastIndexOf(t);return-1!==i&&(i+=r),i},k._capitalize=function(e){if("string"!=typeof e)throw k.TypeError.create("capitalize()","capitalize() requires a string");return e.length&&(e=e[0].toUpperCase()+e.slice(1).toLowerCase()),e},k._items=function(e){if(k._ismap(e)){var r=[];return e.forEach(function(e,t){r.push([t,e])}),r}if(k._isobject(e)){r=[];for(var t in e)r.push([t,e[t]]);return r}throw k.TypeError.create("items()","items() requires a dict")},k._values=function(e){if(k._ismap(e)){var r=[];return e.forEach(function(e,t){r.push(e)}),r}if(k._isobject(e)){r=[];for(var t in e)r.push(e[t]);return r}throw k.TypeError.create("values()","values() requires a dict")},k._join=function(e,t){for(var r=[],n=k._iter(t);;){var i=n.next();if(i.done)break;r.push(i.value)}return r.join(e)},k._startswith=function(e,t){if("string"!=typeof t)throw k.TypeError.create("startswith()","startswith() argument must be string");return e.substr(0,t.length)===t},k._endswith=function(e,t){if("string"!=typeof t)throw k.TypeError.create("endswith()","endswith() argument must be string");return e.substr(e.length-t.length)===t},k._isoformat=function(e){if(!k._isdate(e))throw k.TypeError.create("isoformat()","isoformat() requires a date");var t=e.getFullYear()+"-"+k._lpad((e.getMonth()+1).toString(),"0",2)+"-"+k._lpad(e.getDate().toString(),"0",2),r=e.getHours(),n=e.getMinutes(),i=e.getSeconds(),o=e.getMilliseconds();return(r||n||i||o)&&(t+="T"+k._lpad(r.toString(),"0",2)+":"+k._lpad(n.toString(),"0",2)+":"+k._lpad(i.toString(),"0",2),o&&(t+="."+k._lpad(o.toString(),"0",3)+"000")),t},k._mimeformat=function(e){return["Mon","Tue","Wed","Thu","Fri","Sat","Sun"][k._weekday(e)]+", "+k._lpad(e.getDate(),"0",2)+" "+["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][e.getMonth()]+" "+e.getFullYear()+" "+k._lpad(e.getHours(),"0",2)+":"+k._lpad(e.getMinutes(),"0",2)+":"+k._lpad(e.getSeconds(),"0",2)+" GMT"},k._weekday=function(e){var t=e.getDay();return t?t-1:6},k._week=function(e,t){null===t?t=0:t%=7;var r=k._yearday(e)+6,n=new Date(e.getFullYear(),0,1).getDay();for(--n<0&&(n=6);n!=t;)--r,7==++n&&(n=0);return Math.floor(r/7)},k._isleap=function(e){return 1===new Date(e.getFullYear(),1,29).getMonth()},k._yearday=function(e){var t=k._isleap(e)?1:0,r=e.getDate();switch(e.getMonth()){case 0:return r;case 1:return 31+r;case 2:return 59+t+r;case 3:return 59+t+31+r;case 4:return 59+t+31+30+r;case 5:return 59+t+31+30+31+r;case 6:return 59+t+31+30+31+30+r;case 7:return 59+t+31+30+31+30+31+r;case 8:return 59+t+31+30+31+30+31+31+r;case 9:return 59+t+31+30+31+30+31+31+30+r;case 10:return 59+t+31+30+31+30+31+31+30+31+r;case 11:return 59+t+31+30+31+30+31+31+30+31+30+r}},k._append=function(e,t){for(var r=0;re._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>e._microseconds;k._unorderable(">",this,e)},__ge__:function(e){if(k._istimedelta(e))return this._days!=e._days?this._days>e._days:this._seconds!=e._seconds?this._seconds>e._seconds:this._microseconds>=e._microseconds;k._unorderable(">=",this,e)},__neg__:function(){return k.TimeDelta.create(-this._days,-this._seconds,-this._microseconds)},_add:function(e,t,r,n){var i=e.getFullYear(),o=e.getMonth(),s=e.getDate()+t,a=e.getHours(),u=e.getMinutes(),l=e.getSeconds()+r,_=e.getMilliseconds()+n/1e3;return new Date(i,o,s,a,u,l,_)},__add__:function(e){if(k._istimedelta(e))return k.TimeDelta.create(this._days+e._days,this._seconds+e._seconds,this._microseconds+e._microseconds);if(k._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw k.TypeError.create("+",k._type(this)+" + "+k._type(e)+" not supported")},__radd__:function(e){if(k._isdate(e))return this._add(e,this._days,this._seconds,this._microseconds);throw k.TypeError.create("+",k._type(this)+" + "+k._type(e)+" not supported")},__sub__:function(e){if(k._istimedelta(e))return k.TimeDelta.create(this._days-e._days,this._seconds-e._seconds,this._microseconds-e._microseconds);throw k.TypeError.create("-",k._type(this)+" - "+k._type(e)+" not supported")},__rsub__:function(e){if(k._isdate(e))return this._add(e,-this._days,-this._seconds,-this._microseconds);throw k.TypeError.create("-",k._type(this)+" - "+k._type(e)+" not supported")},__mul__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw k.TypeError.create("*",k._type(this)+" * "+k._type(e)+" not supported")},__rmul__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days*e,this._seconds*e,this._microseconds*e);throw k.TypeError.create("*",k._type(this)+" * "+k._type(e)+" not supported")},__truediv__:function(e){if("number"==typeof e)return k.TimeDelta.create(this._days/e,this._seconds/e,this._microseconds/e);if(k._istimedelta(e)){var t=this._days,r=e._days,n=this._seconds||e._seconds,i=this._microseconds||e._microseconds;return(n||i)&&(t=86400*t+this._seconds,r=86400*r+e._seconds,i&&(t=1e6*t+this._microseconds,r=1e6*r+e._microseconds)),t/r}throw k.TypeError.create("/",k._type(this)+" / "+k._type(e)+" not supported")},__getattr__:function(e){var t=this;switch(e){case"days":return k.expose([],function(){return t._days});case"seconds":return k.expose([],function(){return t._seconds});case"microseconds":return k.expose([],function(){return t._microseconds});default:return}},days:function(){return this._days},seconds:function(){return this._seconds},microseconds:function(){return this._microseconds}}),k.MonthDelta=k._inherit(k.Proto,{__type__:"ul4.MonthDelta",create:function(e){var t=k._clone(this);return t._months=void 0!==e?e:0,t},__repr__:function(){return this._months?"monthdelta("+this._months+")":"monthdelta()"},__str__:function(){return this._months?-1!==this._months&&1!==this._months?this._months+" months":this._months+" month":"0 months"},__bool__:function(){return 0!==this._months},__abs__:function(){return this._months<0?k.MonthDelta.create(-this._months):this},__eq__:function(e){return!!k._ismonthdelta(e)&&this._months===e._months},__lt__:function(e){if(k._ismonthdelta(e))return this._monthse._months;k._unorderable(">",this,e)},__ge__:function(e){if(k._ismonthdelta(e))return this._months>=e._months;k._unorderable(">=",this,e)},__neg__:function(){return k.MonthDelta.create(-this._months)},_add:function(e,t){for(var r=e.getFullYear(),n=e.getMonth()+t,i=e.getDate(),o=e.getHours(),s=e.getMinutes(),a=e.getSeconds(),u=e.getMilliseconds();;){var l=new Date(r,n,1,o,s,a,u).getMonth(),_=new Date(r,n,i,o,s,a,u);if(_.getMonth()===l)return _;--i}},__add__:function(e){if(k._ismonthdelta(e))return k.MonthDelta.create(this._months+e._months);if(k._isdate(e))return this._add(e,this._months);throw k._type(this)+" + "+k._type(e)+" not supported"},__radd__:function(e){if(k._isdate(e))return this._add(e,this._months);throw k._type(this)+" + "+k._type(e)+" not supported"},__sub__:function(e){if(k._ismonthdelta(e))return k.MonthDelta.create(this._months-e._months);throw k._type(this)+" - "+k._type(e)+" not supported"},__rsub__:function(e){if(k._isdate(e))return this._add(e,-this._months);throw k._type(this)+" - "+k._type(e)+" not supported"},__mul__:function(e){if("number"==typeof e)return k.MonthDelta.create(this._months*Math.floor(e));throw k._type(this)+" * "+k._type(e)+" not supported"},__rmul__:function(e){if("number"==typeof e)return k.MonthDelta.create(this._months*Math.floor(e));throw k._type(this)+" * "+k._type(e)+" not supported"},__floordiv__:function(e){if("number"==typeof e)return k.MonthDelta.create(Math.floor(this._months/e));if(k._ismonthdelta(e))return Math.floor(this._months/e._months);throw k._type(this)+" // "+k._type(e)+" not supported"},__truediv__:function(e){if(k._ismonthdelta(e))return this._months/e._months;throw k._type(this)+" / "+k._type(e)+" not supported"},__getattr__:function(e){var t=this;switch(e){case"months":return k.expose([],function(){return t._months});default:return}},months:function(){return this._months}}),k._Set=k._inherit(k.Proto,{__type__:"ul4._Set",create:function(){var e=k._clone(this);return e.items={},e.add.apply(e,arguments),e},add:function(){for(var e=0;e"},geodist:function(e,t){var r=function(e){return(e=Math.sin(e))*e},n=function(e){return(e=Math.cos(e))*e},i=Math.PI/180,o=1/298.257223563,s=e.lat*i,a=e.long*i,u=t.lat*i,l=(s+u)/2,_=(s-u)/2,c=(a-t.long*i)/2,h=r(_)*n(c)+n(l)*r(c),f=n(_)*n(c)+r(l)*r(c),p=Math.atan(Math.sqrt(h/f)),d=2*p*6378.137,m=Math.sqrt(h*f)/p,g=(3*m+1)/(2*h);return d*(1+o*((3*m-1)/(2*f))*r(l)*n(_)-o*g*n(l)*r(_))}}),L.FlashMessage=k._inherit(L.Base,{_ul4onattrs:["timestamp","type","title","message"],__repr__:function(){return""}}),L.App=k._inherit(L.Base,{_ul4onattrs:["id","globals","name","description","language","startlink","iconlarge","iconsmall","owner","controls","records","recordcount","installation","categories","params","views","datamanagement_identifier"],insert:function(e){return this.globals.Login._insert(this,e)},__repr__:function(){return""}}),L.View=k._inherit(L.Base,{_ul4onattrs:["id","name","app","order","width","height","start","end"],__repr__:function(){return""}}),L.DataSource=k._inherit(L.Base,{_ul4onattrs:["id","identifier","app","apps"],__repr__:function(){return""}}),L.Record=k._inherit(L.Base,{_ul4onattrs:["id","app","createdat","createdby","updatedat","updatedby","updatecount","values","attachments","children"],delete:function(){return this.app.globals.Login._delete(this)},update:function(e){return this.app.globals.Login._update(this,e)},__repr__:function(){return""},search:function(e){for(var t in e){var r=e[t];if(k._bool(r)&&!this.fields.get(t).search(r))return!1}return!0},_dumpUL4ONAttr:function(e){return"values"===e?this._sparsevalues:this[e]},_loadUL4ONAttr:function(e,t){"values"===e?(this._sparsevalues=t,this._values=null,this._fields=null):this[e]=t}}),Object.defineProperty(L.Record,"values",{get:function(){if(null===this._values){this._values=w._havemap?new Map:{};var n=this;this.app.controls.forEach(function(e,t){var r=n._sparsevalues.get(e.identifier);void 0===r&&(r=null),n._values.set(t,r)})}return this._values}}),Object.defineProperty(L.Record,"fields",{get:function(){if(null===this._fields){this._fields=w._havemap?new Map:{};var n=this;this.values.forEach(function(e,t){var r=L.Field.create(n.app.controls.get(t),n.app,e);n._fields.set(t,r)})}return this._fields}}),L.Control=k._inherit(L.Base,{type:null,subtype:null,_ul4onattrs:["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],__repr__:function(){return""},asjson:function(e){return e},_logsearch:function(e,t){},search:function(e,t){return!1}}),L.BoolControl=k._inherit(L.Control,{type:"bool",__type__:"BoolControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),L.IntControl=k._inherit(L.Control,{type:"int",__type__:"IntControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator&&t.value===e}}),L.NumberControl=k._inherit(L.Control,{type:"number",__type__:"NumberControl",search:function(e,t){return this._logsearch(e,t),"equals"===t.operator?t.value===e:"range"===t.operator&&(null!==e&&((null===t.minvalue||t.minvalue<=e)&&(null===t.maxvalue||e"}}),L.LookupItem=k._inherit(L.Base,{_ul4onattrs:["key","label"],__repr__:function(){return""}}),L.User=k._inherit(L.Base,{_ul4onattrs:["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],__repr__:function(){return""}}),L.File=k._inherit(L.Base,{_ul4onattrs:["id","url","filename","mimetype","width","height"],__repr__:function(){return""}}),L.Geo=k._inherit(L.Base,{_ul4onattrs:["lat","long","info"],__repr__:function(){return""}}),L.Attachment=k._inherit(L.Base,{_ul4onattrs:["id","record","label","active"],__repr__:function(){return""}}),L.NoteAttachment=k._inherit(L.Attachment,{type:"noteattachment",__type__:"NoteAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.URLAttachment=k._inherit(L.Attachment,{type:"urlattachment",__type__:"URLAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.FileAttachment=k._inherit(L.Attachment,{type:"fileattachment",__type__:"FileAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"])}),L.ImageAttachment=k._inherit(L.Attachment,{type:"imageattachment",__type__:"ImageAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["original","thumb","small","medium","large"])}),L.JSONAttachment=k._inherit(L.Attachment,{type:"jsonattachment",__type__:"JSONAttachment",_ul4onattrs:L.Attachment._ul4onattrs.concat(["value"]),_dumpUL4ONAttr:function(e){return"value"===e?k._asjson(this.value):this[e]},_loadUL4ONAttr:function(e,t){"value"===e?this.value=k._fromjson(t):this[e]=t}}),L.Installation=k._inherit(L.Base,{_ul4onattrs:["id","name"],__repr__:function(){return""}}),L.Category=k._inherit(L.Base,{_ul4onattrs:["id","identifier","name","order","parent","children","apps"],__repr__:function(){for(var e=[],t=this;null!==t;)e.splice(0,0,t.identifier),t=t.parent;return""}}),L.KeyView=k._inherit(L.Base,{_ul4onattrs:["id","identifier","name","key","user"],__repr__:function(){return""}}),L.AppParameter=k._inherit(L.Base,{_ul4onattrs:["id","app","identifier","description","value"],__repr__:function(){return""}});for(var D=["Globals","App","View","DataSource","Record","BoolControl","IntControl","NumberControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","FileControl","ButtonControl","Field","LookupItem","User","File","Geo","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","KeyView","AppParameter"],q=0;q=this.data.length)throw new R.ValueError("UL4 decoder at EOF");return this.data.charAt(this.pos++)}},{key:"readcharoreof",value:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)}},{key:"readblackchar",value:function(){for(var t=/\s/;;){if(this.pos>=this.data.length)throw new R.ValueError("UL4 decoder at EOF at position "+this.pos+" with path "+this.stack.join("/"));var e=this.data.charAt(this.pos++);if(!e.match(t))return e}}},{key:"read",value:function(t){this.pos+t>this.length&&(t=this.length-this.pos);var e=this.data.substring(this.pos,this.pos+t);return this.pos+=t,e}},{key:"backup",value:function(){--this.pos}},{key:"readnumber",value:function(){for(var t=/[-+0123456789.eE]/,e="";;){var r=this.readcharoreof();if(null===r||!r.match(t)){var n=parseFloat(e);if(isNaN(n))throw new R.ValueError("invalid number, got "+R._repr("value")+" at position "+this.pos+" with path "+this.stack.join("/"));return n}e+=r}}},{key:"_beginfakeloading",value:function(){var t=this.backrefs.length;return this.backrefs.push(null),t}},{key:"_endfakeloading",value:function(t,e){this.backrefs[t]=e}},{key:"_readescape",value:function(t,e){var r=this.read(e);if(r.length!=e)throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));var n=parseInt(r,16);if(isNaN(n))throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));return String.fromCharCode(n)}},{key:"load",value:function(){var t,e=this.readblackchar();switch(e){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===e&&this.backrefs.push(null),null;case"b":case"B":if("T"===(t=this.readchar()))t=!0;else{if("F"!==t)throw new R.ValueError("wrong value for boolean, expected 'T' or 'F', got "+R._repr(t)+" at position "+this.pos+" with path "+this.stack.join("/"));t=!1}return"B"===e&&this.backrefs.push(t),t;case"i":case"I":case"f":case"F":return t=this.readnumber(),"I"!==e&&"F"!==e||this.backrefs.push(t),t;case"s":case"S":t=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var o=this.readchar();"\\"==o?t.push("\\"):"n"==o?t.push("\n"):"r"==o?t.push("\r"):"t"==o?t.push("\t"):"f"==o?t.push("\f"):"b"==o?t.push("\b"):"a"==o?t.push(""):"'"==o?t.push("'"):'"'==o?t.push('"'):"x"==o?t.push(this._readescape("x",2)):"u"==o?t.push(this._readescape("u",4)):"U"==o?t.push(this._readescape("U",8)):t.push("\\"+o)}else t.push(n)}return t=t.join(""),"S"===e&&this.backrefs.push(t),t;case"c":case"C":return t=new R.Color,"C"===e&&this.backrefs.push(t),t._r=this.load(),t._g=this.load(),t._b=this.load(),t._a=this.load(),t;case"x":case"X":var i=this.load(),a=this.load(),u=this.load();return t=new R.Date(i,a,u),"X"===e&&this.backrefs.push(t),t;case"z":case"Z":return(t=new Date).setFullYear(this.load()),t.setDate(1),t.setMonth(this.load()-1),t.setDate(this.load()),t.setHours(this.load()),t.setMinutes(this.load()),t.setSeconds(this.load()),t.setMilliseconds(this.load()/1e3),"Z"===e&&this.backrefs.push(t),t;case"t":case"T":return(t=new R.TimeDelta)._days=this.load(),t._seconds=this.load(),t._microseconds=this.load(),"T"===e&&this.backrefs.push(t),t;case"r":case"R":return t=new R.slice,"R"===e&&this.backrefs.push(t),t.start=this.load(),t.stop=this.load(),t;case"m":case"M":return t=new R.MonthDelta,"M"===e&&this.backrefs.push(t),t._months=this.load(),t;case"l":case"L":for(this.stack.push("list"),t=[],"L"===e&&this.backrefs.push(t);"]"!==(e=this.readblackchar());)this.backup(),t.push(this.load());return this.stack.pop(),t;case"d":case"D":case"e":case"E":if(!R._havemap&&("e"==e||"E"==e))throw new R.ValueError("ordered dictionaries are not supported at position "+this.pos+" with path "+this.stack.join("/"));for(t=R._emptymap(),this.stack.push("d"===e||"D"===e?"dict":"odict"),"D"!==e&&"E"!==e||this.backrefs.push(t);"}"!==(e=this.readblackchar());){this.backup();var s=this.load(),l=this.load();R._setmap(t,s,l)}return this.stack.pop(),t;case"y":case"Y":for(this.stack.push("set"),t=R._makeset(),"Y"===e&&this.backrefs.push(t);"}"!==(e=this.readblackchar());)this.backup(),t.add(this.load());return this.stack.pop(),t;case"o":case"O":var c;"O"===e&&(c=this._beginfakeloading());var h,p=this.load();if(this.stack.push(p),null!==this.registry?void 0===(h=this.registry[p])&&(h=R._registry[p]):h=R._registry[p],void 0===h)throw new R.ValueError("can't load object of type "+R._repr(p)+" at position "+this.pos+" with path "+this.stack.join("/"));if(t=new h,"O"===e&&this._endfakeloading(c,t),t.ul4onload(this),")"!==(e=this.readblackchar()))throw new R.ValueError("object terminator ')' for object of type '"+p+"' expected, got "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"));return this.stack.pop(),t;default:throw new R.ValueError("unknown typecode "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"))}}},{key:"loadcontent",value:function(){var e=this;return{next:function(){var t=e.readblackchar();return e.backup(),")"==t?{done:!0}:{done:!1,value:e.load()}}}}}]),r}(),R._rvalidchars=/^[\],:{}\s]*$/,R._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,R._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,R._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,R._inherit=function(t,e){return Object.assign(Object.create(t),e)},R._map2object=function(t){if(R._ismap(t)){var r={};return t.forEach(function(t,e){if("string"!=typeof e)throw new R.TypeError("keys must be strings");r[e]=t}),r}return t},R._bound=function(t,e){return t<0?0:e=r.length)return 1;var u=R._cmp(t,e[a],r[a]);if(u)return u}return r.length>e.length?-1:0}}else if((R._isset(e)||R._isul4set(e))&&(R._isset(r)||R._isul4set(r))){for(var s=!1,l=!1,c=_iter(e);;){var h=c.next();if(h.done)break;if(!r.has(h.value)){s=!0;break}}for(var p=_iter(r);;){var _=p.next();if(_.done)break;if(!e.has(_.value)){l=!0;break}}return s?l?null:1:l?-1:0}return R._unorderable(t,e,r)},R._lt=function(t,e){var r=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(e);if(-1!=r.indexOf(M(t))){if(-1!=r.indexOf(M(e)))return t=e.length)return!1;if(!R._eq(t[n],e[n]))return R._lt(t[n],e[n])}return t.length=r.length)return!1;if(!R._eq(e[n],r[n]))return R._lt(e[n],r[n])}return e.length<=r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r)){if(R._isset(r))e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)});else if(R._isul4set(r))for(var a in e.forEach(function(t){r.items[t]||(o=!0)}),r.items)if(!e.has(a)){i=!0;break}}else if(R._isul4set(r)){if(R._isset(r)){for(var u in e.items)if(!r.has(u)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var s in e.items)if(!r.items[s]){o=!0;break}for(var l in r.items)if(!e.items[l]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable("<=",e,r)},R._gt=function(e,r){var t=["boolean","number"];if(e&&"function"==typeof e.__gt__)return e.__gt__(r);if(-1!=t.indexOf(M(e))){if(-1!=t.indexOf(M(r)))return rr.getTime()}else if(R._islist(e)){if(R._islist(r)){if(e===r)return!1;for(var n=0;n=r.length)return!0;if(!R._eq(e[n],r[n]))return R._gt(e[n],r[n])}return e.length>r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r))R._isset(r)?(e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)})):R._isul4set(r)&&(e.forEach(function(t){r.items[t]||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)}));else if(R._isul4set(r)){if(R._isset(r)){for(var a in e.items)if(!r.has(a)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var u in e.items)if(!r.items[u]){o=!0;break}for(var s in r.items)if(!e.items[s]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable(">",e,r)},R._ge=function(r,e){var t=["boolean","number"];if(r&&"function"==typeof r.__ge__)return r.__ge__(e);if(-1!=t.indexOf(M(r))){if(-1!=t.indexOf(M(e)))return e<=r}else if("string"==typeof r){if("string"==typeof e)return e<=r}else if(R._isdatetime(r)){if(R._isdatetime(e))return r.getTime()>=e.getTime()}else if(R._islist(r)){if(R._islist(e)){if(r===e)return!0;for(var n=0;n=e.length)return!0;if(!R._eq(r[n],e[n]))return R._gt(r[n],e[n])}return r.length>=e.length}}else if(R._isset(r)||R._isul4set(r)){var o=!1,i=!1;if(R._isset(e)){if(R._isset(e))r.forEach(function(t){e.has(t)||(o=!0)}),e.forEach(function(t){r.has(t)||(i=!0)});else if(R._isul4set(e))for(var a in r.forEach(function(t){e.items[t]||(o=!0)}),e.items)if(!r.has(a)){i=!0;break}}else if(R._isul4set(e)){if(R._isset(e)){for(var u in r.items)if(!e.has(u)){o=!0;break}e.forEach(function(t,e){r.items[t]||(i=!0)})}else if(R._isul4set(e)){for(var s in r.items)if(!e.items[s]){o=!0;break}for(var l in e.items)if(!r.items[l]){i=!0;break}}}else R._unorderable(operator,r,e);return o?i?null:1:i?-1:0}R._unorderable(">=",r,e)},R._iter=function(t){if("string"==typeof t||R._islist(t))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(R._isset(t)){var e=[];return t.forEach(function(t){e.push(t)}),{index:0,next:function(){return this.index>=e.length?{done:!0}:{value:e[this.index++],done:!1}}}}if(R._isul4set(t))return R._iter(t.items);if(R._isobject(t)){var n=[];for(var o in t)n.push(o);return{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}throw new R.TypeError(R._type(t)+" object is not iterable")},R._str_repr=function(t,e){for(var r="",n=!1,o=!1,i=0;i":"":R._isdate(t)?R._date_repr(t,e):R._isdatetime(t)?R._datetime_repr(t,e):void 0===t?"":"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._islist(t)?R._list_repr(t,e):R._ismap(t)?R._map_repr(t,e):R._isset(t)?R._set_repr(t,e):R._isobject(t)?R._object_repr(t,e):"?"},R._repr=function(t){return R._repr_internal(t,!1)},R._ascii=function(t){return R._repr_internal(t,!0)},R._date_str=function(t){var e=t._date.getFullYear(),r=t._date.getMonth()+1,n=t._date.getDate();return e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)},R._datetime_str=function(t){var e=t.getFullYear(),r=t.getMonth()+1,n=t.getDate(),o=t.getHours(),i=t.getMinutes(),a=t.getSeconds(),u=t.getMilliseconds(),s=e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)+" "+R._lpad(o.toString(),"0",2)+":"+R._lpad(i.toString(),"0",2);return(a||u)&&(s+=":"+R._lpad(a.toString(),"0",2),u&&(s+="."+R._lpad(u.toString(),"0",3)+"000")),s},R._str=function(t){return void 0===t?"":null===t?"":!1===t?"False":!0===t?"True":"string"==typeof t?t:"number"==typeof t?t.toString():R._isdate(t)?R._date_str(t):R._isdatetime(t)?R._datetime_str(t):R._islist(t)?R._list_repr(t):R._isset(t)?R._set_repr(t):R._ismap(t)?R._map_repr(t):"object"===M(t)&&"function"==typeof t.__str__?t.__str__():"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._isobject(t)?R._object_repr(t):"?"},R._bool=function(t){if(null==t||!1===t||0===t||""===t)return!1;if(M(t),"function"==typeof t.__bool__)return t.__bool__();if(R._islist(t))return 0!==t.length;if(R._ismap(t)||R._isset(t))return 0!=t.size;if(R._isobject(t)){for(var e in t)if(t.hasOwnProperty(e))return!0;return!1}return!0},R._int=function(t,e){var r;if(null!==e){if("string"!=typeof t||!R._isint(e))throw new R.TypeError("int() requires a string and an integer");if("NaN"==(r=parseInt(t,e)).toString())throw new R.TypeError("invalid literal for int()");return r}if("string"==typeof t){if("NaN"==(r=parseInt(t)).toString())throw new R.TypeError("invalid literal for int()");return r}if("number"==typeof t)return Math.floor(t);if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("int() argument must be a string or a number")},R._float=function(t){if("string"==typeof t)return parseFloat(t);if("number"==typeof t)return t;if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("float() argument must be a string or a number")},R._list=function(t){for(var e=R._iter(t),r=[];;){var n=e.next();if(n.done)return r;r.push(n.value)}},R._set=function(t){for(var e=R._iter(t),r=R._emptyset();;){var n=e.next();if(n.done)return r;r.add(n.value)}},R._len=function(t){if("string"==typeof t||R._islist(t))return t.length;if(R._ismap(t)||R._isset(t))return t.size;if(R._isobject(t)){var e=0;for(var r in t)++e;return e}throw new R.TypeError("object of type '"+R._type(t)+"' has no len()")},R._type=function(t){return null===t?"none":!1===t||!0===t?"bool":void 0===t?"undefined":"number"==typeof t?Math.round(t)==t?"int":"float":"function"==typeof t?"function":"function"==typeof t.ul4type?t.ul4type():R.Protocol.get(t).ul4type(t)},R._mod=function(t,e){var r=Math.floor(t/e),n=t-r*e;return 0!==n&&(e<0&&0=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n[1],o=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n}var h,p=t<0;switch(p&&(t=-t),l){case"b":h=t.toString(2);break;case"c":if(p||65535"==i)h=R._str_repeat(o,s-h.length)+h;else{var _=s-h.length,f=Math.floor(_/2),d=_-f;h=R._str_repeat(o,f)+h+R._str_repeat(o,d)}return h},R._format=function(t,e,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return R._isdate(t)?R._format_datetime(t._date,e,r):R._isdatetime(t)?R._format_datetime(t,e,r):R._isint(t)?R._format_int(t,e,r):!0===t?R._format_int(1,e,r):!1===t?R._format_int(0,e,r):void 0},R._lpad=function(t,e,r){for("number"==typeof t&&(t=t.toString());t.lengththis.args.length){var u=null===t?"expected":t+"() expects";throw new R.ArgumentError(u+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+e.length+" given")}}else n.push(e.slice(this.args.length));if(null===this.remkwargs){for(var s in r)if(!this.argNames[s])throw null===t?new R.ArgumentError("an argument named "+R._repr(s)+" isn't supported"):new R.ArgumentError(t+"() doesn't support an argument named "+R._repr(s))}else{var l=R._emptymap();for(var c in r)this.argNames[c]||R._setmap(l,c,r[c]);n.push(l)}return n}},{key:"bindObject",value:function(t,e,r){e=this.bindArray(t,e,r);var n,o={};for(n=0;n"}},{key:"__str__",value:function(){return this.toString()}},{key:"toString",value:function(){for(var t=[],e=0;e=c.getTime()){var h=R.SubAST.prototype._do(t,c);return[o,Math.floor(h.days()/7)+1,R.DateTimeProtocol.weekday(t)]}}}},{key:"week",value:function(t){var e=1=r.length){o="";break}if("\n"===r.charAt(t)){o="";break}--n,++t}return r.substring(e,t)+o}},{key:"line",get:function(){return null===this._line&&this._calculateLineCol(),this._line}},{key:"col",get:function(){return null===this._col&&this._calculateLineCol(),this._col}}]),n}(),R.AST.prototype._ul4onattrs=["template","pos"],R.TextAST=function(t){function r(t,e){return E(this,r),V(this,O(r).call(this,t,e))}return L(r,R.AST),P(r,[{key:"_eval",value:function(t){t.output(this.text)}},{key:"_str",value:function(t){t.push("text "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}},{key:"text",get:function(){return this.source}}]),r}(),R.IndentAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e)))._text=r,n}return L(o,R.TextAST),P(o,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"text",get:function(){return void 0!==this.template?null===this._text?this.source:this._text:null}}]),o}(),R.LineEndAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.TextAST),P(e,[{key:"_str",value:function(t){t.push("lineend "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CodeAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.AST),e}(),R.ConstAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){return this.value}}]),o}(),R.ConstAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["value"]),R.ItemArgBase=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_handle_eval_list",value:function(t,e){try{return this._eval_list(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_set",value:function(t,e){try{return this._eval_set(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_dict",value:function(t,e){try{return this._eval_dict(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_call",value:function(t,e,r){try{return this._eval_call(t,e,r)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}}]),e}(),R.SeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){var r=this.value._handle_eval(t);e.push(r)}},{key:"_eval_set",value:function(t,e){var r=this.value._handle_eval(t);e.add(r)}}]),o}(),R.SeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.UnpackSeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.push(o.value)}}},{key:"_eval_set",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.add(o.value)}}}]),o}(),R.UnpackSeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.DictItemAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).key=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,e){var r=this.key._handle_eval(t),n=this.value._handle_eval(t);R._setmap(e,r,n)}}]),i}(),R.DictItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["key","value"]),R.UnpackDictItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,r){var e=this.item._handle_eval(t);if(R._islist(e))for(var n=0;n")}},{key:"_eval_call",value:function(t,e,r){var n=this.value._handle_eval(t);e.push(n)}}]),o}(),R.PosArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.KeywordArgAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).name=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){if(r.hasOwnProperty(this.name))throw new R.ArgumentError("duplicate keyword argument "+this.name);var n=this.value._handle_eval(t);r[this.name]=n}}]),i}(),R.KeywordArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["name","value"]),R.UnpackListArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);e.push.apply(e,N(n))}}]),o}(),R.UnpackListArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["item"]),R.UnpackDictArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);if(R._islist(n))for(var o=0;o")}},{key:"_eval",value:function(t){for(var e=[],r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=[],o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptyset(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptyset(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptymap(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptymap(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){var e=this.container._handle_eval(t),a=R._iter(e),u=t.inheritvars(),s=this;return{next:function(){for(;;){var t=a.next();if(t.done)return t;for(var e=R._unpackvar(s.varname,t.value),r=0;r")}},{key:"_eval",value:function(t){return this._get(t,this.name)}},{key:"_eval_set",value:function(t,e){this._set(t,this.name,e)}},{key:"_eval_modify",value:function(t,e,r){this._modify(t,e,this.name,r)}},{key:"_get",value:function(t,e){var r=t.get(e);return void 0===r&&(r=R.functions[e]),r}},{key:"_set",value:function(t,e,r){t.set(e,r)}},{key:"_modify",value:function(t,e,r,n){var o=e._ido(t.get(r),n);t.set(r,o)}}]),o}(),R.VarAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["name"]),R.UnaryAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).obj=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj="),this.obj._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._do(e)}}]),o}(),R.UnaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj"]),R.NegAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return null!==t&&"function"==typeof t.__neg__?t.__neg__():-t}}]),e}(),R.BitNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return-t-1}}]),e}(),R.NotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return!R._bool(t)}}]),e}(),R.IfAST=function(t){function a(t,e,r,n,o){var i;return E(this,a),(i=V(this,O(a).call(this,t,e))).objif=r,i.objcond=n,i.objelse=o,i}return L(a,R.CodeAST),P(a,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(1),t.push("objif="),this.objif._repr(t),t.push(0),t.push("objcond="),this.objcond._repr(t),t.push(0),t.push("objelse="),this.objelse._repr(t),t.push(-1),t.push(">")}},{key:"_eval",value:function(t){var e=this.objcond._handle_eval(t);return R._bool(e)?this.objif._handle_eval(t):this.objelse._handle_eval(t)}}]),a}(),R.IfAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["objif","objcond","objelse"]),R.ReturnAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);throw new R.ReturnException(e)}},{key:"_str",value:function(t){t.push("return "),this.obj._str(t)}}]),e}(),R.PrintAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._str(e);t.output(r)}},{key:"_str",value:function(t){t.push("print "),this.obj._str(t)}}]),e}(),R.PrintXAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._xmlescape(e);t.output(r)}},{key:"_str",value:function(t){t.push("printx "),this.obj._str(t)}}]),e}(),R.BinaryAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj1=r,o.obj2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj1="),this.obj1._repr(t),t.push(" obj2="),this.obj2._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj1._handle_eval(t),r=this.obj2._handle_eval(t);return this._do(e,r)}}]),i}(),R.BinaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj1","obj2"]),R.ItemAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return this._get(t,e)}},{key:"_eval_set",value:function(t,e){var r=this.obj1._handle_eval(t),n=this.obj2._handle_eval(t);this._set(r,n,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj1._handle_eval(t),o=this.obj2._handle_eval(t);this._modify(e,n,o,r)}},{key:"_get",value:function(t,e){if("string"==typeof t||R._islist(t)){if(e instanceof R.slice){var r=e.start,n=e.stop;return null==r&&(r=0),null==n&&(n=t.length),t.slice(r,n)}var o=e;if(e<0&&(e+=t.length),e<0||e>=t.length)throw new R.IndexError(t,o);return t[e]}if(t&&"function"==typeof t.__getitem__)return t.__getitem__(e);if(R._ismap(t))return t.get(e);throw new R.TypeError(R._type(t)+" object is not subscriptable")}},{key:"_set",value:function(t,e,r){if(R._islist(t))if(e instanceof R.slice){var n=e.start,o=e.stop;null===n?n=0:n<0&&(n+=t.length),n<0?n=0:n>t.length&&(n=t.length),null===o?o=t.length:o<0&&(o+=t.length),o<0?o=0:o>t.length&&(o=t.length),o=t.length)throw new R.IndexError(t,u);t[e]=r}else if(t&&"function"==typeof t.__setitem__)t.__setitem__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.NotSubscriptableError(t);t[e]=r}}},{key:"_modify",value:function(t,e,r,n){this._set(e,r,t._ido(this._get(e,r),n))}}]),e}(),R.IsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t===e}}]),e}(),R.IsNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t!==e}}]),e}(),R.EQAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._eq(t,e)}}]),e}(),R.NEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ne(t,e)}}]),e}(),R.LTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._lt(t,e)}}]),e}(),R.LEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._le(t,e)}}]),e}(),R.GTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._gt(t,e)}}]),e}(),R.GEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ge(t,e)}}]),e}(),R.ContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if("string"==typeof t&&"string"==typeof e)return-1!==e.indexOf(t);if(R._islist(e))return-1!==e.indexOf(t);if(e&&"function"==typeof e.__contains__)return e.__contains__(t);if(R._ismap(e)||R._isset(e))return e.has(t);if(R._isobject(e)){for(var r in e)if(r===t)return!0;return!1}if(R._iscolor(e))return e._r===t||e._g===t||e._b===t||e._a===t;throw new R.TypeError(R._type(e)+" object is not iterable")}}]),e}(),R.NotContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return!R.ContainsAST.prototype._do(t,e)}}]),e}(),R.AddAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__add__)return t.__add__(e);if(e&&"function"==typeof e.__radd__)return e.__radd__(t);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" + "+R._type(this.obj2)+" is not supported");return R._islist(t)&&R._islist(e)?N(t).concat(N(e)):t+e}},{key:"_ido",value:function(t,e){return R._islist(t)&&R._islist(e)?(R.ListProtocol.append(t,e),t):this._do(t,e)}}]),e}(),R.SubAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__sub__)return t.__sub__(e);if(e&&"function"==typeof e.__rsub__)return e.__rsub__(t);if(R._isdate(t)&&R._isdate(e))return this._date_sub(t,e);if(R._isdatetime(t)&&R._isdatetime(e))return this._datetime_sub(t,e);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" - "+R._type(this.obj2)+" is not supported");return t-e}},{key:"_date_sub",value:function(t,e){return this._datetime_sub(t._date,e._date)}},{key:"_datetime_sub",value:function(t,e){var r=t")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._get(e,this.attrname)}},{key:"_eval_set",value:function(t,e){var r=this.obj._handle_eval(t);this._set(r,this.attrname,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj._handle_eval(t);this._modify(e,n,this.attrname,r)}},{key:"_get",value:function(e,t){var r=R.Protocol.get(e);try{return r.getattr(e,t)}catch(t){if(t instanceof R.AttributeError&&t.obj===e)return;throw t}}},{key:"_set",value:function(t,e,r){if("object"===M(t)&&"function"==typeof t.__setattr__)t.__setattr__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.TypeError(R._type(t)+" object has no writable attributes");t[e]=r}}},{key:"_modify",value:function(t,e,r,n){var o=this._get(e,r),i=t._ido(o,n);this._set(e,r,i)}}]),i}(),R.AttrAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj","attrname"]),R.CallAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj=r,o.args=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_makeargs",value:function(t){for(var e=[],r={},n=0;n")}},{key:"_str",value:function(t){t.push("render "),t.push(this.tag.code.replace(/\r?\n/g," ")),null!==this.indent&&(t.push(" with indent "),t.push(R._repr(this.indent.text)))}},{key:"_handle_eval",value:function(t){var e=t.withindent(null!==this.indent?this.indent.text:null),r=this.obj._handle_eval(e),n=this._makeargs(e);this._handle_additional_arguments(e,n);try{return R._callrender(e,r,n.args,n.kwargs)}catch(t){throw this._decorate_exception(t),t}}},{key:"_handle_additional_arguments",value:function(t,e){}}]),i}(),R.RenderAST.prototype._ul4onattrs=R.CallAST.prototype._ul4onattrs.concat(["indent"]),R.RenderAST.prototype._reprname="RenderAST",R.RenderXAST=function(t){function r(){return E(this,r),V(this,O(r).apply(this,arguments))}return L(r,R.RenderAST),P(r,[{key:"_handle_eval",value:function(t){t.escapes.push(R._xmlescape);var e=null;try{e=I(O(r.prototype),"_handle_eval",this).call(this,t)}finally{t.escapes.splice(t.escapes.length-1,1)}return e}}]),r}(),R.RenderBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){if(e.kwargs.hasOwnProperty("content"))throw new R.ArgumentError("duplicate keyword argument content");var r=new R.TemplateClosure(this.content,this.content.signature,t.vars);e.kwargs.content=r}}]),e}(),R.RenderBlockAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.RenderBlocksAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){var r=t.inheritvars();for(var n in R.BlockAST.prototype._eval.call(this,r),r.vars)if(r.vars.hasOwnProperty(n)){if(n in e.kwargs)throw new R.ArgumentError("duplicate keyword argument "+n);e.kwargs[n]=r.get(n)}}}]),e}(),R.RenderBlocksAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.slice=function(t){function n(t,e){var r;return E(this,n),(r=V(this,O(n).call(this))).start=t,r.stop=e,r}return L(n,R.Proto),P(n,[{key:"of",value:function(t){var e=this.start||0,r=null===this.stop?t.length:this.stop;return t.slice(e,r)}},{key:"__repr__",value:function(){return"slice("+R._repr(this.start)+", "+R._repr(this.stop)+", None)"}},{key:"__getattr__",value:function(t){switch(t){case"start":return this.start;case"stop":return this.stop;default:throw new R.AttributeError(this,t)}}}]),n}(),R.SliceAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).index1=r,o.index2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){var e=null!==this.index1?this.index1._handle_eval(t):null,r=null!==this.index2?this.index2._handle_eval(t):null;return new R.slice(e,r)}}]),i}(),R.SliceAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["index1","index2"]),R.SetVarAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).lvalue=r,o.value=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" lvalue="),t.push(R._repr(this.lvalue)),t.push(" value="),this.value._repr(t),t.push(">")}},{key:"_eval",value:function(t){for(var e=this.value._handle_eval(t),r=R._unpackvar(this.lvalue,e),n=0;n")}},{key:"_str_varname",value:function(t,e){if(R._islist(e)){t.push("(");for(var r=0;r")}},{key:"_str",value:function(t){t.push("while "),this.condition._repr(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_eval",value:function(t){for(;;){var e=this.condition._handle_eval(t);if(!R._bool(e))break;try{I(O(o.prototype),"_eval",this).call(this,t)}catch(t){if(t instanceof R.BreakException)break;if(!(t instanceof R.ContinueException))throw t}}}}]),o}(),R.WhileBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.BreakAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.BreakException}},{key:"_str",value:function(t){t.push("break"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.ContinueAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.ContinueException}},{key:"_str",value:function(t){t.push("continue"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CondBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"_str",value:function(t){t.push(this._strname),t.push(" "),this.condition._str(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){var e=this.condition._handle_eval(t);return R._bool(e)}}]),o}(),R.ConditionalBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.IfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.IfBlockAST.prototype._strname="if",R.ElIfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.ElIfBlockAST.prototype._strname="else if",R.ElseBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_repr",value:function(t){t.push("")}},{key:"_str",value:function(t){t.push("else:"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){return!0}}]),e}(),R.Template=function(t){function l(t,e,r,n,o,i,a,u){var s;return E(this,l),(s=V(this,O(l).call(this,t,e)))._source=r,s.name=n,s.whitespace=o,s.startdelim=i,s.enddelim=a,s.docpos=null,s.signature=u,s._asts=null,s._ul4_callsignature=u,s._ul4_rendersignature=u,s.parenttemplate=null,s}return L(l,R.BlockAST),P(l,[{key:"__getattr__",value:function(t){var r=this;switch(t){case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;default:return I(O(l.prototype),"__getattr__",this).call(this,t)}}},{key:"ul4ondump",value:function(t){var e;if(t.dump(R.version),t.dump(this.name),t.dump(this._source),t.dump(this.whitespace),t.dump(this.startdelim),t.dump(this.enddelim),t.dump(this.docpos),t.dump(this.parenttemplate),null===this.signature||this.signature instanceof R.SignatureAST)e=this.signature;else{e=[];for(var r=0;r"!==this.enddelim&&(t.push(" enddelim="),t.push(R._repr(this.enddelim))),t.push(">")}},{key:"_str",value:function(t){t.push("def "),t.push(this.name?this.name:"unnamed"),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_renderbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(!(t instanceof R.ReturnException))throw t}}},{key:"__render__",value:function(t,e){this._renderbound(t,e)}},{key:"render",value:function(t,e){this._renderbound(t,e)}},{key:"_rendersbound",value:function(t,e){var r=t.replaceoutput();return this._renderbound(r,e),r.getoutput()}},{key:"renders",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._rendersbound(e,t)}},{key:"doc",value:function(){return null!=this.docpos?this.docpos.of(this._source):null}},{key:"_callbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(t instanceof R.ReturnException)return t.result;throw t}return null}},{key:"call",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._callbound(e,t)}},{key:"__call__",value:function(t,e){return this._callbound(t,e)}},{key:"ul4type",value:function(){return"template"}}]),l}(),R.Template.prototype._ul4_callneedsobject=!0,R.Template.prototype._ul4_callneedscontext=!0,R.Template.prototype._ul4_renderneedsobject=!0,R.Template.prototype._ul4_renderneedscontext=!0,R.SignatureAST=function(t){function o(t,e){var r;return E(this,o),(r=V(this,O(o).call(this,t,e))).params=[],r}return L(o,R.CodeAST),P(o,[{key:"ul4ondump",value:function(t){I(O(o.prototype),"ul4ondump",this).call(this,t);for(var e=[],r=0;r")}}]),o}(),R.TemplateClosure=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).template=t,n.signature=e,n.vars=r,n._ul4_callsignature=e,n._ul4_rendersignature=e,n.name=t.name,n.tag=t.tag,n.endtag=t.endtag,n._source=t._source,n.startdelim=t.startdelim,n.enddelim=t.enddelim,n.docpos=t.docpos,n.content=t.content,n}return L(o,R.Proto),P(o,[{key:"__render__",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"render",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"__call__",value:function(t,e){return this.template._callbound(t,R._inherit(this.vars,e))}},{key:"_renderbound",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"_rendersbound",value:function(t,e){return this.template._rendersbound(t,R._inherit(this.vars,e))}},{key:"__getattr__",value:function(t){var r=this;switch(t){case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;case"signature":return this.signature;default:return this.template.__getattr__(t)}}},{key:"ul4type",value:function(){return"template"}}]),o}(),R.TemplateClosure.prototype._ul4_callneedsobject=!0,R.TemplateClosure.prototype._ul4_callneedscontext=!0,R.TemplateClosure.prototype._ul4_renderneedsobject=!0,R.TemplateClosure.prototype._ul4_renderneedscontext=!0,R._rgb=function(t,e,r,n){return new this.Color(255*t,255*e,255*r,255*n)},R._xmlescape=function(t){return t=(t=(t=(t=(t=(t=R._str(t)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},R._csv=function(t){return null===t?"":("string"!=typeof t&&(t=R._repr(t)),-1===t.indexOf(",")&&-1===t.indexOf('"')&&-1===t.indexOf("\n")||(t='"'+t.replace(/"/g,'""')+'"'),t)},R._chr=function(t){if("number"!=typeof t)throw new R.TypeError("chr() requires an int");return String.fromCharCode(t)},R._ord=function(t){if("string"!=typeof t||1!=t.length)throw new R.TypeError("ord() requires a string of length 1");return t.charCodeAt(0)},R._hex=function(t){if("number"!=typeof t)throw new R.TypeError("hex() requires an int");return t<0?"-0x"+t.toString(16).substr(1):"0x"+t.toString(16)},R._oct=function(t){if("number"!=typeof t)throw new R.TypeError("oct() requires an int");return t<0?"-0o"+t.toString(8).substr(1):"0o"+t.toString(8)},R._bin=function(t){if("number"!=typeof t)throw new R.TypeError("bin() requires an int");return t<0?"-0b"+t.toString(2).substr(1):"0b"+t.toString(2)},R._min=function(t){if(0==t.length)throw new R.ArgumentError("min() requires at least 1 argument, 0 given");1==t.length&&(t=t[0]);for(var e,r=R._iter(t),n=!0;;){var o=r.next();if(o.done){if(n)throw new R.ValueError("min() argument is an empty sequence!");return e}(n||o.valuee)&&(e=o.value),n=!1}},R._sum=function(t){for(var e=1",t,e)}:function(t,e){return R._cmp("<=>",t,e)},i=R._list(e);return i.sort(o),i}for(var a=[],u=0,s=R._iter(e);;++u){var l=s.next();if(l.done)break;var c=R._call(t,r,[l.value],{});a.push([c,n?-u:u,l.value])}cmp=function(t,e){var r=R._cmp("<=>",t[0],e[0]);return r||(r=R._cmp("<=>",t[1],e[1])),n?-r:r},a.sort(cmp);for(var h=[],p=0;p=a?{done:!0}:{value:e+this.index++*n,done:!1}}}},R._slice=function(t){var e,r,n,o;if(t.length<2)throw new R.ArgumentError("required slice() argument missing");if(4= 0");if(n<0)throw new R.ValueError("slice() requires a stop argument >= 0");if(o<=0)throw new R.ValueError("slice() requires a step argument > 0");var i=r,a=0,u=R._iter(e);return{next:function(){for(var t;at.length||nt.length+1&&(o=t.length+1),o}r=R._bound(r,t.length),n=R._bound(n,t.length);var i=0;if(R._islist(t)){for(var a=r;an);)++i,u+=e.length;return i},R._find=function(t,e){var r=2t._date;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.Date)return this._date>=t._date;R._unorderable(">=",this,t)}},{key:"year",value:function(){return this._date.getFullYear()}},{key:"month",value:function(){return this._date.getMonth()+1}},{key:"day",value:function(){return this._date.getDate()}},{key:"ul4type",value:function(){return"date"}}]),o}(),R.TimeDelta=function(t){function a(){var t,e=0t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>t._microseconds;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.TimeDelta)return this._days!=t._days?this._days>t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>=t._microseconds;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.TimeDelta(-this._days,-this._seconds,-this._microseconds)}},{key:"adddate",value:function(t,e){var r=t._date.getFullYear(),n=t._date.getMonth(),o=t._date.getDate()+e;return new R.Date(r,n,o)}},{key:"_adddatetime",value:function(t,e,r,n){var o=t.getFullYear(),i=t.getMonth(),a=t.getDate()+e,u=t.getHours(),s=t.getMinutes(),l=t.getSeconds()+r,c=t.getMilliseconds()+n/1e3;return new Date(o,i,a,u,s,l,c)}},{key:"__add__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days+t._days,this._seconds+t._seconds,this._microseconds+t._microseconds);if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days-t._days,this._seconds-t._seconds,this._microseconds-t._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._days);if(R._isdatetime(t))return this._adddatetime(t,-this._days,-this._seconds,-this._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days/t,this._seconds/t,this._microseconds/t);if(t instanceof R.TimeDelta){var e=this._days,r=t._days,n=this._seconds||t._seconds,o=this._microseconds||t._microseconds;return(n||o)&&(e=86400*e+this._seconds,r=86400*r+t._seconds,o&&(e=1e6*e+this._microseconds,r=1e6*r+t._microseconds)),e/r}throw new R.TypeError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"days":var r=function(){return e._days};return R.expose(r,[]),r;case"seconds":var n=function(){return e._seconds};return R.expose(n,[]),n;case"microseconds":var o=function(){return e._microseconds};return R.expose(o,[]),o;default:throw new R.AttributeError(this,t)}}},{key:"days",value:function(){return this._days}},{key:"seconds",value:function(){return this._seconds}},{key:"microseconds",value:function(){return this._microseconds}},{key:"ul4type",value:function(){return"timedelta"}}]),a}(),R.MonthDelta=function(t){function r(){var t,e=0t._months;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.MonthDelta)return this._months>=t._months;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.MonthDelta(-this._months)}},{key:"_adddate",value:function(t,e){var r=this._adddatetime(t._date,e);return new R.Date(r.getFullYear(),r.getMonth()+1,r.getDate())}},{key:"_adddatetime",value:function(t,e){for(var r=t.getFullYear(),n=t.getMonth()+e,o=t.getDate(),i=t.getHours(),a=t.getMinutes(),u=t.getSeconds(),s=t.getMilliseconds();;){var l=new Date(r,n,1,i,a,u,s).getMonth(),c=new Date(r,n,o,i,a,u,s);if(c.getMonth()===l)return c;--o}}},{key:"__add__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months+t._months);if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months-t._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._months);if(R._isdatetime(t))return this._adddatetime(t,-this._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__floordiv__",value:function(t){if("number"==typeof t)return new R.MonthDelta(Math.floor(this._months/t));if(R._ismonthdelta(t))return Math.floor(this._months/t._months);throw new R.ArgumentError(R._type(this)+" // "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if(R._ismonthdelta(t))return this._months/t._months;throw new R.ArgumentError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"months":var r=function(){return e._months};return R.expose(r,[]),r;default:throw new R.AttributeError(this,t)}}},{key:"months",value:function(){return this._months}},{key:"ul4type",value:function(){return"monthdelta"}}]),r}();for(var H=[R.TextAST,R.IndentAST,R.LineEndAST,R.ConstAST,R.SeqItemAST,R.UnpackSeqItemAST,R.DictItemAST,R.UnpackDictItemAST,R.PosArgAST,R.KeywordArgAST,R.UnpackListArgAST,R.UnpackDictArgAST,R.ListAST,R.ListCompAST,R.DictAST,R.DictCompAST,R.SetAST,R.SetCompAST,R.GenExprAST,R.VarAST,R.NotAST,R.NegAST,R.BitNotAST,R.IfAST,R.ReturnAST,R.PrintAST,R.PrintXAST,R.ItemAST,R.IsAST,R.IsNotAST,R.EQAST,R.NEAST,R.LTAST,R.LEAST,R.GTAST,R.GEAST,R.NotContainsAST,R.ContainsAST,R.AddAST,R.SubAST,R.MulAST,R.FloorDivAST,R.TrueDivAST,R.ModAST,R.ShiftLeftAST,R.ShiftRightAST,R.BitAndAST,R.BitXOrAST,R.BitOrAST,R.AndAST,R.OrAST,R.SliceAST,R.AttrAST,R.CallAST,R.RenderAST,R.RenderXAST,R.RenderBlockAST,R.RenderBlocksAST,R.SetVarAST,R.AddVarAST,R.SubVarAST,R.MulVarAST,R.TrueDivVarAST,R.FloorDivVarAST,R.ModVarAST,R.ShiftLeftVarAST,R.ShiftRightVarAST,R.BitAndVarAST,R.BitXOrVarAST,R.BitOrVarAST,R.ForBlockAST,R.WhileBlockAST,R.BreakAST,R.ContinueAST,R.CondBlockAST,R.IfBlockAST,R.ElIfBlockAST,R.ElseBlockAST,R.SignatureAST,R.Template],X=0;X"}}]),e}(),K.Handler=function(){function t(){E(this,t)}return P(t,[{key:"save",value:function(t){}},{key:"delete",value:function(t){}}]),t}(),K.Globals=function(t){function e(){var t;return E(this,e),(t=V(this,O(e).call(this))).version=null,t.platform=null,t.user=null,t.maxdbactions=null,t.maxtemplateruntime=null,t.flashmessages=null,t.handler=new K.Handler,t}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}],[{key:"geodist",value:function(t,e){var r=function(t){return(t=Math.sin(t))*t},n=function(t){return(t=Math.cos(t))*t},o=Math.PI/180,i=1/298.257223563,a=t.lat*o,u=t.long*o,s=e.lat*o,l=(a+s)/2,c=(a-s)/2,h=(u-e.long*o)/2,p=r(c)*n(h)+n(l)*r(h),_=n(c)*n(h)+r(l)*r(h),f=Math.atan(Math.sqrt(p/_)),d=2*f*6378.137,v=Math.sqrt(p*_)/f,m=(3*v+1)/(2*p);return d*(1+i*((3*v-1)/(2*_))*r(l)*n(c)-i*m*n(l)*r(c))}}]),e}(),K.Globals.prototype._ul4onattrs=["version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"],K.Globals.prototype._ul4attrs=R._makeset("version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"),K.FlashMessage=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.FlashMessage.prototype._ul4onattrs=["timestamp","type","title","message"],K.FlashMessage.prototype._ul4attrs=R._makeset("timestamp","type","title","message"),K.App=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}},{key:"insert",value:function(){var t=0"}}]),e}(),K.View.prototype._ul4onattrs=["id","name","app","order","width","height","start","end"],K.View.prototype._ul4attrs=R._makeset("id","name","app","order","width","height","start","end"),K.DataSourceData=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.DataSourceData.prototype._ul4onattrs=["id","identifier","app","apps"],K.DataSourceData.prototype._ul4attrs=R._makeset("id","identifier","app","apps"),K.Record=function(t){function r(t){var e;return E(this,r),(e=V(this,O(r).call(this))).id=null,e.app=t,e.createdat=null,e.createdby=null,e.updatedat=null,e.updatedby=null,e.updatecount=0,e._sparsevalues=new Map,e._values=null,e._fields=null,e.children=new Map,e.attachments=null,e.errors=[],e._is_deleted=!1,e}return L(r,K.Base),P(r,[{key:"__repr__",value:function(){var t=[""),t.join("")}},{key:"is_dirty",value:function(){if(null===this.id)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.is_dirty())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"has_errors",value:function(){if(0!==this.errors.length)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.has_errors())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"delete",value:function(){return this.app.globals.handler.delete(this)}},{key:"save",value:function(){this.app.globals.handler.save(this)}},{key:"update",value:function(){var t=0"}},{key:"_logsearch",value:function(t,e){}},{key:"search",value:function(t,e){return!1}}]),e}(),K.Control.prototype.type=null,K.Control.prototype.subtype=null,K.Control.prototype._ul4onattrs=["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],K.Control.prototype._ul4attrs=R._makeset("id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"),K.BoolControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.BoolControl.prototype.type="bool",K.IntControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.IntControl.prototype.type="int",K.NumberControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator?e.value===t:"range"===e.operator&&(null!==t&&((null===e.minvalue||e.minvalue<=t)&&(null===e.maxvalue||t"}},{key:"value",get:function(){return this._value},set:function(t){var e=this._value;R._ne(e,t)&&(this.record.values.set(this.control.identifier,t),this._value=t,this._dirty=!0)}}]),o}(),K.LookupItem=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.LookupItem.prototype._ul4onattrs=["key","label"],K.LookupItem.prototype._ul4attrs=R._makeset("key","label"),K.User=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.User.prototype._ul4onattrs=["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],K.User.prototype._ul4attrs=R._makeset("_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"),K.File=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.File.prototype._ul4onattrs=["id","url","filename","mimetype","width","height","internalid","createdat","size"],K.File.prototype._ul4attrs=R._makeset("id","url","filename","mimetype","width","height","size","createdat"),K.Geo=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).lat=t,n.long=e,n.info=r,n}return L(o,K.Base),P(o,[{key:"__repr__",value:function(){return""}}]),o}(),K.Geo.prototype._ul4onattrs=["lat","long","info"],K.Geo.prototype._ul4attrs=R._makeset("lat","long","info"),K.Attachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Attachment.prototype._ul4onattrs=["id","record","label","active"],K.Attachment.prototype._ul4attrs=R._makeset("id","record","label","active"),K.NoteAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.NoteAttachment.prototype.type="noteattachment",K.NoteAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.NoteAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.URLAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.URLAttachment.prototype.type="urlattachment",K.URLAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.URLAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.FileAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.FileAttachment.prototype.type="fileattachment",K.FileAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.FileAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.ImageAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.ImageAttachment.prototype.type="imageattachment",K.ImageAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["original","thumb","small","medium","large"]),K.ImageAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["original","thumb","small","medium","large"])),K.JSONAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),P(e,[{key:"_dumpUL4ONAttr",value:function(t){return"value"===t?R._asjson(this.value):this[t]}},{key:"_loadUL4ONAttr",value:function(t,e){"value"===t?this.value=R._fromjson(e):this[t]=e}}]),e}(),K.JSONAttachment.prototype.type="jsonattachment",K.JSONAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.JSONAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.Installation=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Installation.prototype._ul4onattrs=["id","name"],K.Installation.prototype._ul4attrs=R._makeset("id","name"),K.Category=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){for(var t=[],e=this;null!==e;)t.splice(0,0,e.identifier),e=e.parent;return""}}]),e}(),K.Category.prototype._ul4onattrs=["id","identifier","name","order","parent","children","apps"],K.Category.prototype._ul4attrs=R._makeset("id","identifier","name","order","parent","children","apps"),K.KeyView=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.KeyView.prototype._ul4onattrs=["id","identifier","name","key","user"],K.KeyView.prototype._ul4attrs=R._makeset("id","identifier","name","key","user"),K.AppParameter=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.AppParameter.prototype._ul4onattrs=["id","app","identifier","description","value"],K.AppParameter.prototype._ul4attrs=R._makeset("id","app","identifier","description","value");for(var W=[K.Globals,K.App,K.View,K.DataSourceData,K.Record,K.BoolControl,K.IntControl,K.NumberControl,K.TextControl,K.EmailControl,K.URLControl,K.TelControl,K.PasswordControl,K.TextAreaControl,K.DateControl,K.DatetimeMinuteControl,K.DatetimeSecondControl,K.LookupControl,K.LookupSelectControl,K.LookupRadioControl,K.LookupChoiceControl,K.AppLookupControl,K.AppLookupSelectControl,K.AppLookupRadioControl,K.AppLookupChoiceControl,K.MultipleLookupControl,K.MultipleLookupSelectControl,K.MultipleLookupCheckboxControl,K.MultipleLookupChoiceControl,K.MultipleAppLookupControl,K.MultipleAppLookupSelectControl,K.MultipleAppLookupCheckboxControl,K.MultipleAppLookupChoiceControl,K.GeoControl,K.FileControl,K.ButtonControl,K.Field,K.LookupItem,K.User,K.File,K.Geo,K.NoteAttachment,K.URLAttachment,K.FileAttachment,K.ImageAttachment,K.JSONAttachment,K.Installation,K.Category,K.KeyView,K.AppParameter],$=0;$ 1) {\n\t\t\t\toldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (i = 1; i < arguments.length; ++i)\n\t\t\t\t\tthis.dump(arguments[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t},\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish: function finish() {\n\t\t\treturn this.data.join(\"\");\n\t\t},\n\n\t\tdump: function dump(obj) {\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof (obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof (obj) == \"number\") {\n\t\t\t\tvar type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof (obj) == \"string\") {\n\t\t\t\tvar index = this._strings2index[obj];\n\t\t\t\tif (typeof (index) !== \"undefined\") {\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tthis._line(\"S\" + ul4._str_repr(obj));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.slice))\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump) {\n\t\t\t\tif (obj.__id__) {\n\t\t\t\t\tvar index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof (index) != \"undefined\") {\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (obj.__id__)\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj)) {\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var i in obj)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj)) {\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj)) {\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (var key in obj) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj)) {\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function (value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow \"can't handle object\";\n\t\t}\n\t};\n\n// Helper \"class\" for decoding\nul4on.Decoder = {\n\t// Creates a new decoder for reading from the string ``data``\n\tcreate: function create(data, registry) {\n\t\tvar decoder = ul4._clone(this);\n\t\tdecoder.data = data;\n\t\tdecoder.pos = 0;\n\t\tdecoder.backrefs = [];\n\t\tdecoder.registry = typeof (registry) === \"undefined\" ? null : registry;\n\t\treturn decoder;\n\t},\n\n\t// Read a character from the buffer\n\treadchar: function readchar() {\n\t\tif (this.pos >= this.data.length)\n\t\t\tthrow \"UL4 decoder at EOF\";\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read a character from the buffer (return null on eof)\n\treadcharoreof: function readcharoreof() {\n\t\tif (this.pos >= this.data.length)\n\t\t\treturn null;\n\t\treturn this.data.charAt(this.pos++);\n\t},\n\n\t// Read next not-whitespace character from the buffer\n\treadblackchar: function readblackchar() {\n\t\tvar re_white = /\\s/;\n\n\t\tfor (; ;) {\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow \"UL4 decoder at EOF\";\n\t\t\tvar c = this.data.charAt(this.pos++);\n\t\t\tif (!c.match(re_white))\n\t\t\t\treturn c;\n\t\t}\n\t},\n\n\t// Read ``size`` characters from the buffer\n\tread: function read(size) {\n\t\tif (this.pos + size > this.length)\n\t\t\tsize = this.length - this.pos;\n\t\tvar result = this.data.substring(this.pos, this.pos + size);\n\t\tthis.pos += size;\n\t\treturn result;\n\t},\n\n\t// \"unread\" one character\n\tbackup: function backup() {\n\t\t--this.pos;\n\t},\n\n\t// Read a number from the buffer\n\treadnumber: function readnumber() {\n\t\tvar re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\tfor (; ;) {\n\t\t\tvar c = this.readcharoreof();\n\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\tvalue += c;\n\t\t\telse {\n\t\t\t\tvar result = parseFloat(value);\n\t\t\t\tif (result == NaN)\n\t\t\t\t\tthrow \"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t},\n\n\t_beginfakeloading: function _beginfakeloading() {\n\t\tvar oldpos = this.backrefs.length;\n\t\tthis.backrefs.push(null);\n\t\treturn oldpos;\n\t},\n\n\t_endfakeloading: function _endfakeloading(oldpos, value) {\n\t\tthis.backrefs[oldpos] = value;\n\t},\n\n\t_readescape: function _readescape(escapechar, length) {\n\t\tvar chars = this.read(length);\n\t\tif (chars.length != length)\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\tvar codepoint = parseInt(chars, 16);\n\t\tif (isNaN(codepoint))\n\t\t\tthrow \"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos;\n\t\treturn String.fromCharCode(codepoint);\n\t},\n\n\t// Load the next object from the buffer\n\tload: function load() {\n\t\tvar typecode = this.readblackchar();\n\t\tvar result;\n\t\tswitch (typecode) {\n\t\t\tcase \"^\":\n\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\tcase \"n\":\n\t\t\tcase \"N\":\n\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\treturn null;\n\t\t\tcase \"b\":\n\t\t\tcase \"B\":\n\t\t\t\tresult = this.readchar();\n\t\t\t\tif (result === \"T\")\n\t\t\t\t\tresult = true;\n\t\t\t\telse if (result === \"F\")\n\t\t\t\t\tresult = false;\n\t\t\t\telse\n\t\t\t\t\tthrow \"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos;\n\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"i\":\n\t\t\tcase \"I\":\n\t\t\tcase \"f\":\n\t\t\tcase \"F\":\n\t\t\t\tresult = this.readnumber();\n\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"s\":\n\t\t\tcase \"S\":\n\t\t\t\tresult = [];\n\t\t\t\tvar delimiter = this.readblackchar();\n\t\t\t\tfor (; ;) {\n\t\t\t\t\tvar c = this.readchar();\n\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (c == \"\\\\\") {\n\t\t\t\t\t\tvar c2 = this.readchar();\n\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tresult.push(c);\n\t\t\t\t}\n\t\t\t\tresult = result.join(\"\");\n\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"c\":\n\t\t\tcase \"C\":\n\t\t\t\tresult = ul4.Color.create();\n\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._r = this.load();\n\t\t\t\tresult._g = this.load();\n\t\t\t\tresult._b = this.load();\n\t\t\t\tresult._a = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"z\":\n\t\t\tcase \"Z\":\n\t\t\t\tresult = new Date();\n\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\tresult.setDate(1);\n\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\tresult.setDate(this.load());\n\t\t\t\tresult.setHours(this.load());\n\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\tresult.setMilliseconds(this.load() / 1000);\n\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"t\":\n\t\t\tcase \"T\":\n\t\t\t\tresult = ul4.TimeDelta.create();\n\t\t\t\tresult._days = this.load();\n\t\t\t\tresult._seconds = this.load();\n\t\t\t\tresult._microseconds = this.load();\n\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\treturn result;\n\t\t\tcase \"r\":\n\t\t\tcase \"R\":\n\t\t\t\tresult = ul4.slice.create();\n\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult.start = this.load();\n\t\t\t\tresult.stop = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"m\":\n\t\t\tcase \"M\":\n\t\t\t\tresult = ul4.MonthDelta.create();\n\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tresult._months = this.load();\n\t\t\t\treturn result;\n\t\t\tcase \"l\":\n\t\t\tcase \"L\":\n\t\t\t\tresult = [];\n\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.push(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"d\":\n\t\t\tcase \"D\":\n\t\t\tcase \"e\":\n\t\t\tcase \"E\":\n\t\t\t\tif (!ul4on._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\tthrow \"ordered dictionaries are not supported!\";\n\t\t\t\tresult = ul4on._emptymap();\n\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tvar key = this.load();\n\t\t\t\t\tvar value = this.load();\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"y\":\n\t\t\tcase \"Y\":\n\t\t\t\tresult = ul4on._makeset();\n\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\tfor (; ;) {\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\treturn result;\n\t\t\t\t\tthis.backup();\n\t\t\t\t\tresult.add(this.load());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\tcase \"o\":\n\t\t\tcase \"O\":\n\t\t\t\tvar oldpos;\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\tvar name = this.load();\n\t\t\t\tvar proto;\n\t\t\t\tif (this.registry !== null) {\n\t\t\t\t\tproto = this.registry[name];\n\t\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tproto = ul4on._registry[name];\n\t\t\t\tif (typeof (proto) === \"undefined\")\n\t\t\t\t\tthrow \"can't load object of type \" + ul4._repr(name);\n\t\t\t\tresult = proto();\n\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\tresult.ul4onload(this);\n\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\tthrow \"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t\t\treturn result;\n\t\t\tdefault:\n\t\t\t\tthrow \"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos;\n\t\t}\n\t},\n\n\t// Return an iterator for loading the content of a object\n\tloadcontent: function load(loadcontent) {\n\t\tlet self = this;\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\tself.backup();\n\t\t\t\tif (typecode == \")\")\n\t\t\t\t\treturn { done: true };\n\t\t\t\telse\n\t\t\t\t\treturn { done: false, value: self.load() };\n\t\t\t}\n\t\t};\n\t}\n};\n\n\n//\n// UL4\n//\n\n// REs for parsing JSON\nul4._rvalidchars = /^[\\],:{}\\s]*$/;\nul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n/// Helper functions\n\n// Crockford style object creation\nul4._simpleclone = function _simpleclone(obj) {\n\tfunction F() { };\n\tF.prototype = obj;\n\tvar result = new F();\n\treturn result;\n};\n\n// Crockford style object creation + prototype chain + object ids\nul4._clone = function _clone(obj) {\n\tvar result = ul4._simpleclone(obj);\n\tresult.__prototype__ = obj;\n\tresult.__id__ = ul4.Proto._nextid++;\n\treturn result;\n};\n\n// Adds attributes from on object to another and returns it\nul4._extend = function _extend(obj, attrs) {\n\tfor (var name in attrs)\n\t\tobj[name] = attrs[name];\n\treturn obj;\n};\n\n// Clone an object via ``_simpleclone`` and extend it\nul4._simpleinherit = function _simpleinherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._simpleclone(baseobj), attrs);\n};\n\n// Clone an object via ``_clone`` and extend it\nul4._inherit = function _inherit(baseobj, attrs) {\n\treturn ul4._extend(ul4._clone(baseobj), attrs);\n};\n\n// Convert a map to an object\nul4._map2object = function _map2object(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar newobj = {};\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (typeof (key) !== \"string\")\n\t\t\t\tthrow ul4.TypeError.create(\"keys must be strings\");\n\t\t\tnewobj[key] = value;\n\t\t});\n\t\treturn newobj;\n\t}\n\treturn obj;\n};\n\n// Clip a number to the range [0;max)\nul4._bound = function _bound(value, upper) {\n\tif (value < 0)\n\t\treturn 0;\n\telse if (value > upper)\n\t\treturn upper;\n\telse\n\t\treturn value;\n};\n\n// Create a pretty stacktrace from an exception\nul4._stacktrace = function _stacktrace(exc) {\n\tvar output = ul4._type(exc);\n\tvar s = exc.toString();\n\tif (s)\n\t\toutput += \": \" + s;\n\tif (exc.cause)\n\t\toutput += \"\\n\\n\" + ul4._stacktrace(exc.cause);\n\treturn output;\n};\n\n// Call a function ``f`` with UL4 argument handling\nul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) {\n\tvar finalargs;\n\tif (needsobject) {\n\t\tif (signature === null) {\n\t\t\tif (args.length)\n\t\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = [kwargs];\n\t\t}\n\t\telse\n\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t}\n\telse {\n\t\tif (signature === null)\n\t\t\tthrow ul4.ArgumentError.create(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t}\n\tif (needscontext)\n\t\tfinalargs.unshift(context);\n\treturn f.apply(functioncontext, finalargs);\n};\n\nul4._callfunction = function _callfunction(context, f, args, kwargs) {\n\tvar name = f._ul4_name || f.name;\n\tif (typeof (f._ul4_signature) === \"undefined\" || typeof (f._ul4_needsobject) === \"undefined\" || typeof (f._ul4_needscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", \"function \" + ul4.repr(f) + \" is not callable by UL4\");\n\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n}\n\nul4._callobject = function _callobject(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_callsignature) === \"undefined\" || typeof (obj._ul4_callneedsobject) === \"undefined\" || typeof (obj._ul4_callneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"call\", ul4.type(obj) + \" object is not callable by UL4\");\n\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n}\n\nul4._callrender = function _callrender(context, obj, args, kwargs) {\n\tif (typeof (obj._ul4_rendersignature) === \"undefined\" || typeof (obj._ul4_renderneedsobject) === \"undefined\" || typeof (obj._ul4_renderneedscontext) === \"undefined\")\n\t\tthrow ul4.TypeError.create(\"render\", ul4.type(obj) + \" object is not renderable by UL4\");\n\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n}\n\nul4._call = function _call(context, f, args, kwargs) {\n\tif (typeof (f) === \"function\")\n\t\treturn ul4._callfunction(context, f, args, kwargs);\n\telse if (f && typeof (f.__call__) === \"function\")\n\t\treturn ul4._callobject(context, f, args, kwargs);\n\telse\n\t\tthrow ul4.TypeError.create(\"call\", ul4._type(f) + \" is not callable\");\n}\n\nul4._unpackvar = function _unpackvar(lvalue, value) {\n\tif (!ul4._islist(lvalue))\n\t\treturn [[lvalue, value]];\n\telse {\n\t\tvar newvalue = [];\n\t\tvar iter = ul4._iter(value);\n\n\t\tfor (var i = 0; ; ++i) {\n\t\t\tvar item = iter.next();\n\n\t\t\tif (item.done) {\n\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\telse\n\t\t\t\t\tthrow ul4.ValueError.create(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t}\n\t\t}\n\t\treturn newvalue;\n\t}\n};\n\nul4._formatsource = function _formatsource(out) {\n\tvar finalout = [];\n\tvar level = 0, needlf = false;\n\tfor (var i = 0; i < out.length; ++i) {\n\t\tif (typeof (out[i]) === \"number\") {\n\t\t\tlevel += out[i];\n\t\t\tneedlf = true;\n\t\t}\n\t\telse {\n\t\t\tif (needlf) {\n\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\tfor (var j = 0; j < level; ++j)\n\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\tneedlf = false;\n\t\t\t}\n\t\t\tfinalout.push(out[i]);\n\t\t}\n\t}\n\tif (needlf)\n\t\tfinalout.push(\"\\n\");\n\treturn finalout.join(\"\");\n};\n\n// Compare ``obj1`` and ``obj2`` if they have the same value\nul4._eq = function _eq(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__eq__) === \"function\")\n\t\treturn obj1.__eq__(obj2);\n\telse if (obj2 && typeof (obj2.__eq__) === \"function\")\n\t\treturn obj2.__eq__(obj1);\n\telse if (obj1 === null)\n\t\treturn obj2 === null;\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 == obj2\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 == obj2;\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.length != obj2.length)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isobject(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.hasOwnProperty(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tfor (var key in obj1) {\n\t\t\t\tif (obj2.has(key)) {\n\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tvar result = true;\n\t\t\tobj2.forEach(function (value, key) {\n\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\tresult = false;\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._ismap(obj1)) {\n\t\tif (ul4._isobject(obj2)) {\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!result)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before)\n\t\t\tfor (var key in obj2) {\n\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse if (ul4._ismap(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value, key) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse if (ul4._isset(obj1)) {\n\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\tif (ul4._isset(obj2)) {\n\t\t\t// Shortcut, if it's the same object\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tif (obj1.size != obj2.size)\n\t\t\t\treturn false;\n\t\t\tvar result = true;\n\t\t\tobj1.forEach(function (value) {\n\t\t\t\tif (result) // Skip code, if result is already ``false``\n\t\t\t\t{\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\telse\n\t\treturn obj1 === obj2;\n};\n\n// Compare ``obj1`` and ``obj2`` if they don't have the same value\nul4._ne = function _ne(obj1, obj2) {\n\tif (obj1 && typeof (obj1.__ne__) === \"function\")\n\t\treturn obj1.__ne__(obj2);\n\telse if (obj2 && typeof (obj2.__ne__) === \"function\")\n\t\treturn obj2.__ne__(obj1);\n\telse\n\t\treturn !ul4._eq(obj1, obj2);\n}\n\nul4._unorderable = function _unorderable(operator, obj1, obj2) {\n\tthrow ul4.TypeError.create(operator, \"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n};\n\n// Return:\n// -1 when ``obj1 < obj2``,\n// 0 when ``obj1 == obj2``,\n// 1 when ``obj1 > obj2``,\n// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n// raise TypeError if objects are uncomparable\n// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\nul4._cmp = function _cmp(operator, obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2)) {\n\t\t\tvar v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t}\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn 0;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn 1;\n\t\t\t\tvar res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t}\n\t}\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\telse\n\t\tul4._unorderable(operator, obj1, obj2);\n}\n\n// Return whether ``obj1 < obj2``\nul4._lt = function _lt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__lt__) === \"function\")\n\t\treturn obj1.__lt__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 < obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() < obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length < obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1)) {\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<\", obj1, obj2);\n};\n\n// Return whether ``obj1 <= obj2``\nul4._le = function _le(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__le__) === \"function\")\n\t\treturn obj1.__le__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 <= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length <= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\"<=\", obj1, obj2);\n};\n\n// Return whether ``obj1 > obj2``\nul4._gt = function _gt(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__gt__) === \"function\")\n\t\treturn obj1.__gt__(obj2);\n\tif (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 > obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() > obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn false;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length > obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">\", obj1, obj2);\n};\n\n// Return whether ``obj1 >= obj2``\nul4._ge = function _ge(obj1, obj2) {\n\tvar numbertypes = [\"boolean\", \"number\"];\n\n\tif (obj1 && typeof (obj1.__ge__) === \"function\")\n\t\treturn obj1.__ge__(obj2);\n\telse if (numbertypes.indexOf(typeof (obj1)) != -1) {\n\t\tif (numbertypes.indexOf(typeof (obj2)) != -1)\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (typeof (obj1) === \"string\") {\n\t\tif (typeof (obj2) === \"string\")\n\t\t\treturn obj1 >= obj2;\n\t}\n\telse if (ul4._isdate(obj1)) {\n\t\tif (ul4._isdate(obj2))\n\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t}\n\telse if (ul4._islist(obj1)) {\n\t\tif (ul4._islist(obj2)) {\n\t\t\tif (obj1 === obj2)\n\t\t\t\treturn true;\n\t\t\tfor (var i = 0; i < obj1.length; ++i) {\n\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\treturn true;\n\t\t\t\tvar eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\tif (!eq)\n\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t}\n\t\t\treturn obj1.length >= obj2.length;\n\t\t}\n\t}\n\t// FIXME: Set comparison\n\telse if (ul4._isset(obj1) || ul4._isul4set(obj1)) {\n\t\tvar in1only = false;\n\t\tvar in2only = false;\n\n\t\tif (ul4._isset(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tobj1.forEach(function (value) {\n\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t});\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.has(value)) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isul4set(obj2)) {\n\t\t\tif (ul4._isset(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.has(value)) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobj2.forEach(function (value) {\n\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2)) {\n\t\t\t\tfor (var value in obj1.items) {\n\t\t\t\t\tif (!obj2.items[value]) {\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var value in obj2.items) {\n\t\t\t\t\tif (!obj1.items[value]) {\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\tif (in1only) {\n\t\t\tif (in2only)\n\t\t\t\treturn null;\n\t\t\telse\n\t\t\t\treturn 1;\n\t\t}\n\t\telse {\n\t\t\tif (in2only)\n\t\t\t\treturn -1;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tul4._unorderable(\">=\", obj1, obj2);\n};\n\n// Return an iterator for ``obj``\nul4._iter = function _iter(obj) {\n\tif (typeof (obj) === \"string\" || ul4._islist(obj)) {\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\treturn { value: obj[this.index++], done: false };\n\t\t\t\telse\n\t\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isiter(obj))\n\t\treturn obj;\n\telse if (obj !== null && typeof (obj.__iter__) === \"function\")\n\t\treturn obj.__iter__();\n\telse if (ul4._ismap(obj)) {\n\t\tvar keys = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tkeys.push(key);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isset(obj)) {\n\t\tvar values = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tvalues.push(value);\n\t\t});\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: values[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse if (ul4._isul4set(obj)) {\n\t\treturn ul4._iter(obj.items);\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar keys = [];\n\t\tfor (var key in obj)\n\t\t\tkeys.push(key);\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function () {\n\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\treturn { done: true };\n\t\t\t\treturn { value: keys[this.index++], done: false };\n\t\t\t}\n\t\t};\n\t}\n\tthrow ul4.TypeError.create(\"iter\", ul4._type(obj) + \" object is not iterable\");\n};\n\nul4._str_repr = function _str_repr(str, ascii) {\n\tvar result = \"\";\n\tvar squote = false, dquote = false;\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tif (c == '\"') {\n\t\t\tdquote = true;\n\t\t\tif (squote)\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (c == \"'\") {\n\t\t\tsquote = true;\n\t\t\tif (dquote)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\tvar quote = (squote && !dquote) ? '\"' : \"'\";\n\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase '\"':\n\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\tbreak;\n\t\t\tcase \"'\":\n\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tvar escape;\n\t\t\t\tif (code < 32)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\tescape = 0;\n\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\tescape = 2;\n\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\tescape = 4;\n\t\t\t\telse\n\t\t\t\t\tescape = 8;\n\n\t\t\t\tif (escape === 0)\n\t\t\t\t\tresult += c;\n\t\t\t\telse if (escape === 2)\n\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\telse if (escape === 4)\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn quote + result + quote;\n};\n\nul4._date_repr = function _date_repr(obj, ascii) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tvar result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\tresult += \")\";\n\n\treturn result;\n};\n\nul4._map_repr = function _map_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\n\tvar i = 0;\n\tobj.forEach(function (value, key) {\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(value, ascii));\n\t});\n\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._list_repr = function _list_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"[\");\n\tfor (var i = 0; i < obj.length; ++i) {\n\t\tif (i !== 0)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(obj[i], ascii));\n\t}\n\tv.push(\"]\");\n\treturn v.join(\"\");\n};\n\nul4._set_repr = function _set_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tif (!obj.size)\n\t\tv.push(\"/\");\n\telse {\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._object_repr = function _object_repr(obj, ascii) {\n\tvar v = [];\n\tv.push(\"{\");\n\tvar i = 0;\n\tfor (var key in obj) {\n\t\tif (!obj.hasOwnProperty(key))\n\t\t\tcontinue;\n\t\tif (i++)\n\t\t\tv.push(\", \");\n\t\tv.push(ul4._repr_internal(key, ascii));\n\t\tv.push(\": \");\n\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t}\n\tv.push(\"}\");\n\treturn v.join(\"\");\n};\n\nul4._repr_internal = function _repr_internal(obj, ascii) {\n\tif (obj === null)\n\t\treturn \"None\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_repr(obj, ascii);\n\telse if (typeof (obj) === \"number\")\n\t\treturn \"\" + obj;\n\telse if (typeof (obj) === \"function\")\n\t\tif (obj._ul4_name || obj.name)\n\t\t\treturn \"\";\n\t\telse\n\t\t\treturn \"\";\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_repr(obj, ascii);\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj, ascii);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj, ascii);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj, ascii);\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj, ascii);\n\treturn \"?\";\n};\n\n// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\nul4._repr = function _repr(obj) {\n\treturn ul4._repr_internal(obj, false);\n}\n\nul4._ascii = function _ascii(obj) {\n\treturn ul4._repr_internal(obj, true);\n}\n\nul4._date_str = function _date_str(obj) {\n\tvar year = obj.getFullYear();\n\tvar month = obj.getMonth() + 1;\n\tvar day = obj.getDate();\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\n\tvar result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\tif (ms)\n\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\treturn result;\n};\n\nul4._str = function _str(obj) {\n\tif (typeof (obj) === \"undefined\")\n\t\treturn \"\";\n\telse if (obj === null)\n\t\treturn \"\";\n\telse if (obj === false)\n\t\treturn \"False\";\n\telse if (obj === true)\n\t\treturn \"True\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn obj;\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj.toString();\n\telse if (ul4._isdate(obj))\n\t\treturn ul4._date_str(obj);\n\telse if (ul4._islist(obj))\n\t\treturn ul4._list_repr(obj);\n\telse if (ul4._isset(obj))\n\t\treturn ul4._set_repr(obj);\n\telse if (ul4._ismap(obj))\n\t\treturn ul4._map_repr(obj);\n\telse if (typeof (obj) === \"object\" && typeof (obj.__str__) === \"function\")\n\t\treturn obj.__str__();\n\telse if (typeof (obj) === \"object\" && typeof (obj.__repr__) === \"function\")\n\t\treturn obj.__repr__();\n\telse if (ul4._isobject(obj))\n\t\treturn ul4._object_repr(obj);\n\treturn \"?\";\n};\n\n// Convert ``obj`` to bool, according to its \"truth value\"\nul4._bool = function _bool(obj) {\n\tif (typeof (obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\treturn false;\n\telse {\n\t\tif (typeof (obj) === \"object\", typeof (obj.__bool__) === \"function\")\n\t\t\treturn obj.__bool__();\n\t\tif (ul4._islist(obj))\n\t\t\treturn obj.length !== 0;\n\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\treturn obj.size != 0;\n\t\telse if (ul4._isobject(obj)) {\n\t\t\tfor (var key in obj) {\n\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\nul4._int = function _int(obj, base) {\n\tvar result;\n\tif (base !== null) {\n\t\tif (typeof (obj) !== \"string\" || !ul4._isint(base))\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"int() requires a string and an integer\");\n\t\tresult = parseInt(obj, base);\n\t\tif (result.toString() == \"NaN\")\n\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\treturn result;\n\t}\n\telse {\n\t\tif (typeof (obj) == \"string\") {\n\t\t\tresult = parseInt(obj);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow ul4.TypeError.create(\"int()\", \"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse if (typeof (obj) == \"number\")\n\t\t\treturn Math.floor(obj);\n\t\telse if (obj === true)\n\t\t\treturn 1;\n\t\telse if (obj === false)\n\t\t\treturn 0;\n\t\tthrow ul4.TypeError.create(\"int()\", \"int() argument must be a string or a number\");\n\t}\n};\n\n// Convert ``obj`` to a float\nul4._float = function _float(obj) {\n\tif (typeof (obj) === \"string\")\n\t\treturn parseFloat(obj);\n\telse if (typeof (obj) === \"number\")\n\t\treturn obj;\n\telse if (obj === true)\n\t\treturn 1.0;\n\telse if (obj === false)\n\t\treturn 0.0;\n\tthrow ul4.TypeError.create(\"float()\", \"float() argument must be a string or a number\");\n};\n\n// Convert ``obj`` to a list\nul4._list = function _list(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = [];\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.push(value.value);\n\t}\n};\n\n// Convert ``obj`` to a set\nul4._set = function _set(obj) {\n\tvar iter = ul4._iter(obj);\n\n\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\tfor (; ;) {\n\t\tvar value = iter.next();\n\t\tif (value.done)\n\t\t\treturn result;\n\t\tresult.add(value.value);\n\t}\n};\n\n// Return the length of ``sequence``\nul4._len = function _len(sequence) {\n\tif (typeof (sequence) == \"string\" || ul4._islist(sequence))\n\t\treturn sequence.length;\n\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\treturn sequence.size;\n\telse if (ul4._isobject(sequence)) {\n\t\tvar i = 0;\n\t\tfor (var key in sequence)\n\t\t\t++i;\n\t\treturn i;\n\t}\n\tthrow ul4.TypeError.create(\"len\", \"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n};\n\nul4._type = function _type(obj) {\n\tif (obj === null)\n\t\treturn \"none\";\n\telse if (obj === false || obj === true)\n\t\treturn \"bool\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"undefined\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn \"str\";\n\telse if (typeof (obj) === \"number\")\n\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\telse if (ul4._islist(obj))\n\t\treturn \"list\";\n\telse if (ul4._isset(obj))\n\t\treturn \"set\";\n\telse if (ul4._isdate(obj))\n\t\treturn \"date\";\n\telse if (typeof (obj.__type__) !== \"undefined\")\n\t\treturn obj.__type__;\n\telse if (ul4._istimedelta(obj))\n\t\treturn \"timedelta\";\n\telse if (ul4._isdict(obj))\n\t\treturn \"dict\";\n\telse if (ul4._istemplate(obj))\n\t\treturn \"template\";\n\telse if (ul4._isfunction(obj))\n\t\treturn \"function\";\n\treturn null;\n};\n\n\n// Return whether any of the items in ``iterable`` are true\nul4._any = function _any(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn false;\n\t\t\tif (ul4._bool(item.value))\n\t\t\t\treturn true;\n\t\t}\n\t}\n};\n\n// Return whether all of the items in ``iterable`` are true\nul4._all = function _all(iterable) {\n\tif (typeof (iterable) == \"string\") {\n\t\tfor (var i = 0; i < iterable.length; ++i) {\n\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\telse {\n\t\tfor (var iter = ul4._iter(iterable); ;) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\treturn true;\n\t\t\tif (!ul4._bool(item.value))\n\t\t\t\treturn false;\n\t\t}\n\t}\n};\n\n// Check if ``obj`` is undefined\nul4._isundefined = function _isundefined(obj) {\n\treturn typeof (obj) === \"undefined\";\n};\n\n\n// Check if ``obj`` is *not* undefined\nul4._isdefined = function _isdefined(obj) {\n\treturn typeof (obj) !== \"undefined\";\n};\n\n// Check if ``obj`` is ``None``\nul4._isnone = function _isnone(obj) {\n\treturn obj === null;\n};\n\n// Check if ``obj`` is a boolean\nul4._isbool = function _isbool(obj) {\n\treturn typeof (obj) == \"boolean\";\n};\n\n// Check if ``obj`` is a int\nul4._isint = function _isint(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) == obj;\n};\n\n// Check if ``obj`` is a float\nul4._isfloat = function _isfloat(obj) {\n\treturn (typeof (obj) == \"number\") && Math.round(obj) != obj;\n};\n\n// Check if ``obj`` is a string\nul4._isstr = function _isstr(obj) {\n\treturn typeof (obj) == \"string\";\n};\n\n// Check if ``obj`` is a date\nul4._isdate = function _isdate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n};\n\n// Check if ``obj`` is a color\nul4._iscolor = function _iscolor(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Color));\n};\n\n// Check if ``obj`` is a timedelta object\nul4._istimedelta = function _istimedelta(obj) {\n\treturn (obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.TimeDelta));\n};\n\n// Check if ``obj`` is a monthdelta object\nul4._ismonthdelta = function _ismonthdelta(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.MonthDelta);\n};\n\n// Check if ``obj`` is a template\nul4._istemplate = function _istemplate(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\");\n};\n\n// Check if ``obj`` is a function\nul4._isfunction = function _isfunction(obj) {\n\treturn typeof (obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj.__type__ === \"ul4.Template\" || obj.__type__ === \"ul4.TemplateClosure\"));\n};\n\n// Check if ``obj`` is a list\nul4._islist = function _islist(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n};\n\n// Check if ``obj`` is a set\nul4._isset = function _isset(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n};\n\n// Check if ``obj`` is an exception (at least a UL4 exception)\nul4._isexception = function _isexception(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4.Error);\n};\n\nul4._isul4set = function _isul4set(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.isa) === \"function\" && obj.isa(ul4._Set);\n};\n\n// Check if ``obj`` is an iterator\nul4._isiter = function _isiter(obj) {\n\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.next) === \"function\";\n};\n\n// Check if ``obj`` is a JS object\nul4._isobject = function _isobject(obj) {\n\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof (obj.__type__) === \"undefined\";\n};\n\n// Check if ``obj`` is a map\nul4._ismap = function _ismap(obj) {\n\tif (ul4on._havemap)\n\t\treturn obj !== null && typeof (obj) === \"object\" && typeof (obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\treturn false;\n};\n\n// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\nul4._isdict = function _isdict(obj) {\n\treturn ul4._isobject(obj) || ul4._ismap(obj);\n};\n\n\n// Repeat string ``str`` ``rep`` times\nul4._str_repeat = function _str_repeat(str, rep) {\n\tvar result = \"\";\n\tfor (; rep > 0; --rep)\n\t\tresult += str;\n\treturn result;\n};\n\nul4._list_repeat = function _list_repeat(list, rep) {\n\tvar result = [];\n\tfor (; rep > 0; --rep)\n\t\tfor (var i = 0; i < list.length; ++i)\n\t\t\tresult.push(list[i]);\n\treturn result;\n};\n\nul4._str_json = function _str_json(str) {\n\tvar result = \"\";\n\tfor (var i = 0; i < str.length; ++i) {\n\t\tvar c = str[i];\n\t\tswitch (c) {\n\t\t\tcase \"\\r\":\n\t\t\t\tresult += \"\\\\r\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\n\":\n\t\t\t\tresult += \"\\\\n\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\t\":\n\t\t\t\tresult += \"\\\\t\";\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tresult += '\\\\\"';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvar code = str.charCodeAt(i);\n\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\tresult += c;\n\t\t\t\telse\n\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn '\"' + result + '\"';\n};\n\n// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\nul4._asjson = function _asjson(obj) {\n\tif (obj === null)\n\t\treturn \"null\";\n\telse if (typeof (obj) === \"undefined\")\n\t\treturn \"{}.undefined\";\n\telse if (obj === false)\n\t\treturn \"false\";\n\telse if (obj === true)\n\t\treturn \"true\";\n\telse if (typeof (obj) === \"string\")\n\t\treturn ul4._str_json(obj);\n\telse if (typeof (obj) === \"number\") {\n\t\treturn \"\" + obj;\n\t}\n\telse if (ul4._islist(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"[\");\n\t\tfor (var i = 0; i < obj.length; ++i) {\n\t\t\tif (i != 0)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._ismap(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tobj.forEach(function (value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(value));\n\t\t});\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar v = [];\n\t\tv.push(\"{\");\n\t\tvar i = 0;\n\t\tfor (var key in obj) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._asjson(key));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t}\n\telse if (ul4._isdate(obj)) {\n\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t}\n\telse if (ul4._istimedelta(obj)) {\n\t\treturn \"ul4.TimeDelta.create(\" + obj.days + \", \" + obj.seconds + \", \" + obj.microseconds + \")\";\n\t}\n\telse if (ul4._ismonthdelta(obj)) {\n\t\treturn \"ul4.MonthDelta.create(\" + obj.months + \")\";\n\t}\n\telse if (ul4._iscolor(obj)) {\n\t\treturn \"ul4.Color.create(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t}\n\telse if (ul4._istemplate(obj)) {\n\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t}\n\tthrow ul4.TypeError.create(\"asjson()\", \"asjson() requires a serializable object\");\n};\n\n// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\nul4._fromjson = function _fromjson(string) {\n\t// The following is from jQuery's parseJSON function\n\tstring = ul4._strip(string, null);\n\tif (root.JSON && root.JSON.parse)\n\t\treturn root.JSON.parse(string);\n\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\treturn (new Function(\"return \" + string))();\n\tthrow ul4.TypeError.create(\"fromjson()\", \"invalid JSON\");\n};\n\n// Encodes ``obj`` in the UL4 Object Notation format\nul4._asul4on = function _asul4on(obj) {\n\treturn ul4on.dumps(obj);\n};\n\n// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\nul4._fromul4on = function _fromul4on(string) {\n\treturn ul4on.loads(string);\n};\n\nul4._format_date = function _format_date(obj, fmt, lang) {\n\tvar translations = {\n\t\tde: {\n\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\ten: {\n\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\txf: \"%m/%d/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p \"\n\t\t},\n\t\tfr: {\n\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tes: {\n\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\txf: \"%d/%m/%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tit: {\n\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\txf: \"%d/%m/%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tda: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsv: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t},\n\t\tnl: {\n\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\txf: \"%d-%m-%y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tpt: {\n\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tcs: {\n\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tsk: {\n\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t},\n\t\tpl: {\n\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t},\n\t\thr: {\n\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tsr: {\n\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y.\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t},\n\t\tro: {\n\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\thu: {\n\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\txf: \"%Y-%m-%d\",\n\t\t\tXf: \"%H.%M.%S\",\n\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t},\n\t\ttr: {\n\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\txf: \"%d-%m-%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tru: {\n\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\txf: \"%d.%m.%Y\",\n\t\t\tXf: \"%H:%M:%S\",\n\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t},\n\t\tzh: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t},\n\t\tko: {\n\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t},\n\t\tja: {\n\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t}\n\t};\n\n\tvar translation = translations[lang];\n\n\tvar firstday;\n\n\tvar result = [];\n\tvar inspec = false;\n\tfor (var i = 0; i < fmt.length; ++i) {\n\t\tvar c = fmt[i];\n\t\tif (inspec) {\n\t\t\tswitch (c) {\n\t\t\t\tcase \"a\":\n\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"A\":\n\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"B\":\n\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"H\":\n\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"I\":\n\t\t\t\t\tc = ul4._lpad(((obj.getHours() - 1) % 12) + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"j\":\n\t\t\t\t\tc = ul4._lpad(ul4._yearday(obj), \"0\", 3);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"m\":\n\t\t\t\t\tc = ul4._lpad(obj.getMonth() + 1, \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"M\":\n\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"p\":\n\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"S\":\n\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"U\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 6), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"w\":\n\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"W\":\n\t\t\t\t\tc = ul4._lpad(ul4._week(obj, 0), \"0\", 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"x\":\n\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"X\":\n\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"y\":\n\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"z\":\n\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Z\":\n\t\t\t\t\t// Time zone name\n\t\t\t\t\tc = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.push(c);\n\t\t\tinspec = false;\n\t\t}\n\t\telse {\n\t\t\tif (c == \"%\")\n\t\t\t\tinspec = true;\n\t\t\telse\n\t\t\t\tresult.push(c);\n\t\t}\n\t}\n\treturn result.join(\"\");\n};\n\nul4._format_int = function _format_int(obj, fmt, lang) {\n\tvar work = fmt;\n\n\t// Defaults\n\tvar fill = ' ';\n\tvar align = '>'; // '<', '>', '=' or '^'\n\tvar sign = '-'; // '+', '-' or ' '\n\tvar alternate = false;\n\tvar minimumwidth = 0;\n\tvar type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t// Determine output type\n\tif (/[bcdoxXn]$/.test(work)) {\n\t\ttype = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract minimum width\n\tif (/\\d+$/.test(work)) {\n\t\tvar minimumwidthStr = /\\d+$/.exec(work);\n\t\twork = work.replace(/\\d+$/, \"\");\n\t\tif (/^0/.test(minimumwidthStr)) {\n\t\t\talign = '=';\n\t\t\tfill = '0';\n\t\t}\n\t\tminimumwidth = parseInt(minimumwidthStr);\n\t}\n\n\t// Alternate form?\n\tif (/#$/.test(work)) {\n\t\talternate = true;\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Determine sign\n\tif (/[+ -]$/.test(work)) {\n\t\tif (type == 'c')\n\t\t\tthrow ul4.ValueError.create(\"sign not allowed for integer format type 'c'\");\n\t\tsign = work.substring(work.length - 1);\n\t\twork = work.substring(0, work.length - 1);\n\t}\n\n\t// Extract fill and align char\n\tif (work.length >= 3)\n\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\telse if (work.length == 2) {\n\t\tif (/[<>=^]$/.test(work)) {\n\t\t\talign = work[1];\n\t\t\tfill = work[0];\n\t\t}\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\telse if (work.length == 1) {\n\t\tif (/^[<>=^]$/.test(work))\n\t\t\talign = work;\n\t\telse\n\t\t\tthrow ul4.ValueError.create(\"illegal integer format string \" + ul4._repr(fmt));\n\t}\n\n\t// Basic number formatting\n\tvar neg = obj < 0;\n\n\tif (neg)\n\t\tobj = -obj;\n\n\tvar output;\n\tswitch (type) {\n\t\tcase 'b':\n\t\t\toutput = obj.toString(2);\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tif (neg || obj > 65535)\n\t\t\t\tthrow ul4.ValueError.create(\"value out of bounds for c format\");\n\t\t\toutput = String.fromCharCode(obj);\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t\tcase 'o':\n\t\t\toutput = obj.toString(8);\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\toutput = obj.toString(16);\n\t\t\tbreak;\n\t\tcase 'X':\n\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\tbreak;\n\t\tcase 'n':\n\t\t\t// FIXME: locale formatting\n\t\t\toutput = obj.toString();\n\t\t\tbreak;\n\t}\n\n\t// The rest of the formatting\n\tif (align === '=') {\n\t\tif (neg || sign !== '-')\n\t\t\t--minimumwidth;\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\tminimumwidth -= 2;\n\n\t\tif (output.length < minimumwidth)\n\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\n\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\toutput = \"0\" + type + output;\n\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t}\n\telse {\n\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\toutput = \"0\" + type + output;\n\t\tif (neg)\n\t\t\toutput = \"-\" + output;\n\t\telse if (sign != '-')\n\t\t\toutput = sign + output;\n\t\tif (output.length < minimumwidth) {\n\t\t\tif (align == '<')\n\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth - output.length);\n\t\t\telse if (align == '>')\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth - output.length) + output;\n\t\t\telse // if (align == '^')\n\t\t\t{\n\t\t\t\tvar pad = minimumwidth - output.length;\n\t\t\t\tvar padBefore = Math.floor(pad / 2);\n\t\t\t\tvar padAfter = pad - padBefore;\n\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n};\n\n// Format ``obj`` using the format string ``fmt`` in the language ``lang``\nul4._format = function _format(obj, fmt, lang) {\n\tif (typeof (lang) === \"undefined\" || lang === null)\n\t\tlang = \"en\";\n\telse {\n\t\tvar translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null };\n\t\tlang = lang.toLowerCase();\n\t\tif (typeof (translations[lang]) === \"undefined\") {\n\t\t\tlang = lang.split(/_/)[0];\n\t\t\tif (typeof (translations[lang]) === \"undefined\")\n\t\t\t\tlang = \"en\";\n\t\t}\n\t}\n\tif (ul4._isdate(obj))\n\t\treturn ul4._format_date(obj, fmt, lang);\n\telse if (ul4._isint(obj))\n\t\treturn ul4._format_int(obj, fmt, lang);\n\telse if (obj === true)\n\t\treturn ul4._format_int(1, fmt, lang);\n\telse if (obj === false)\n\t\treturn ul4._format_int(0, fmt, lang);\n};\n\nul4._lpad = function _lpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = pad + string;\n\treturn string;\n};\n\nul4._rpad = function _rpad(string, pad, len) {\n\tif (typeof (string) === \"number\")\n\t\tstring = string.toString();\n\twhile (string.length < len)\n\t\tstring = string + pad;\n\treturn string;\n};\n\nul4.Proto = {\n\t__prototype__: null,\n\t__id__: 0,\n\t_nextid: 1,\n\tisa: function isa(type) {\n\t\tif (this === type)\n\t\t\treturn true;\n\t\tif (this.__prototype__ === null)\n\t\t\treturn false;\n\t\treturn this.__prototype__.isa(type);\n\t},\n\n\tisprotoof: function isprotoof(obj) {\n\t\twhile (true) {\n\t\t\tif (obj === null || Object.prototype.toString.call(obj) !== \"[object Object]\" || typeof (obj.__prototype__) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\tif (obj === this)\n\t\t\t\treturn true;\n\t\t\tobj = obj.__prototype__;\n\t\t}\n\t},\n\n\t// equality comparison of objects defaults to identity comparison\n\t__eq__: function __eq__(other) {\n\t\treturn this === other;\n\t},\n\n\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t// ``__ne__`` will be synthesized from that\n\t__ne__: function __ne__(other) {\n\t\treturn !this.__eq__(other);\n\t},\n\n\t// For other comparison operators, each method has to be implemented:\n\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t// ``>=`` calls ``__ge__``\n\n\t__bool__: function __bool__() {\n\t\treturn true;\n\t}\n};\n\nul4.Signature = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create() {\n\t\t\tvar signature = ul4._clone(this);\n\t\t\tsignature.args = [];\n\t\t\tsignature.argNames = {};\n\t\t\tsignature.remargs = null;\n\t\t\tsignature.remkwargs = null;\n\n\t\t\tvar nextDefault = false;\n\t\t\tvar lastArgname = null;\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tvar argName = arguments[i];\n\t\t\t\tif (nextDefault) {\n\t\t\t\t\tsignature.args.push({ name: lastArgname, defaultValue: argName });\n\t\t\t\t\tsignature.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (argName.substr(argName.length - 1) === \"=\") {\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length - 1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tsignature.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tsignature.remargs = argName.substr(1);\n\t\t\t\t\telse {\n\t\t\t\t\t\tsignature.args.push({ name: argName });\n\t\t\t\t\t\tsignature.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn signature;\n\t\t},\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray: function bindArray(name, args, kwargs) {\n\t\t\tvar finalargs = [];\n\t\t\tvar decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\t\t\t\tif (i < args.length) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null) {\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length) {\n\t\t\t\t\tvar prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow ul4.ArgumentError.create(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null) {\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key]) {\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow ul4.ArgumentError.create(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tvar remkwargs = {};\n\t\t\t\tfor (var key in kwargs) {\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tremkwargs[key] = kwargs[key];\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t},\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject: function bindObject(name, args, kwargs) {\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tvar argObject = {};\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\treturn this.toString();\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar v = [];\n\t\t\tfor (var i = 0; i < this.args.length; ++i) {\n\t\t\t\tvar arg = this.args[i];\n\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t}\n);\n\n// Adds name and signature to a function/method and makes the method callable in templates\nul4.expose = function expose(signature, options, f) {\n\tif (typeof (f) === \"undefined\") {\n\t\tf = options;\n\t\toptions = {};\n\t}\n\tif (options.name)\n\t\tf._ul4_name = options.name;\n\tif (ul4._islist(signature))\n\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\tf._ul4_signature = signature;\n\tf._ul4_needsobject = options.needsobject || false;\n\tf._ul4_needscontext = options.needscontext || false;\n\n\treturn f;\n};\n\nul4.Context = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(vars) {\n\t\t\tif (vars === null || typeof (vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = vars;\n\t\t\tcontext.indents = [];\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars: function inheritvars() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext.vars = ul4._simpleclone(this.vars);\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent: function withindent(indent) {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tif (indent !== null) {\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput: function replaceoutput() {\n\t\t\tvar context = ul4._clone(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t},\n\n\t\tclone: function clone(vars) {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\toutput: function output(value) {\n\t\t\tthis._output.push(value);\n\t\t},\n\n\t\tgetoutput: function getoutput() {\n\t\t\treturn this._output.join(\"\");\n\t\t},\n\n\t\tget: function get(name) {\n\t\t\treturn this.vars[name];\n\t\t},\n\n\t\tset: function set(name, value) {\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t}\n);\n\n/// Exceptions\n\nul4.Exception = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Exception\",\n\t\t\"cause\": null,\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Exceptions used internally by UL4 for flow control\nul4.InternalException = ul4._inherit(ul4.Exception, {});\n\n// Control flow exceptions\nul4.ReturnException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ReturnException\",\n\n\t\tcreate: function create(result) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.result = result;\n\t\t\treturn exception;\n\t\t}\n\t}\n);\n\nul4.BreakException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.BreakException\"\n\t}\n);\n\nul4.ContinueException = ul4._inherit(\n\tul4.InternalException,\n\t{\n\t\t__type__: \"ul4.ContinueException\"\n\t}\n);\n\n// Real exceptions raised by various parts of UL4\nul4.SyntaxError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.SyntaxError\"\n\t}\n);\n\nul4.LValueRequiredError = ul4._inherit(\n\tul4.SyntaxError,\n\t{\n\t\t__type__: \"ul4.LValueRequiredError\",\n\n\t\ttoString: function toString() {\n\t\t\treturn \"lvalue required!\";\n\t\t}\n\t}\n);\n\nul4.TypeError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.TypeError\",\n\n\t\tcreate: function create(operation, message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.operation = operation;\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ValueError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ValueError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\nul4.ArgumentError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.ArgumentError\",\n\n\t\tcreate: function create(message) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.message = message;\n\t\t\treturn exception;\n\t\t},\n\t\ttoString: function toString() {\n\t\t\treturn this.message;\n\t\t}\n\t}\n);\n\n/// Exception that wraps other exceptions while they bubble up the stack\nul4.LocationError = ul4._inherit(\n\tul4.Exception,\n\t{\n\t\t__type__: \"ul4.LocationError\",\n\n\t\tcreate: function create(location, cause) {\n\t\t\tvar exception = ul4._clone(this);\n\t\t\texception.location = location;\n\t\t\texception.cause = cause;\n\t\t\treturn exception;\n\t\t},\n\n\t\t_templateprefix: function (template) {\n\t\t\tvar out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tvar first = true;\n\t\t\twhile (template != null) {\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name !== null ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t},\n\n\t\t_template: function _template() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.template;\n\t\t\telse\n\t\t\t\treturn this.location.tag.template;\n\t\t},\n\n\t\t_outerpos: function _outerpos() {\n\t\t\tif (ul4.Tag.isprotoof(this.location))\n\t\t\t\treturn this.location.pos;\n\t\t\telse {\n\t\t\t\tvar tag = this.location.tag;\n\t\t\t\tif (tag === null) // A top level template as no tag\n\t\t\t\t\treturn this.location.pos;\n\t\t\t\telse\n\t\t\t\t\treturn tag.pos;\n\t\t\t}\n\t\t},\n\n\t\t_innerpos: function _innerpos() {\n\t\t\treturn this.location.pos;\n\t\t},\n\n\t\ttoString: function toString() {\n\t\t\tvar template = this._template();\n\t\t\tvar templateprefix = this._templateprefix(template);\n\t\t\tvar outerpos = this._outerpos();\n\t\t\tvar innerpos = this._innerpos();\n\n\t\t\tvar prefix = template.source.substring(outerpos.start, innerpos.start);\n\t\t\tvar code = template.source.substring(innerpos.start, innerpos.stop);\n\t\t\tvar suffix = template.source.substring(innerpos.stop, outerpos.stop);\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\t\t\tvar text = prefix + code + suffix;\n\t\t\tvar underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\t// find line numbers\n\t\t\tvar lineno = 1, colno = 1;\n\t\t\tfor (var i = 0; i < innerpos.start; ++i) {\n\t\t\t\tif (template.source[i] === \"\\n\") {\n\t\t\t\t\t++lineno;\n\t\t\t\t\tcolno = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++colno;\n\t\t\t}\n\n\t\t\tpos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + lineno + \"; col \" + colno;\n\n\t\t\treturn templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"cause\":\n\t\t\t\t\treturn this.cause;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tcase \"template\":\n\t\t\t\t\treturn this._template;\n\t\t\t\tcase \"outerpos\":\n\t\t\t\t\treturn this._outerpos;\n\t\t\t\tcase \"innerpos\":\n\t\t\t\t\treturn this._innerpos;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t}\n);\n\n\n/// Classes for the syntax tree\nul4.AST = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(pos) {\n\t\t\tvar ast = ul4._clone(this);\n\t\t\tast.pos = pos;\n\t\t\treturn ast;\n\t\t},\n\t\t__str__: function __str__() {\n\t\t\tvar out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\tvar out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_handle_eval_modify: function _handle_eval_modify(context, operator, value) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthrow ul4.LValueRequiredError;\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t},\n\t\t_str: function _str(out) {\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this[this._ul4onattrs[i]]);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tthis[this._ul4onattrs[i]] = decoder.load();\n\t\t},\n\t\t__setitem__: function __setitem__(attrname, value) {\n\t\t\tthrow ul4.TypeError.create(\"mutate\", \"object is immutable\");\n\t\t},\n\t\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\t\t_ul4onattrs: [\"pos\"]\n\t}\n);\n\nul4.TextAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, pos) {\n\t\t\tvar text = ul4.AST.create.call(this, pos);\n\t\t\ttext.template = template;\n\t\t\treturn text;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"template\"]),\n\t\t_text: function _text() {\n\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.IndentAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\tcreate: function create(template, pos, text) {\n\t\t\tvar indent = ul4.TextAST.create.call(this, template, pos);\n\t\t\tindent._maketext(text);\n\t\t\treturn indent;\n\t\t},\n\t\t_maketext: function _maketext(text) {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tif (text === null)\n\t\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\telse\n\t\t\t\t\tthis.text = text;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.text = null;\n\t\t},\n\t\t_text: function _text() {\n\t\t\tif (this.text === null)\n\t\t\t\treturn this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\telse\n\t\t\t\treturn this.text;\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < context.indents.length; ++i)\n\t\t\t\tcontext.output(context.indents[i]);\n\t\t\tcontext.output(this._text());\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.TextAST.ul4ondump.call(this, encoder);\n\n\t\t\tif (this.text === this.template.source.substring(this.pos.start, this.pos.stop))\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this.text);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext(decoder.load());\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.LineEndAST = ul4._inherit(\n\tul4.TextAST,\n\t{\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this._text()));\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.Tag = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(template, tag, tagpos, codepos) {\n\t\t\tvar tago = ul4.AST.create.call(this, tagpos);\n\t\t\ttago.template = template;\n\t\t\ttago.tag = tag;\n\t\t\ttago.codepos = codepos;\n\t\t\ttago._maketext();\n\t\t\treturn tago;\n\t\t},\n\t\t_maketext: function _maketext() {\n\t\t\tif (typeof (this.template) !== \"undefined\") {\n\t\t\t\tthis.text = this.template.source.substring(this.pos.start, this.pos.stop);\n\t\t\t\tthis.code = this.template.source.substring(this.codepos.start, this.codepos.stop);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.text = null;\n\t\t\t\tthis.code = null;\n\t\t\t}\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.AST.ul4ondump.call(this, encoder);\n\t\t\tencoder.dump(this.template);\n\t\t\tencoder.dump(this.tag);\n\t\t\tencoder.dump(this.codepos);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.TextAST.ul4onload.call(this, decoder);\n\t\t\tthis.template = decoder.load();\n\t\t\tthis.tag = decoder.load();\n\t\t\tthis.codepos = decoder.load();\n\t\t\t// Recreate ``text`` attribute\n\t\t\tthis._maketext();\n\t\t}\n\t}\n);\n\nul4.CodeAST = ul4._inherit(\n\tul4.AST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar code = ul4.AST.create.call(this, pos);\n\t\t\tcode.tag = tag;\n\t\t\treturn code;\n\t\t},\n\t\t_ul4onattrs: ul4.AST._ul4onattrs.concat([\"tag\"]),\n\t\t_str: function _str(out) {\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t}\n\t}\n);\n\nul4.ConstAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar constant = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tconstant.value = value;\n\t\t\treturn constant;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this.value;\n\t\t}\n\t}\n);\n\nul4.ItemArgBase = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_handle_eval_list: function _handle_eval_list(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_set: function _handle_eval_set(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_dict: function _handle_eval_dict(context, result) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_handle_eval_call: function _handle_eval_call(context, args, kwargs) {\n\t\t\ttry {\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc))\n\t\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.SeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar seqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tseqitem.value = value;\n\t\t\treturn seqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t}\n);\n\n\nul4.UnpackSeqItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackseqitem.value = value;\n\t\t\treturn unpackseqitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_list: function _eval_list(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t},\n\t\t_eval_set: function _eval_set(context, result) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.DictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, key, value) {\n\t\t\tvar dictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tdictitem.key = key;\n\t\t\tdictitem.value = value;\n\t\t\treturn dictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"key\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar key = this.key._handle_eval(context);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tul4on._setmap(result, key, value);\n\t\t}\n\t}\n);\n\nul4.UnpackDictItemAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\tunpackdictitem.item = item;\n\t\t\treturn unpackdictitem;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_dict: function _eval_dict(context, result) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item)\n\t\t\t\t\tul4on._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.PosArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t}\n);\n\nul4.KeywordArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, name, value) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.name = name;\n\t\t\targ.value = value;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"name\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + this.name);\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t}\n);\n\nul4.UnpackListArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\targs.push.apply(args, item);\n\t\t}\n\t}\n);\n\nul4.UnpackDictArgAST = ul4._inherit(\n\tul4.ItemArgBase,\n\t{\n\t\tcreate: function create(tag, pos, item) {\n\t\t\tvar arg = ul4.ItemArgBase.create.call(this, tag, pos);\n\t\t\targ.item = item;\n\t\t\treturn arg;\n\t\t},\n\t\t_ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat([\"item\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval_call: function _eval_call(context, args, kwargs) {\n\t\t\tvar item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item)) {\n\t\t\t\tfor (var i = 0; i < item.length; ++i) {\n\t\t\t\t\tif (!ul4._islist(item[i]) || item[i].length != 2)\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tvar key = item[i][0], value = item[i][1];\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item)) {\n\t\t\t\titem.forEach(function (value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item)) {\n\t\t\t\tfor (var key in item) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow ul4.ArgumentError.create(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ListAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar list = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlist.items = [];\n\t\t\treturn list;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = [];\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_list(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ListCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.item = item;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = [];\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar dict = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tdict.items = [];\n\t\t\treturn dict;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._emptymap();\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_dict(context, result);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.DictCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, key, value, varname, container, condition) {\n\t\t\tvar listcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tlistcomp.key = key;\n\t\t\tlistcomp.value = value;\n\t\t\tlistcomp.varname = varname;\n\t\t\tlistcomp.container = container;\n\t\t\tlistcomp.condition = condition;\n\t\t\treturn listcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._emptymap();\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) {\n\t\t\t\t\tvar key = this.key._handle_eval(localcontext);\n\t\t\t\t\tvar value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4on._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar set = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tset.items = [];\n\t\t\treturn set;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"items\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\n\t\t\tfor (var i = 0; i < this.items.length; ++i)\n\t\t\t\tthis.items[i]._handle_eval_set(context, result);\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.SetCompAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar setcomp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsetcomp.item = item;\n\t\t\tsetcomp.container = container;\n\t\t\tsetcomp.condition = condition;\n\t\t\treturn setcomp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar result = ul4on._haveset ? new Set() : ul4._Set.create();\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.GenExprAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, item, varname, container, condition) {\n\t\t\tvar genexp = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tgenexp.item = item;\n\t\t\tgenexp.varname = varname;\n\t\t\tgenexp.container = container;\n\t\t\tgenexp.condition = condition;\n\t\t\treturn genexp;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\t\t\tvar iter = ul4._iter(container);\n\n\t\t\tvar localcontext = context.inheritvars();\n\n\t\t\tvar self = this;\n\n\t\t\tvar result = {\n\t\t\t\tnext: function () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tvar varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t\tvaritems[i][0]._handle_eval_set(localcontext, varitems[i][1]);\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) {\n\t\t\t\t\t\t\tvar value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn { value: value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.VarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, name) {\n\t\t\tvar variable = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tvariable.name = name;\n\t\t\treturn variable;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"name\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\treturn this._get(context, this.name);\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tthis._set(context, this.name, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t},\n\t\t_get: function _get(context, name) {\n\t\t\tvar result = context.get(name);\n\t\t\tif (typeof (result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t},\n\t\t_set: function _set(context, name, value) {\n\t\t\tcontext.set(name, value);\n\t\t},\n\t\t_modify: function _modify(context, operator, name, value) {\n\t\t\tvar newvalue = operator._ido(context.get(name), value)\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t}\n);\n\nul4.UnaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj) {\n\t\t\tvar unary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tunary.obj = obj;\n\t\t\treturn unary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t}\n);\n\n// Negation\nul4.NegAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\tif (obj !== null && typeof (obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t}\n);\n\n// Bitwise not\nul4.BitNotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn -obj - 1;\n\t\t}\n\t}\n);\n\n// Not\nul4.NotAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_do: function _do(obj) {\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t}\n);\n\n// If expression\nul4.IfAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, objif, objcond, objelse) {\n\t\t\tvar ifexpr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tifexpr.objif = objif;\n\t\t\tifexpr.objcond = objcond;\n\t\t\tifexpr.objelse = objelse;\n\t\t\treturn ifexpr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar result;\n\t\t\tvar condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.ReturnAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar result = this.obj._handle_eval(context);\n\t\t\tthrow ul4.ReturnException.create(result);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.PrintXAST = ul4._inherit(\n\tul4.UnaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t}\n);\n\nul4.BinaryAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj1, obj2) {\n\t\t\tvar binary = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tbinary.obj1 = obj1;\n\t\t\tbinary.obj2 = obj2;\n\t\t\treturn binary;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj1\", \"obj2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.type);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Item access and assignment: dict[key], list[index], string[index], color[index]\nul4.ItemAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t},\n\t\t_get: function _get(container, key) {\n\t\t\tif (typeof (container) === \"string\" || ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof (start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof (stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__getitem__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\treturn container[key];\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"[]\", ul4._type(container) + \" object is not subscriptable\");\n\t\t},\n\t\t_set: function _set(container, key, value) {\n\t\t\tif (ul4._islist(container)) {\n\t\t\t\tif (typeof (key) === \"object\" && typeof (key.isa) === \"function\" && key.isa(ul4.slice)) {\n\t\t\t\t\tvar start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop - start); // Remove old element\n\t\t\t\t\tfor (var iter = ul4._iter(value); ;) {\n\t\t\t\t\t\tvar item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof (container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (Object.prototype.toString.call(container) === \"[object Object]\")\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.NotSubscriptableError.create(container);\n\t\t},\n\t\t_modify: function _modify(operator, container, key, value) {\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t}\n);\n\n// Identifty test operator ``is``\nul4.IsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t}\n);\n\n// Inverted tdentifty test operator ``is not``\nul4.IsNotAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t}\n);\n\n// Comparison operator ==\nul4.EQAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator !=\nul4.NEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <\nul4.LTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator <=\nul4.LEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >\nul4.GTAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Comparison operator >=\nul4.GEAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Containment test: string in string, obj in list, key in dict, value in rgb\nul4.ContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\tif (typeof (obj) === \"string\" && typeof (container) === \"string\") {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container)) {\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof (container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container)) {\n\t\t\t\tfor (var key in container) {\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container)) {\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"in\", ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t}\n);\n\n// Inverted containment test\nul4.NotContainsAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj, container) {\n\t\t\treturn !ul4.ContainsAST._do(obj, container);\n\t\t}\n\t}\n);\n\n// Addition: num + num, string + string\nul4.AddAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tvar result = [];\n\t\t\t\tul4._append(result, obj1);\n\t\t\t\tul4._append(result, obj2);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2)) {\n\t\t\t\tul4._append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Substraction: num - num\nul4.SubAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t},\n\t\t_date_sub: function _date_sub(obj1, obj2) {\n\t\t\tvar swap = (obj2 > obj1);\n\n\t\t\tif (swap) {\n\t\t\t\tvar t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tvar year1 = obj1.getFullYear();\n\t\t\tvar yearday1 = ul4._yearday(obj1);\n\t\t\tvar year2 = obj2.getFullYear();\n\t\t\tvar yearday2 = ul4._yearday(obj2);\n\n\t\t\tvar diffdays = 0;\n\n\t\t\twhile (year1 > year2) {\n\t\t\t\tdiffdays += ul4._yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tvar hours1 = obj1.getHours();\n\t\t\tvar minutes1 = obj1.getMinutes();\n\t\t\tvar seconds1 = obj1.getSeconds();\n\t\t\tvar hours2 = obj2.getHours();\n\t\t\tvar minutes2 = obj2.getMinutes();\n\t\t\tvar seconds2 = obj2.getSeconds();\n\n\t\t\tvar diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tvar diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap) {\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Multiplication: num * num, int * str, str * int, int * list, list * int\nul4.MulAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1)) {\n\t\t\t\tif (typeof (obj2) === \"string\") {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2)) {\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2)) {\n\t\t\t\tif (typeof (obj1) === \"string\") {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1)) {\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow ul4.ValueError.create(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2)) {\n\t\t\t\tif (obj2 > 0) {\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++])\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Truncating division\nul4.FloorDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"//\", ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// \"Real\" division\nul4.TrueDivAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj1 && typeof (obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof (obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\treturn obj1 / obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Modulo\nul4.ModAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tvar div = Math.floor(obj1 / obj2);\n\t\t\tvar mod = obj1 - div * obj2;\n\n\t\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) {\n\t\t\t\tmod += obj2;\n\t\t\t\t--div;\n\t\t\t}\n\t\t\treturn obj1 - div * obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise left shift\nul4.ShiftLeftAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise right shift\nul4.ShiftRightAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise and\nul4.BitAndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise exclusive or\nul4.BitXOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\n// Bitwise or\nul4.BitOrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_do: function _do(obj1, obj2) {\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t},\n\t\t_ido: function _ido(obj1, obj2) {\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t}\n);\n\nul4.AndAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.OrAST = ul4._inherit(\n\tul4.BinaryAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tvar obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t}\n);\n\nul4.AttrAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, attrname) {\n\t\t\tvar attr = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tattr.obj = obj;\n\t\t\tattr.attrname = attrname;\n\t\t\treturn attr;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"attrname\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t},\n\t\t_eval_set: function _eval_set(context, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t},\n\t\t_eval_modify: function _eval_modify(context, operator, value) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t},\n\t\t_get: function _get(object, attrname) {\n\t\t\tif (typeof (object) === \"string\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\treturn ul4.expose([\"old\", \"new\", \"count=\", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); });\n\t\t\t\t\tcase \"strip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function strip(chars) { return ul4._strip(object, chars); });\n\t\t\t\t\tcase \"lstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function lstrip(chars) { return ul4._lstrip(object, chars); });\n\t\t\t\t\tcase \"rstrip\":\n\t\t\t\t\t\treturn ul4.expose([\"chars=\", null], function rstrip(chars) { return ul4._rstrip(object, chars); });\n\t\t\t\t\tcase \"split\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function split(sep, count) { return ul4._split(object, sep, count); });\n\t\t\t\t\tcase \"rsplit\":\n\t\t\t\t\t\treturn ul4.expose([\"sep=\", null, \"count=\", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); });\n\t\t\t\t\tcase \"splitlines\":\n\t\t\t\t\t\treturn ul4.expose([\"keepends=\", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); });\n\t\t\t\t\tcase \"lower\":\n\t\t\t\t\t\treturn ul4.expose([], function lower() { return object.toLowerCase(); });\n\t\t\t\t\tcase \"upper\":\n\t\t\t\t\t\treturn ul4.expose([], function upper() { return object.toUpperCase(); });\n\t\t\t\t\tcase \"capitalize\":\n\t\t\t\t\t\treturn ul4.expose([], function capitalize() { return ul4._capitalize(object); });\n\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\treturn ul4.expose([\"iterable\"], function join(iterable) { return ul4._join(object, iterable); });\n\t\t\t\t\tcase \"startswith\":\n\t\t\t\t\t\treturn ul4.expose([\"prefix\"], function startswith(prefix) { return ul4._startswith(object, prefix); });\n\t\t\t\t\tcase \"endswith\":\n\t\t\t\t\t\treturn ul4.expose([\"suffix\"], function endswith(suffix) { return ul4._endswith(object, suffix); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._islist(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"append\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function append(items) { return ul4._append(object, items); });\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\treturn ul4.expose([\"pos\", \"*items\"], function insert(pos, items) { return ul4._insert(object, pos, items); });\n\t\t\t\t\tcase \"pop\":\n\t\t\t\t\t\treturn ul4.expose([\"pos=\", -1], function pop(pos) { return ul4._pop(object, pos); });\n\t\t\t\t\tcase \"count\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); });\n\t\t\t\t\tcase \"find\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); });\n\t\t\t\t\tcase \"rfind\":\n\t\t\t\t\t\treturn ul4.expose([\"sub\", \"start=\", null, \"end=\", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isdate(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"weekday\":\n\t\t\t\t\t\treturn ul4.expose([], function weekday() { return ul4._weekday(object); });\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\treturn ul4.expose([\"firstweekday=\", null], function week(firstweekday) { return ul4._week(object, firstweekday); });\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\treturn ul4.expose([], function day() { return object.getDate(); });\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\treturn ul4.expose([], function month() { return object.getMonth() + 1; });\n\t\t\t\t\tcase \"year\":\n\t\t\t\t\t\treturn ul4.expose([], function year() { return object.getFullYear(); });\n\t\t\t\t\tcase \"hour\":\n\t\t\t\t\t\treturn ul4.expose([], function hour() { return object.getHours(); });\n\t\t\t\t\tcase \"minute\":\n\t\t\t\t\t\treturn ul4.expose([], function minute() { return object.getMinutes(); });\n\t\t\t\t\tcase \"second\":\n\t\t\t\t\t\treturn ul4.expose([], function second() { return object.getSeconds(); });\n\t\t\t\t\tcase \"microsecond\":\n\t\t\t\t\t\treturn ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; });\n\t\t\t\t\tcase \"mimeformat\":\n\t\t\t\t\t\treturn ul4.expose([], function mimeformat() { return ul4._mimeformat(object); });\n\t\t\t\t\tcase \"isoformat\":\n\t\t\t\t\t\treturn ul4.expose([], function isoformat() { return ul4._isoformat(object); });\n\t\t\t\t\tcase \"yearday\":\n\t\t\t\t\t\treturn ul4.expose([], function yearday() { return ul4._yearday(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn object.get(attrname);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isset(object)) {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"add\":\n\t\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Object.prototype.toString.call(object) === \"[object Object]\") {\n\t\t\t\tswitch (attrname) {\n\t\t\t\t\tcase \"get\":\n\t\t\t\t\t\treturn ul4.expose([\"key\", \"default=\", null], function get(key, default_) { return ul4._get(object, key, default_); });\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn ul4.expose([], function items() { return ul4._items(object); });\n\t\t\t\t\tcase \"values\":\n\t\t\t\t\t\treturn ul4.expose([], function values() { return ul4._values(object); });\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\treturn ul4.expose([\"*other\", \"**kwargs\"], function update(other, kwargs) { return ul4._update(object, other, kwargs); });\n\t\t\t\t\tcase \"clear\":\n\t\t\t\t\t\treturn ul4.expose([], function clear() { return ul4._clear(object); });\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar result;\n\t\t\t\t\t\tif (object && typeof (object.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\t\t\t\tresult = object.__getattr__(attrname);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult = object[attrname];\n\t\t\t\t\t\tif (typeof (result) !== \"function\")\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\tvar realresult = function () {\n\t\t\t\t\t\t\treturn result.apply(object, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\t\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\t\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\t\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\t\t\t\treturn realresult;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"get\", ul4._type(object) + \" object has no readable attributes\");\n\t\t},\n\t\t_set: function _set(object, attrname, value) {\n\t\t\tif (typeof (object) === \"object\" && typeof (object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value)\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow ul4.TypeError.create(\"set\", ul4._type(object) + \" object has no writable attributes\");\n\t\t},\n\t\t_modify: function _modify(operator, object, attrname, value) {\n\t\t\tvar oldvalue = this._get(object, attrname);\n\t\t\tvar newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t}\n);\n\nul4.CallAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar call = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tcall.obj = obj;\n\t\t\tcall.args = args;\n\t\t\treturn call;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"obj\", \"args\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_makeargs: function _makeargs(context) {\n\t\t\tvar args = [], kwargs = {};\n\t\t\tfor (var i = 0; i < this.args.length; ++i)\n\t\t\t\tthis.args[i]._handle_eval_call(context, args, kwargs);\n\t\t\treturn { args: args, kwargs: kwargs };\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\ttry {\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar obj = this.obj._handle_eval(context);\n\t\t\tvar args = this._makeargs(context);\n\t\t\tvar result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.RenderAST = ul4._inherit(\n\tul4.CallAST,\n\t{\n\t\tcreate: function create(tag, pos, obj, args) {\n\t\t\tvar render = ul4.CallAST.create.call(this, tag, pos, obj, args);\n\t\t\trender.indent = null;\n\t\t\treturn render;\n\t\t},\n\t\t_ul4onattrs: ul4.CallAST._ul4onattrs.concat([\"indent\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null) {\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent._text()));\n\t\t\t}\n\t\t},\n\t\t_handle_eval: function _handle_eval(context) {\n\t\t\tvar localcontext = context.withindent(this.indent !== null ? this.indent._text() : null);\n\t\t\tvar obj = this.obj._handle_eval(localcontext);\n\t\t\tvar args = this._makeargs(localcontext);\n\n\t\t\ttry {\n\t\t\t\tvar result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\texc = ul4.LocationError.create(this, exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t}\n);\n\n// Slice object\nul4.slice = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(start, stop) {\n\t\t\tvar slice = ul4._clone(this);\n\t\t\tslice.start = start;\n\t\t\tslice.stop = stop;\n\t\t\treturn slice;\n\t\t},\n\t\t__repr__: function __repr__() {\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \")\";\n\t\t}\n\t}\n);\n\n\n// List/String slice\nul4.SliceAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, index1, index2) {\n\t\t\tvar slice = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tslice.index1 = index1;\n\t\t\tslice.index2 = index2;\n\t\t\treturn slice;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"index1\", \"index2\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tvar index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn ul4.slice.create(index1, index2);\n\t\t}\n\t}\n);\n\n\nul4.SetVarAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos, lvalue, value) {\n\t\t\tvar changevar = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tchangevar.lvalue = lvalue;\n\t\t\tchangevar.value = value;\n\t\t\treturn changevar;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"lvalue\", \"value\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_set(context, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ModifyVarAST = ul4._inherit(\n\tul4.SetVarAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tvar value = this.value._handle_eval(context);\n\t\t\tvar items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (var i = 0; i < items.length; ++i) {\n\t\t\t\tvar item = items[i];\n\t\t\t\titem[0]._handle_eval_modify(context, this._operator, item[1]);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST });\n\nul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST });\n\nul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST });\n\nul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST });\n\nul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST });\n\nul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST });\n\nul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST });\n\nul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST });\n\nul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST });\n\nul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST });\n\nul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST });\n\nul4.BlockAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar block = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tblock.endtag = null;\n\t\t\tblock.content = [];\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.CodeAST._ul4onattrs.concat([\"endtag\", \"content\"]),\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i)\n\t\t\t\tthis.content[i]._handle_eval(context);\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tif (this.content.length) {\n\t\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\t\tthis.content[i]._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ForBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, varname, container) {\n\t\t\tvar for_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tfor_.varname = varname;\n\t\t\tfor_.container = container;\n\t\t\treturn for_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"varname\", \"container\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str_varname: function _str_varname(out, varname) {\n\t\t\tif (ul4._islist(varname)) {\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (var i = 0; i < varname.length; ++i) {\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar container = this.container._handle_eval(context);\n\n\t\t\tfor (var iter = ul4._iter(container); ;) {\n\t\t\t\tvar value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tvar varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (var i = 0; i < varitems.length; ++i)\n\t\t\t\t\tvaritems[i][0]._handle_eval_set(context, varitems[i][1]);\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.WhileBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar while_ = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\twhile_.condition = condition;\n\t\t\treturn while_;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \"),\n\t\t\t\tthis.container._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\twhile (true) {\n\t\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry {\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tul4.BlockAST._eval.call(this, context);\n\t\t\t\t}\n\t\t\t\tcatch (exc) {\n\t\t\t\t\tif (exc === ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc === ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"while \");\n\t\t\tul4.AST._str.call(this, out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.BreakAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.BreakException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.ContinueAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tthrow ul4.ContinueException;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t}\n\t}\n);\n\nul4.CondBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_eval: function _eval(context) {\n\t\t\tfor (var i = 0; i < this.content.length; ++i) {\n\t\t\t\tvar block = this.content[i];\n\t\t\t\tvar execute = block._execute(context);\n\t\t\t\tif (execute) {\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);\n\nul4.ConditionalBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, condition) {\n\t\t\tvar block = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\tblock.condition = condition;\n\t\t\treturn block;\n\t\t},\n\t\t_ul4onattrs: ul4.BlockAST._ul4onattrs.concat([\"condition\"]),\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\tvar cond = this.condition._handle_eval(context);\n\t\t\tvar result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t}\n);\n\nul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"if\" });\n\nul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: \"else if\" });\n\nul4.ElseBlockAST = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\"),\n\t\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_execute: function _execute(context) {\n\t\t\treturn true;\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t}\n);\n\nul4.Template = ul4._inherit(\n\tul4.BlockAST,\n\t{\n\t\tcreate: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) {\n\t\t\tvar template = ul4.BlockAST.create.call(this, tag, pos);\n\t\t\ttemplate.source = source;\n\t\t\ttemplate.name = name;\n\t\t\ttemplate.whitespace = whitespace;\n\t\t\ttemplate.startdelim = startdelim;\n\t\t\ttemplate.enddelim = enddelim;\n\t\t\ttemplate.docpos = null;\n\t\t\ttemplate.signature = signature;\n\t\t\ttemplate._jsfunction = null;\n\t\t\ttemplate._asts = null;\n\t\t\ttemplate._ul4_callsignature = signature;\n\t\t\ttemplate._ul4_rendersignature = signature;\n\t\t\ttemplate.parenttemplate = null;\n\t\t\treturn template;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tvar signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this.source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || ul4.SignatureAST.isprotoof(this.signature))\n\t\t\t\tsignature = this.signature;\n\t\t\telse {\n\t\t\t\tsignature = [];\n\t\t\t\tfor (var i = 0; i < this.signature.args.length; ++i) {\n\t\t\t\t\tvar arg = this.signature.args[i];\n\t\t\t\t\tif (typeof (arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name + \"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tul4.BlockAST.ul4ondump.call(this, encoder);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tvar version = decoder.load();\n\t\t\tvar signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow ul4.ValueError.create(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow ul4.ValueError.create(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\t\t\tthis.name = decoder.load();\n\t\t\tthis.source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = ul4.Signature.create.apply(ul4.Signature, signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tul4.BlockAST.ul4onload.call(this, decoder);\n\t\t},\n\t\tloads: function loads(string) {\n\t\t\treturn ul4on.loads(string);\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tvar closure = ul4.TemplateClosure.create(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"\") {\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t},\n\t\t_str: function _str(out) {\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (!ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t},\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis._renderbound(context, vars);\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\tvar localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t},\n\t\trenders: function renders(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t},\n\t\tdoc: function doc() {\n\t\t\treturn this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null;\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"tag\":\n\t\t\t\t\treturn this.tag;\n\t\t\t\tcase \"endtag\":\n\t\t\t\t\treturn this.endtag;\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\t_callbound: function _callbound(context, vars) {\n\t\t\tvar localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry {\n\t\t\t\tul4.BlockAST._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc) {\n\t\t\t\tif (ul4.ReturnException.isprotoof(exc))\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcall: function call(vars) {\n\t\t\tvars = vars || {};\n\t\t\tvar context = ul4.Context.create();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this._callbound(context, vars);\n\t\t},\n\t\t__type__: \"ul4.Template\" // used by ``istemplate()``\n\t}\n);\n\nul4.SignatureAST = ul4._inherit(\n\tul4.CodeAST,\n\t{\n\t\tcreate: function create(tag, pos) {\n\t\t\tvar signature = ul4.CodeAST.create.call(this, tag, pos);\n\t\t\tsignature.params = [];\n\t\t\treturn signature;\n\t\t},\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tul4.CodeAST.ul4ondump.call(this, encoder);\n\n\t\t\tvar dump = [];\n\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t},\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tul4.AST.ul4onload.call(this, decoder);\n\t\t\tvar dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (var i = 0; i < dump.length; ++i) {\n\t\t\t\tvar param = dump[i];\n\t\t\t\tif (typeof (param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t},\n\t\t_eval: function _eval(context) {\n\t\t\tvar args = [];\n\t\t\tfor (var i = 0; i < this.params.length; ++i) {\n\t\t\t\tvar param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse {\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ul4.Signature.create.apply(ul4.Signature, args);\n\t\t},\n\t\t_repr: function _repr(out) {\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.typename);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t}\n);\n\nul4.TemplateClosure = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function create(template, signature, vars) {\n\t\t\tvar closure = ul4._clone(this);\n\t\t\tclosure.template = template;\n\t\t\tclosure.signature = signature;\n\t\t\tclosure.vars = vars;\n\t\t\tclosure._ul4_callsignature = signature;\n\t\t\tclosure._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tclosure.name = template.name;\n\t\t\tclosure.tag = template.tag;\n\t\t\tclosure.endtag = template.endtag;\n\t\t\tclosure.source = template.source;\n\t\t\tclosure.startdelim = template.startdelim;\n\t\t\tclosure.enddelim = template.enddelim;\n\t\t\tclosure.docpos = template.docpos;\n\t\t\tclosure.content = template.content;\n\t\t\treturn closure;\n\t\t},\n\t\t_ul4_callneedsobject: true,\n\t\t_ul4_callneedscontext: true,\n\t\t_ul4_renderneedsobject: true,\n\t\t_ul4_renderneedscontext: true,\n\t\t__render__: function __render__(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\trender: function render(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__call__: function __call__(context, vars) {\n\t\t\treturn this.template._callbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_renderbound: function _renderbound(context, vars) {\n\t\t\tthis.template._renderbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t_rendersbound: function _rendersbound(context, vars) {\n\t\t\treturn this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars));\n\t\t},\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"render\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); });\n\t\t\t\tcase \"renders\":\n\t\t\t\t\treturn ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); });\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t},\n\t\t__type__: \"ul4.TemplateClosure\" // used by ``istemplate()``\n\t}\n);\n\n// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\nul4._rgb = function _rgb(r, g, b, a) {\n\treturn this.Color.create(255 * r, 255 * g, 255 * b, 255 * a);\n};\n\n// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\nul4._xmlescape = function _xmlescape(obj) {\n\tobj = ul4._str(obj);\n\tobj = obj.replace(/&/g, \"&\");\n\tobj = obj.replace(//g, \">\");\n\tobj = obj.replace(/'/g, \"'\");\n\tobj = obj.replace(/\"/g, \""\");\n\treturn obj;\n};\n\n// Convert ``obj`` to a string suitable for output into a CSV file\nul4._csv = function _csv(obj) {\n\tif (obj === null)\n\t\treturn \"\";\n\telse if (typeof (obj) !== \"string\")\n\t\tobj = ul4._repr(obj);\n\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\treturn obj;\n};\n\n// Return a string containing one character with the codepoint ``i``\nul4._chr = function _chr(i) {\n\tif (typeof (i) != \"number\")\n\t\tthrow ul4.TypeError.create(\"chr()\", \"chr() requires an int\");\n\treturn String.fromCharCode(i);\n};\n\n// Return the codepoint for the one and only character in the string ``c``\nul4._ord = function _ord(c) {\n\tif (typeof (c) != \"string\" || c.length != 1)\n\t\tthrow ul4.TypeError.create(\"ord()\", \"ord() requires a string of length 1\");\n\treturn c.charCodeAt(0);\n};\n\n// Convert an integer to a hexadecimal string\nul4._hex = function _hex(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"hex()\", \"hex() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0x\" + number.toString(16).substr(1);\n\telse\n\t\treturn \"0x\" + number.toString(16);\n};\n\n// Convert an integer to a octal string\nul4._oct = function _oct(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"oct()\", \"oct() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0o\" + number.toString(8).substr(1);\n\telse\n\t\treturn \"0o\" + number.toString(8);\n};\n\n// Convert an integer to a binary string\nul4._bin = function _bin(number) {\n\tif (typeof (number) != \"number\")\n\t\tthrow ul4.TypeError.create(\"bin()\", \"bin() requires an int\");\n\tif (number < 0)\n\t\treturn \"-0b\" + number.toString(2).substr(1);\n\telse\n\t\treturn \"0b\" + number.toString(2);\n};\n\n// Return the minimum value\nul4._min = function _min(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"min() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"min() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value < result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the maximum value\nul4._max = function _max(obj) {\n\tif (obj.length == 0)\n\t\tthrow ul4.ArgumentError.create(\"max() requires at least 1 argument, 0 given\");\n\telse if (obj.length == 1)\n\t\tobj = obj[0];\n\tvar iter = ul4._iter(obj);\n\tvar result;\n\tvar first = true;\n\twhile (true) {\n\t\tvar item = iter.next();\n\t\tif (item.done) {\n\t\t\tif (first)\n\t\t\t\tthrow ul4.ValueError.create(\"max() argument is an empty sequence!\");\n\t\t\treturn result;\n\t\t}\n\t\tif (first || (item.value > result))\n\t\t\tresult = item.value;\n\t\tfirst = false;\n\t}\n};\n\n// Return the of the values from the iterable starting with ``start`` (default ``0``)\nul4._sum = function _sum(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tstart += item.value;\n\t}\n\treturn start;\n};\n\n// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._first = function _first(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar item = ul4._iter(iterable).next();\n\treturn item.done ? defaultValue : item.value;\n};\n\n// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\nul4._last = function _last(iterable, defaultValue) {\n\tif (typeof (defaultValue) === \"undefined\")\n\t\tdefaultValue = null;\n\n\tvar value = defaultValue;\n\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tvalue = item.value;\n\t}\n\treturn value;\n};\n\n// Return a sorted version of ``iterable``\nul4._sorted = function _sorted(context, iterable, key, reverse) {\n\tvar cmp;\n\tif (key === null) {\n\t\t// FIXME: stability\n\t\tif (reverse) {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tcmp = function cmp(a, b) {\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t}\n\t\t}\n\t\tvar result = ul4._list(iterable);\n\t\tresult.sort(cmp);\n\t\treturn result;\n\t}\n\telse {\n\t\tvar sort = [];\n\n\t\tfor (var i = 0, iter = ul4._iter(iterable); ; ++i) {\n\t\t\tvar item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvar keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\tsort.push([keyvalue, i, item.value]);\n\t\t}\n\t\tcmp = function cmp(s1, s2) {\n\t\t\tvar res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\tif (res)\n\t\t\t\treturn reverse ? -res : res;\n\t\t\tres = ul4._cmp(s1[1], s2[1]);\n\t\t\treturn reverse ? -res : res;\n\t\t}\n\n\t\tsort.sort(cmp);\n\n\t\tvar result = [];\n\t\tfor (var i = 0; i < sort.length; ++i) {\n\t\t\tresult.push(sort[i][2]);\n\t\t}\n\t\treturn result;\n\t}\n};\n\n// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step``\nul4._range = function _range(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required range() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar lower, higher;\n\tif (step === 0)\n\t\tthrow ul4.ValueError.create(\"range() requires a step argument != 0\");\n\telse if (step > 0) {\n\t\tlower = start;\n\t\theigher = stop;\n\t}\n\telse {\n\t\tlower = stop;\n\t\theigher = start;\n\t}\n\tvar length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0;\n\n\treturn {\n\t\tindex: 0,\n\t\tnext: function () {\n\t\t\tif (this.index >= length)\n\t\t\t\treturn { done: true };\n\t\t\treturn { value: start + (this.index++) * step, done: false };\n\t\t}\n\t};\n};\n\n// Return a iterable object returning a slice from the argument\nul4._slice = function _slice(args) {\n\tvar iterable, start, stop, step;\n\tif (args.length < 2)\n\t\tthrow ul4.ArgumentError.create(\"required slice() argument missing\");\n\telse if (args.length > 4)\n\t\tthrow ul4.ArgumentError.create(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 2) {\n\t\titerable = args[0];\n\t\tstart = 0;\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 4) {\n\t\titerable = args[0];\n\t\tstart = args[1] !== null ? args[1] : 0;\n\t\tstop = args[2];\n\t\tstep = args[3] !== null ? args[3] : 1;\n\t}\n\tif (start < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a start argument >= 0\");\n\tif (stop < 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a stop argument >= 0\");\n\tif (step <= 0)\n\t\tthrow ul4.ValueError.create(\"slice() requires a step argument > 0\");\n\n\tvar next = start, count = 0;\n\tvar iter = ul4._iter(iterable);\n\treturn {\n\t\tnext: function () {\n\t\t\tvar result;\n\t\t\twhile (count < next) {\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t}\n\t\t\tif (stop !== null && count >= stop)\n\t\t\t\treturn { done: true };\n\t\t\tresult = iter.next();\n\t\t\tif (result.done)\n\t\t\t\treturn result;\n\t\t\t++count;\n\t\t\tnext += step;\n\t\t\tif (stop !== null && next > stop)\n\t\t\t\tnext = stop;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// ``%`` escape unsafe characters in the string ``string``\nul4._urlquote = function _urlquote(string) {\n\treturn encodeURIComponent(string);\n};\n\n// The inverse function of ``urlquote``\nul4._urlunquote = function _urlunquote(string) {\n\treturn decodeURIComponent(string);\n};\n\n// Return a reverse iterator over ``sequence``\nul4._reversed = function _reversed(sequence) {\n\tif (typeof (sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\tsequence = ul4._list(sequence);\n\treturn {\n\t\tindex: sequence.length - 1,\n\t\tnext: function () {\n\t\t\treturn this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true };\n\t\t}\n\t};\n};\n\n// Returns a random number in the interval ``[0;1[``\nul4._random = function _random() {\n\treturn Math.random();\n};\n\n// Return a randomly select item from ``range(start, stop, step)``\nul4._randrange = function _randrange(args) {\n\tvar start, stop, step;\n\tif (args.length < 1)\n\t\tthrow ul4.ArgumentError.create(\"required randrange() argument missing\");\n\telse if (args.length > 3)\n\t\tthrow ul4.ArgumentError.create(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\telse if (args.length == 1) {\n\t\tstart = 0;\n\t\tstop = args[0];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 2) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = 1;\n\t}\n\telse if (args.length == 3) {\n\t\tstart = args[0];\n\t\tstop = args[1];\n\t\tstep = args[2];\n\t}\n\tvar width = stop - start;\n\n\tvar value = Math.random();\n\n\tvar n;\n\tif (step > 0)\n\t\tn = Math.floor((width + step - 1) / step);\n\telse if (step < 0)\n\t\tn = Math.floor((width + step + 1) / step);\n\telse\n\t\tthrow ul4.ValueError.create(\"randrange() requires a step argument != 0\");\n\treturn start + step * Math.floor(value * n);\n};\n\n// Return a random item/char from the list/string ``sequence``\nul4._randchoice = function _randchoice(sequence) {\n\tvar iscolor = ul4._iscolor(sequence);\n\tif (typeof (sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\tthrow ul4.TypeError.create(\"randchoice() requires a string or list\");\n\tif (iscolor)\n\t\tsequence = ul4._list(sequence);\n\treturn sequence[Math.floor(Math.random() * sequence.length)];\n};\n\n// Round a number ``x`` to ``digits`` decimal places (may be negative)\nul4._round = function _round(x, digits) {\n\tif (typeof (digits) === \"undefined\")\n\t\tdigits = 0;\n\tif (digits) {\n\t\tvar threshhold = Math.pow(10, digits);\n\t\treturn Math.round(x * threshhold) / threshhold;\n\t}\n\telse\n\t\treturn Math.round(x);\n};\n\n// Return a hex-encode MD5 hash of the argument\n// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5\nul4._md5 = function _md5(string) {\n\treturn md5(string);\n};\n\n// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\nul4._enumerate = function _enumerate(iterable, start) {\n\tif (typeof (start) === \"undefined\")\n\t\tstart = 0;\n\n\treturn {\n\t\titer: ul4._iter(iterable),\n\t\tindex: start,\n\t\tnext: function () {\n\t\t\tvar item = this.iter.next();\n\t\t\treturn item.done ? item : { value: [this.index++, item.value], done: false };\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\nul4._isfirst = function _isfirst(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\treturn {\n\t\tnext: function () {\n\t\t\tvar item = iter.next();\n\t\t\tvar result = item.done ? item : { value: [isfirst, item.value], done: false };\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\nul4._islast = function _islast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._isfirstlast = function _isfirstlast(iterable) {\n\tvar iter = ul4._iter(iterable);\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\nul4._enumfl = function _enumfl(iterable, start) {\n\tvar iter = ul4._iter(iterable);\n\tvar i = start;\n\tvar isfirst = true;\n\tvar lastitem = iter.next();\n\treturn {\n\t\tnext: function () {\n\t\t\tif (lastitem.done)\n\t\t\t\treturn lastitem;\n\t\t\tvar item = iter.next();\n\t\t\tvar result = { value: [i++, isfirst, item.done, lastitem.value], done: false };\n\t\t\tlastitem = item;\n\t\t\tisfirst = false;\n\t\t\treturn result;\n\t\t}\n\t};\n};\n\n// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\nul4._zip = function _zip(iterables) {\n\tvar result;\n\tif (iterables.length) {\n\t\tvar iters = [];\n\t\tfor (var i = 0; i < iterables.length; ++i)\n\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\tvar items = [];\n\t\t\t\tfor (var i = 0; i < iters.length; ++i) {\n\t\t\t\t\tvar item = iters[i].next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\treturn item;\n\t\t\t\t\titems.push(item.value);\n\t\t\t\t}\n\t\t\t\treturn { value: items, done: false };\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\treturn { done: true };\n\t\t\t}\n\t\t};\n\t}\n};\n\n// Return the absolute value for the number ``number``\nul4._abs = function _abs(number) {\n\tif (number !== null && typeof (number.__abs__) === \"function\")\n\t\treturn number.__abs__();\n\treturn Math.abs(number);\n};\n\n// Return a ``Date`` object from the arguments passed in\nul4._date = function _date(year, month, day, hour, minute, second, microsecond) {\n\tif (typeof (hour) === \"undefined\")\n\t\thour = 0;\n\n\tif (typeof (minute) === \"undefined\")\n\t\tminute = 0;\n\n\tif (typeof (second) === \"undefined\")\n\t\tsecond = 0;\n\n\tif (typeof (microsecond) === \"undefined\")\n\t\tmicrosecond = 0;\n\n\treturn new Date(year, month - 1, day, hour, minute, second, microsecond / 1000);\n};\n\n// Return a ``TimeDelta`` object from the arguments passed in\nul4._timedelta = function _timedelta(days, seconds, microseconds) {\n\treturn this.TimeDelta.create(days, seconds, microseconds);\n};\n\n// Return a ``MonthDelta`` object from the arguments passed in\nul4._monthdelta = function _monthdelta(months) {\n\treturn this.MonthDelta.create(months);\n};\n\n// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\nul4._hls = function _hls(h, l, s, a) {\n\tvar _v = function (m1, m2, hue) {\n\t\thue = hue % 1.0;\n\t\tif (hue < 1 / 6)\n\t\t\treturn m1 + (m2 - m1) * hue * 6.0;\n\t\telse if (hue < 0.5)\n\t\t\treturn m2;\n\t\telse if (hue < 2 / 3)\n\t\t\treturn m1 + (m2 - m1) * (2 / 3 - hue) * 6.0;\n\t\treturn m1;\n\t};\n\n\tvar m1, m2;\n\tif (typeof (a) === \"undefined\")\n\t\ta = 1;\n\tif (s === 0.0)\n\t\treturn ul4._rgb(l, l, l, a);\n\tif (l <= 0.5)\n\t\tm2 = l * (1.0 + s);\n\telse\n\t\tm2 = l + s - (l * s);\n\tm1 = 2.0 * l - m2;\n\treturn ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a);\n};\n\n// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\nul4._hsv = function _hsv(h, s, v, a) {\n\tif (s === 0.0)\n\t\treturn ul4._rgb(v, v, v, a);\n\tvar i = Math.floor(h * 6.0);\n\tvar f = (h * 6.0) - i;\n\tvar p = v * (1.0 - s);\n\tvar q = v * (1.0 - s * f);\n\tvar t = v * (1.0 - s * (1.0 - f));\n\tswitch (i % 6) {\n\t\tcase 0:\n\t\t\treturn ul4._rgb(v, t, p, a);\n\t\tcase 1:\n\t\t\treturn ul4._rgb(q, v, p, a);\n\t\tcase 2:\n\t\t\treturn ul4._rgb(p, v, t, a);\n\t\tcase 3:\n\t\t\treturn ul4._rgb(p, q, v, a);\n\t\tcase 4:\n\t\t\treturn ul4._rgb(t, p, v, a);\n\t\tcase 5:\n\t\t\treturn ul4._rgb(v, p, q, a);\n\t}\n};\n\n// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\nul4._get = function _get(container, key, defaultvalue) {\n\tif (ul4._ismap(container)) {\n\t\tif (container.has(key))\n\t\t\treturn container.get(key);\n\t\treturn defaultvalue;\n\t}\n\telse if (ul4._isobject(container)) {\n\t\tvar result = container[key];\n\t\tif (typeof (result) === \"undefined\")\n\t\t\treturn defaultvalue;\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"get()\", \"get() requires a dict\");\n};\n\n// Return a ``Date`` object for the current time\nul4.now = function now() {\n\treturn new Date();\n};\n\n// Return a ``Date`` object for the current time in UTC\nul4.utcnow = function utcnow() {\n\tvar now = new Date();\n\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n};\n\nul4.functions = {\n\trepr: ul4.expose([\"obj\"], { name: \"repr\" }, ul4._repr),\n\tascii: ul4.expose([\"obj\"], { name: \"ascii\" }, ul4._ascii),\n\tstr: ul4.expose([\"obj=\", \"\"], { name: \"str\" }, ul4._str),\n\tint: ul4.expose([\"obj=\", 0, \"base=\", null], { name: \"int\" }, ul4._int),\n\tfloat: ul4.expose([\"obj=\", 0.0], { name: \"float\" }, ul4._float),\n\tlist: ul4.expose([\"iterable=\", []], { name: \"list\" }, ul4._list),\n\tset: ul4.expose([\"iterable=\", []], { name: \"set\" }, ul4._set),\n\tbool: ul4.expose([\"obj=\", false], { name: \"bool\" }, ul4._bool),\n\tlen: ul4.expose([\"sequence\"], { name: \"len\" }, ul4._len),\n\ttype: ul4.expose([\"obj\"], { name: \"type\" }, ul4._type),\n\tformat: ul4.expose([\"obj\", \"fmt\", \"lang=\", null], { name: \"format\" }, ul4._format),\n\tany: ul4.expose([\"iterable\"], { name: \"any\" }, ul4._any),\n\tall: ul4.expose([\"iterable\"], { name: \"all\" }, ul4._all),\n\tzip: ul4.expose([\"*iterables\"], { name: \"zip\" }, ul4._zip),\n\tisundefined: ul4.expose([\"obj\"], { name: \"isundefined\" }, ul4._isundefined),\n\tisdefined: ul4.expose([\"obj\"], { name: \"isdefined\" }, ul4._isdefined),\n\tisnone: ul4.expose([\"obj\"], { name: \"isnone\" }, ul4._isnone),\n\tisbool: ul4.expose([\"obj\"], { name: \"isbool\" }, ul4._isbool),\n\tisint: ul4.expose([\"obj\"], { name: \"isint\" }, ul4._isint),\n\tisfloat: ul4.expose([\"obj\"], { name: \"isfloat\" }, ul4._isfloat),\n\tisstr: ul4.expose([\"obj\"], { name: \"isstr\" }, ul4._isstr),\n\tisdate: ul4.expose([\"obj\"], { name: \"isdate\" }, ul4._isdate),\n\tiscolor: ul4.expose([\"obj\"], { name: \"iscolor\" }, ul4._iscolor),\n\tistimedelta: ul4.expose([\"obj\"], { name: \"istimedelta\" }, ul4._istimedelta),\n\tismonthdelta: ul4.expose([\"obj\"], { name: \"ismonthdelta\" }, ul4._ismonthdelta),\n\tistemplate: ul4.expose([\"obj\"], { name: \"istemplate\" }, ul4._istemplate),\n\tisfunction: ul4.expose([\"obj\"], { name: \"isfunction\" }, ul4._isfunction),\n\tislist: ul4.expose([\"obj\"], { name: \"islist\" }, ul4._islist),\n\tisset: ul4.expose([\"obj\"], { name: \"isset\" }, ul4on._haveset ? ul4._isset : ul4._isul4set),\n\tisdict: ul4.expose([\"obj\"], { name: \"isdict\" }, ul4._isdict),\n\tisexception: ul4.expose([\"obj\"], { name: \"isexception\" }, ul4._isexception),\n\tasjson: ul4.expose([\"obj\"], { name: \"asjson\" }, ul4._asjson),\n\tfromjson: ul4.expose([\"string\"], { name: \"fromjson\" }, ul4._fromjson),\n\tasul4on: ul4.expose([\"obj\"], { name: \"asul4on\" }, ul4._asul4on),\n\tfromul4on: ul4.expose([\"string\"], { name: \"fromul4on\" }, ul4._fromul4on),\n\tnow: ul4.expose([], ul4.now),\n\tutcnow: ul4.expose([], ul4.utcnow),\n\tenumerate: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumerate\" }, ul4._enumerate),\n\tisfirst: ul4.expose([\"iterable\"], { name: \"isfirst\" }, ul4._isfirst),\n\tislast: ul4.expose([\"iterable\"], { name: \"islast\" }, ul4._islast),\n\tisfirstlast: ul4.expose([\"iterable\"], { name: \"isfirstlast\" }, ul4._isfirstlast),\n\tenumfl: ul4.expose([\"iterable\", \"start=\", 0], { name: \"enumfl\" }, ul4._enumfl),\n\tabs: ul4.expose([\"number\"], { name: \"abs\" }, ul4._abs),\n\tdate: ul4.expose([\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], { name: \"date\" }, ul4._date),\n\ttimedelta: ul4.expose([\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], { name: \"timedelta\" }, ul4._timedelta),\n\tmonthdelta: ul4.expose([\"months=\", 0], { name: \"monthdelta\" }, ul4._monthdelta),\n\trgb: ul4.expose([\"r\", \"g\", \"b\", \"a=\", 1.0], { name: \"rgb\" }, ul4._rgb),\n\thls: ul4.expose([\"h\", \"l\", \"s\", \"a=\", 1.0], { name: \"hls\" }, ul4._hls),\n\thsv: ul4.expose([\"h\", \"s\", \"v\", \"a=\", 1.0], { name: \"hsv\" }, ul4._hsv),\n\txmlescape: ul4.expose([\"obj\"], { name: \"xmlescape\" }, ul4._xmlescape),\n\tcsv: ul4.expose([\"obj\"], { name: \"csv\" }, ul4._csv),\n\tchr: ul4.expose([\"i\"], { name: \"chr\" }, ul4._chr),\n\tord: ul4.expose([\"c\"], { name: \"ord\" }, ul4._ord),\n\thex: ul4.expose([\"number\"], { name: \"hex\" }, ul4._hex),\n\toct: ul4.expose([\"number\"], { name: \"oct\" }, ul4._oct),\n\tbin: ul4.expose([\"number\"], { name: \"bin\" }, ul4._bin),\n\tmin: ul4.expose([\"*obj\"], { name: \"min\" }, ul4._min),\n\tmax: ul4.expose([\"*obj\"], { name: \"max\" }, ul4._max),\n\tsum: ul4.expose([\"iterable\", \"start=\", 0], { name: \"sum\" }, ul4._sum),\n\tfirst: ul4.expose([\"iterable\", \"default=\", null], { name: \"first\" }, ul4._first),\n\tlast: ul4.expose([\"iterable\", \"default=\", null], { name: \"last\" }, ul4._last),\n\tsorted: ul4.expose([\"iterable\", \"key=\", null, \"reverse=\", false], { name: \"sorted\", needscontext: true }, ul4._sorted),\n\trange: ul4.expose([\"*args\"], { name: \"range\" }, ul4._range),\n\tslice: ul4.expose([\"*args\"], { name: \"slice\" }, ul4._slice),\n\turlquote: ul4.expose([\"string\"], { name: \"urlquote\" }, ul4._urlquote),\n\turlunquote: ul4.expose([\"string\"], { name: \"urlunquote\" }, ul4._urlunquote),\n\treversed: ul4.expose([\"sequence\"], { name: \"reversed\" }, ul4._reversed),\n\trandom: ul4.expose([], { name: \"random\" }, ul4._random),\n\trandrange: ul4.expose([\"*args\"], { name: \"randrange\" }, ul4._randrange),\n\trandchoice: ul4.expose([\"sequence\"], { name: \"randchoice\" }, ul4._randchoice),\n\tround: ul4.expose([\"x\", \"digit=\", 0], { name: \"round\" }, ul4._round),\n\tmd5: ul4.expose([\"string\"], { name: \"md5\" }, ul4._md5)\n};\n\n// Functions implementing UL4 methods\nul4._replace = function _replace(string, old, new_, count) {\n\tif (count === null)\n\t\tcount = string.length;\n\n\tvar result = [];\n\twhile (string.length) {\n\t\tvar pos = string.indexOf(old);\n\t\tif (pos === -1 || !count--) {\n\t\t\tresult.push(string);\n\t\t\tbreak;\n\t\t}\n\t\tresult.push(string.substr(0, pos));\n\t\tresult.push(new_);\n\t\tstring = string.substr(pos + old.length);\n\t}\n\treturn result.join(\"\");\n};\n\nul4._strip = function _strip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"strip()\", \"strip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._lstrip = function _lstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"lstrip()\", \"lstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[0]) >= 0)\n\t\tstring = string.substr(1);\n\treturn string;\n};\n\nul4._rstrip = function _rstrip(string, chars) {\n\tif (chars === null)\n\t\tchars = \" \\r\\n\\t\";\n\telse if (typeof (chars) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rstrip()\", \"rstrip() requires two strings\");\n\n\twhile (string && chars.indexOf(string[string.length - 1]) >= 0)\n\t\tstring = string.substr(0, string.length - 1);\n\treturn string;\n};\n\nul4._split = function _split(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"split()\", \"split() requires a string\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.indexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.push(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(string.substr(0, pos));\n\t\t\t\tstring = string.substr(pos + sep.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._lstrip(string, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.push(part);\n\t\t\t\tstring = string.substr(part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._rsplit = function _rsplit(string, sep, count) {\n\tif (sep !== null && typeof (sep) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"rsplit()\", \"rsplit() requires a string as second argument\");\n\n\tif (count === null) {\n\t\tvar result = string.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\tif (sep === null) {\n\t\t\tif (result.length && !result[0].length)\n\t\t\t\tresult.splice(0, 1);\n\t\t\tif (result.length && !result[result.length - 1].length)\n\t\t\t\tresult.splice(-1);\n\t\t}\n\t\treturn result;\n\t}\n\telse {\n\t\tif (sep !== null) {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tvar pos = string.lastIndexOf(sep);\n\t\t\t\tif (pos === -1 || !count--) {\n\t\t\t\t\tresult.unshift(string);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.unshift(string.substr(pos + sep.length));\n\t\t\t\tstring = string.substr(0, pos);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\telse {\n\t\t\tvar result = [];\n\t\t\twhile (string.length) {\n\t\t\t\tstring = ul4._rstrip(string, null, null);\n\t\t\t\tvar part;\n\t\t\t\tif (!count--)\n\t\t\t\t\tpart = string; // Take the rest of the string\n\t\t\t\telse {\n\t\t\t\t\tpart = string.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\tpart = part[part.length - 1];\n\t\t\t\t}\n\t\t\t\tif (part.length)\n\t\t\t\t\tresult.unshift(part);\n\t\t\t\tstring = string.substr(0, string.length - part.length);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n};\n\nul4._splitlines = function _splitlines(string, keepends) {\n\tvar lookingAtLineEnd = function lookingAtLineEnd() {\n\t\tvar c = string[pos];\n\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\treturn 1;\n\t\tif (c === '\\r') {\n\t\t\tif (pos == length - 1)\n\t\t\t\treturn 1;\n\t\t\tif (string[pos + 1] === '\\n')\n\t\t\t\treturn 2;\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\n\tvar result = [], length = string.length;\n\n\tfor (var pos = 0, startpos = 0; ;) {\n\t\tif (pos >= length) {\n\t\t\tif (startpos != pos)\n\t\t\t\tresult.push(string.substring(startpos));\n\t\t\treturn result;\n\t\t}\n\t\tvar lineendlen = lookingAtLineEnd();\n\t\tif (!lineendlen)\n\t\t\t++pos;\n\t\telse {\n\t\t\tvar endpos = pos + (keepends ? lineendlen : 0);\n\t\t\tresult.push(string.substring(startpos, endpos));\n\t\t\tpos += lineendlen;\n\t\t\tstartpos = pos;\n\t\t}\n\t}\n};\n\nul4._count = function _count(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\n\tvar isstr = ul4._isstr(obj);\n\n\tif (isstr && !sub.length) {\n\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\treturn 0;\n\t\tvar result = end - start + 1;\n\t\tif (result > obj.length + 1)\n\t\t\tresult = obj.length + 1;\n\t\treturn result;\n\t}\n\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tvar count = 0;\n\tif (ul4._islist(obj)) {\n\t\tfor (var i = start; i < end; ++i) {\n\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t++count;\n\t\t}\n\t\treturn count;\n\t}\n\telse // string\n\t{\n\t\tvar lastIndex = start;\n\n\t\tfor (; ;) {\n\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\tif (lastIndex == -1)\n\t\t\t\tbreak;\n\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\tbreak;\n\t\t\t++count;\n\t\t\tlastIndex += sub.length;\n\t\t}\n\t\treturn count;\n\t}\n};\n\nul4._find = function _find(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.indexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._rfind = function _rfind(obj, sub, start, end) {\n\tif (start < 0)\n\t\tstart += obj.length;\n\tif (start === null)\n\t\tstart = 0;\n\tif (end < 0)\n\t\tend += obj.length;\n\tif (end === null)\n\t\tend = obj.length;\n\tstart = ul4._bound(start, obj.length);\n\tend = ul4._bound(end, obj.length);\n\n\tif (start !== 0 || end !== obj.length) {\n\t\tif (typeof (obj) == \"string\")\n\t\t\tobj = obj.substring(start, end);\n\t\telse\n\t\t\tobj = obj.slice(start, end);\n\t}\n\tvar result = obj.lastIndexOf(sub);\n\tif (result !== -1)\n\t\tresult += start;\n\treturn result;\n};\n\nul4._capitalize = function _capitalize(obj) {\n\tif (typeof (obj) != \"string\")\n\t\tthrow ul4.TypeError.create(\"capitalize()\", \"capitalize() requires a string\");\n\n\tif (obj.length)\n\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\treturn obj;\n};\n\nul4._items = function _items(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push([key, value]);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push([key, obj[key]]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"items()\", \"items() requires a dict\");\n};\n\nul4._values = function _values(obj) {\n\tif (ul4._ismap(obj)) {\n\t\tvar result = [];\n\t\tobj.forEach(function (value, key) {\n\t\t\tresult.push(value);\n\t\t});\n\t\treturn result;\n\t}\n\telse if (ul4._isobject(obj)) {\n\t\tvar result = [];\n\t\tfor (var key in obj)\n\t\t\tresult.push(obj[key]);\n\t\treturn result;\n\t}\n\tthrow ul4.TypeError.create(\"values()\", \"values() requires a dict\");\n};\n\nul4._join = function _join(sep, iterable) {\n\tvar resultlist = [];\n\tfor (var iter = ul4._iter(iterable); ;) {\n\t\tvar item = iter.next();\n\t\tif (item.done)\n\t\t\tbreak;\n\t\tresultlist.push(item.value);\n\t}\n\treturn resultlist.join(sep);\n};\n\nul4._startswith = function _startswith(string, prefix) {\n\tif (typeof (prefix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"startswith()\", \"startswith() argument must be string\");\n\n\treturn string.substr(0, prefix.length) === prefix;\n};\n\nul4._endswith = function _endswith(string, suffix) {\n\tif (typeof (suffix) !== \"string\")\n\t\tthrow ul4.TypeError.create(\"endswith()\", \"endswith() argument must be string\");\n\n\treturn string.substr(string.length - suffix.length) === suffix;\n};\n\nul4._isoformat = function _isoformat(obj) {\n\tif (!ul4._isdate(obj))\n\t\tthrow ul4.TypeError.create(\"isoformat()\", \"isoformat() requires a date\");\n\n\tvar result = obj.getFullYear() + \"-\" + ul4._lpad((obj.getMonth() + 1).toString(), \"0\", 2) + \"-\" + ul4._lpad(obj.getDate().toString(), \"0\", 2);\n\tvar hour = obj.getHours();\n\tvar minute = obj.getMinutes();\n\tvar second = obj.getSeconds();\n\tvar ms = obj.getMilliseconds();\n\tif (hour || minute || second || ms) {\n\t\tresult += \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\tif (ms)\n\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t}\n\treturn result;\n};\n\nul4._mimeformat = function _mimeformat(obj) {\n\tvar weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\tvar monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\treturn weekdayname[ul4._weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n};\n\nul4._weekday = function _weekday(obj) {\n\tvar d = obj.getDay();\n\treturn d ? d - 1 : 6;\n};\n\nul4._week = function _week(obj, firstweekday) {\n\tif (firstweekday === null)\n\t\tfirstweekday = 0;\n\telse\n\t\tfirstweekday %= 7;\n\n\tvar yearday = ul4._yearday(obj) + 6;\n\tvar jan1 = new Date(obj.getFullYear(), 0, 1);\n\tvar jan1weekday = jan1.getDay();\n\tif (--jan1weekday < 0)\n\t\tjan1weekday = 6;\n\n\twhile (jan1weekday != firstweekday) {\n\t\t--yearday;\n\t\tif (++jan1weekday == 7)\n\t\t\tjan1weekday = 0;\n\t}\n\treturn Math.floor(yearday / 7);\n};\n\nul4._isleap = function _isleap(obj) {\n\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n};\n\nul4._yearday = function _yearday(obj) {\n\tvar leap = ul4._isleap(obj) ? 1 : 0;\n\tvar day = obj.getDate();\n\tswitch (obj.getMonth()) {\n\t\tcase 0:\n\t\t\treturn day;\n\t\tcase 1:\n\t\t\treturn 31 + day;\n\t\tcase 2:\n\t\t\treturn 31 + 28 + leap + day;\n\t\tcase 3:\n\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\tcase 4:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\tcase 5:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\tcase 6:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\tcase 7:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\tcase 8:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\tcase 9:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\tcase 10:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\tcase 11:\n\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t}\n};\n\nul4._append = function _append(obj, items) {\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.push(items[i]);\n\treturn null;\n};\n\nul4._insert = function _insert(obj, pos, items) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tfor (var i = 0; i < items.length; ++i)\n\t\tobj.splice(pos++, 0, items[i]);\n\treturn null;\n};\n\nul4._pop = function _pop(obj, pos) {\n\tif (pos < 0)\n\t\tpos += obj.length;\n\n\tvar result = obj[pos];\n\tobj.splice(pos, 1);\n\treturn result;\n};\n\nul4._update = function _update(obj, others, kwargs) {\n\tif (!ul4._isdict(obj))\n\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict\");\n\tfor (var i = 0; i < others.length; ++i) {\n\t\tvar other = others[i];\n\t\tif (ul4._ismap(other)) {\n\t\t\tother.forEach(function (value, key) {\n\t\t\t\tul4on._setmap(obj, key, value);\n\t\t\t});\n\t\t}\n\t\telse if (ul4._isobject(other)) {\n\t\t\tfor (var key in other)\n\t\t\t\tul4on._setmap(obj, key, other[key]);\n\t\t}\n\t\telse if (ul4._islist(other)) {\n\t\t\tfor (var j = 0; j < other.length; ++j) {\n\t\t\t\tif (!ul4._islist(other[j]) || (other[j].length != 2))\n\t\t\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\tul4on._setmap(obj, other[j][0], other[j][1]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow ul4.TypeError.create(\"update()\", \"update() requires a dict or a list of (key, value) pairs\");\n\t}\n\tfor (var key in kwargs)\n\t\tul4on._setmap(obj, key, kwargs[key]);\n\treturn null;\n};\n\nul4._clear = function _clear(obj) {\n\tif (ul4._ismap(obj))\n\t\tobj.clear();\n\telse if (ul4._isset(obj))\n\t\tobj.clear();\n\telse if (ul4._isobject(obj)) {\n\t\tfor (var key in obj)\n\t\t\tdelete obj[key];\n\t}\n\telse\n\t\tthrow ul4.TypeError.create(\"clear()\", \"clear() requires a dict or set\");\n\treturn null;\n};\n\nul4.Color = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.Color\",\n\n\t\tcreate: function create(r, g, b, a) {\n\t\t\tvar c = ul4._clone(this);\n\t\t\tc._r = typeof (r) !== \"undefined\" ? r : 0;\n\t\t\tc._g = typeof (g) !== \"undefined\" ? g : 0;\n\t\t\tc._b = typeof (b) !== \"undefined\" ? b : 0;\n\t\t\tc._a = typeof (a) !== \"undefined\" ? a : 255;\n\t\t\treturn c;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._a !== 0xff) {\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a / 255) + \")\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tvar g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tvar b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tvar a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t},\n\n\t\t__iter__: function __iter__() {\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function () {\n\t\t\t\t\tif (this.index == 0) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._r, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._g, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._b, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3) {\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn { value: this.obj._a, done: false };\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"r\":\n\t\t\t\t\treturn ul4.expose([], function r() { return self._r; });\n\t\t\t\tcase \"g\":\n\t\t\t\t\treturn ul4.expose([], function g() { return self._g; });\n\t\t\t\tcase \"b\":\n\t\t\t\t\treturn ul4.expose([], function b() { return self._b; });\n\t\t\t\tcase \"a\":\n\t\t\t\t\treturn ul4.expose([], function a() { return self._a; });\n\t\t\t\tcase \"lum\":\n\t\t\t\t\treturn ul4.expose([], function lum() { return self.lum(); });\n\t\t\t\tcase \"hls\":\n\t\t\t\t\treturn ul4.expose([], function hls() { return self.hls(); });\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\treturn ul4.expose([], function hlsa() { return self.hlsa(); });\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\treturn ul4.expose([], function hsv() { return self.hsv(); });\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\treturn ul4.expose([], function hsva() { return self.hsva(); });\n\t\t\t\tcase \"witha\":\n\t\t\t\t\treturn ul4.expose([\"a\"], function witha(a) { return self.witha(a); });\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function withlum(lum) { return self.withlum(lum); });\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function abslum(lum) { return self.abslum(lum); });\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\treturn ul4.expose([\"lum\"], function rellum(lum) { return self.rellum(lum); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__getitem__: function __getitem__(key) {\n\t\t\tvar orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._iscolor(other))\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t},\n\n\t\tr: ul4.expose([], function r() { return this._r; }),\n\n\t\tg: ul4.expose([], function g() { return this._g; }),\n\n\t\tb: ul4.expose([], function b() { return this._b; }),\n\n\t\ta: ul4.expose([], function a() { return this._a; }),\n\n\t\tlum: ul4.expose([], function lum() { return this.hls()[1]; }),\n\n\t\thls: ul4.expose([],\n\t\t\tfunction hls() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar h, l, s;\n\t\t\t\tvar rc, gc, bc;\n\n\t\t\t\tl = (minc + maxc) / 2.0;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, l, 0.0];\n\t\t\t\tif (l <= 0.5)\n\t\t\t\t\ts = (maxc - minc) / (maxc + minc);\n\t\t\t\telse\n\t\t\t\t\ts = (maxc - minc) / (2.0 - maxc - minc);\n\t\t\t\trc = (maxc - r) / (maxc - minc);\n\t\t\t\tgc = (maxc - g) / (maxc - minc);\n\t\t\t\tbc = (maxc - b) / (maxc - minc);\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, l, s];\n\t\t\t}\n\t\t),\n\n\t\thlsa: ul4.expose([],\n\t\t\tfunction hlsa() {\n\t\t\t\tvar hls = this.hls();\n\t\t\t\treturn hls.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\thsv: ul4.expose([],\n\t\t\tfunction hsv() {\n\t\t\t\tvar r = this._r / 255.0;\n\t\t\t\tvar g = this._g / 255.0;\n\t\t\t\tvar b = this._b / 255.0;\n\t\t\t\tvar maxc = Math.max(r, g, b);\n\t\t\t\tvar minc = Math.min(r, g, b);\n\t\t\t\tvar v = maxc;\n\t\t\t\tif (minc == maxc)\n\t\t\t\t\treturn [0.0, 0.0, v];\n\t\t\t\tvar s = (maxc - minc) / maxc;\n\t\t\t\tvar rc = (maxc - r) / (maxc - minc);\n\t\t\t\tvar gc = (maxc - g) / (maxc - minc);\n\t\t\t\tvar bc = (maxc - b) / (maxc - minc);\n\t\t\t\tvar h;\n\t\t\t\tif (r == maxc)\n\t\t\t\t\th = bc - gc;\n\t\t\t\telse if (g == maxc)\n\t\t\t\t\th = 2.0 + rc - bc;\n\t\t\t\telse\n\t\t\t\t\th = 4.0 + gc - rc;\n\t\t\t\th = (h / 6.0) % 1.0;\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\t\t),\n\n\t\thsva: ul4.expose([],\n\t\t\tfunction hsva() {\n\t\t\t\tvar hsv = this.hsv();\n\t\t\t\treturn hsv.concat(this._a / 255.0);\n\t\t\t}\n\t\t),\n\n\t\twitha: ul4.expose([\"a\"],\n\t\t\tfunction witha(a) {\n\t\t\t\tif (typeof (a) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\treturn ul4.Color.create(this._r, this._g, this._b, a);\n\t\t\t}\n\t\t),\n\n\t\twithlum: ul4.expose([\"lum\"],\n\t\t\tfunction withlum(lum) {\n\t\t\t\tif (typeof (lum) !== \"number\")\n\t\t\t\t\tthrow ul4.TypeError.create(\"witha()\", \"witha() requires a number\");\n\t\t\t\tvar hlsa = this.hlsa();\n\t\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t\t}\n\t\t)\n\t}\n);\n\nul4.TimeDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.TimeDelta\",\n\n\t\tcreate: function create(days, seconds, microseconds) {\n\t\t\tvar td = ul4._clone(this);\n\t\t\tif (typeof (days) === \"undefined\")\n\t\t\t\tdays = 0;\n\t\t\tif (typeof (seconds) === \"undefined\")\n\t\t\t\tseconds = 0;\n\t\t\tif (typeof (microseconds) === \"undefined\")\n\t\t\t\tmicroseconds = 0;\n\n\t\t\tvar total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST._do(total_microseconds, 1000000);\n\t\t\tvar total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0) {\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\ttd._microseconds = microseconds;\n\t\t\ttd._seconds = seconds;\n\t\t\ttd._days = days;\n\n\t\t\treturn td;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._microseconds) {\n\t\t\t\tif (!this._seconds) {\n\t\t\t\t\tif (!this._days)\n\t\t\t\t\t\treturn \"timedelta()\";\n\t\t\t\t\treturn \"timedelta(\" + this._days + \")\";\n\t\t\t\t}\n\t\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \")\";\n\t\t\t}\n\t\t\treturn \"timedelta(\" + this._days + \", \" + this._seconds + \", \" + this._microseconds + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tvar v = [];\n\t\t\tif (this._days) {\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tvar seconds = this._seconds % 60;\n\t\t\tvar minutes = Math.floor(this._seconds / 60);\n\t\t\tvar hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds) {\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._istimedelta(other)) {\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds);\n\t\t},\n\n\t\t_add: function _add(date, days, seconds, microseconds) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth();\n\t\t\tvar day = date.getDate() + days;\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds() + seconds;\n\t\t\tvar millisecond = date.getMilliseconds() + microseconds / 1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"+\", ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._istimedelta(other))\n\t\t\t\treturn ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow ul4.TypeError.create(\"-\", ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"*\", ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (typeof (other) === \"number\") {\n\t\t\t\treturn ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (ul4._istimedelta(other)) {\n\t\t\t\tvar myValue = this._days;\n\t\t\t\tvar otherValue = other._days;\n\t\t\t\tvar hasSeconds = this._seconds || other._seconds;\n\t\t\t\tvar hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds) {\n\t\t\t\t\tmyValue = myValue * 86400 + this._seconds;\n\t\t\t\t\totherValue = otherValue * 86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds) {\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue / otherValue;\n\t\t\t}\n\t\t\tthrow ul4.TypeError.create(\"/\", ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"days\":\n\t\t\t\t\treturn ul4.expose([], function days() { return self._days; });\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\treturn ul4.expose([], function seconds() { return self._seconds; });\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\treturn ul4.expose([], function microseconds() { return self._microseconds; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tdays: function days() {\n\t\t\treturn this._days;\n\t\t},\n\n\t\tseconds: function seconds() {\n\t\t\treturn this._seconds;\n\t\t},\n\n\t\tmicroseconds: function microseconds() {\n\t\t\treturn this._microseconds;\n\t\t}\n\t}\n);\n\nul4.MonthDelta = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4.MonthDelta\",\n\n\t\tcreate: function create(months) {\n\t\t\tvar md = ul4._clone(this);\n\t\t\tmd._months = typeof (months) !== \"undefined\" ? months : 0;\n\t\t\treturn md;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t},\n\n\t\t__str__: function __str__() {\n\t\t\tif (this._months) {\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\treturn this._months !== 0;\n\t\t},\n\n\t\t__abs__: function __abs__() {\n\t\t\treturn this._months < 0 ? ul4.MonthDelta.create(-this._months) : this;\n\t\t},\n\n\t\t__eq__: function __eq__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t},\n\n\t\t__lt__: function __lt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__le__: function __le__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t},\n\n\t\t__gt__: function __gt__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t},\n\n\t\t__ge__: function __ge__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t},\n\n\t\t__neg__: function __neg__() {\n\t\t\treturn ul4.MonthDelta.create(-this._months);\n\t\t},\n\n\t\t_add: function _add(date, months) {\n\t\t\tvar year = date.getFullYear();\n\t\t\tvar month = date.getMonth() + months;\n\t\t\tvar day = date.getDate();\n\t\t\tvar hour = date.getHours();\n\t\t\tvar minute = date.getMinutes();\n\t\t\tvar second = date.getSeconds();\n\t\t\tvar millisecond = date.getMilliseconds();\n\n\t\t\twhile (true) {\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tvar targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tvar result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t},\n\n\t\t__add__: function __add__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__radd__: function __radd__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, this._months);\n\t\t\tthrow ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__sub__: function __sub__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn ul4.MonthDelta.create(this._months - other._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rsub__: function __rsub__(other) {\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._add(other, -this._months);\n\t\t\tthrow ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__mul__: function __mul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__rmul__: function __rmul__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(this._months * Math.floor(other));\n\t\t\tthrow ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__floordiv__: function __floordiv__(other) {\n\t\t\tif (typeof (other) === \"number\")\n\t\t\t\treturn ul4.MonthDelta.create(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__truediv__: function __truediv__(other) {\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\";\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"months\":\n\t\t\t\t\treturn ul4.expose([], function months() { return self._months; });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\tmonths: function months() {\n\t\t\treturn this._months;\n\t\t}\n\t}\n);\n\n// When we don't have a real ``Set`` type, emulate one that supports strings\nul4._Set = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\t__type__: \"ul4._Set\",\n\n\t\tcreate: function create() {\n\t\t\tvar set = ul4._clone(this);\n\t\t\tset.items = {};\n\t\t\tset.add.apply(set, arguments);\n\t\t\treturn set;\n\t\t},\n\n\t\tadd: function add() {\n\t\t\tfor (var i = 0; i < arguments.length; ++i) {\n\t\t\t\tthis.items[arguments[i]] = true;\n\t\t\t}\n\t\t},\n\n\t\t__getattr__: function __getattr__(attrname) {\n\t\t\tvar self = this;\n\t\t\tswitch (attrname) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose([\"*items\"], function add(items) { self.add.apply(self, items); });\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\n\t\t__contains__: function __contains__(item) {\n\t\t\treturn this.items[item] || false;\n\t\t},\n\n\t\t__bool__: function __bool__() {\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\t__repr__: function __repr__() {\n\t\t\tvar v = [];\n\t\t\tv.push(\"{\");\n\t\t\tvar i = 0;\n\t\t\tfor (var item in this.items) {\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t},\n\n\t\t__eq__: function (other) {\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Substract the number of items that ``other`` has\n\t\t\t\tfor (var item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t},\n\n\t\t__le__: function (other) {\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in this.items) {\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t},\n\n\t\t__ge__: function (other) {\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other)) {\n\t\t\t\tvar result = true;\n\t\t\t\tother.forEach(function (value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other)) {\n\t\t\t\tvar count = 0;\n\t\t\t\tfor (var item in other.items) {\n\t\t\t\t\tif (!this.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"TextAST\",\n\t\"IndentAST\",\n\t\"LineEndAST\",\n\t\"Tag\",\n\t\"ConstAST\",\n\t\"SeqItemAST\",\n\t\"UnpackSeqItemAST\",\n\t\"DictItemAST\",\n\t\"UnpackDictItemAST\",\n\t\"PosArgAST\",\n\t\"KeywordArgAST\",\n\t\"UnpackListArgAST\",\n\t\"UnpackDictArgAST\",\n\t\"ListAST\",\n\t\"ListCompAST\",\n\t\"DictAST\",\n\t\"DictCompAST\",\n\t\"SetAST\",\n\t\"SetCompAST\",\n\t\"GenExprAST\",\n\t\"VarAST\",\n\t\"NotAST\",\n\t\"NegAST\",\n\t\"BitNotAST\",\n\t\"IfAST\",\n\t\"ReturnAST\",\n\t\"PrintAST\",\n\t\"PrintXAST\",\n\t\"ItemAST\",\n\t\"IsAST\",\n\t\"IsNotAST\",\n\t\"EQAST\",\n\t\"NEAST\",\n\t\"LTAST\",\n\t\"LEAST\",\n\t\"GTAST\",\n\t\"GEAST\",\n\t\"NotContainsAST\",\n\t\"ContainsAST\",\n\t\"AddAST\",\n\t\"SubAST\",\n\t\"MulAST\",\n\t\"FloorDivAST\",\n\t\"TrueDivAST\",\n\t\"ModAST\",\n\t\"ShiftLeftAST\",\n\t\"ShiftRightAST\",\n\t\"BitAndAST\",\n\t\"BitXOrAST\",\n\t\"BitOrAST\",\n\t\"AndAST\",\n\t\"OrAST\",\n\t\"SliceAST\",\n\t\"AttrAST\",\n\t\"CallAST\",\n\t\"RenderAST\",\n\t\"SetVarAST\",\n\t\"AddVarAST\",\n\t\"SubVarAST\",\n\t\"MulVarAST\",\n\t\"TrueDivVarAST\",\n\t\"FloorDivVarAST\",\n\t\"ModVarAST\",\n\t\"ShiftLeftVarAST\",\n\t\"ShiftRightVarAST\",\n\t\"BitAndVarAST\",\n\t\"BitXOrVarAST\",\n\t\"BitOrVarAST\",\n\t\"ForBlockAST\",\n\t\"WhileBlockAST\",\n\t\"BreakAST\",\n\t\"ContinueAST\",\n\t\"CondBlockAST\",\n\t\"IfBlockAST\",\n\t\"ElIfBlockAST\",\n\t\"ElseBlockAST\",\n\t\"SignatureAST\",\n\t\"Template\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar ul4onname = name;\n\tif (ul4onname.substr(ul4onname.length - 3) === \"AST\")\n\t\tul4onname = ul4onname.substr(0, ul4onname.length - 3);\n\tul4onname = ul4onname.toLowerCase();\n\tvar object = ul4[name];\n\tobject.typename = name;\n\tobject.type = ul4onname;\n\tul4on.register(\"de.livinglogic.ul4.\" + ul4onname, object);\n}\n","import { ul4, ul4on } from './ul4';\n\nlet la = {};\n\n\nla.Base = ul4._inherit(\n\tul4.Proto,\n\t{\n\t\tcreate: function () {\n\t\t\treturn ul4._clone(this);\n\t\t},\n\n\t\tul4ondump: function ul4ondump(encoder) {\n\t\t\tfor (var i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\treturn this[name];\n\t\t},\n\n\t\tul4onload: function ul4onload(decoder) {\n\t\t\tfor (var i = 0, iter = decoder.loadcontent(); ; ++i) {\n\t\t\t\tvar iteritem = iter.next();\n\t\t\t\tif (iteritem.done)\n\t\t\t\t\tbreak;\n\t\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t\t}\n\t\t\tfor (; i < this._ul4onattrs.length; ++i) {\n\t\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t\t\t}\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tthis[name] = value;\n\t\t},\n\n\t\t_setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) {\n\t\t\tthis[name] = null;\n\t\t}\n\t}\n);\n\nla.Globals = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\t\tgeodist: function geodist(geo1, geo2) {\n\t\t\tvar sqsin = function sqsin(x) { x = Math.sin(x); return x * x };\n\t\t\tvar sqcos = function sqsos(x) { x = Math.cos(x); return x * x };\n\t\t\tvar deg2rad = Math.PI / 180; // Conversion factor degree -> radians\n\t\t\tvar radius = 6378.137; // Equatorial radius of earth in km\n\t\t\tvar flat = 1 / 298.257223563; // Earth flattening\n\n\t\t\tvar lat1 = geo1.lat * deg2rad;\n\t\t\tvar long1 = geo1.long * deg2rad;\n\t\t\tvar lat2 = geo2.lat * deg2rad;\n\t\t\tvar long2 = geo2.long * deg2rad;\n\t\t\tvar F = (lat1 + lat2) / 2;\n\t\t\tvar G = (lat1 - lat2) / 2;\n\t\t\tvar l = (long1 - long2) / 2;\n\t\t\tvar S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\t\tvar C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\t\tvar w = Math.atan(Math.sqrt(S / C));\n\t\t\tvar D = 2 * w * radius;\n\t\t\tvar T = Math.sqrt(S * C) / w;\n\t\t\tvar H1 = (3 * T - 1) / (2 * C);\n\t\t\tvar H2 = (3 * T + 1) / (2 * S);\n\t\t\tvar s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\t\treturn s;\n\t\t}\n\t}\n);\n\nla.FlashMessage = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"timestamp\", \"type\", \"title\", \"message\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.App = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"owner\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\"],\n\n\t\tinsert: function (values) {\n\t\t\treturn this.globals.Login._insert(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.View = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.DataSource = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"app\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Record = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"],\n\n\t\tdelete: function () {\n\t\t\treturn this.app.globals.Login._delete(this);\n\t\t},\n\n\t\tupdate: function (values) {\n\t\t\treturn this.app.globals.Login._update(this, values);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tsearch: function search(search) {\n\t\t\tfor (var identifier in search) {\n\t\t\t\tvar fieldsearch = search[identifier];\n\t\t\t\tif (ul4._bool(fieldsearch)) {\n\t\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"values\")\n\t\t\t\treturn this._sparsevalues;\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"values\") {\n\t\t\t\tthis._sparsevalues = value;\n\t\t\t\tthis._values = null;\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis[name] = value;\n\t\t}\n\t}\n);\n\nObject.defineProperty(la.Record, \"values\", {\n\tget: function () {\n\t\tif (this._values === null) {\n\t\t\tthis._values = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.app.controls.forEach(function (control, id) {\n\t\t\t\tvar fieldvalue = self._sparsevalues.get(control.identifier);\n\t\t\t\tif (typeof (fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tself._values.set(id, fieldvalue);\n\t\t\t});\n\t\t}\n\t\treturn this._values;\n\t}\n});\n\nObject.defineProperty(la.Record, \"fields\", {\n\tget: function () {\n\t\tif (this._fields === null) {\n\t\t\tthis._fields = ul4on._havemap ? new Map() : {};\n\t\t\tvar self = this;\n\t\t\tthis.values.forEach(function (value, id) {\n\t\t\t\tvar field = la.Field.create(self.app.controls.get(id), self.app, value);\n\t\t\t\tself._fields.set(id, field);\n\t\t\t});\n\t\t}\n\t\treturn this._fields;\n\t}\n});\n\nla.Control = ul4._inherit(\n\tla.Base,\n\t{\n\t\ttype: null,\n\t\tsubtype: null,\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\t_logsearch: function _logsearch(value, search) {\n\t\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t\t},\n\n\t\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t\t// ``value`` is the value of the field\n\t\t// ``search`` is an object with information what we're searching for\n\t\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\t\tsearch: function search(value, search) {\n\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.BoolControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"bool\",\n\t\t__type__: \"BoolControl\",\n\n\t\t// ``search`` must by ``null``, ``false`` or ``true``\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.IntControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"int\",\n\t\t__type__: \"IntControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.NumberControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"number\",\n\t\t__type__: \"NumberControl\",\n\n\t\t// ``search.value`` must by ``null`` or an integer\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"range\") {\n\t\t\t\tif (value === null)\n\t\t\t\t\treturn false;\n\t\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.StringControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"string\",\n\n\t\tasjson: function (value) {\n\t\t\treturn value;\n\t\t},\n\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn search.value === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (search.value === null || value === null)\n\t\t\t\t\treturn search.value === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.TextControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"text\",\n\t\t__type__: \"TextControl\"\n\t}\n);\n\nla.EmailControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"email\",\n\t\t__type__: \"EmailControl\"\n\t}\n);\n\nla.URLControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"url\",\n\t\t__type__: \"URLControl\"\n\t}\n);\n\nla.TelControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"tel\"\n\t}\n);\n\nla.PasswordControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"password\"\n\t}\n);\n\nla.TextAreaControl = ul4._inherit(\n\tla.StringControl,\n\t{\n\t\tsubtype: \"textarea\",\n\t\t__type__: \"TextAreaControl\"\n\t}\n);\n\nla.DateControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"date\",\n\t\tsubtype: \"date\",\n\t\t__type__: \"DateControl\",\n\n\t\tasjson: function (value) {\n\t\t\tif (value instanceof Date) {\n\t\t\t\tvalue = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`;\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y\";\n\t\t},\n\n\t\t// searchvalue must be ``null``, a ``Date`` object or a string\n\t\tsearch: function search(value, search) {\n\t\t\tthis._logsearch(value, search);\n\n\t\t\tvar searchvalue = search.value;\n\t\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\t\tif (value !== null)\n\t\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\t\tif (search.operator === \"equals\")\n\t\t\t\treturn searchvalue === value;\n\t\t\telse if (search.operator === \"contains\") {\n\t\t\t\tif (searchvalue === null || value === null)\n\t\t\t\t\treturn searchvalue === value;\n\t\t\t\telse\n\t\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.DatetimeMinuteControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimeminute\",\n\t\t__type__: \"DatetimeMinuteControl\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t\t}\n\t}\n);\n\nla.DatetimeSecondControl = ul4._inherit(\n\tla.DateControl,\n\t{\n\t\tsubtype: \"datetimesecond\",\n\t\t__type__: \"DatetimeMinuteSecond\",\n\n\t\tformatstring: function formatstring(language) {\n\t\t\tlanguage = language || this.app.language;\n\n\t\t\tif (language === \"de\")\n\t\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\t\telse\n\t\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t\t}\n\t}\n);\n\nla.LookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"lookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupdata\"]),\n\n\t\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (this.lookupapp === null) {\n\t\t\t\tif (search.operator === \"equals\") {\n\t\t\t\t\tif (value === null)\n\t\t\t\t\t\treturn search.value === null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn value.key === search.value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (value === null || search.value === null)\n\t\t\t\t\treturn value === search.value;\n\t\t\t\telse\n\t\t\t\t\treturn value.search(search);\n\t\t\t}\n\t\t}\n\t}\n);\n\nla.LookupSelectControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"LookupSelectControl\"\n\t}\n);\n\nla.LookupRadioControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"LookupRadioControl\"\n\t}\n);\n\nla.LookupChoiceControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"LookupChoiceControl\"\n\t}\n);\n\nla.AppLookupControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"applookup\",\n\t\t_ul4onattrs: la.Control._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]),\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (value === null || search.value === null)\n\t\t\t\treturn value === search.value;\n\t\t\telse\n\t\t\t\treturn value.search(search);\n\t\t}\n\t}\n);\n\nla.AppLookupSelectControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"AppLookupSelectControl\"\n\t}\n);\n\nla.AppLookupRadioControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"radio\",\n\t\t__type__: \"AppLookupRadioControl\"\n\t}\n);\n\nla.AppLookupChoiceControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\tsubtype: \"choice\",\n\t\t__type__: \"AppLookupChoiceControl\"\n\t}\n);\n\nla.MultipleLookupControl = ul4._inherit(\n\tla.LookupControl,\n\t{\n\t\ttype: \"multiplelookup\",\n\n\t\t// search.value must be ``null`` or a ``LookupItem`` key\n\t\t// if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (this.lookupapp === null) {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].key === search.value)\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (search.value === null)\n\t\t\t\t\t\treturn value.length === 0;\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleLookupSelectControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleLookupSelectControl\"\n\t}\n);\n\nla.MultipleLookupCheckboxControl = ul4._inherit(\n\tla.MultipleLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleLookupCheckboxControl\"\n\t}\n);\n\nla.MultipleAppLookupControl = ul4._inherit(\n\tla.AppLookupControl,\n\t{\n\t\ttype: \"multipleapplookup\",\n\n\t\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\t\tsearch: function search(value, search) {\n\t\t\tif (search.operator === \"equals\") {\n\t\t\t\tif (search.value === null)\n\t\t\t\t\treturn value.length === 0;\n\t\t\t\telse {\n\t\t\t\t\tfor (var i = 0; i < value.length; ++i) {\n\t\t\t\t\t\tif (value[i].search(search.value))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n);\n\nla.MultipleAppLookupSelectControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"select\",\n\t\t__type__: \"MultipleAppLookupSelectControl\"\n\t}\n);\n\nla.MultipleAppLookupCheckboxControl = ul4._inherit(\n\tla.MultipleAppLookupControl,\n\t{\n\t\tsubtype: \"checkbox\",\n\t\t__type__: \"MultipleAppLookupCheckboxControl\"\n\t}\n);\n\nla.GeoControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"geo\",\n\n\n\t\tasjson: function (value) {\n\t\t\tif (la.Geo.isprotoof(value))\n\t\t\t\tvalue = `${value.lat}, ${value.long}, ${value.info}`;\n\t\t\treturn value;\n\t\t},\n\n\t\t__type__: \"GeoControl\"\n\t}\n);\n\nla.FileControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"file\",\n\t\t__type__: \"FileControl\"\n\t}\n);\n\nla.ButtonControl = ul4._inherit(\n\tla.Control,\n\t{\n\t\ttype: \"button\",\n\t\t__type__: \"ButtonControl\"\n\t}\n);\n\nla.Field = ul4._inherit(\n\tla.Base,\n\t{\n\t\tcreate: function create(control, record, value) {\n\t\t\tvar field = la.Base.create.call(this);\n\t\t\tfield.control = control;\n\t\t\tfield.record = record;\n\t\t\tfield.value = value;\n\t\t\treturn field;\n\t\t},\n\n\t\tsearch: function search(searchvalue) {\n\t\t\treturn this.control.search(this.value, searchvalue);\n\t\t},\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.LookupItem = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"key\", \"label\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.User = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.File = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Geo = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"lat\", \"long\", \"info\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Attachment = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"record\", \"label\", \"active\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.NoteAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"noteattachment\",\n\t\t__type__: \"NoteAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.URLAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"urlattachment\",\n\t\t__type__: \"URLAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.FileAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"fileattachment\",\n\t\t__type__: \"FileAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"])\n\t}\n);\n\nla.ImageAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"imageattachment\",\n\t\t__type__: \"ImageAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"])\n\t}\n);\n\nla.JSONAttachment = ul4._inherit(\n\tla.Attachment,\n\t{\n\t\ttype: \"jsonattachment\",\n\t\t__type__: \"JSONAttachment\",\n\t\t_ul4onattrs: la.Attachment._ul4onattrs.concat([\"value\"]),\n\t\t_dumpUL4ONAttr: function _dumpUL4ONAttr(name) {\n\t\t\tif (name === \"value\")\n\t\t\t\treturn ul4._asjson(this.value);\n\t\t\telse\n\t\t\t\treturn this[name];\n\t\t},\n\n\t\t_loadUL4ONAttr: function _loadUL4ONAttr(name, value) {\n\t\t\tif (name === \"value\")\n\t\t\t\tthis.value = ul4._fromjson(value);\n\t\t\telse\n\t\t\t\tthis[name] = value\n\t\t}\n\t}\n);\n\nla.Installation = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"name\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.Category = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"],\n\n\t\t__repr__: function repr() {\n\t\t\tvar v = [];\n\t\t\tvar category = this;\n\t\t\twhile (category !== null) {\n\t\t\t\tv.splice(0, 0, category.identifier);\n\t\t\t\tcategory = category.parent;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.KeyView = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"identifier\", \"name\", \"key\", \"user\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nla.AppParameter = ul4._inherit(\n\tla.Base,\n\t{\n\t\t_ul4onattrs: [\"id\", \"app\", \"identifier\", \"description\", \"value\"],\n\n\t\t__repr__: function repr() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n);\n\nvar classes = [\n\t\"Globals\",\n\t\"App\",\n\t\"View\",\n\t\"DataSource\",\n\t\"Record\",\n\t\"BoolControl\",\n\t\"IntControl\",\n\t\"NumberControl\",\n\t\"TextControl\",\n\t\"EmailControl\",\n\t\"URLControl\",\n\t\"TelControl\",\n\t\"PasswordControl\",\n\t\"TextAreaControl\",\n\t\"DateControl\",\n\t\"DatetimeMinuteControl\",\n\t\"DatetimeSecondControl\",\n\t\"LookupControl\",\n\t\"LookupSelectControl\",\n\t\"LookupRadioControl\",\n\t\"LookupChoiceControl\",\n\t\"AppLookupControl\",\n\t\"AppLookupSelectControl\",\n\t\"AppLookupRadioControl\",\n\t\"AppLookupChoiceControl\",\n\t\"MultipleLookupControl\",\n\t\"MultipleLookupSelectControl\",\n\t\"MultipleLookupCheckboxControl\",\n\t\"MultipleAppLookupControl\",\n\t\"MultipleAppLookupSelectControl\",\n\t\"MultipleAppLookupCheckboxControl\",\n\t\"GeoControl\",\n\t\"FileControl\",\n\t\"ButtonControl\",\n\t\"Field\",\n\t\"LookupItem\",\n\t\"User\",\n\t\"File\",\n\t\"Geo\",\n\t\"NoteAttachment\",\n\t\"URLAttachment\",\n\t\"FileAttachment\",\n\t\"ImageAttachment\",\n\t\"JSONAttachment\",\n\t\"Installation\",\n\t\"Category\",\n\t\"KeyView\",\n\t\"AppParameter\"\n];\n\nfor (var i = 0; i < classes.length; ++i) {\n\tvar name = classes[i];\n\tvar object = la[name];\n\tul4on.register(\"de.livingapps.appdd.\" + name.toLowerCase(), object);\n}\n\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4, ul4on } from './modules/ul4';\nimport * as https from 'https';\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4on.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["ul4","ul4on","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","argument","set","_emptymap","_setmap","key","value","__proto__","_makeset","this","_Set","create","add","register","name","obj","ul4onname","dumps","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_clone","_level","_strings2index","_ids2index","_backrefs","_line","line","oldindent","push","join","type","Math","round","index","_str_repr","_iscolor","r","g","b","a","_isdate","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","_typeof","isa","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","decoder","pos","backrefs","readchar","charAt","readcharoreof","readblackchar","re_white","c","match","read","result","substring","backup","readnumber","re_digits","parseFloat","NaN","_repr","_beginfakeloading","oldpos","_endfakeloading","_readescape","escapechar","chars","codepoint","parseInt","isNaN","String","fromCharCode","typecode","delimiter","c2","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","proto","ul4onload","loadcontent","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_simpleclone","F","__prototype__","Proto","_nextid","_extend","attrs","_simpleinherit","baseobj","_inherit","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","_type","s","toString","cause","_internal_call","context","f","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","repr","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_unpackvar","lvalue","newvalue","iter","_iter","item","ValueError","concat","_formatsource","out","finalout","level","needlf","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","get","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","items","_lt","__lt__","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","escape","code","charCodeAt","test","_lpad","_date_repr","year","month","day","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","__repr__","_ascii","_date_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","__type__","_istemplate","_isfunction","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","Object","call","_isexception","Error","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","_strip","root","JSON","parse","replace","Function","_asul4on","_fromul4on","_format_date","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","_yearday","_week","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","isprotoof","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","decname","arg","prefix","argObject","expose","options","Context","vars","indents","_output","inheritvars","withindent","replaceoutput","clone","getoutput","Exception","__getattr__","attrname","InternalException","ReturnException","exception","BreakException","ContinueException","SyntaxError","LValueRequiredError","operation","message","LocationError","location","_templateprefix","template","parenttemplate","first","_template","Tag","tag","_outerpos","_innerpos","templateprefix","outerpos","innerpos","source","suffix","text","underline","lineno","colno","AST","ast","_handle_eval","_eval","_handle_eval_set","_eval_set","_handle_eval_modify","_eval_modify","_ul4onattrs","__setitem__","TextAST","_text","IndentAST","_maketext","LineEndAST","tagpos","codepos","tago","CodeAST","ConstAST","constant","ItemArgBase","_handle_eval_list","_eval_list","_handle_eval_dict","_eval_dict","_handle_eval_call","_eval_call","SeqItemAST","seqitem","UnpackSeqItemAST","unpackseqitem","DictItemAST","dictitem","UnpackDictItemAST","unpackdictitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","ListCompAST","varname","container","condition","listcomp","localcontext","varitems","DictAST","dict","DictCompAST","SetAST","SetCompAST","setcomp","GenExprAST","genexp","VarAST","variable","_get","_modify","functions","_ido","UnaryAST","unary","typename","_do","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","ifexpr","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","binary","ItemAST","__getitem__","splice","NotSubscriptableError","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","_append","SubAST","__sub__","__rsub__","_date_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","_date","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","div","mod","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","attr","object","sub","end","_count","_find","_rfind","old","new_","count","_replace","_lstrip","_rstrip","sep","_split","_rsplit","keepends","_splitlines","_capitalize","_join","_startswith","_endswith","_insert","_pop","_weekday","firstweekday","_mimeformat","_isoformat","default_","_items","_values","_update","_clear","realresult","__setattr__","oldvalue","CallAST","_makeargs","RenderAST","render","SliceAST","index1","index2","SetVarAST","changevar","ModifyVarAST","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","BlockAST","block","endtag","content","ForBlockAST","for_","_str_varname","WhileBlockAST","while_","cond","BreakAST","ContinueAST","CondBlockAST","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","Template","whitespace","startdelim","enddelim","docpos","_jsfunction","_asts","SignatureAST","closure","TemplateClosure","_renderbound","_rendersbound","renders","doc","_callbound","params","param","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","lower","heigher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshhold","pow","_md5","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","microsecond","_timedelta","_monthdelta","_hls","h","l","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","part","lastIndexOf","startpos","lineendlen","endpos","lastIndex","resultlist","d","yearday","jan1weekday","_isleap","leap","others","clear","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","td","total_microseconds","total_seconds","minutes","hours","_add","millisecond","myValue","otherValue","hasSeconds","hasMicroseconds","md","targetmonth","classes","la","Base","_dumpUL4ONAttr","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","Globals","geodist","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","insert","globals","Login","id","View","DataSource","identifier","Record","delete","app","_delete","update","search","fieldsearch","fields","_sparsevalues","_fields","defineProperty","controls","control","fieldvalue","field","Field","Control","subtype","_logsearch","BoolControl","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","formatstring","language","searchvalue","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","lookupapp","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","GeoControl","Geo","info","FileControl","ButtonControl","record","LookupItem","label","User","firstname","lastname","email","File","url","filename","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","username","loginRequired","_userName","ecdhCurve","commonjs","ident","undefined","httpsAgent"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sources":["../es2015/modules/ul4.js","../es2015/modules/livingapi.js","../../src/livingsdk.ts"],"sourcesContent":["/*!\n * UL4/UL4ON JavaScript Library\n * http://www.livinglogic.de/Python/ul4c/\n * http://www.livinglogic.de/Python/ul4on/\n *\n * Copyright 2011-2018 by LivingLogic AG, Bayreuth/Germany\n * Copyright 2011-2018 by Walter Dörwald\n *\n * All Rights Reserved\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*jslint vars: true */\nexport let ul4 = {};\n\nlet iscommon = (typeof module === 'object' && module.exports);\n\n\tul4.version = \"46\";\n\n\t//\n\t// UL4ON\n\t//\n\n\tul4._registry = {};\n\n\tul4._havemap = (typeof(Map) === \"function\" && typeof(Map.prototype.forEach) === \"function\");\n\n\tul4._havemapconstructor = (function ()\n\t{\n\t\tif (ul4._havemap)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (new Map([[1, 2]]).size == 1)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t})();\n\n\tul4._haveset = (typeof(Set) === \"function\" && typeof(Set.prototype.forEach) === \"function\");\n\n\tul4._havesetconstructor = (function ()\n\t{\n\t\tif (ul4._haveset)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (new Set([1, 2]).size == 2)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t})();\n\n\t// helper functions that work with Maps and objects\n\tif (ul4._havemap)\n\t{\n\t\tul4._makemap = function _makemap(...items)\n\t\t{\n\t\t\tlet map = new Map();\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [key, value] = items[i];\n\t\t\t\tmap.set(key, value);\n\t\t\t}\n\t\t\treturn map;\n\t\t};\n\n\t\tul4._setmap = function _setmap(map, key, value)\n\t\t{\n\t\t\tif (map.__proto__ === Map.prototype)\n\t\t\t\tmap.set(key, value);\n\t\t\telse\n\t\t\t\tmap[key] = value;\n\t\t};\n\n\t\tul4._emptymap = function _emptymap()\n\t\t{\n\t\t\treturn new Map();\n\t\t};\n\n\t\tul4._getmap = function _getmap(map, key, value)\n\t\t{\n\t\t\tif (map.__proto__ === Map.prototype)\n\t\t\t\treturn map.get(key);\n\t\t\telse\n\t\t\t\treturn map[key];\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._makemap = function _makemap(...items)\n\t\t{\n\t\t\tlet map = {};\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [key, value] = items[i];\n\t\t\t\tmap[key] = value;\n\t\t\t}\n\t\t\treturn map;\n\t\t};\n\n\t\tul4._setmap = function _setmap(map, key, value)\n\t\t{\n\t\t\tmap[key] = value;\n\t\t};\n\n\t\tul4._emptymap = function _emptymap()\n\t\t{\n\t\t\treturn {};\n\t\t};\n\n\t\tul4._getmap = function _getmap(map, key, value)\n\t\t{\n\t\t\treturn map[key];\n\t\t};\n\t}\n\n\t// Function used for making sets, when the Set constructor doesn't work (or we don't have sets)\n\tif (ul4._haveset)\n\t{\n\t\tul4._emptyset = function _emptyset()\n\t\t{\n\t\t\treturn new Set();\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._emptyset = function _emptyset()\n\t\t{\n\t\t\treturn new ul4._Set();\n\t\t};\n\t}\n\n\tul4._makeset = function _makeset(...items)\n\t{\n\t\tlet set = ul4._emptyset();\n\n\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\tset.add(items[i]);\n\t\treturn set;\n\t};\n\n\t// Register the constructor function ``f`` under the name ``name`` with the UL4ON machinery\n\tul4.register = function register(name, f)\n\t{\n\t\tf.prototype.ul4onname = name;\n\t\tul4._registry[name] = f;\n\t};\n\n\t// Return a string that contains the object ``obj`` in the UL4ON serialization format\n\tul4.dumps = function dumps(obj, indent)\n\t{\n\t\tlet encoder = new ul4.Encoder(indent);\n\t\tencoder.dump(obj);\n\t\treturn encoder.finish();\n\t};\n\n\t// Load an object from the string ``data``.\n\t// ``data`` must contain the object in the UL4ON serialization format\n\t// ``registry`` may be null or a dictionary mapping type names to constructor functions\n\tul4.loads = function loads(data, registry)\n\t{\n\t\tlet decoder = new ul4.Decoder(data, registry);\n\t\treturn decoder.load();\n\t};\n\n\t// Helper class for encoding\n\tul4.Encoder = class Encoder\n\t{\n\t\t// Create a new Encoder object\n\t\tconstructor(indent=null)\n\t\t{\n\t\t\tthis.indent = indent;\n\t\t\tthis.data = [];\n\t\t\tthis._level = 0;\n\t\t\tthis._strings2index = {};\n\t\t\tthis._ids2index = {};\n\t\t\tthis._backrefs = 0;\n\t\t}\n\n\t\t_line(line, ...args)\n\t\t{\n\t\t\tif (this.indent !== null)\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < this._level; ++i)\n\t\t\t\t\tthis.data.push(this.indent);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (this.data.length)\n\t\t\t\t\tthis.data.push(\" \");\n\t\t\t}\n\t\t\tthis.data.push(line);\n\n\t\t\tif (args.length)\n\t\t\t{\n\t\t\t\tlet oldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (let i = 0; i < args.length; ++i)\n\t\t\t\t\tthis.dump(args[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t}\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish()\n\t\t{\n\t\t\treturn this.data.join(\"\");\n\t\t}\n\n\t\tdump(obj)\n\t\t{\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof(obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof(obj) == \"number\")\n\t\t\t{\n\t\t\t\tlet type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof(obj) == \"string\")\n\t\t\t{\n\t\t\t\tlet index = this._strings2index[obj];\n\t\t\t\tif (typeof(index) !== \"undefined\")\n\t\t\t\t{\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tlet dump = ul4._str_repr(obj).replace(\"<\", \"\\\\x3c\");\n\t\t\t\t\tthis._line(\"S\" + dump);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"x\", obj.year(), obj.month(), obj.day());\n\t\t\telse if (ul4._isdatetime(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (obj instanceof ul4.slice)\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump)\n\t\t\t{\n\t\t\t\tif (obj.__id__)\n\t\t\t\t{\n\t\t\t\t\tlet index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof(index) != \"undefined\")\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\t}\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function(value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (let key in obj)\n\t\t\t\t{\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function(value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"can't create UL4ON dump of object \" + ul4._repr(obj));\n\t\t}\n\t};\n\n\t// Helper class for decoding\n\tul4.Decoder = class Decoder\n\t{\n\t\t// Creates a new decoder for reading from the string ``data``\n\t\tconstructor(data, registry)\n\t\t{\n\t\t\tthis.data = data;\n\t\t\tthis.pos = 0;\n\t\t\tthis.backrefs = [];\n\t\t\tthis.registry = typeof(registry) === \"undefined\" ? null : registry;\n\t\t\tthis.stack = []; // Use for informative error messages\n\t\t}\n\n\t\t// Read a character from the buffer\n\t\treadchar()\n\t\t{\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF\");\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read a character from the buffer (return null on eof)\n\t\treadcharoreof()\n\t\t{\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\treturn null;\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read next not-whitespace character from the buffer\n\t\treadblackchar()\n\t\t{\n\t\t\tlet re_white = /\\s/;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tif (this.pos >= this.data.length)\n\t\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\tlet c = this.data.charAt(this.pos++);\n\t\t\t\tif (!c.match(re_white))\n\t\t\t\t\treturn c;\n\t\t\t}\n\t\t}\n\n\t\t// Read ``size`` characters from the buffer\n\t\tread(size)\n\t\t{\n\t\t\tif (this.pos+size > this.length)\n\t\t\t\tsize = this.length-this.pos;\n\t\t\tlet result = this.data.substring(this.pos, this.pos+size);\n\t\t\tthis.pos += size;\n\t\t\treturn result;\n\t\t}\n\n\t\t// \"unread\" one character\n\t\tbackup()\n\t\t{\n\t\t\t--this.pos;\n\t\t}\n\n\t\t// Read a number from the buffer\n\t\treadnumber()\n\t\t{\n\t\t\tlet re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlet c = this.readcharoreof();\n\t\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\t\tvalue += c;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = parseFloat(value);\n\t\t\t\t\tif (isNaN(result))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_beginfakeloading()\n\t\t{\n\t\t\tlet oldpos = this.backrefs.length;\n\t\t\tthis.backrefs.push(null);\n\t\t\treturn oldpos;\n\t\t}\n\n\t\t_endfakeloading(oldpos, value)\n\t\t{\n\t\t\tthis.backrefs[oldpos] = value;\n\t\t}\n\n\t\t_readescape(escapechar, length)\n\t\t{\n\t\t\tlet chars = this.read(length);\n\t\t\tif (chars.length != length)\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\tlet codepoint = parseInt(chars, 16);\n\t\t\tif (isNaN(codepoint))\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\treturn String.fromCharCode(codepoint);\n\t\t}\n\n\t\t// Load the next object from the buffer\n\t\tload()\n\t\t{\n\t\t\tlet typecode = this.readblackchar();\n\t\t\tlet result;\n\t\t\tswitch (typecode)\n\t\t\t{\n\t\t\t\tcase \"^\":\n\t\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\t\tcase \"n\":\n\t\t\t\tcase \"N\":\n\t\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\t\treturn null;\n\t\t\t\tcase \"b\":\n\t\t\t\tcase \"B\":\n\t\t\t\t\tresult = this.readchar();\n\t\t\t\t\tif (result === \"T\")\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\telse if (result === \"F\")\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"i\":\n\t\t\t\tcase \"I\":\n\t\t\t\tcase \"f\":\n\t\t\t\tcase \"F\":\n\t\t\t\t\tresult = this.readnumber();\n\t\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"s\":\n\t\t\t\tcase \"S\":\n\t\t\t\t\tresult = [];\n\t\t\t\t\tlet delimiter = this.readblackchar();\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet c = this.readchar();\n\t\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tif (c == \"\\\\\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet c2 = this.readchar();\n\t\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(c);\n\t\t\t\t\t}\n\t\t\t\t\tresult = result.join(\"\");\n\t\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"c\":\n\t\t\t\tcase \"C\":\n\t\t\t\t\tresult = new ul4.Color();\n\t\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._r = this.load();\n\t\t\t\t\tresult._g = this.load();\n\t\t\t\t\tresult._b = this.load();\n\t\t\t\t\tresult._a = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"x\":\n\t\t\t\tcase \"X\":\n\t\t\t\t{\n\t\t\t\t\tlet year = this.load();\n\t\t\t\t\tlet month = this.load();\n\t\t\t\t\tlet day = this.load();\n\t\t\t\t\tresult = new ul4.Date(year, month, day);\n\t\t\t\t\tif (typecode === \"X\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tcase \"z\":\n\t\t\t\tcase \"Z\":\n\t\t\t\t\tresult = new Date();\n\t\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\t\tresult.setDate(1);\n\t\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\t\tresult.setDate(this.load());\n\t\t\t\t\tresult.setHours(this.load());\n\t\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\t\tresult.setMilliseconds(this.load()/1000);\n\t\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"t\":\n\t\t\t\tcase \"T\":\n\t\t\t\t\tresult = new ul4.TimeDelta();\n\t\t\t\t\tresult._days = this.load();\n\t\t\t\t\tresult._seconds = this.load();\n\t\t\t\t\tresult._microseconds = this.load();\n\t\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"r\":\n\t\t\t\tcase \"R\":\n\t\t\t\t\tresult = new ul4.slice();\n\t\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult.start = this.load();\n\t\t\t\t\tresult.stop = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"m\":\n\t\t\t\tcase \"M\":\n\t\t\t\t\tresult = new ul4.MonthDelta();\n\t\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._months = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"l\":\n\t\t\t\tcase \"L\":\n\t\t\t\t\tthis.stack.push(\"list\");\n\t\t\t\t\tresult = [];\n\t\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.push(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"d\":\n\t\t\t\tcase \"D\":\n\t\t\t\tcase \"e\":\n\t\t\t\tcase \"E\":\n\t\t\t\t\tif (!ul4._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"ordered dictionaries are not supported at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = ul4._emptymap();\n\t\t\t\t\tthis.stack.push(typecode === \"d\" || typecode === \"D\" ? \"dict\" : \"odict\");\n\t\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tlet key = this.load();\n\t\t\t\t\t\tlet value = this.load();\n\t\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"y\":\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tthis.stack.push(\"set\");\n\t\t\t\t\tresult = ul4._makeset();\n\t\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.add(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"o\":\n\t\t\t\tcase \"O\":\n\t\t\t\t{\n\t\t\t\t\tlet oldpos;\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\t\tlet name = this.load();\n\t\t\t\t\tthis.stack.push(name);\n\t\t\t\t\tlet constructor;\n\t\t\t\t\tif (this.registry !== null)\n\t\t\t\t\t{\n\t\t\t\t\t\tconstructor = this.registry[name];\n\t\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"can't load object of type \" + ul4._repr(name) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = new constructor();\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\t\tresult.ul4onload(this);\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.ValueError(\"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t}\n\t\t}\n\n\t\t// Return an iterator for loading the content of a object\n\t\tloadcontent()\n\t\t{\n\t\t\tlet self = this;\n\t\t\treturn {\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\t\t// Always \"unread\" the typecode even at the end\n\t\t\t\t\t// so that at the end of a call to ul4onload()\n\t\t\t\t\t// the next input is the \"end of object\" marker\n\t\t\t\t\t// no matter whether ul4onload() uses loadcontent() or not.\n\t\t\t\t\tself.backup();\n\t\t\t\t\tif (typecode == \")\")\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: false, value: self.load()};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t//\n\t// UL4\n\t//\n\n\t// REs for parsing JSON\n\tul4._rvalidchars = /^[\\],:{}\\s]*$/;\n\tul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n\tul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n\tul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n\t/// Helper functions\n\n\t// Clone an object and extend it\n\tul4._inherit = function _inherit(baseobj, attrs)\n\t{\n\t\treturn Object.assign(Object.create(baseobj), attrs);\n\t};\n\n\t// Convert a map to an object\n\tul4._map2object = function _map2object(obj)\n\t{\n\t\tif (ul4._ismap(obj))\n\t\t{\n\t\t\tlet newobj = {};\n\t\t\tobj.forEach(function(value, key){\n\t\t\t\tif (typeof(key) !== \"string\")\n\t\t\t\t\tthrow new ul4.TypeError(\"keys must be strings\");\n\t\t\t\tnewobj[key] = value;\n\t\t\t});\n\t\t\treturn newobj;\n\t\t}\n\t\treturn obj;\n\t};\n\n\t// Clip a number to the range [0;max)\n\tul4._bound = function _bound(value, upper)\n\t{\n\t\tif (value < 0)\n\t\t\treturn 0;\n\t\telse if (value > upper)\n\t\t\treturn upper;\n\t\telse\n\t\t\treturn value;\n\t};\n\n\t// Create a pretty stacktrace from an exception\n\tul4._stacktrace = function _stacktrace(exc)\n\t{\n\t\tlet output = (exc instanceof ul4.Exception ? exc.constructor.name + \": \" : \"\") + exc.toString();\n\t\tif (exc.context)\n\t\t\toutput = ul4._stacktrace(exc.context) + \"\\n\\n\" + output;\n\t\treturn output;\n\t};\n\n\t// Call a function ``f`` with UL4 argument handling\n\tul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs)\n\t{\n\t\tlet finalargs;\n\t\tif (needsobject)\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t{\n\t\t\t\tif (args.length)\n\t\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\t\tfinalargs = [kwargs];\n\t\t\t}\n\t\t\telse\n\t\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t\t}\n\t\tif (needscontext)\n\t\t\tfinalargs.unshift(context);\n\t\treturn f.apply(functioncontext, finalargs);\n\t};\n\n\tul4._callfunction = function _callfunction(context, f, args, kwargs)\n\t{\n\t\tlet name = f._ul4_name || f.name;\n\t\tif (typeof(f._ul4_signature) === \"undefined\" || typeof(f._ul4_needsobject) === \"undefined\" || typeof(f._ul4_needscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(f) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n\t};\n\n\tul4._callobject = function _callobject(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_callsignature) === \"undefined\" || typeof(obj._ul4_callneedsobject) === \"undefined\" || typeof(obj._ul4_callneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n\t};\n\n\tul4._callrender = function _callrender(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_rendersignature) === \"undefined\" || typeof(obj._ul4_renderneedsobject) === \"undefined\" || typeof(obj._ul4_renderneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not renderable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n\t};\n\n\tul4._call = function _call(context, f, args, kwargs)\n\t{\n\t\tif (typeof(f) === \"function\")\n\t\t\treturn ul4._callfunction(context, f, args, kwargs);\n\t\telse if (f && typeof(f.__call__) === \"function\")\n\t\t\treturn ul4._callobject(context, f, args, kwargs);\n\t\telse\n\t\t\tthrow new ul4.TypeError(ul4._type(f) + \" is not callable\");\n\t};\n\n\tul4._unpackvar = function _unpackvar(lvalue, value)\n\t{\n\t\tif (!ul4._islist(lvalue))\n\t\t\treturn [[lvalue, value]];\n\t\telse\n\t\t{\n\t\t\tlet newvalue = [];\n\t\t\tlet iter = ul4._iter(value);\n\n\t\t\tfor (let i = 0;;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\n\t\t\t\tif (item.done)\n\t\t\t\t{\n\t\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newvalue;\n\t\t}\n\t};\n\n\tul4._formatsource = function _formatsource(out)\n\t{\n\t\tlet finalout = [];\n\t\tlet level = 0, needlf = false;\n\t\tfor (let i = 0; i < out.length; ++i)\n\t\t{\n\t\t\tlet part = out[i];\n\t\t\tif (typeof(part) === \"number\")\n\t\t\t{\n\t\t\t\tlevel += part;\n\t\t\t\tneedlf = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (needlf)\n\t\t\t\t{\n\t\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\t\tfor (let j = 0; j < level; ++j)\n\t\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\t\tneedlf = false;\n\t\t\t\t}\n\t\t\t\tfinalout.push(part);\n\t\t\t}\n\t\t}\n\t\tif (needlf)\n\t\t\tfinalout.push(\"\\n\");\n\t\treturn finalout.join(\"\");\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they have the same value\n\tul4._eq = function _eq(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__eq__) === \"function\")\n\t\t\treturn obj1.__eq__(obj2);\n\t\telse if (obj2 && typeof(obj2.__eq__) === \"function\")\n\t\t\treturn obj2.__eq__(obj1);\n\t\telse if (obj1 === null)\n\t\t\treturn obj2 === null;\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.length != obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isobject(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.hasOwnProperty(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.has(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tlet result = true;\n\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}, this);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._ismap(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn obj1 === obj2;\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they don't have the same value\n\tul4._ne = function _ne(obj1, obj2)\n\t{\n\t\tif (obj1 && typeof(obj1.__ne__) === \"function\")\n\t\t\treturn obj1.__ne__(obj2);\n\t\telse if (obj2 && typeof(obj2.__ne__) === \"function\")\n\t\t\treturn obj2.__ne__(obj1);\n\t\telse\n\t\t\treturn !ul4._eq(obj1, obj2);\n\t};\n\n\tul4._unorderable = function _unorderable(operator, obj1, obj2)\n\t{\n\t\tthrow new ul4.TypeError(\"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n\t};\n\n\t// Return:\n\t// -1 when ``obj1 < obj2``,\n\t// 0 when ``obj1 == obj2``,\n\t// 1 when ``obj1 > obj2``,\n\t// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n\t// raise TypeError if objects are uncomparable\n\t// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n\t// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\n\tul4._cmp = function _cmp(operator, obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t{\n\t\t\t\tlet v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t\t}\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn 0;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tlet res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\t\tif (res)\n\t\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2) || ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tlet in1only = false;\n\t\t\t\tlet in2only = false;\n\n\t\t\t\tfor (let iter = _iter(obj1);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj2.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let iter = _iter(obj2);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj1.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (in1only)\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ul4._unorderable(operator, obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 < obj2``\n\tul4._lt = function _lt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__lt__) === \"function\")\n\t\t\treturn obj1.__lt__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() < obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length < obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(obj1[key]))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(obj2[key]))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[obj1[key]])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[obj2[key]])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 <= obj2``\n\tul4._le = function _le(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__le__) === \"function\")\n\t\t\treturn obj1.__le__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length <= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<=\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 > obj2``\n\tul4._gt = function _gt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__gt__) === \"function\")\n\t\t\treturn obj1.__gt__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() > obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length > obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 >= obj2``\n\tul4._ge = function _ge(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__ge__) === \"function\")\n\t\t\treturn obj1.__ge__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length >= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">=\", obj1, obj2);\n\t};\n\n\t// Return an iterator for ``obj``\n\tul4._iter = function _iter(obj)\n\t{\n\t\tif (typeof(obj) === \"string\" || ul4._islist(obj))\n\t\t{\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\t\treturn {value: obj[this.index++], done: false};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isiter(obj))\n\t\t\treturn obj;\n\t\telse if (obj !== null && typeof(obj.__iter__) === \"function\")\n\t\t\treturn obj.__iter__();\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tkeys.push(key);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isset(obj))\n\t\t{\n\t\t\tlet values = [];\n\t\t\tobj.forEach(function(item) {\n\t\t\t\tvalues.push(item);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: values[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isul4set(obj))\n\t\t{\n\t\t\treturn ul4._iter(obj.items);\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tkeys.push(key);\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tthrow new ul4.TypeError(ul4._type(obj) + \" object is not iterable\");\n\t};\n\n\tul4._str_repr = function _str_repr(str, ascii)\n\t{\n\t\tlet result = \"\";\n\t\tlet squote = false, dquote = false;\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tif (c == '\"')\n\t\t\t{\n\t\t\t\tdquote = true;\n\t\t\t\tif (squote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (c == \"'\")\n\t\t\t{\n\t\t\t\tsquote = true;\n\t\t\t\tif (dquote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\t\tlet quote = (squote && !dquote) ? '\"' : \"'\";\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"'\":\n\t\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tlet escape;\n\t\t\t\t\tif (code < 32)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\t\tescape = 4;\n\t\t\t\t\telse\n\t\t\t\t\t\tescape = 8;\n\n\t\t\t\t\tif (escape === 0)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse if (escape === 2)\n\t\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\t\telse if (escape === 4)\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn quote + result + quote;\n\t};\n\n\tul4._date_repr = function _date_repr(obj, ascii)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \")\";\n\t\treturn result;\n\t};\n\n\tul4._datetime_repr = function _datetime_repr(obj, ascii)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\";\n\n\t\tif (hour || minute || second || ms)\n\t\t{\n\t\t\tresult += ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\t\tif (second || ms)\n\t\t\t{\n\t\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\t\tif (ms)\n\t\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\t}\n\t\t}\n\t\tresult += \")\";\n\n\t\treturn result;\n\t};\n\n\tul4._map_repr = function _map_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\n\t\tlet i = 0;\n\t\tobj.forEach(function(value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._list_repr = function _list_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"[\");\n\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t{\n\t\t\tlet item = obj[i];\n\t\t\tif (i)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(item, ascii));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._set_repr = function _set_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tif (!obj.size)\n\t\t\tv.push(\"/\");\n\t\telse\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t\t});\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._object_repr = function _object_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tlet i = 0;\n\t\tfor (let key in obj)\n\t\t{\n\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\tcontinue;\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._repr_internal = function _repr_internal(obj, ascii)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"None\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn \"\" + obj;\n\t\telse if (typeof(obj) === \"function\")\n\t\t\tif (obj._ul4_name || obj.name)\n\t\t\t\treturn \"\";\n\t\t\telse\n\t\t\t\treturn \"\";\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_repr(obj, ascii);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj, ascii);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj, ascii);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj, ascii);\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj, ascii);\n\t\treturn \"?\";\n\t};\n\n\t// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\n\tul4._repr = function _repr(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, false);\n\t};\n\n\tul4._ascii = function _ascii(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, true);\n\t};\n\n\tul4._date_str = function _date_str(obj)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\n\t\treturn year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\t};\n\n\tul4._datetime_str = function _datetime_str(obj)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\n\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\tif (second || ms)\n\t\t{\n\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t}\n\t\treturn result;\n\t};\n\n\tul4._str = function _str(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (obj === null)\n\t\t\treturn \"\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn obj;\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj.toString();\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_str(obj);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_str(obj);\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj);\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__str__) === \"function\")\n\t\t\treturn obj.__str__();\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj);\n\t\treturn \"?\";\n\t};\n\n\t// Convert ``obj`` to bool, according to its \"truth value\"\n\tul4._bool = function _bool(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\t\treturn false;\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) === \"object\", typeof(obj.__bool__) === \"function\")\n\t\t\t\treturn obj.__bool__();\n\t\t\tif (ul4._islist(obj))\n\t\t\t\treturn obj.length !== 0;\n\t\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\t\treturn obj.size != 0;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t{\n\t\t\t\tfor (let key in obj)\n\t\t\t\t{\n\t\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t};\n\n\t// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\n\tul4._int = function _int(obj, base)\n\t{\n\t\tlet result;\n\t\tif (base !== null)\n\t\t{\n\t\t\tif (typeof(obj) !== \"string\" || !ul4._isint(base))\n\t\t\t\tthrow new ul4.TypeError(\"int() requires a string and an integer\");\n\t\t\tresult = parseInt(obj, base);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t{\n\t\t\t\tresult = parseInt(obj);\n\t\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (typeof(obj) == \"number\")\n\t\t\t\treturn Math.floor(obj);\n\t\t\telse if (obj === true)\n\t\t\t\treturn 1;\n\t\t\telse if (obj === false)\n\t\t\t\treturn 0;\n\t\t\tthrow new ul4.TypeError(\"int() argument must be a string or a number\");\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a float\n\tul4._float = function _float(obj)\n\t{\n\t\tif (typeof(obj) === \"string\")\n\t\t\treturn parseFloat(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj;\n\t\telse if (obj === true)\n\t\t\treturn 1.0;\n\t\telse if (obj === false)\n\t\t\treturn 0.0;\n\t\tthrow new ul4.TypeError(\"float() argument must be a string or a number\");\n\t};\n\n\t// Convert ``obj`` to a list\n\tul4._list = function _list(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = [];\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.push(value.value);\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a set\n\tul4._set = function _set(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = ul4._emptyset();\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.add(value.value);\n\t\t}\n\t};\n\n\t// Return the length of ``sequence``\n\tul4._len = function _len(sequence)\n\t{\n\t\tif (typeof(sequence) == \"string\" || ul4._islist(sequence))\n\t\t\treturn sequence.length;\n\t\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\t\treturn sequence.size;\n\t\telse if (ul4._isobject(sequence))\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tfor (let key in sequence)\n\t\t\t\t++i;\n\t\t\treturn i;\n\t\t}\n\t\tthrow new ul4.TypeError(\"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n\t};\n\n\tul4._type = function _type(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"none\";\n\t\telse if (obj === false || obj === true)\n\t\t\treturn \"bool\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\t\telse if (typeof(obj) === \"function\")\n\t\t\treturn \"function\";\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj.ul4type) === \"function\")\n\t\t\t\treturn obj.ul4type();\n\t\t\telse\n\t\t\t\treturn ul4.Protocol.get(obj).ul4type(obj);\n\t\t}\n\t};\n\n\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\tul4._mod = function _mod(obj1, obj2)\n\t{\n\t\tlet div = Math.floor(obj1 / obj2);\n\t\tlet mod = obj1 - div * obj2;\n\n\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0)))\n\t\t{\n\t\t\tmod += obj2;\n\t\t\t--div;\n\t\t}\n\t\treturn obj1 - div * obj2;\n\t},\n\n\t// Return the attribute with the name ``attrname`` of the object ``obj``\n\t// If ``obj`` doesn't have such an attribute, return ``default_``\n\tul4._getattr = function _getattr(obj, attrname, default_=null)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\ttry\n\t\t{\n\t\t\treturn proto.getattr(obj, attrname);\n\t\t}\n\t\tcatch (exc)\n\t\t{\n\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === obj)\n\t\t\t\treturn default_;\n\t\t\telse\n\t\t\t\tthrow exc;\n\t\t}\n\t};\n\n\t// Return wether the object ``obj`` has an attribute with the name ``attrname``\n\tul4._hasattr = function _hasattr(obj, attrname)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.hasattr(obj, attrname);\n\t};\n\n\t// Return the names of the attributes of the object ``obj`` as a set.\n\tul4._dir = function _dir(obj)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.dir();\n\t};\n\n\t// Return whether any of the items in ``iterable`` are true\n\tul4._any = function _any(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn false;\n\t\t\t\tif (ul4._bool(item.value))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Return whether all of the items in ``iterable`` are true\n\tul4._all = function _all(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn true;\n\t\t\t\tif (!ul4._bool(item.value))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Check if ``obj`` is undefined\n\tul4._isundefined = function _isundefined(obj)\n\t{\n\t\treturn typeof(obj) === \"undefined\";\n\t};\n\n\n\t// Check if ``obj`` is *not* undefined\n\tul4._isdefined = function _isdefined(obj)\n\t{\n\t\treturn typeof(obj) !== \"undefined\";\n\t};\n\n\t// Check if ``obj`` is ``None``\n\tul4._isnone = function _isnone(obj)\n\t{\n\t\treturn obj === null;\n\t};\n\n\t// Check if ``obj`` is a boolean\n\tul4._isbool = function _isbool(obj)\n\t{\n\t\treturn typeof(obj) == \"boolean\";\n\t};\n\n\t// Check if ``obj`` is a int\n\tul4._isint = function _isint(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) == obj;\n\t};\n\n\t// Check if ``obj`` is a float\n\tul4._isfloat = function _isfloat(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) != obj;\n\t};\n\n\t// Check if ``obj`` is a string\n\tul4._isstr = function _isstr(obj)\n\t{\n\t\treturn typeof(obj) == \"string\";\n\t};\n\n\t// Check if ``obj`` is a datetime\n\tul4._isdatetime = function _isdate(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n\t};\n\n\tul4._isdate = function _isdate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Date);\n\t};\n\n\t// Check if ``obj`` is a color\n\tul4._iscolor = function _iscolor(obj)\n\t{\n\t\treturn (obj instanceof ul4.Color);\n\t};\n\n\t// Check if ``obj`` is a timedelta object\n\tul4._istimedelta = function _istimedelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.TimeDelta);\n\t};\n\n\t// Check if ``obj`` is a monthdelta object\n\tul4._ismonthdelta = function _ismonthdelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.MonthDelta);\n\t};\n\n\t// Check if ``obj`` is a template\n\tul4._istemplate = function _istemplate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure);\n\t};\n\n\t// Check if ``obj`` is a function\n\tul4._isfunction = function _isfunction(obj)\n\t{\n\t\treturn typeof(obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure));\n\t};\n\n\t// Check if ``obj`` is a list\n\tul4._islist = function _islist(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n\t};\n\n\t// Check if ``obj`` is a set\n\tul4._isset = function _isset(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n\t};\n\n\t// Check if ``obj`` is an exception (at least a UL4 exception)\n\tul4._isexception = function _isexception(obj)\n\t{\n\t\treturn (obj instanceof ul4.Exception);\n\t};\n\n\tul4._isul4set = function _isul4set(obj)\n\t{\n\t\treturn (obj instanceof ul4._Set);\n\t};\n\n\tul4._isanyset = function _isanyset(obj)\n\t{\n\t\treturn (ul4._isset(obj) || ul4._isul4set(obj));\n\t};\n\n\t// Check if ``obj`` is an iterator\n\tul4._isiter = function _isiter(obj)\n\t{\n\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.next) === \"function\";\n\t};\n\n\t// Check if ``obj`` is a JS object\n\tul4._isobject = function _isobject(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof(obj.__type__) === \"undefined\" && !(obj instanceof ul4.Proto);\n\t};\n\n\tif (ul4._havemap)\n\t{\n\t\t// Check if ``obj`` is a ``Map``\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\t\t};\n\n\t\t// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj) || ul4._ismap(obj);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn false;\n\t\t};\n\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj);\n\t\t};\n\t}\n\n\t// Repeat string ``str`` ``rep`` times\n\tul4._str_repeat = function _str_repeat(str, rep)\n\t{\n\t\tlet result = \"\";\n\t\tfor (; rep>0; --rep)\n\t\t\tresult += str;\n\t\treturn result;\n\t};\n\n\tul4._list_repeat = function _list_repeat(list, rep)\n\t{\n\t\tlet result = [];\n\t\tfor (; rep>0; --rep)\n\t\t\tfor (let i = 0; i < list.length; ++i)\n\t\t\t\tresult.push(list[i]);\n\t\treturn result;\n\t};\n\n\tul4._str_json = function _str_json(str)\n\t{\n\t\tlet result = \"\";\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += '\\\\\"';\n\t\t\t\t\tbreak;\n\t\t\t\tcase '<':\n\t\t\t\t\tresult += '\\\\u003c';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn '\"' + result + '\"';\n\t};\n\n\t// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\n\tul4._asjson = function _asjson(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"null\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (obj === false)\n\t\t\treturn \"false\";\n\t\telse if (obj === true)\n\t\t\treturn \"true\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_json(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t{\n\t\t\treturn \"\" + obj;\n\t\t}\n\t\telse if (ul4._islist(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"[\");\n\t\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t\t{\n\t\t\t\tif (i != 0)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t\t}\n\t\t\tv.push(\"]\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(value));\n\t\t\t});\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let key in obj)\n\t\t\t{\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t\t}\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isdate(obj))\n\t\t{\n\t\t\treturn \"new ul4.Date(\" + obj._date.getFullYear() + \", \" + (obj._date.getMonth()+1) + \", \" + obj._date.getDate() + \")\";\n\t\t}\n\t\telse if (ul4._isdatetime(obj))\n\t\t{\n\t\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t\t}\n\t\telse if (ul4._istimedelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.TimeDelta(\" + obj._days + \", \" + obj._seconds + \", \" + obj._microseconds + \")\";\n\t\t}\n\t\telse if (ul4._ismonthdelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.MonthDelta(\" + obj._months + \")\";\n\t\t}\n\t\telse if (ul4._iscolor(obj))\n\t\t{\n\t\t\treturn \"new ul4.Color(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t\t}\n\t\telse if (ul4._istemplate(obj))\n\t\t{\n\t\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t\t}\n\t\tthrow new ul4.TypeError(\"asjson() requires a serializable object\");\n\t};\n\n\t// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\n\tul4._fromjson = function _fromjson(string)\n\t{\n\t\t// The following is from jQuery's parseJSON function\n\t\tstring = ul4.StrProtocol.strip(string);\n\t\tif (root.JSON && root.JSON.parse)\n\t\t\treturn root.JSON.parse(string);\n\t\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\t\treturn (new Function(\"return \" + string))();\n\t\tthrow new ul4.TypeError(\"invalid JSON\");\n\t};\n\n\t// Encodes ``obj`` in the UL4 Object Notation format\n\tul4._asul4on = function _asul4on(obj)\n\t{\n\t\treturn ul4.dumps(obj);\n\t};\n\n\t// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\n\tul4._fromul4on = function _fromul4on(string)\n\t{\n\t\treturn ul4.loads(string);\n\t};\n\n\tul4._format_datetime = function _format_datetime(obj, fmt, lang)\n\t{\n\t\tlet translations = {\n\t\t\tde: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\ten: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\t\txf: \"%m/%d/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p\"\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tes: {\n\t\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\t\txf: \"%d/%m/%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tit: {\n\t\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tda: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsv: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t\t},\n\t\t\tnl: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\t\txf: \"%d-%m-%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tpt: {\n\t\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tcs: {\n\t\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tsk: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tpl: {\n\t\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t\t},\n\t\t\thr: {\n\t\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsr: {\n\t\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y.\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t\t},\n\t\t\tro: {\n\t\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\thu: {\n\t\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t\t},\n\t\t\ttr: {\n\t\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tru: {\n\t\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tzh: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t\t},\n\t\t\tko: {\n\t\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t\t},\n\t\t\tja: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t\t}\n\t\t};\n\n\t\tlet translation = translations[lang];\n\n\t\tlet result = [];\n\t\tlet inspec = false;\n\t\tfor (let i = 0; i < fmt.length; ++i)\n\t\t{\n\t\t\tlet c = fmt[i];\n\t\t\tif (inspec)\n\t\t\t{\n\t\t\t\tswitch (c)\n\t\t\t\t{\n\t\t\t\t\tcase \"a\":\n\t\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"A\":\n\t\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"b\":\n\t\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"B\":\n\t\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"c\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"H\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"I\":\n\t\t\t\t\t\tc = ul4._lpad(((obj.getHours()-1) % 12)+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"j\":\n\t\t\t\t\t\tc = ul4._lpad(ul4.DateTimeProtocol.yearday(obj), \"0\", 3);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMonth()+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"p\":\n\t\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"S\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"U\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 6), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"w\":\n\t\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"W\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 0), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"X\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Y\":\n\t\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"z\":\n\t\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Z\":\n\t\t\t\t\t\t// Time zone name\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(c);\n\t\t\t\tinspec = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (c == \"%\")\n\t\t\t\t\tinspec = true;\n\t\t\t\telse\n\t\t\t\t\tresult.push(c);\n\t\t\t}\n\t\t}\n\t\treturn result.join(\"\");\n\t};\n\n\tul4._format_int = function _format_int(obj, fmt, lang)\n\t{\n\t\tlet work = fmt;\n\n\t\t// Defaults\n\t\tlet fill = ' ';\n\t\tlet align = '>'; // '<', '>', '=' or '^'\n\t\tlet sign = '-'; // '+', '-' or ' '\n\t\tlet alternate = false;\n\t\tlet minimumwidth = 0;\n\t\tlet type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t\t// Determine output type\n\t\tif (/[bcdoxXn]$/.test(work))\n\t\t{\n\t\t\ttype = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract minimum width\n\t\tif (/\\d+$/.test(work))\n\t\t{\n\t\t\tlet minimumwidthStr = /\\d+$/.exec(work);\n\t\t\twork = work.replace(/\\d+$/, \"\");\n\t\t\tif (/^0/.test(minimumwidthStr))\n\t\t\t{\n\t\t\t\talign = '=';\n\t\t\t\tfill = '0';\n\t\t\t}\n\t\t\tminimumwidth = parseInt(minimumwidthStr);\n\t\t}\n\n\t\t// Alternate form?\n\t\tif (/#$/.test(work))\n\t\t{\n\t\t\talternate = true;\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Determine sign\n\t\tif (/[+ -]$/.test(work))\n\t\t{\n\t\t\tif (type == 'c')\n\t\t\t\tthrow new ul4.ValueError(\"sign not allowed for integer format type 'c'\");\n\t\t\tsign = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract fill and align char\n\t\tif (work.length >= 3)\n\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\telse if (work.length == 2)\n\t\t{\n\t\t\tif (/[<>=^]$/.test(work))\n\t\t\t{\n\t\t\t\talign = work[1];\n\t\t\t\tfill = work[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\t\telse if (work.length == 1)\n\t\t{\n\t\t\tif (/^[<>=^]$/.test(work))\n\t\t\t\talign = work;\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\n\t\t// Basic number formatting\n\t\tlet neg = obj < 0;\n\n\t\tif (neg)\n\t\t\tobj = -obj;\n\n\t\tlet output;\n\t\tswitch (type)\n\t\t{\n\t\t\tcase 'b':\n\t\t\t\toutput = obj.toString(2);\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tif (neg || obj > 65535)\n\t\t\t\t\tthrow new ul4.ValueError(\"value out of bounds for c format\");\n\t\t\t\toutput = String.fromCharCode(obj);\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\toutput = obj.toString(8);\n\t\t\t\tbreak;\n\t\t\tcase 'x':\n\t\t\t\toutput = obj.toString(16);\n\t\t\t\tbreak;\n\t\t\tcase 'X':\n\t\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\t// FIXME: locale formatting\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// The rest of the formatting\n\t\tif (align === '=')\n\t\t{\n\t\t\tif (neg || sign !== '-')\n\t\t\t\t--minimumwidth;\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\tminimumwidth -= 2;\n\n\t\t\tif (output.length < minimumwidth)\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t\tif (output.length < minimumwidth)\n\t\t\t{\n\t\t\t\tif (align == '<')\n\t\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth-output.length);\n\t\t\t\telse if (align == '>')\n\t\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\t\t\t\telse // if (align == '^')\n\t\t\t\t{\n\t\t\t\t\tlet pad = minimumwidth - output.length;\n\t\t\t\t\tlet padBefore = Math.floor(pad/2);\n\t\t\t\t\tlet padAfter = pad-padBefore;\n\t\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// Format ``obj`` using the format string ``fmt`` in the language ``lang``\n\tul4._format = function _format(obj, fmt, lang)\n\t{\n\t\tif (typeof(lang) === \"undefined\" || lang === null)\n\t\t\tlang = \"en\";\n\t\telse\n\t\t{\n\t\t\tlet translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null};\n\t\t\tlang = lang.toLowerCase();\n\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t{\n\t\t\t\tlang = lang.split(/_/)[0];\n\t\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t\t\tlang = \"en\";\n\t\t\t}\n\t\t}\n\t\tif (ul4._isdate(obj))\n\t\t\treturn ul4._format_datetime(obj._date, fmt, lang);\n\t\tif (ul4._isdatetime(obj))\n\t\t\treturn ul4._format_datetime(obj, fmt, lang);\n\t\telse if (ul4._isint(obj))\n\t\t\treturn ul4._format_int(obj, fmt, lang);\n\t\telse if (obj === true)\n\t\t\treturn ul4._format_int(1, fmt, lang);\n\t\telse if (obj === false)\n\t\t\treturn ul4._format_int(0, fmt, lang);\n\t};\n\n\tul4._lpad = function _lpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = pad + string;\n\t\treturn string;\n\t};\n\n\tul4._rpad = function _rpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = string + pad;\n\t\treturn string;\n\t};\n\n\t// This is outside of ``Proto`` on purpose\n\t// This way reactive frameworks like ``Vue.js`` don't get to see it\n\t// and complain about mutating render functions when those create new objects.\n\tlet _nextid = 1;\n\n\tul4.Proto = class Proto\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tthis.__id__ = _nextid++;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\t// equality comparison of objects defaults to identity comparison\n\t\t__eq__(other)\n\t\t{\n\t\t\treturn this === other;\n\t\t}\n\n\t\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t\t// ``__ne__`` will be synthesized from that\n\t\t__ne__(other)\n\t\t{\n\t\t\treturn !this.__eq__(other);\n\t\t}\n\n\t\t// For other comparison operators, each method has to be implemented:\n\t\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t\t// ``>=`` calls ``__ge__``\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Signature = class Signature extends ul4.Proto\n\t{\n\t\tconstructor(...args)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.args = [];\n\t\t\tthis.argNames = {};\n\t\t\tthis.remargs = null;\n\t\t\tthis.remkwargs = null;\n\n\t\t\tlet nextDefault = false;\n\t\t\tlet lastArgname = null;\n\t\t\tfor (let i = 0; i < args.length; ++i)\n\t\t\t{\n\t\t\t\tlet argName = args[i];\n\t\t\t\tif (nextDefault)\n\t\t\t\t{\n\t\t\t\t\tthis.args.push({name: lastArgname, defaultValue: argName});\n\t\t\t\t\tthis.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (argName.substr(argName.length-1) === \"=\")\n\t\t\t\t\t{\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length-1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tthis.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tthis.remargs = argName.substr(1);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.args.push({name: argName});\n\t\t\t\t\t\tthis.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray(name, args, kwargs)\n\t\t{\n\t\t\tlet finalargs = [];\n\t\t\tlet decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (i < args.length)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null)\n\t\t\t{\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length)\n\t\t\t\t{\n\t\t\t\t\tlet prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow new ul4.ArgumentError(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null)\n\t\t\t{\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tlet remkwargs = ul4._emptymap();\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tul4._setmap(remkwargs, key, kwargs[key]);\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t}\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject(name, args, kwargs)\n\t\t{\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tlet argObject = {};\n\t\t\tlet i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn this.toString();\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t};\n\n\t// When we don't have a real ``Set`` type, emulate one that supports strings\n\tul4._Set = class _Set\n\t{\n\t\tconstructor(...items)\n\t\t{\n\t\t\tthis.items = {};\n\t\t\tthis.add(...items);\n\t\t}\n\n\t\tadd(...items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tthis.items[items[i]] = true;\n\t\t}\n\n\t\tclear()\n\t\t{\n\t\t\tthis.items = {};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose(function add(items){ self.add(...items); }, [\"*items\"]);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__contains__(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\thas(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Subtract the number of items that ``other`` has\n\t\t\t\tfor (let item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let key in other.items)\n\t\t\t\t{\n\t\t\t\t\tif (!this.items[key])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t};\n\n\tul4._Set.prototype.__type__ = \"set\";\n\n\t// Adds name and signature to a function/method and makes the method callable in templates\n\tul4.expose = function expose(f, signature, options)\n\t{\n\t\toptions = options || {};\n\t\tif (options.name)\n\t\t\tf._ul4_name = options.name;\n\t\tif (ul4._islist(signature))\n\t\t\tsignature = new ul4.Signature(...signature);\n\t\tf._ul4_signature = signature;\n\t\tf._ul4_needsobject = options.needsobject || false;\n\t\tf._ul4_needscontext = options.needscontext || false;\n\t};\n\n\t// Protocol objects for all builtin types\n\t// These objects are singleton, so we replace the constructor with the prototype object afterwards\n\tul4.Protocol = class Protocol\n\t{\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\tdir()\n\t\t{\n\t\t\treturn this.attrs;\n\t\t}\n\n\t\tget(obj)\n\t\t{\n\t\t\tif (ul4._isstr(obj))\n\t\t\t\treturn ul4.StrProtocol;\n\t\t\telse if (ul4._islist(obj))\n\t\t\t\treturn ul4.ListProtocol;\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\treturn ul4.DateProtocol;\n\t\t\telse if (ul4._isset(obj))\n\t\t\t\treturn ul4.SetProtocol;\n\t\t\telse if (ul4._ismap(obj))\n\t\t\t\treturn ul4.MapProtocol;\n\t\t\telse if (ul4._isdatetime(obj))\n\t\t\t\treturn ul4.DateTimeProtocol;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t\treturn ul4.ObjectProtocol;\n\t\t\telse\n\t\t\t\treturn ul4.Protocol;\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t\treturn obj.__getattr__(attrname);\n\t\t\telse if (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t}\n\n\t\thasattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tobj.__getattr__(attrname);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this.attrs.has(attrname);\n\t\t}\n\t};\n\n\tul4.Protocol = ul4.Protocol.prototype;\n\tul4.Protocol.attrs = ul4._emptyset();\n\n\tul4.StrProtocol = class StrProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"str\";\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\n\t\treplace(obj, old, new_, count=null)\n\t\t{\n\t\t\tif (count === null)\n\t\t\t\tcount = obj.length;\n\n\t\t\tlet result = [];\n\t\t\twhile (obj.length)\n\t\t\t{\n\t\t\t\tlet pos = obj.indexOf(old);\n\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t{\n\t\t\t\t\tresult.push(obj);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\tresult.push(new_);\n\t\t\t\tobj = obj.substr(pos + old.length);\n\t\t\t}\n\t\t\treturn result.join(\"\");\n\t\t}\n\n\t\tstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"strip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tlstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"lstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\treturn obj;\n\t\t}\n\n\t\trstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"split() requires a string\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.indexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\t\t\tobj = obj.substr(pos + sep.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.lstrip(obj, null);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.push(part);\n\t\t\t\t\t\tobj = obj.substr(part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rsplit() requires a string as second argument\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.lastIndexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.unshift(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.unshift(obj.substr(pos+sep.length));\n\t\t\t\t\t\tobj = obj.substr(0, pos);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.rstrip(obj);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\t\t\tpart = part[part.length-1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.unshift(part);\n\t\t\t\t\t\tobj = obj.substr(0, obj.length-part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsplitlines(obj, keepends=false)\n\t\t{\n\t\t\tlet pos = 0;\n\t\t\tlet lookingAtLineEnd = function lookingAtLineEnd()\n\t\t\t{\n\t\t\t\tlet c = obj[pos];\n\t\t\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\t\t\treturn 1;\n\t\t\t\tif (c === '\\r')\n\t\t\t\t{\n\t\t\t\t\tif (pos == length-1)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tif (obj[pos+1] === '\\n')\n\t\t\t\t\t\treturn 2;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\tlet result = [], length = obj.length;\n\n\t\t\tfor (pos = 0, startpos = 0;;)\n\t\t\t{\n\t\t\t\tif (pos >= length)\n\t\t\t\t{\n\t\t\t\t\tif (startpos != pos)\n\t\t\t\t\t\tresult.push(obj.substring(startpos));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tlet lineendlen = lookingAtLineEnd();\n\t\t\t\tif (!lineendlen)\n\t\t\t\t\t++pos;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet endpos = pos + (keepends ? lineendlen : 0);\n\t\t\t\t\tresult.push(obj.substring(startpos, endpos));\n\t\t\t\t\tpos += lineendlen;\n\t\t\t\t\tstartpos = pos;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlower(obj)\n\t\t{\n\t\t\treturn obj.toLowerCase();\n\t\t}\n\n\t\tupper(obj)\n\t\t{\n\t\t\treturn obj.toUpperCase();\n\t\t}\n\n\t\tcapitalize(obj)\n\t\t{\n\t\t\tif (obj.length)\n\t\t\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\t\t\treturn obj;\n\t\t}\n\n\t\tjoin(obj, iterable)\n\t\t{\n\t\t\tlet resultlist = [];\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresultlist.push(item.value);\n\t\t\t}\n\t\t\treturn resultlist.join(obj);\n\t\t}\n\n\t\tstartswith(obj, prefix)\n\t\t{\n\t\t\tif (typeof(prefix) === \"string\")\n\t\t\t\treturn obj.substr(0, prefix.length) === prefix;\n\t\t\telse if (ul4._islist(prefix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < prefix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlepre = prefix[i];\n\t\t\t\t\tif (obj.substr(0, singlepre.length) === singlepre)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"startswith() argument must be string\");\n\t\t}\n\n\t\tendswith(obj, suffix)\n\t\t{\n\t\t\tif (typeof(suffix) === \"string\")\n\t\t\t\treturn obj.substr(obj.length-suffix.length) === suffix;\n\t\t\telse if (ul4._islist(suffix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < suffix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlesuf = suffix[i];\n\t\t\t\t\tif (obj.substr(obj.length-singlesuf.length) === singlesuf)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"endswith() argument must be string or list of strings\");\n\t\t}\n\t};\n\n\tul4.StrProtocol = ul4.StrProtocol.prototype;\n\tul4.StrProtocol.attrs = ul4._makeset(\n\t\t\"split\",\n\t\t\"rsplit\",\n\t\t\"splitlines\",\n\t\t\"strip\",\n\t\t\"lstrip\",\n\t\t\"rstrip\",\n\t\t\"upper\",\n\t\t\"lower\",\n\t\t\"capitalize\",\n\t\t\"startswith\",\n\t\t\"endswith\",\n\t\t\"replace\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\",\n\t\t\"join\"\n\t);\n\n\tul4.expose(ul4.StrProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.replace, [\"old\", \"new\", \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.strip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.lstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.rstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.split, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.rsplit, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.splitlines, [\"keepends=\", false]);\n\tul4.expose(ul4.StrProtocol.lower, []);\n\tul4.expose(ul4.StrProtocol.upper, []);\n\tul4.expose(ul4.StrProtocol.capitalize, []);\n\tul4.expose(ul4.StrProtocol.join, [\"iterable\"]);\n\tul4.expose(ul4.StrProtocol.startswith, [\"prefix\"]);\n\tul4.expose(ul4.StrProtocol.endswith, [\"suffix\"]);\n\n\tul4.ListProtocol = class ListProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"list\";\n\t\t}\n\n\t\tappend(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.push(items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tinsert(obj, pos, items)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.splice(pos++, 0, items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tpop(obj, pos)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tlet result = obj[pos];\n\t\t\tobj.splice(pos, 1);\n\t\t\treturn result;\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\t};\n\n\tul4.ListProtocol = ul4.ListProtocol.prototype;\n\tul4.ListProtocol.attrs = ul4._makeset(\n\t\t\"append\",\n\t\t\"insert\",\n\t\t\"pop\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\"\n\t);\n\n\tul4.expose(ul4.ListProtocol.append, [\"*items\"]);\n\tul4.expose(ul4.ListProtocol.insert, [\"pos\", \"*items\"]);\n\tul4.expose(ul4.ListProtocol.pop, [\"pos=\", -1]);\n\tul4.expose(ul4.ListProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\n\tul4.MapProtocol = class MapProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj.get(attrname);\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tif (obj.has(key))\n\t\t\t\treturn obj.get(key);\n\t\t\treturn default_;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push([key, value]);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push(value);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tupdate(obj, other, kwargs)\n\t\t{\n\t\t\treturn ul4._update(obj, other, kwargs);\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.MapProtocol = ul4.MapProtocol.prototype;\n\tul4.MapProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.MapProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.MapProtocol.items, []);\n\tul4.expose(ul4.MapProtocol.values, []);\n\tul4.expose(ul4.MapProtocol.update, [\"*other\", \"**kwargs\"]);\n\tul4.expose(ul4.MapProtocol.clear, []);\n\n\tul4.SetProtocol = class SetProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"set\";\n\t\t}\n\n\t\tadd(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tobj.add(items[i]);\n\t\t\t}\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.SetProtocol = ul4.SetProtocol.prototype;\n\tul4.SetProtocol.attrs = ul4._makeset(\"add\", \"clear\");\n\n\tul4.expose(ul4.SetProtocol.add, [\"*items\"]);\n\tul4.expose(ul4.SetProtocol.clear, []);\n\n\tul4.DateProtocol = class DateProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.weekday(obj._date);\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj._date, firstweekday, mindaysinfirstweek);\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj._date.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj._date.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj._date.getFullYear();\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t\t\tlet d = obj._date;\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(d)] + \", \" + ul4._lpad(d.getDate(), \"0\", 2) + \" \" + monthname[d.getMonth()] + \" \" + d.getFullYear();\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet d = obj._date;\n\t\t\treturn d.getFullYear() + \"-\" + ul4._lpad((d.getMonth()+1).toString(), \"0\", 2) + \"-\" + ul4._lpad(d.getDate().toString(), \"0\", 2);\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.yearday(obj._date);\n\t\t}\n\t};\n\n\tul4.DateProtocol = ul4.DateProtocol.prototype;\n\tul4.DateProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateProtocol.weekday, []);\n\tul4.expose(ul4.DateProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.day, []);\n\tul4.expose(ul4.DateProtocol.month, []);\n\tul4.expose(ul4.DateProtocol.year, []);\n\tul4.expose(ul4.DateProtocol.mimeformat, []);\n\tul4.expose(ul4.DateProtocol.isoformat, []);\n\tul4.expose(ul4.DateProtocol.yearday, []);\n\n\tul4.DateTimeProtocol = class DatetimeProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"datetime\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\tlet d = obj.getDay();\n\t\t\treturn d ? d-1 : 6;\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\t// Normalize parameters\n\t\t\tfirstweekday = ul4._mod(firstweekday, 7);\n\t\t\tif (mindaysinfirstweek < 1)\n\t\t\t\tmindaysinfirstweek = 1;\n\t\t\telse if (mindaysinfirstweek > 7)\n\t\t\t\tmindaysinfirstweek = 7;\n\n\t\t\t// ``obj`` might be in the first week of the next year, or last week of\n\t\t\t// the previous year, so we might have to try those too.\n\t\t\tfor (let offset = +1; offset >= -1; --offset)\n\t\t\t{\n\t\t\t\tlet year = obj.getFullYear() + offset;\n\t\t\t\t// ``refdate`` will always be in week 1\n\t\t\t\tlet refDate = new Date(year, 0, mindaysinfirstweek);\n\t\t\t\t// Go back to the start of ``refdate``s week (i.e. day 1 of week 1)\n\t\t\t\tlet weekDayDiff = ul4._mod(ul4.DateTimeProtocol.weekday(refDate) - firstweekday, 7);\n\t\t\t\tlet weekStartYear = refDate.getFullYear();\n\t\t\t\tlet weekStartMonth = refDate.getMonth();\n\t\t\t\tlet weekStartDay = refDate.getDate() - weekDayDiff;\n\t\t\t\tlet weekStart = new Date(weekStartYear, weekStartMonth, weekStartDay);\n\t\t\t\t// Is our date ``obj`` at or after day 1 of week 1?\n\t\t\t\tif (obj.getTime() >= weekStart.getTime())\n\t\t\t\t{\n\t\t\t\t\tlet diff = ul4.SubAST.prototype._do(obj, weekStart);\n\t\t\t\t\t// Add 1, because the first week is week 1, not week 0\n\t\t\t\t\tlet week = Math.floor(diff.days()/7) + 1;\n\t\t\t\t\treturn [year, week, ul4.DateTimeProtocol.weekday(obj)];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj.getFullYear();\n\t\t}\n\n\t\thour(obj)\n\t\t{\n\t\t\treturn obj.getHours();\n\t\t}\n\n\t\tminute(obj)\n\t\t{\n\t\t\treturn obj.getMinutes();\n\t\t}\n\n\t\tsecond(obj)\n\t\t{\n\t\t\treturn obj.getSeconds();\n\t\t}\n\n\t\tmicrosecond(obj)\n\t\t{\n\t\t\treturn obj.getMilliseconds() * 1000;\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet year = obj.getFullYear();\n\t\t\tlet month = obj.getMonth()+1;\n\t\t\tlet day = obj.getDate();\n\t\t\tlet hour = obj.getHours();\n\t\t\tlet minute = obj.getMinutes();\n\t\t\tlet second = obj.getSeconds();\n\t\t\tlet ms = obj.getMilliseconds();\n\t\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\treturn result;\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\tlet leap = ul4._isleap(obj) ? 1 : 0;\n\t\t\tlet day = obj.getDate();\n\t\t\tswitch (obj.getMonth())\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn day;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn 31 + day;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn 31 + 28 + leap + day;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\t\t\tcase 4:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\t\t\tcase 5:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\t\t\tcase 6:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\t\t\tcase 7:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\t\t\tcase 8:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\t\t\tcase 9:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\t\t\tcase 10:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\t\t\tcase 11:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.DateTimeProtocol = ul4.DateTimeProtocol.prototype;\n\tul4.DateTimeProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"hour\", \"minute\", \"second\", \"microsecond\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateTimeProtocol.weekday, []);\n\tul4.expose(ul4.DateTimeProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.day, []);\n\tul4.expose(ul4.DateTimeProtocol.month, []);\n\tul4.expose(ul4.DateTimeProtocol.year, []);\n\tul4.expose(ul4.DateTimeProtocol.hour, []);\n\tul4.expose(ul4.DateTimeProtocol.minute, []);\n\tul4.expose(ul4.DateTimeProtocol.second, []);\n\tul4.expose(ul4.DateTimeProtocol.microsecond, []);\n\tul4.expose(ul4.DateTimeProtocol.mimeformat, []);\n\tul4.expose(ul4.DateTimeProtocol.isoformat, []);\n\tul4.expose(ul4.DateTimeProtocol.yearday, []);\n\n\tul4.ObjectProtocol = class ObjectProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tlet result;\n\t\t\tif (obj && typeof(obj.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\tresult = obj.__getattr__(attrname);\n\t\t\telse\n\t\t\t\tresult = obj[attrname];\n\t\t\tif (typeof(result) !== \"function\")\n\t\t\t\treturn result;\n\t\t\tlet realresult = function(...args) {\n\t\t\t\t// We can use ``apply`` here, as we know that ``obj`` is a real object.\n\t\t\t\treturn result.apply(obj, args);\n\t\t\t};\n\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\treturn realresult;\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tlet result = obj[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn default_;\n\t\t\treturn result;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push([key, obj[key]]);\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push(obj[key]);\n\t\t\treturn result;\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tfor (let key in obj)\n\t\t\t\tdelete obj[key];\n\t\t}\n\t};\n\n\tul4.ObjectProtocol = ul4.ObjectProtocol.prototype;\n\tul4.ObjectProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.ObjectProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.ObjectProtocol.items, []);\n\tul4.expose(ul4.ObjectProtocol.values, []);\n\tul4.expose(ul4.ObjectProtocol.clear, []);\n\n\tul4.Context = class Context\n\t{\n\t\tconstructor(vars)\n\t\t{\n\t\t\tif (vars === null || typeof(vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tthis.vars = vars;\n\t\t\tthis.indents = [];\n\t\t\tthis.escapes = [];\n\t\t\tthis._output = [];\n\t\t}\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext.vars = Object.create(this.vars);\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent(indent)\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tif (indent !== null)\n\t\t\t{\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t}\n\n\t\tclone(vars)\n\t\t{\n\t\t\treturn Object.create(this);\n\t\t}\n\n\t\toutput(value)\n\t\t{\n\t\t\tfor (let i = 0; i < this.escapes.length; ++i)\n\t\t\t{\n\t\t\t\tlet escape = this.escapes[i];\n\t\t\t\tvalue = escape(value);\n\t\t\t}\n\t\t\tthis._output.push(value);\n\t\t}\n\n\t\tgetoutput()\n\t\t{\n\t\t\treturn this._output.join(\"\");\n\t\t}\n\n\t\tget(name)\n\t\t{\n\t\t\treturn this.vars[name];\n\t\t}\n\n\t\tset(name, value)\n\t\t{\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t};\n\n\t/// Exceptions\n\n\t// Note that extending ``Error`` doesn't work, so we do it the \"classic\" way\n\tul4.Exception = function Exception(message, fileName, lineNumber)\n\t{\n\t\tlet instance = new Error(message, fileName, lineNumber);\n\t\tObject.setPrototypeOf(instance, Object.getPrototypeOf(this));\n\t\tinstance.__id__ = _nextid++;\n\t\tinstance.context = null;\n\t\treturn instance;\n\t};\n\n\tul4.Exception.prototype = Object.create(Error.prototype, {\n\t\tconstructor: {\n\t\t\tvalue: Error,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tconfigurable: true\n\t\t}\n\t});\n\n\tif (Object.setPrototypeOf)\n\t\tObject.setPrototypeOf(ul4.Exception, Error);\n\telse\n\t\tul4.Exception.__proto__ = Error;\n\n\tul4.Exception.prototype.__getattr__ = function __getattr__(attrname)\n\t{\n\t\tswitch (attrname)\n\t\t{\n\t\t\tcase \"context\":\n\t\t\t\treturn this.context;\n\t\t\tdefault:\n\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\t};\n\n\t// Exceptions used internally by UL4 for flow control\n\tul4.InternalException = class InternalException extends ul4.Exception\n\t{\n\t};\n\n\t// Control flow exceptions\n\tul4.ReturnException = class ReturnException extends ul4.InternalException\n\t{\n\t\tconstructor(result)\n\t\t{\n\t\t\tsuper(\"return\");\n\t\t\tthis.result = result;\n\t\t}\n\t};\n\n\tul4.BreakException = class BreakException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"break\");\n\t\t}\n\t};\n\n\tul4.ContinueException = class ContinueException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"continue\");\n\t\t}\n\t};\n\n\t// Real exceptions raised by various parts of UL4\n\tul4.SyntaxError = class SyntaxError extends ul4.Exception\n\t{\n\t};\n\n\tul4.LValueRequiredError = class LValueRequiredError extends ul4.SyntaxError\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"lvalue required\");\n\t\t}\n\t};\n\n\tul4.TypeError = class TypeError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ValueError = class ValueError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ArgumentError = class ArgumentError extends ul4.Exception\n\t{\n\t};\n\n\tul4.NotSubscriptableError = class NotSubscriptableError extends ul4.Exception\n\t{\n\t\tconstructor(obj)\n\t\t{\n\t\t\tsuper(\"Object of type \" + _type(obj) + \" is not subscriptable\");\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"Object of type \" + _type(this.obj) + \" is not subscriptable\";\n\t\t}\n\t};\n\n\tul4.ZeroDivisionError = class ZeroDivisionError extends ul4.Exception\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"division by zero\");\n\t\t}\n\t};\n\n\tul4.IndexError = class IndexError extends ul4.Exception\n\t{\n\t\tconstructor(obj, index)\n\t\t{\n\t\t\tsuper(\"index \" + ul4._repr(index) + \" out of range\");\n\t\t\tthis.obj = obj;\n\t\t\tthis.index = index;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"index \" + this.index + \" out of range for \" + ul4._type(this.obj);\n\t\t}\n\t};\n\n\tul4.AttributeError = class AttributeError extends ul4.Exception\n\t{\n\t\tconstructor(obj, attrname)\n\t\t{\n\t\t\tsuper(\"object of type \" + ul4._type(obj) + \" has no attribute \" + ul4._repr(attrname));\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\t};\n\n\t/// Exception that wraps other exceptions while they bubble up the stack\n\tul4.LocationError = class LocationError extends ul4.Exception\n\t{\n\t\tconstructor(location)\n\t\t{\n\t\t\tsuper(\"nested exception in \" + ul4._repr(location));\n\t\t\tthis.location = location;\n\t\t}\n\n\t\t_templateprefix()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tlet first = true;\n\t\t\twhile (template != null)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet templateprefix = this._templateprefix();\n\n\t\t\tlet prefix = this.location.sourceprefix;\n\t\t\tlet code = this.location.source;\n\t\t\tlet suffix = this.location.sourcesuffix;\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\n\t\t\tlet text = prefix + code + suffix;\n\t\t\tlet underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\tlet pos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + this.location.line + \"; col \" + this.location.col;\n\n\t\t\tlet message = templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t\treturn message;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"context\":\n\t\t\t\t\treturn this.context;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\t/// Classes for the syntax tree\n\tul4.AST = class AST extends ul4.Proto\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.pos = pos;\n\t\t\tthis._line = null;\n\t\t\tthis._col = null;\n\t\t}\n\n\t\tget fullsource()\n\t\t{\n\t\t\treturn this.template._source;\n\t\t}\n\n\t\tget source()\n\t\t{\n\t\t\treturn this.pos.of(this.template._source);\n\t\t}\n\n\t\tget sourceprefix()\n\t\t{\n\t\t\tlet outerstartpos = this.pos.start;\n\t\t\tlet innerstartpos = outerstartpos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxprefix = 40;\n\t\t\tlet preprefix = \"\\u2026\";\n\t\t\twhile (maxprefix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the start of the source code\n\t\t\t\tif (outerstartpos === 0)\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the start of the line\n\t\t\t\tif (source.charAt(outerstartpos-1) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxprefix;\n\t\t\t\t--outerstartpos;\n\t\t\t}\n\t\t\treturn preprefix + source.substring(outerstartpos, innerstartpos);\n\t\t}\n\n\t\tget sourcesuffix()\n\t\t{\n\t\t\tlet outerstoppos = this.pos.stop;\n\t\t\tlet innerstoppos = outerstoppos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxsuffix = 40;\n\t\t\tlet postsuffix = \"\\u2026\";\n\t\t\twhile (maxsuffix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the ed of the source code\n\t\t\t\tif (outerstoppos >= source.length)\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the end of the line\n\t\t\t\tif (source.charAt(outerstoppos) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxsuffix;\n\t\t\t\t++outerstoppos;\n\t\t\t}\n\t\t\treturn source.substring(innerstoppos, outerstoppos) + postsuffix;\n\t\t}\n\n\t\tget line()\n\t\t{\n\t\t\tif (this._line === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._line;\n\t\t}\n\n\t\tget col()\n\t\t{\n\t\t\tif (this._col === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._col;\n\t\t}\n\n\t\t_calculateLineCol()\n\t\t{\n\t\t\tthis._line = 1\n\t\t\tthis._col = 1;\n\t\t\tlet stop = this.pos.start;\n\t\t\tfor (let i = 0; i < stop; ++i)\n\t\t\t{\n\t\t\t\tif (this.template.source[i] === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\t++this._line;\n\t\t\t\t\tthis._col = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++this._col;\n\t\t\t}\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tif (attrname === \"type\" || attrname === \"fullsource\" || attrname === \"source\" || attrname === \"sourceprefix\" || attrname === \"sourcesuffix\" || attrname === \"line\" || attrname === \"col\")\n\t\t\t\treturn this[attrname];\n\t\t\telse if (this._ul4onattrs.indexOf(attrname) >= 0)\n\t\t\t\treturn this[attrname];\n\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\n\t\t__setitem__(attrname, value)\n\t\t{\n\t\t\tthrow new ul4.TypeError(\"object is immutable\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t_decorate_exception(exc)\n\t\t{\n\t\t\twhile (exc.context !== undefined && exc.context !== null)\n\t\t\t\texc = exc.context;\n\t\t\texc.context = new ul4.LocationError(this);\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_handle_eval_modify(context, operator, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this.source.replace(/\\r?\\n/g, ' '));\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tencoder.dump(this[attrname]);\n\t\t\t}\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tthis[attrname] = decoder.load();\n\t\t\t}\n\t\t}\n\t};\n\n\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\tul4.AST.prototype._ul4onattrs = [\"template\", \"pos\"];\n\n\tul4.TextAST = class TextAST extends ul4.AST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\treturn this.source;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.IndentAST = class IndentAST extends ul4.TextAST\n\t{\n\t\tconstructor(template, pos, text)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._text = text;\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\tif (typeof(this.template) !== \"undefined\")\n\t\t\t\treturn this._text === null ? this.source : this._text;\n\t\t\telse\n\t\t\t\treturn null;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < context.indents.length; ++i)\n\t\t\t{\n\t\t\t\tlet indent = context.indents[i];\n\t\t\t\tcontext.output(indent);\n\t\t\t}\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tif (this._text === this.source)\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this._text);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tthis._text = decoder.load();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.LineEndAST = class LineEndAST extends ul4.TextAST\n\t{\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CodeAST = class CodeAST extends ul4.AST\n\t{\n\t};\n\n\tul4.ConstAST = class ConstAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this.value;\n\t\t}\n\t};\n\n\tul4.ConstAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.ItemArgBase = class ItemArgBase extends ul4.CodeAST\n\t{\n\t\t_handle_eval_list(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_dict(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_call(context, args, kwargs)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SeqItemAST = class SeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t};\n\n\tul4.SeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.UnpackSeqItemAST = class UnpackSeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackSeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.DictItemAST = class DictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, key, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet key = this.key._handle_eval(context);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tul4._setmap(result, key, value);\n\t\t}\n\t};\n\n\tul4.DictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"key\", \"value\"]),\n\n\tul4.UnpackDictItemAST = class UnpackDictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(result, subitem[0], subitem[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t\tul4._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.PosArgAST = class PosArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t};\n\n\tul4.PosArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.KeywordArgAST = class KeywordArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, name, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + this.name);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t};\n\n\tul4.KeywordArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"name\", \"value\"]);\n\n\tul4.UnpackListArgAST = class UnpackListArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\targs.push(...item);\n\t\t}\n\t};\n\n\tul4.UnpackListArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.UnpackDictArgAST = class UnpackDictArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tlet [key, value] = subitem;\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.ListAST = class ListAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_list(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.ListCompAST = class ListCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = [];\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.SetAST = class SetAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptyset();\n\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_set(context, result);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.SetCompAST = class SetCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"item\":\n\t\t\t\t\treturn this.item;\n\t\t\t\tcase \"varname\":\n\t\t\t\t\treturn this.varname;\n\t\t\t\tcase \"container\":\n\t\t\t\t\treturn this.container;\n\t\t\t\tcase \"condition\":\n\t\t\t\t\treturn this.condition;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptyset();\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.DictAST = class DictAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn this.items;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptymap();\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_dict(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.DictCompAST = class DictCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, key, value, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptymap();\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t{\n\t\t\t\t\tlet key = this.key._handle_eval(localcontext);\n\t\t\t\t\tlet value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.GenExprAST = class GenExprAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\t\t\tlet iter = ul4._iter(container);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet self = this;\n\n\t\t\tlet result = {\n\t\t\t\tnext: function(){\n\t\t\t\t\twhile (true)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tlet varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn {value: value, done: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.GenExprAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.VarAST = class VarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, name)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this._get(context, this.name);\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthis._set(context, this.name, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t}\n\n\t\t_get(context, name)\n\t\t{\n\t\t\tlet result = context.get(name);\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t}\n\n\t\t_set(context, name, value)\n\t\t{\n\t\t\tcontext.set(name, value);\n\t\t}\n\n\t\t_modify(context, operator, name, value)\n\t\t{\n\t\t\tlet newvalue = operator._ido(context.get(name), value);\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t};\n\n\tul4.VarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"name\"]);\n\n\tul4.UnaryAST = class UnaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t};\n\n\tul4.UnaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\"]);\n\n\t// Negation\n\tul4.NegAST = class NegAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\tif (obj !== null && typeof(obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t};\n\n\t// Bitwise not\n\tul4.BitNotAST = class BitNotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn -obj-1;\n\t\t}\n\t};\n\n\t// Not\n\tul4.NotAST = class NotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t};\n\n\t// If expression\n\tul4.IfAST = class IfAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, objif, objcond, objelse)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.objif = objif;\n\t\t\tthis.objcond = objcond;\n\t\t\tthis.objelse = objelse;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result;\n\t\t\tlet condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.IfAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]);\n\n\tul4.ReturnAST = class ReturnAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = this.obj._handle_eval(context);\n\t\t\tthrow new ul4.ReturnException(result);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintAST = class PrintAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintXAST = class PrintXAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.BinaryAST = class BinaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj1, obj2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj1 = obj1;\n\t\t\tthis.obj2 = obj2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.BinaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj1\", \"obj2\"]);\n\n\t// Item access and assignment: dict[key], list[index], string[index], color[index]\n\tul4.ItemAST = class ItemAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tlet result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t}\n\n\t\t_get(container, key)\n\t\t{\n\t\t\tif (typeof(container) === \"string\" || ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof(start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof(stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__getitem__) === \"function\") // objects without ``_getitem__`` don't support item access\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not subscriptable\");\n\t\t}\n\n\t\t_set(container, key, value)\n\t\t{\n\t\t\tif (ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop-start); // Remove old element\n\t\t\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.NotSubscriptableError(container);\n\t\t}\n\n\t\t_modify(operator, container, key, value)\n\t\t{\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t};\n\n\t// Identifty test operator ``is``\n\tul4.IsAST = class IsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t};\n\n\t// Inverted identity test operator ``is not``\n\tul4.IsNotAST = class IsNotAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t};\n\n\t// Comparison operator ==\n\tul4.EQAST = class EQAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator !=\n\tul4.NEAST = class NEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <\n\tul4.LTAST = class LTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <=\n\tul4.LEAST = class LEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >\n\tul4.GTAST = class GTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >=\n\tul4.GEAST = class GEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t};\n\n\t// Containment test: string in string, obj in list, key in dict, value in rgb\n\tul4.ContainsAST = class ContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\tif (typeof(obj) === \"string\" && typeof(container) === \"string\")\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container))\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof(container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t{\n\t\t\t\tfor (let key in container)\n\t\t\t\t{\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container))\n\t\t\t{\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t};\n\n\t// Inverted containment test\n\tul4.NotContainsAST = class NotContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\treturn !ul4.ContainsAST.prototype._do(obj, container);\n\t\t}\n\t};\n\n\t// Addition: num + num, string + string\n\tul4.AddAST = class AddAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t\treturn [...obj1, ...obj2];\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tul4.ListProtocol.append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Substraction: num - num\n\tul4.SubAST = class SubAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\telse if (ul4._isdatetime(obj1) && ul4._isdatetime(obj2))\n\t\t\t\treturn this._datetime_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t}\n\n\t\t_date_sub(obj1, obj2)\n\t\t{\n\t\t\treturn this._datetime_sub(obj1._date, obj2._date);\n\t\t}\n\n\t\t_datetime_sub(obj1, obj2)\n\t\t{\n\t\t\tlet swap = (obj2 > obj1);\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tlet t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tlet year1 = obj1.getFullYear();\n\t\t\tlet yearday1 = ul4.DateTimeProtocol.yearday(obj1);\n\t\t\tlet year2 = obj2.getFullYear();\n\t\t\tlet yearday2 = ul4.DateTimeProtocol.yearday(obj2);\n\n\t\t\tlet diffdays = 0;\n\n\t\t\twhile (year1 > year2)\n\t\t\t{\n\t\t\t\tdiffdays += ul4.DateProtocol.yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tlet hours1 = obj1.getHours();\n\t\t\tlet minutes1 = obj1.getMinutes();\n\t\t\tlet seconds1 = obj1.getSeconds();\n\t\t\tlet hours2 = obj2.getHours();\n\t\t\tlet minutes2 = obj2.getMinutes();\n\t\t\tlet seconds2 = obj2.getSeconds();\n\n\t\t\tlet diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tlet diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn new ul4.TimeDelta(diffdays, diffseconds, 1000*diffmilliseconds);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\n\t// Multiplication: num * num, int * str, str * int, int * list, list * int\n\tul4.MulAST = class MulAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1))\n\t\t\t{\n\t\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2))\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2))\n\t\t\t{\n\t\t\t\tif (typeof(obj1) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1))\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2))\n\t\t\t{\n\t\t\t\tif (obj2 > 0)\n\t\t\t\t{\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\tlet targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Truncating division\n\tul4.FloorDivAST = class FloorDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// \"Real\" division\n\tul4.TrueDivAST = class TrueDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn obj1 / obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Modulo\n\tul4.ModAST = class ModAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._mod(obj1, obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise left shift\n\tul4.ShiftLeftAST = class ShiftLeftAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise right shift\n\tul4.ShiftRightAST = class ShiftRightAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise and\n\tul4.BitAndAST = class BitAndAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise exclusive or\n\tul4.BitXOrAST = class BitXOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise or\n\tul4.BitOrAST = class BitOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.AndAST = class AndAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.OrAST = class OrAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.AttrAST = class AttrAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, attrname)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t}\n\n\t\t_get(object, attrname)\n\t\t{\n\t\t\tlet proto = ul4.Protocol.get(object);\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn proto.getattr(object, attrname);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\treturn undefined;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_set(object, attrname, value)\n\t\t{\n\t\t\tif (typeof(object) === \"object\" && typeof(object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value);\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(object) + \" object has no writable attributes\");\n\t\t}\n\n\t\t_modify(operator, object, attrname, value)\n\t\t{\n\t\t\tlet oldvalue = this._get(object, attrname);\n\t\t\tlet newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t};\n\n\tul4.AttrAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"attrname\"]);\n\n\tul4.CallAST = class CallAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.args = args;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_makeargs(context)\n\t\t{\n\t\t\tlet args = [], kwargs = {};\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\targ._handle_eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\treturn {args: args, kwargs: kwargs};\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet args = this._makeargs(context);\n\t\t\tlet result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.CallAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"args\"]);\n\n\tul4.RenderAST = class RenderAST extends ul4.CallAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos, obj, args);\n\t\t\tthis.indent = null;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this._reprname);\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.code.replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null)\n\t\t\t{\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent.text));\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tlet localcontext = context.withindent(this.indent !== null ? this.indent.text : null);\n\t\t\tlet obj = this.obj._handle_eval(localcontext);\n\t\t\tlet args = this._makeargs(localcontext);\n\t\t\tthis._handle_additional_arguments(localcontext, args);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlet result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t}\n\t};\n\n\tul4.RenderAST.prototype._ul4onattrs = ul4.CallAST.prototype._ul4onattrs.concat([\"indent\"]);\n\tul4.RenderAST.prototype._reprname = \"RenderAST\";\n\n\tul4.RenderXAST = class RenderXAST extends ul4.RenderAST\n\t{\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tcontext.escapes.push(ul4._xmlescape);\n\n\t\t\tlet result = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresult = super._handle_eval(context);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcontext.escapes.splice(context.escapes.length-1, 1);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST = class RenderBlockAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tif (args.kwargs.hasOwnProperty(\"content\"))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument content\");\n\t\t\tlet closure = new ul4.TemplateClosure(this.content, this.content.signature, context.vars);\n\t\t\targs.kwargs.content = closure;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.RenderBlocksAST = class RenderBlocksAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tlet localcontext = context.inheritvars();\n\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\n\t\t\tfor (let key in localcontext.vars)\n\t\t\t{\n\t\t\t\tif (localcontext.vars.hasOwnProperty(key))\n\t\t\t\t{\n\t\t\t\t\tif (key in args.kwargs)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\targs.kwargs[key] = localcontext.get(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.RenderBlocksAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\t// Slice object\n\tul4.slice = class slice extends ul4.Proto\n\t{\n\t\tconstructor(start, stop)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.start = start;\n\t\t\tthis.stop = stop;\n\t\t}\n\n\t\tof(string)\n\t\t{\n\t\t\tlet start = this.start || 0;\n\t\t\tlet stop = this.stop === null ? string.length : this.stop;\n\t\t\treturn string.slice(start, stop);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \", None)\";\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"start\":\n\t\t\t\t\treturn this.start;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\treturn this.stop;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\n\t// List/String slice\n\tul4.SliceAST = class SliceAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, index1, index2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.index1 = index1;\n\t\t\tthis.index2 = index2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tlet index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn new ul4.slice(index1, index2);\n\t\t}\n\t};\n\n\tul4.SliceAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"index1\", \"index2\"]);\n\n\tul4.SetVarAST = class SetVarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, lvalue, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.lvalue = lvalue;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SetVarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"lvalue\", \"value\"]);\n\n\tul4.ModifyVarAST = class ModifyVarAST extends ul4.SetVarAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_modify(context, this._operator, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.AddVarAST = class AddVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.AddVarAST.prototype._operator = ul4.AddAST.prototype;\n\n\tul4.SubVarAST = class SubVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.SubVarAST.prototype._operator = ul4.SubAST.prototype;\n\n\tul4.MulVarAST = class MulVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.MulVarAST.prototype._operator = ul4.MulAST.prototype;\n\n\tul4.TrueDivVarAST = class TrueDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.TrueDivVarAST.prototype._operator = ul4.TrueDivAST.prototype;\n\n\tul4.FloorDivVarAST = class FloorDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.FloorDivVarAST.prototype._operator = ul4.FloorDivAST.prototype;\n\n\tul4.ModVarAST = class ModVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ModVarAST.prototype._operator = ul4.ModAST.prototype;\n\n\tul4.ShiftLeftVarAST = class ShiftLeftVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftLeftVarAST.prototype._operator = ul4.ShiftLeftAST.prototype;\n\n\tul4.ShiftRightVarAST = class ShiftRightVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftRightVarAST.prototype._operator = ul4.ShiftRightAST.prototype;\n\n\tul4.BitAndVarAST = class BitAndVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitAndVarAST.prototype._operator = ul4.BitAndAST.prototype;\n\n\tul4.BitXOrVarAST = class BitXOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitXOrVarAST.prototype._operator = ul4.BitXOrAST.prototype;\n\n\tul4.BitOrVarAST = class BitOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitOrVarAST.prototype._operator = ul4.BitOrAST.prototype;\n\n\tul4.BlockAST = class BlockAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.content = [];\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.content[i];\n\t\t\t\titem._handle_eval(context);\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tif (this.content.length)\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = this.content[i];\n\t\t\t\t\titem._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.BlockAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.ForBlockAST = class ForBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, varname, container)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str_varname(out, varname)\n\t\t{\n\t\t\tif (ul4._islist(varname))\n\t\t\t{\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (let i = 0; i < varname.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t\t}\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t};\n\n\tul4.ForBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"varname\", \"container\"]);\n\n\tul4.WhileBlockAST = class WhileBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"while \");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping the original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.WhileBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.BreakAST = class BreakAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.BreakException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.ContinueAST = class ContinueAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.ContinueException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CondBlockAST = class CondBlockAST extends ul4.BlockAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet block = this.content[i];\n\t\t\t\tlet execute = block._execute(context);\n\t\t\t\tif (execute)\n\t\t\t\t{\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST = class ConditionalBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\tlet result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.IfBlockAST = class IfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.IfBlockAST.prototype._strname = \"if\";\n\n\tul4.ElIfBlockAST = class ElIfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.ElIfBlockAST.prototype._strname = \"else if\";\n\n\tul4.ElseBlockAST = class ElseBlockAST extends ul4.BlockAST\n\t{\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Template = class Template extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, source, name, whitespace, startdelim, enddelim, signature)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._source = source;\n\t\t\tthis.name = name;\n\t\t\tthis.whitespace = whitespace;\n\t\t\tthis.startdelim = startdelim;\n\t\t\tthis.enddelim = enddelim;\n\t\t\tthis.docpos = null;\n\t\t\tthis.signature = signature;\n\t\t\tthis._asts = null;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tthis.parenttemplate = null;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tlet signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this._source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || this.signature instanceof ul4.SignatureAST)\n\t\t\t\tsignature = this.signature;\n\t\t\telse\n\t\t\t{\n\t\t\t\tsignature = [];\n\t\t\t\tfor (let i = 0; i < this.signature.args.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet arg = this.signature.args[i];\n\t\t\t\t\tif (typeof(arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name+\"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tsuper.ul4ondump(encoder);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tlet version = decoder.load();\n\t\t\tlet signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow new ul4.ValueError(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow new ul4.ValueError(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\n\t\t\tthis.name = decoder.load();\n\t\t\tthis._source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = new ul4.Signature(...signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tsuper.ul4onload(decoder);\n\t\t}\n\n\t\tloads(string)\n\t\t{\n\t\t\treturn ul4.loads(string);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tlet closure = new ul4.TemplateClosure(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\")\n\t\t\t{\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.ReturnException))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t}\n\n\t\trenders(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t}\n\n\t\tdoc()\n\t\t{\n\t\t\treturn this.docpos != null ? this.docpos.of(this._source) : null;\n\t\t}\n\n\t\t_callbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.ReturnException)\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tcall(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.Template.prototype._ul4_callneedsobject = true;\n\tul4.Template.prototype._ul4_callneedscontext = true;\n\tul4.Template.prototype._ul4_renderneedsobject = true;\n\tul4.Template.prototype._ul4_renderneedscontext = true;\n\n\tul4.SignatureAST = class SignatureAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.params = [];\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tlet dump = [];\n\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tlet dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (let i = 0; i < dump.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = dump[i];\n\t\t\t\tif (typeof(param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet args = [];\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new ul4.Signature(...args);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t};\n\n\tul4.TemplateClosure = class TemplateClosure extends ul4.Proto\n\t{\n\t\tconstructor(template, signature, vars)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.signature = signature;\n\t\t\tthis.vars = vars;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tthis.name = template.name;\n\t\t\tthis.tag = template.tag;\n\t\t\tthis.endtag = template.endtag;\n\t\t\tthis._source = template._source;\n\t\t\tthis.startdelim = template.startdelim;\n\t\t\tthis.enddelim = template.enddelim;\n\t\t\tthis.docpos = template.docpos;\n\t\t\tthis.content = template.content;\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this.template._callbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\treturn this.template._rendersbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.TemplateClosure.prototype._ul4_callneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_callneedscontext = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedscontext = true;\n\n\t// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\n\tul4._rgb = function _rgb(r, g, b, a)\n\t{\n\t\treturn new this.Color(255*r, 255*g, 255*b, 255*a);\n\t};\n\n\t// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\n\tul4._xmlescape = function _xmlescape(obj)\n\t{\n\t\tobj = ul4._str(obj);\n\t\tobj = obj.replace(/&/g, \"&\");\n\t\tobj = obj.replace(//g, \">\");\n\t\tobj = obj.replace(/'/g, \"'\");\n\t\tobj = obj.replace(/\"/g, \""\");\n\t\treturn obj;\n\t};\n\n\t// Convert ``obj`` to a string suitable for output into a CSV file\n\tul4._csv = function _csv(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) !== \"string\")\n\t\t\tobj = ul4._repr(obj);\n\t\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\t\treturn obj;\n\t};\n\n\t// Return a string containing one character with the codepoint ``i``\n\tul4._chr = function _chr(i)\n\t{\n\t\tif (typeof(i) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"chr() requires an int\");\n\t\treturn String.fromCharCode(i);\n\t};\n\n\t// Return the codepoint for the one and only character in the string ``c``\n\tul4._ord = function _ord(c)\n\t{\n\t\tif (typeof(c) != \"string\" || c.length != 1)\n\t\t\tthrow new ul4.TypeError(\"ord() requires a string of length 1\");\n\t\treturn c.charCodeAt(0);\n\t};\n\n\t// Convert an integer to a hexadecimal string\n\tul4._hex = function _hex(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"hex() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0x\" + number.toString(16).substr(1);\n\t\telse\n\t\t\treturn \"0x\" + number.toString(16);\n\t};\n\n\t// Convert an integer to a octal string\n\tul4._oct = function _oct(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"oct() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0o\" + number.toString(8).substr(1);\n\t\telse\n\t\t\treturn \"0o\" + number.toString(8);\n\t};\n\n\t// Convert an integer to a binary string\n\tul4._bin = function _bin(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"bin() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0b\" + number.toString(2).substr(1);\n\t\telse\n\t\t\treturn \"0b\" + number.toString(2);\n\t};\n\n\t// Return the minimum value\n\tul4._min = function _min(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"min() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"min() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value < result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the maximum value\n\tul4._max = function _max(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"max() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"max() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value > result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the of the values from the iterable starting with ``start`` (default ``0``)\n\tul4._sum = function _sum(iterable, start=0)\n\t{\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tstart += item.value;\n\t\t}\n\t\treturn start;\n\t};\n\n\t// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._first = function _first(iterable, defaultValue=null)\n\t{\n\t\tlet item = ul4._iter(iterable).next();\n\t\treturn item.done ? defaultValue : item.value;\n\t};\n\n\t// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._last = function _last(iterable, defaultValue=null)\n\t{\n\t\tlet value = defaultValue;\n\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvalue = item.value;\n\t\t}\n\t\treturn value;\n\t};\n\n\t// Return a sorted version of ``iterable``\n\tul4._sorted = function _sorted(context, iterable, key=null, reverse=false)\n\t{\n\t\tif (key === null)\n\t\t{\n\t\t\t// FIXME: stability\n\t\t\tlet cmp = reverse ? function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t} : function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t};\n\t\t\tlet result = ul4._list(iterable);\n\t\t\tresult.sort(cmp);\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet sort = [];\n\n\t\t\tfor (let i = 0, iter = ul4._iter(iterable);;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\t\t// For a stable sorting we have to use the nagative index if\n\t\t\t\t// reverse sorting is specified\n\t\t\t\tsort.push([keyvalue, reverse ? -i : i, item.value]);\n\t\t\t}\n\t\t\tcmp = function cmp(s1, s2)\n\t\t\t{\n\t\t\t\tlet res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn reverse ? -res : res;\n\t\t\t\tres = ul4._cmp(\"<=>\", s1[1], s2[1]);\n\t\t\t\treturn reverse ? -res : res;\n\t\t\t};\n\n\t\t\tsort.sort(cmp);\n\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < sort.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = sort[i];\n\t\t\t\tresult.push(item[2]);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\t// Return a iterable object iterating from ``start`` up to (but not including) ``stop`` with a step size of ``step``\n\tul4._range = function _range(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required range() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet lower, higher;\n\t\tif (step === 0)\n\t\t\tthrow new ul4.ValueError(\"range() requires a step argument != 0\");\n\t\telse if (step > 0)\n\t\t{\n\t\t\tlower = start;\n\t\t\thigher = stop;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlower = stop;\n\t\t\thigher = start;\n\t\t}\n\t\tlet length = (lower < higher) ? Math.floor((higher - lower - 1)/Math.abs(step)) + 1 : 0;\n\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function()\n\t\t\t{\n\t\t\t\tif (this.index >= length)\n\t\t\t\t\treturn {done: true};\n\t\t\t\treturn {value: start + (this.index++) * step, done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return a iterable object returning a slice from the argument\n\tul4._slice = function _slice(args)\n\t{\n\t\tlet iterable, start, stop, step;\n\t\tif (args.length < 2)\n\t\t\tthrow new ul4.ArgumentError(\"required slice() argument missing\");\n\t\telse if (args.length > 4)\n\t\t\tthrow new ul4.ArgumentError(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = 0;\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 4)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = args[3] !== null ? args[3] : 1;\n\t\t}\n\t\tif (start < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a start argument >= 0\");\n\t\tif (stop < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a stop argument >= 0\");\n\t\tif (step <= 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a step argument > 0\");\n\n\t\tlet next = start, count = 0;\n\t\tlet iter = ul4._iter(iterable);\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet result;\n\t\t\t\twhile (count < next)\n\t\t\t\t{\n\t\t\t\t\tresult = iter.next();\n\t\t\t\t\tif (result.done)\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\tif (stop !== null && count >= stop)\n\t\t\t\t\treturn {done: true};\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t\tnext += step;\n\t\t\t\tif (stop !== null && next > stop)\n\t\t\t\t\tnext = stop;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// ``%`` escape unsafe characters in the string ``string``\n\tul4._urlquote = function _urlquote(string)\n\t{\n\t\treturn encodeURIComponent(string);\n\t};\n\n\t// The inverse function of ``urlquote``\n\tul4._urlunquote = function _urlunquote(string)\n\t{\n\t\treturn decodeURIComponent(string);\n\t};\n\n\t// Return a reverse iterator over ``sequence``\n\tul4._reversed = function _reversed(sequence)\n\t{\n\t\tif (typeof(sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn {\n\t\t\tindex: sequence.length-1,\n\t\t\tnext: function() {\n\t\t\t\treturn this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Returns a random number in the interval ``[0;1[``\n\tul4._random = function _random()\n\t{\n\t\treturn Math.random();\n\t};\n\n\t// Return a randomly select item from ``range(start, stop, step)``\n\tul4._randrange = function _randrange(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required randrange() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet width = stop-start;\n\n\t\tlet value = Math.random();\n\n\t\tlet n;\n\t\tif (step > 0)\n\t\t\tn = Math.floor((width + step - 1) / step);\n\t\telse if (step < 0)\n\t\t\tn = Math.floor((width + step + 1) / step);\n\t\telse\n\t\t\tthrow new ul4.ValueError(\"randrange() requires a step argument != 0\");\n\t\treturn start + step*Math.floor(value * n);\n\t};\n\n\t// Return a random item/char from the list/string ``sequence``\n\tul4._randchoice = function _randchoice(sequence)\n\t{\n\t\tlet iscolor = ul4._iscolor(sequence);\n\t\tif (typeof(sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\t\tthrow new ul4.TypeError(\"randchoice() requires a string or list\");\n\t\tif (iscolor)\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn sequence[Math.floor(Math.random() * sequence.length)];\n\t};\n\n\t// Round a number ``x`` to ``digits`` decimal places (may be negative)\n\tul4._round = function _round(x, digits=0)\n\t{\n\t\tif (digits)\n\t\t{\n\t\t\tlet threshold = Math.pow(10, digits);\n\t\t\treturn Math.round(x*threshold)/threshold;\n\t\t}\n\t\telse\n\t\t\treturn Math.round(x);\n\t};\n\n\t// Return a hex-encode MD5 hash of the argument\n\t// This uses the md5 function from https://github.com/blueimp/JavaScript-MD5\n\tif (iscommon)\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\tlet md5 = require('blueimp-md5');\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\n\t// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\n\tul4._enumerate = function _enumerate(iterable, start=0)\n\t{\n\t\treturn {\n\t\t\titer: ul4._iter(iterable),\n\t\t\tindex: start,\n\t\t\tnext: function() {\n\t\t\t\tlet item = this.iter.next();\n\t\t\t\treturn item.done ? item : {value: [this.index++, item.value], done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\n\tul4._isfirst = function _isfirst(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = item.done ? item : {value: [isfirst, item.value], done: false};\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\n\tul4._islast = function _islast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._isfirstlast = function _isfirstlast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._enumfl = function _enumfl(iterable, start=0)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet i = start;\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [i++, isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\n\tul4._zip = function _zip(iterables)\n\t{\n\t\tlet result;\n\t\tif (iterables.length)\n\t\t{\n\t\t\tlet iters = [];\n\t\t\tfor (let i = 0; i < iterables.length; ++i)\n\t\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\tlet items = [];\n\t\t\t\t\tfor (let i = 0; i < iters.length; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iters[i].next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\titems.push(item.value);\n\t\t\t\t\t}\n\t\t\t\t\treturn {value: items, done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t// Return the absolute value for the number ``number``\n\tul4._abs = function _abs(number)\n\t{\n\t\tif (number !== null && typeof(number.__abs__) === \"function\")\n\t\t\treturn number.__abs__();\n\t\treturn Math.abs(number);\n\t};\n\n\t// Return a ``Date`` object from the arguments passed in\n\tul4._date = function _date(year, month, day)\n\t{\n\t\treturn new ul4.Date(year, month, day);\n\t};\n\n\tul4._datetime = function _datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)\n\t{\n\t\treturn new Date(year, month-1, day, hour, minute, second, microsecond/1000);\n\t};\n\n\t// Return a ``TimeDelta`` object from the arguments passed in\n\tul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0)\n\t{\n\t\treturn new this.TimeDelta(days, seconds, microseconds);\n\t};\n\n\t// Return a ``MonthDelta`` object from the arguments passed in\n\tul4._monthdelta = function _monthdelta(months=0)\n\t{\n\t\treturn new this.MonthDelta(months);\n\t};\n\n\t// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\n\tul4._hls = function _hls(h, l, s, a)\n\t{\n\t\tlet _v = function(m1, m2, hue)\n\t\t{\n\t\t\thue = hue % 1.0;\n\t\t\tif (hue < 1/6)\n\t\t\t\treturn m1 + (m2-m1)*hue*6.0;\n\t\t\telse if (hue < 0.5)\n\t\t\t\treturn m2;\n\t\t\telse if (hue < 2/3)\n\t\t\t\treturn m1 + (m2-m1)*(2/3-hue)*6.0;\n\t\t\treturn m1;\n\t\t};\n\n\t\tlet m1, m2;\n\t\tif (typeof(a) === \"undefined\")\n\t\t\ta = 1;\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(l, l, l, a);\n\t\tif (l <= 0.5)\n\t\t\tm2 = l * (1.0+s);\n\t\telse\n\t\t\tm2 = l+s-(l*s);\n\t\tm1 = 2.0*l - m2;\n\t\treturn ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a);\n\t};\n\n\t// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\n\tul4._hsv = function _hsv(h, s, v, a)\n\t{\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(v, v, v, a);\n\t\tlet i = Math.floor(h*6.0);\n\t\tlet f = (h*6.0) - i;\n\t\tlet p = v*(1.0 - s);\n\t\tlet q = v*(1.0 - s*f);\n\t\tlet t = v*(1.0 - s*(1.0-f));\n\t\tswitch (i%6)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\treturn ul4._rgb(v, t, p, a);\n\t\t\tcase 1:\n\t\t\t\treturn ul4._rgb(q, v, p, a);\n\t\t\tcase 2:\n\t\t\t\treturn ul4._rgb(p, v, t, a);\n\t\t\tcase 3:\n\t\t\t\treturn ul4._rgb(p, q, v, a);\n\t\t\tcase 4:\n\t\t\t\treturn ul4._rgb(t, p, v, a);\n\t\t\tcase 5:\n\t\t\t\treturn ul4._rgb(v, p, q, a);\n\t\t}\n\t};\n\n\t// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\n\tul4._get = function _get(container, key, defaultvalue)\n\t{\n\t\tif (ul4._ismap(container))\n\t\t{\n\t\t\tif (container.has(key))\n\t\t\t\treturn container.get(key);\n\t\t\treturn defaultvalue;\n\t\t}\n\t\telse if (ul4._isobject(container))\n\t\t{\n\t\t\tlet result = container[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn defaultvalue;\n\t\t\treturn result;\n\t\t}\n\t\tthrow new ul4.TypeError(\"get() requires a dict\");\n\t};\n\n\t// Return a ``Date`` object for the current time\n\tul4.now = function now()\n\t{\n\t\treturn new Date();\n\t};\n\n\t// Return a ``Date`` object for the current time in UTC\n\tul4.utcnow = function utcnow()\n\t{\n\t\tlet now = new Date();\n\t\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\t\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n\t};\n\n\t// Return an ``ul4.Date`` object for today\n\tul4.today = function today()\n\t{\n\t\tlet now = new Date();\n\t\treturn new ul4.Date(now.getFullYear(), now.getMonth()+1, now.getDate());\n\t};\n\n\tul4.functions = {\n\t\trepr: ul4._repr,\n\t\tascii: ul4._ascii,\n\t\tstr: ul4._str,\n\t\tint: ul4._int,\n\t\tfloat: ul4._float,\n\t\tlist: ul4._list,\n\t\tset: ul4._set,\n\t\tbool: ul4._bool,\n\t\tlen: ul4._len,\n\t\ttype: ul4._type,\n\t\tformat: ul4._format,\n\t\tany: ul4._any,\n\t\tall: ul4._all,\n\t\tzip: ul4._zip,\n\t\tgetattr: ul4._getattr,\n\t\thasattr: ul4._hasattr,\n\t\tdir: ul4._dir,\n\t\tisundefined: ul4._isundefined,\n\t\tisdefined: ul4._isdefined,\n\t\tisnone: ul4._isnone,\n\t\tisbool: ul4._isbool,\n\t\tisint: ul4._isint,\n\t\tisfloat: ul4._isfloat,\n\t\tisstr: ul4._isstr,\n\t\tisdate: ul4._isdate,\n\t\tisdatetime: ul4._isdatetime,\n\t\tiscolor: ul4._iscolor,\n\t\tistimedelta: ul4._istimedelta,\n\t\tismonthdelta: ul4._ismonthdelta,\n\t\tistemplate: ul4._istemplate,\n\t\tisfunction: ul4._isfunction,\n\t\tislist: ul4._islist,\n\t\tisset: ul4._isanyset,\n\t\tisdict: ul4._isdict,\n\t\tisexception: ul4._isexception,\n\t\tasjson: ul4._asjson,\n\t\tfromjson: ul4._fromjson,\n\t\tasul4on: ul4._asul4on,\n\t\tfromul4on: ul4._fromul4on,\n\t\tnow: ul4.now,\n\t\tutcnow: ul4.utcnow,\n\t\ttoday: ul4.today,\n\t\tenumerate: ul4._enumerate,\n\t\tisfirst: ul4._isfirst,\n\t\tislast: ul4._islast,\n\t\tisfirstlast: ul4._isfirstlast,\n\t\tenumfl: ul4._enumfl,\n\t\tabs: ul4._abs,\n\t\tdate: ul4._date,\n\t\tdatetime: ul4._datetime,\n\t\ttimedelta: ul4._timedelta,\n\t\tmonthdelta: ul4._monthdelta,\n\t\trgb: ul4._rgb,\n\t\thls: ul4._hls,\n\t\thsv: ul4._hsv,\n\t\txmlescape: ul4._xmlescape,\n\t\tcsv: ul4._csv,\n\t\tchr: ul4._chr,\n\t\tord: ul4._ord,\n\t\thex: ul4._hex,\n\t\toct: ul4._oct,\n\t\tbin: ul4._bin,\n\t\tmin: ul4._min,\n\t\tmax: ul4._max,\n\t\tsum: ul4._sum,\n\t\tfirst: ul4._first,\n\t\tlast: ul4._last,\n\t\tsorted: ul4._sorted,\n\t\trange: ul4._range,\n\t\tslice: ul4._slice,\n\t\turlquote: ul4._urlquote,\n\t\turlunquote: ul4._urlunquote,\n\t\treversed: ul4._reversed,\n\t\trandom: ul4._random,\n\t\trandrange: ul4._randrange,\n\t\trandchoice: ul4._randchoice,\n\t\tround: ul4._round,\n\t\tmd5: ul4._md5\n\t};\n\n\tul4.expose(ul4._repr, [\"obj\"], {name: \"repr\"});\n\tul4.expose(ul4._ascii, [\"obj\"], {name: \"ascii\"});\n\tul4.expose(ul4._str, [\"obj=\", \"\"], {name: \"str\"});\n\tul4.expose(ul4._int, [\"obj=\", 0, \"base=\", null], {name: \"int\"});\n\tul4.expose(ul4._float, [\"obj=\", 0.0], {name: \"float\"});\n\tul4.expose(ul4._list, [\"iterable=\", []], {name: \"list\"});\n\tul4.expose(ul4._set, [\"iterable=\", []], {name: \"set\"});\n\tul4.expose(ul4._bool, [\"obj=\", false], {name: \"bool\"});\n\tul4.expose(ul4._len, [\"sequence\"], {name: \"len\"});\n\tul4.expose(ul4._type, [\"obj\"], {name: \"type\"});\n\tul4.expose(ul4._format, [\"obj\", \"fmt\", \"lang=\", null], {name: \"format\"});\n\tul4.expose(ul4._any, [\"iterable\"], {name: \"any\"});\n\tul4.expose(ul4._all, [\"iterable\"], {name: \"all\"});\n\tul4.expose(ul4._zip, [\"*iterables\"], {name: \"zip\"});\n\tul4.expose(ul4._getattr, [\"obj\", \"attrname\", \"default=\", null], {name: \"getattr\"});\n\tul4.expose(ul4._hasattr, [\"obj\", \"attrname\"], {name: \"hasattr\"});\n\tul4.expose(ul4._dir, [\"obj\"], {name: \"dir\"});\n\tul4.expose(ul4._isundefined, [\"obj\"], {name: \"isundefined\"});\n\tul4.expose(ul4._isdefined, [\"obj\"], {name: \"isdefined\"});\n\tul4.expose(ul4._isnone, [\"obj\"], {name: \"isnone\"});\n\tul4.expose(ul4._isbool, [\"obj\"], {name: \"isbool\"});\n\tul4.expose(ul4._isint, [\"obj\"], {name: \"isint\"});\n\tul4.expose(ul4._isfloat, [\"obj\"], {name: \"isfloat\"});\n\tul4.expose(ul4._isstr, [\"obj\"], {name: \"isstr\"});\n\tul4.expose(ul4._isdate, [\"obj\"], {name: \"isdate\"});\n\tul4.expose(ul4._isdatetime, [\"obj\"], {name: \"isdatetime\"});\n\tul4.expose(ul4._iscolor, [\"obj\"], {name: \"iscolor\"});\n\tul4.expose(ul4._istimedelta, [\"obj\"], {name: \"istimedelta\"});\n\tul4.expose(ul4._ismonthdelta, [\"obj\"], {name: \"ismonthdelta\"});\n\tul4.expose(ul4._istemplate, [\"obj\"], {name: \"istemplate\"});\n\tul4.expose(ul4._isfunction, [\"obj\"], {name: \"isfunction\"});\n\tul4.expose(ul4._islist, [\"obj\"], {name: \"islist\"});\n\tul4.expose(ul4._isanyset, [\"obj\"], {name: \"isset\"});\n\tul4.expose(ul4._isdict, [\"obj\"], {name: \"isdict\"});\n\tul4.expose(ul4._isexception, [\"obj\"], {name: \"isexception\"});\n\tul4.expose(ul4._asjson, [\"obj\"], {name: \"asjson\"});\n\tul4.expose(ul4._fromjson, [\"string\"], {name: \"fromjson\"});\n\tul4.expose(ul4._asul4on, [\"obj\"], {name: \"asul4on\"});\n\tul4.expose(ul4._fromul4on, [\"string\"], {name: \"fromul4on\"});\n\tul4.expose(ul4.now, []);\n\tul4.expose(ul4.utcnow, []);\n\tul4.expose(ul4.today, []);\n\tul4.expose(ul4._enumerate, [\"iterable\", \"start=\", 0], {name: \"enumerate\"});\n\tul4.expose(ul4._isfirst, [\"iterable\"], {name: \"isfirst\"});\n\tul4.expose(ul4._islast, [\"iterable\"], {name: \"islast\"});\n\tul4.expose(ul4._isfirstlast, [\"iterable\"], {name: \"isfirstlast\"});\n\tul4.expose(ul4._enumfl, [\"iterable\", \"start=\", 0], {name: \"enumfl\"});\n\tul4.expose(ul4._abs, [\"number\"], {name: \"abs\"});\n\tul4.expose(ul4._date, [\"year\", \"month\", \"day\"], {name: \"date\"});\n\tul4.expose(ul4._datetime, [\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], {name: \"datetime\"});\n\tul4.expose(ul4._timedelta, [\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], {name: \"timedelta\"});\n\tul4.expose(ul4._monthdelta, [\"months=\", 0], {name: \"monthdelta\"});\n\tul4.expose(ul4._rgb, [\"r\", \"g\", \"b\", \"a=\", 1.0], {name: \"rgb\"});\n\tul4.expose(ul4._hls, [\"h\", \"l\", \"s\", \"a=\", 1.0], {name: \"hls\"});\n\tul4.expose(ul4._hsv, [\"h\", \"s\", \"v\", \"a=\", 1.0], {name: \"hsv\"});\n\tul4.expose(ul4._xmlescape, [\"obj\"], {name: \"xmlescape\"});\n\tul4.expose(ul4._csv, [\"obj\"], {name: \"csv\"});\n\tul4.expose(ul4._chr, [\"i\"], {name: \"chr\"});\n\tul4.expose(ul4._ord, [\"c\"], {name: \"ord\"});\n\tul4.expose(ul4._hex, [\"number\"], {name: \"hex\"});\n\tul4.expose(ul4._oct, [\"number\"], {name: \"oct\"});\n\tul4.expose(ul4._bin, [\"number\"], {name: \"bin\"});\n\tul4.expose(ul4._min, [\"*obj\"], {name: \"min\"});\n\tul4.expose(ul4._max, [\"*obj\"], {name: \"max\"});\n\tul4.expose(ul4._sum, [\"iterable\", \"start=\", 0], {name: \"sum\"});\n\tul4.expose(ul4._first, [\"iterable\", \"default=\", null], {name: \"first\"});\n\tul4.expose(ul4._last, [\"iterable\", \"default=\", null], {name: \"last\"});\n\tul4.expose(ul4._sorted, [\"iterable\", \"key=\", null, \"reverse=\", false], {name: \"sorted\", needscontext: true});\n\tul4.expose(ul4._range, [\"*args\"], {name: \"range\"});\n\tul4.expose(ul4._slice, [\"*args\"], {name: \"slice\"});\n\tul4.expose(ul4._urlquote, [\"string\"], {name: \"urlquote\"});\n\tul4.expose(ul4._urlunquote, [\"string\"], {name: \"urlunquote\"});\n\tul4.expose(ul4._reversed, [\"sequence\"], {name: \"reversed\"});\n\tul4.expose(ul4._random, [], {name: \"random\"});\n\tul4.expose(ul4._randrange, [\"*args\"], {name: \"randrange\"});\n\tul4.expose(ul4._randchoice, [\"sequence\"], {name: \"randchoice\"});\n\tul4.expose(ul4._round, [\"x\", \"digit=\", 0], {name: \"round\"});\n\tul4.expose(ul4._md5, [\"string\"], {name: \"md5\"});\n\n\t// Functions implementing UL4 methods\n\tul4._count = function _count(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\n\t\tlet isstr = ul4._isstr(obj);\n\n\t\tif (isstr && !sub.length)\n\t\t{\n\t\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\t\treturn 0;\n\t\t\tlet result = end - start + 1;\n\t\t\tif (result > obj.length + 1)\n\t\t\t\tresult = obj.length + 1;\n\t\t\treturn result;\n\t\t}\n\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tlet count = 0;\n\t\tif (ul4._islist(obj))\n\t\t{\n\t\t\tfor (let i = start; i < end; ++i)\n\t\t\t{\n\t\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t\t++count;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t\telse // string\n\t\t{\n\t\t\tlet lastIndex = start;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\t\tif (lastIndex == -1)\n\t\t\t\t\tbreak;\n\t\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\t\tbreak;\n\t\t\t\t++count;\n\t\t\t\tlastIndex += sub.length;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t};\n\n\tul4._find = function _find(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.indexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._rfind = function _rfind(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.lastIndexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._week4format = function _week(obj, firstweekday=null)\n\t{\n\t\tif (firstweekday === null)\n\t\t\tfirstweekday = 0;\n\t\telse\n\t\t\tfirstweekday %= 7;\n\n\t\tlet yearday = ul4.DateTimeProtocol.yearday(obj)+6;\n\t\tlet jan1 = new Date(obj.getFullYear(), 0, 1);\n\t\tlet jan1weekday = jan1.getDay();\n\t\tif (--jan1weekday < 0)\n\t\t\tjan1weekday = 6;\n\n\t\twhile (jan1weekday != firstweekday)\n\t\t{\n\t\t\t--yearday;\n\t\t\tif (++jan1weekday == 7)\n\t\t\t\tjan1weekday = 0;\n\t\t}\n\t\treturn Math.floor(yearday/7);\n\t};\n\n\tul4._isleap = function _isleap(obj)\n\t{\n\t\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n\t};\n\n\tul4._update = function _update(obj, others, kwargs)\n\t{\n\t\tif (!ul4._isdict(obj))\n\t\t\tthrow new ul4.TypeError(\"update() requires a dict\");\n\t\tfor (let i = 0; i < others.length; ++i)\n\t\t{\n\t\t\tlet other = others[i];\n\t\t\tif (ul4._ismap(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(obj, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(other))\n\t\t\t{\n\t\t\t\tfor (let key in other)\n\t\t\t\t\tul4._setmap(obj, key, other[key]);\n\t\t\t}\n\t\t\telse if (ul4._islist(other))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < other.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = other[i];\n\t\t\t\t\tif (!ul4._islist(item) || (item.length != 2))\n\t\t\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(obj, item[0], item[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t}\n\t\tkwargs.forEach(function(value, key) {\n\t\t\tul4._setmap(obj, key, value);\n\t\t});\n\t\treturn null;\n\t};\n\n\tul4.Color = class Color extends ul4.Proto\n\t{\n\t\tconstructor(r=0, g=0, b=0, a=255)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._r = r;\n\t\t\tthis._g = g;\n\t\t\tthis._b = b;\n\t\t\tthis._a = a;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tlet a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a/255) + \")\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__iter__()\n\t\t{\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function() {\n\t\t\t\t\tif (this.index == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._r, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._g, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._b, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._a, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"r\":\n\t\t\t\t\tlet r = function r(){ return self._r; };\n\t\t\t\t\tul4.expose(r, []);\n\t\t\t\t\treturn r;\n\t\t\t\tcase \"g\":\n\t\t\t\t\tlet g = function g(){ return self._g; };\n\t\t\t\t\tul4.expose(g, []);\n\t\t\t\t\treturn g;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tlet b = function b(){ return self._b; };\n\t\t\t\t\tul4.expose(b, []);\n\t\t\t\t\treturn b;\n\t\t\t\tcase \"a\":\n\t\t\t\t\tlet a = function a(){ return self._a; };\n\t\t\t\t\tul4.expose(a, []);\n\t\t\t\t\treturn a;\n\t\t\t\tcase \"lum\":\n\t\t\t\t\tlet lum = function lum(){ return self.lum(); };\n\t\t\t\t\tul4.expose(lum, []);\n\t\t\t\t\treturn lum;\n\t\t\t\tcase \"hls\":\n\t\t\t\t\tlet hls = function hls(){ return self.hls(); };\n\t\t\t\t\tul4.expose(hls, []);\n\t\t\t\t\treturn hls;\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\tlet hlsa = function hlsa(){ return self.hlsa(); };\n\t\t\t\t\tul4.expose(hlsa, []);\n\t\t\t\t\treturn hlsa;\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\tlet hsv = function hsv(){ return self.hsv(); };\n\t\t\t\t\tul4.expose(hsv, []);\n\t\t\t\t\treturn hsv;\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\tlet hsva = function hsva(){ return self.hsva(); };\n\t\t\t\t\tul4.expose(hsva, []);\n\t\t\t\t\treturn hsva;\n\t\t\t\tcase \"witha\":\n\t\t\t\t\tlet witha = function witha(a){ return self.witha(a); };\n\t\t\t\t\tul4.expose(witha, [\"a\"]);\n\t\t\t\t\treturn witha;\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\tlet withlum = function withlum(lum){ return self.withlum(lum); };\n\t\t\t\t\tul4.expose(withlum, [\"lum\"]);\n\t\t\t\t\treturn withlum;\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\tlet abslum = function abslum(lum){ return self.abslum(lum); };\n\t\t\t\t\tul4.expose(abslum, [\"lum\"]);\n\t\t\t\t\treturn abslum;\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\tlet rellum = function rellum(lum){ return self.rellum(lum); };\n\t\t\t\t\tul4.expose(rellum, [\"lum\"]);\n\t\t\t\t\treturn rellum;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__getitem__(key)\n\t\t{\n\t\t\tlet orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.IndexError(this, orgkey);\n\t\t\t}\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Color)\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t}\n\n\t\tr()\n\t\t{\n\t\t\t\treturn this._r;\n\t\t}\n\n\t\tg()\n\t\t{\n\t\t\treturn this._g;\n\t\t}\n\n\t\tb()\n\t\t{\n\t\t\treturn this._b;\n\t\t}\n\n\t\ta()\n\t\t{\n\t\t\treturn this._a;\n\t\t}\n\n\t\tlum()\n\t\t{\n\t\t\treturn this.hls()[1];\n\t\t}\n\n\t\thls()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet h, l, s;\n\t\t\tlet rc, gc, bc;\n\n\t\t\tl = (minc+maxc)/2.0;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, l, 0.0];\n\t\t\tif (l <= 0.5)\n\t\t\t\ts = (maxc-minc) / (maxc+minc);\n\t\t\telse\n\t\t\t\ts = (maxc-minc) / (2.0-maxc-minc);\n\t\t\trc = (maxc-r) / (maxc-minc);\n\t\t\tgc = (maxc-g) / (maxc-minc);\n\t\t\tbc = (maxc-b) / (maxc-minc);\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, l, s];\n\t\t}\n\n\t\thlsa()\n\t\t{\n\t\t\tlet hls = this.hls();\n\t\t\treturn hls.concat(this._a/255.0);\n\t\t}\n\n\t\thsv()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet v = maxc;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, 0.0, v];\n\t\t\tlet s = (maxc-minc) / maxc;\n\t\t\tlet rc = (maxc-r) / (maxc-minc);\n\t\t\tlet gc = (maxc-g) / (maxc-minc);\n\t\t\tlet bc = (maxc-b) / (maxc-minc);\n\t\t\tlet h;\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, s, v];\n\t\t}\n\n\t\thsva()\n\t\t{\n\t\t\tlet hsv = this.hsv();\n\t\t\treturn hsv.concat(this._a/255.0);\n\t\t}\n\n\t\twitha(a)\n\t\t{\n\t\t\tif (typeof(a) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\treturn new ul4.Color(this._r, this._g, this._b, a);\n\t\t}\n\n\t\twithlum(lum)\n\t\t{\n\t\t\tif (typeof(lum) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\tlet hlsa = this.hlsa();\n\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"color\";\n\t\t}\n\t};\n\n\tul4.expose(ul4.Color.prototype.r, []);\n\tul4.expose(ul4.Color.prototype.g, []);\n\tul4.expose(ul4.Color.prototype.b, []);\n\tul4.expose(ul4.Color.prototype.a, []);\n\tul4.expose(ul4.Color.prototype.lum, []);\n\tul4.expose(ul4.Color.prototype.hls, []);\n\tul4.expose(ul4.Color.prototype.hlsa, []);\n\tul4.expose(ul4.Color.prototype.hsv, []);\n\tul4.expose(ul4.Color.prototype.hsva, []);\n\tul4.expose(ul4.Color.prototype.witha, [\"a\"]);\n\tul4.expose(ul4.Color.prototype.withlum, [\"lum\"]);\n\n\tconst _js_Date = Date;\n\n\tul4.Date = class Date extends ul4.Proto\n\t{\n\t\tconstructor(year, month, day)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._date = new _js_Date(year, month-1, day);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn '@(' + this.__str__() + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn ul4._lpad(this._date.getFullYear(), \"0\", 4) + \"-\" + ul4._lpad(this._date.getMonth()+1, \"0\", 2) + \"-\" + ul4._lpad(this._date.getDate(), \"0\", 2);\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date.getTime() === other._date.getTime();\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date < other._date;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date <= other._date;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date > other._date;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date >= other._date;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\tyear()\n\t\t{\n\t\t\treturn this._date.getFullYear();\n\t\t}\n\n\t\tmonth()\n\t\t{\n\t\t\treturn this._date.getMonth()+1;\n\t\t}\n\n\t\tday()\n\t\t{\n\t\t\treturn this._date.getDate();\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\t};\n\n\n\tul4.TimeDelta = class TimeDelta extends ul4.Proto\n\t{\n\t\tconstructor(days=0, seconds=0, microseconds=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tlet total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST.prototype._do(total_microseconds, 1000000);\n\t\t\tlet total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST.prototype._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0)\n\t\t\t{\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\tthis._microseconds = microseconds;\n\t\t\tthis._seconds = seconds;\n\t\t\tthis._days = days;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [], first = true;\n\t\t\tv.push(\"timedelta(\");\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(\"days=\" + this._days);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._seconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"seconds=\" + this._seconds);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"microseconds=\" + this._microseconds);\n\t\t\t}\n\t\t\tv.push(\")\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tlet seconds = this._seconds % 60;\n\t\t\tlet minutes = Math.floor(this._seconds / 60);\n\t\t\tlet hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._days < 0 ? new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds);\n\t\t}\n\n\t\tadddate(date, days)\n\t\t{\n\t\t\tlet year = date._date.getFullYear();\n\t\t\tlet month = date._date.getMonth();\n\t\t\tlet day = date._date.getDate() + days;\n\t\t\treturn new ul4.Date(year, month, day);\n\t\t}\n\n\t\t_adddatetime(date, days, seconds, microseconds)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth();\n\t\t\tlet day = date.getDate() + days;\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds() + seconds;\n\t\t\tlet millisecond = date.getMilliseconds() + microseconds/1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t{\n\t\t\t\treturn new ul4.TimeDelta(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tlet myValue = this._days;\n\t\t\t\tlet otherValue = other._days;\n\t\t\t\tlet hasSeconds = this._seconds || other._seconds;\n\t\t\t\tlet hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds)\n\t\t\t\t{\n\t\t\t\t\tmyValue = myValue*86400+this._seconds;\n\t\t\t\t\totherValue = otherValue*86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds)\n\t\t\t\t\t{\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue/otherValue;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"days\":\n\t\t\t\t\tlet days = function days(){ return self._days; };\n\t\t\t\t\tul4.expose(days, []);\n\t\t\t\t\treturn days;\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\tlet seconds = function seconds(){ return self._seconds; };\n\t\t\t\t\tul4.expose(seconds, []);\n\t\t\t\t\treturn seconds;\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\tlet microseconds = function microseconds(){ return self._microseconds; };\n\t\t\t\t\tul4.expose(microseconds, []);\n\t\t\t\t\treturn microseconds;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tdays()\n\t\t{\n\t\t\treturn this._days;\n\t\t}\n\n\t\tseconds()\n\t\t{\n\t\t\treturn this._seconds;\n\t\t}\n\n\t\tmicroseconds()\n\t\t{\n\t\t\treturn this._microseconds;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"timedelta\";\n\t\t}\n\t};\n\n\n\tul4.MonthDelta = class MonthDelta extends ul4.Proto\n\t{\n\t\tconstructor(months=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._months = months;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._months)\n\t\t\t{\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn this.__str__();\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._months !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._months < 0 ? new ul4.MonthDelta(-this._months) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof MonthDelta)\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.MonthDelta(-this._months);\n\t\t}\n\n\t\t_adddate(date, months)\n\t\t{\n\t\t\tlet result = this._adddatetime(date._date, months);\n\t\t\treturn new ul4.Date(result.getFullYear(), result.getMonth()+1, result.getDate());\n\t\t}\n\n\t\t_adddatetime(date, months)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth() + months;\n\t\t\tlet day = date.getDate();\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds();\n\t\t\tlet millisecond = date.getMilliseconds();\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tlet targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tlet result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months - other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__floordiv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"months\":\n\t\t\t\t\tlet months = function months(){ return self._months; };\n\t\t\t\t\tul4.expose(months, []);\n\t\t\t\t\treturn months;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tmonths()\n\t\t{\n\t\t\treturn this._months;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"monthdelta\";\n\t\t}\n\t};\n\n\tconst classes = [\n\t\tul4.TextAST,\n\t\tul4.IndentAST,\n\t\tul4.LineEndAST,\n\t\tul4.ConstAST,\n\t\tul4.SeqItemAST,\n\t\tul4.UnpackSeqItemAST,\n\t\tul4.DictItemAST,\n\t\tul4.UnpackDictItemAST,\n\t\tul4.PosArgAST,\n\t\tul4.KeywordArgAST,\n\t\tul4.UnpackListArgAST,\n\t\tul4.UnpackDictArgAST,\n\t\tul4.ListAST,\n\t\tul4.ListCompAST,\n\t\tul4.DictAST,\n\t\tul4.DictCompAST,\n\t\tul4.SetAST,\n\t\tul4.SetCompAST,\n\t\tul4.GenExprAST,\n\t\tul4.VarAST,\n\t\tul4.NotAST,\n\t\tul4.NegAST,\n\t\tul4.BitNotAST,\n\t\tul4.IfAST,\n\t\tul4.ReturnAST,\n\t\tul4.PrintAST,\n\t\tul4.PrintXAST,\n\t\tul4.ItemAST,\n\t\tul4.IsAST,\n\t\tul4.IsNotAST,\n\t\tul4.EQAST,\n\t\tul4.NEAST,\n\t\tul4.LTAST,\n\t\tul4.LEAST,\n\t\tul4.GTAST,\n\t\tul4.GEAST,\n\t\tul4.NotContainsAST,\n\t\tul4.ContainsAST,\n\t\tul4.AddAST,\n\t\tul4.SubAST,\n\t\tul4.MulAST,\n\t\tul4.FloorDivAST,\n\t\tul4.TrueDivAST,\n\t\tul4.ModAST,\n\t\tul4.ShiftLeftAST,\n\t\tul4.ShiftRightAST,\n\t\tul4.BitAndAST,\n\t\tul4.BitXOrAST,\n\t\tul4.BitOrAST,\n\t\tul4.AndAST,\n\t\tul4.OrAST,\n\t\tul4.SliceAST,\n\t\tul4.AttrAST,\n\t\tul4.CallAST,\n\t\tul4.RenderAST,\n\t\tul4.RenderXAST,\n\t\tul4.RenderBlockAST,\n\t\tul4.RenderBlocksAST,\n\t\tul4.SetVarAST,\n\t\tul4.AddVarAST,\n\t\tul4.SubVarAST,\n\t\tul4.MulVarAST,\n\t\tul4.TrueDivVarAST,\n\t\tul4.FloorDivVarAST,\n\t\tul4.ModVarAST,\n\t\tul4.ShiftLeftVarAST,\n\t\tul4.ShiftRightVarAST,\n\t\tul4.BitAndVarAST,\n\t\tul4.BitXOrVarAST,\n\t\tul4.BitOrVarAST,\n\t\tul4.ForBlockAST,\n\t\tul4.WhileBlockAST,\n\t\tul4.BreakAST,\n\t\tul4.ContinueAST,\n\t\tul4.CondBlockAST,\n\t\tul4.IfBlockAST,\n\t\tul4.ElIfBlockAST,\n\t\tul4.ElseBlockAST,\n\t\tul4.SignatureAST,\n\t\tul4.Template\n\t];\n\n\tfor (let i = 0; i < classes.length; ++i)\n\t{\n\t\tlet constructor = classes[i];\n\t\tlet ul4onname = constructor.name;\n\t\tif (ul4onname.substr(ul4onname.length-3) === \"AST\")\n\t\t\tul4onname = ul4onname.substr(0, ul4onname.length-3);\n\t\tul4onname = ul4onname.toLowerCase();\n\t\tconstructor.prototype.type = ul4onname;\n\t\tul4.register(\"de.livinglogic.ul4.\" + ul4onname, constructor);\n\t}","import { ul4 } from './ul4';\n\nlet la = {};\n\n\nla.Base = class Base extends ul4.Proto\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tul4ondump(encoder)\n\t{\n\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\treturn this[name];\n\t}\n\n\tul4onload(decoder)\n\t{\n\t\tlet i = 0;\n\t\tfor (let iter = decoder.loadcontent(); ; ++i)\n\t\t{\n\t\t\tlet iteritem = iter.next();\n\t\t\tif (iteritem.done)\n\t\t\t\tbreak;\n\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t}\n\t\tfor (; i < this._ul4onattrs.length; ++i)\n\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tthis[name] = value;\n\t}\n\n\t_setDefaultUL4ONAttr(name)\n\t{\n\t\tthis[name] = null;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (this._ul4attrs.has(name))\n\t\t{\n\t\t\tlet value = this[name];\n\t\t\tif (typeof(value) === \"function\")\n\t\t\t{\n\t\t\t\tlet realvalue = value.bind(this);\n\t\t\t\trealvalue._ul4_name = value._ul4_name || value.name;\n\t\t\t\trealvalue._ul4_signature = value._ul4_signature;\n\t\t\t\trealvalue._ul4_needsobject = value._ul4_needsobject;\n\t\t\t\trealvalue._ul4_needscontext = value._ul4_needscontext;\n\t\t\t\treturn realvalue;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tthrow new ul4.AttributeError(this, name);\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Handler = class Handler\n{\n\tsave(record)\n\t{\n\t}\n\n\tdelete(record)\n\t{\n\t}\n};\n\nla.Globals = class Globals extends la.Base\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis.version = null;\n\t\tthis.platform = null;\n\t\tthis.user = null;\n\t\tthis.maxdbactions = null;\n\t\tthis.maxtemplateruntime = null;\n\t\tthis.flashmessages = null;\n\t\tthis.handler = new la.Handler();\n\t}\n\n\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\tstatic geodist(geo1, geo2)\n\t{\n\t\tlet sqsin = function sqsin(x) {x = Math.sin(x); return x*x};\n\t\tlet sqcos = function sqsos(x) {x = Math.cos(x); return x*x};\n\t\tconst deg2rad = Math.PI/180; // Conversion factor degree -> radians\n\t\tconst radius = 6378.137; // Equatorial radius of earth in km\n\t\tconst flat = 1/298.257223563; // Earth flattening\n\n\t\tconst lat1 = geo1.lat * deg2rad;\n\t\tconst long1 = geo1.long * deg2rad;\n\t\tconst lat2 = geo2.lat * deg2rad;\n\t\tconst long2 = geo2.long * deg2rad;\n\t\tconst F = (lat1 + lat2)/2;\n\t\tconst G = (lat1 - lat2)/2;\n\t\tconst l = (long1 - long2)/2;\n\t\tconst S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\tconst C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\tconst w = Math.atan(Math.sqrt(S/C));\n\t\tconst D = 2 * w * radius;\n\t\tconst T = Math.sqrt(S*C)/w;\n\t\tconst H1 = (3*T-1)/(2*C);\n\t\tconst H2 = (3*T+1)/(2*S);\n\t\tconst s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\treturn s;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Globals.prototype._ul4onattrs = [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"];\nla.Globals.prototype._ul4attrs = ul4._makeset(\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\");\n\nla.FlashMessage = class FlashMessage extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.FlashMessage.prototype._ul4onattrs = [\"timestamp\", \"type\", \"title\", \"message\"];\nla.FlashMessage.prototype._ul4attrs = ul4._makeset(\"timestamp\", \"type\", \"title\", \"message\");\n\nla.App = class App extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\tinsert(values={})\n\t{\n\t\tlet record = this.__call__(values);\n\t\tthis.globals.handler.save(this);\n\t\tthis.globals.Login._insert(this, values);\n\t\treturn record;\n\t}\n\n\t__call__(values={})\n\t{\n\t\tlet record = new la.Record(this);\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\t\treturn record;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t{\n\t\t\tif (!this.controls.has(name.substr(2)))\n\t\t\t\tthrow new ul4.AttributeError(this, name);\n\t\t\treturn this.controls.get(name.substr(2));\n\t\t}\n\t\telse\n\t\t\treturn super.__getattr__(name);\n\t}\n};\n\nla.App.prototype._ul4onattrs = [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"basetable\", \"primarykey\", \"insertprocedure\", \"updateprocedure\", \"deleteprocedure\", \"templates\", \"createdat\", \"updatedat\", \"updatedby\"];\nla.App.prototype._ul4attrs = ul4._makeset(\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"insert\");\nul4.expose(la.App.prototype.__call__, [\"**values\"], {\"needsobject\": true});\nul4.expose(la.App.prototype.insert, [\"**values\"], {\"needsobject\": true});\n\nla.View = class View extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.View.prototype._ul4onattrs = [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"];\nla.View.prototype._ul4attrs = ul4._makeset(\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\");\n\nla.DataSourceData = class DataSourceData extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.DataSourceData.prototype._ul4onattrs = [\"id\", \"identifier\", \"app\", \"apps\"];\nla.DataSourceData.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"app\", \"apps\");\n\nla.Record = class Record extends la.Base\n{\n\tconstructor(app)\n\t{\n\t\tsuper();\n\t\tthis.id = null;\n\t\tthis.app = app;\n\t\tthis.createdat = null;\n\t\tthis.createdby = null;\n\t\tthis.updatedat = null;\n\t\tthis.updatedby = null;\n\t\tthis.updatecount = 0;\n\t\tthis._sparsevalues = new Map();\n\t\tthis._values = null;\n\t\tthis._fields = null;\n\t\tthis.children = new Map();\n\t\tthis.attachments = null;\n\t\tthis.errors = [];\n\t\tthis._is_deleted = false;\n\t}\n\n\t\n\n\t__repr__()\n\t{\n\t\tlet v = [\"\")\n\t\treturn v.join(\"\");\n\t}\n\n\tget values()\n\t{\n\t\tif (this._values === null)\n\t\t{\n\t\t\tthis._values = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, control] of this.app.controls.entries())\n\t\t\t{\n\t\t\t\tlet fieldvalue = this._sparsevalues.get(identifier);\n\t\t\t\tif (typeof(fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tthis._values.set(identifier, fieldvalue);\n\t\t\t}\n\t\t}\n\t\treturn this._values;\n\t}\n\n\tget fields()\n\t{\n\t\tif (this._fields === null)\n\t\t{\n\t\t\tthis._fields = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, value] of this.values.entries())\n\t\t\t{\n\t\t\t\tlet field = new la.Field(this.app.controls.get(identifier), this, value);\n\t\t\t\tthis._fields.set(identifier, field);\n\t\t\t}\n\t\t}\n\t\treturn this._fields;\n\t}\n\n\tis_dirty()\n\t{\n\t\tif (this.id === null)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.is_dirty())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\thas_errors()\n\t{\n\t\tif (this.errors.length !== 0)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.has_errors())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdelete()\n\t{\n\t\treturn this.app.globals.handler.delete(this);\n\t}\n\n\tsave()\n\t{\n\t\tthis.app.globals.handler.save(this);\n\t}\n\n\tupdate(values={})\n\t{\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\tfields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\n\t\tthis.app.globals.handler.save(this);\n\t}\n\n\tsearch(search)\n\t{\n\t\tfor (let identifier in search)\n\t\t{\n\t\t\tlet fieldsearch = search[identifier];\n\t\t\tif (ul4._bool(fieldsearch))\n\t\t\t{\n\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"values\")\n\t\t\treturn this._sparsevalues;\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"values\")\n\t\t{\n\t\t\tthis._sparsevalues = value;\n\t\t\tthis._values = null;\n\t\t\tthis._fields = null;\n\t\t}\n\t\telse\n\t\t\tthis[name] = value;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\treturn this.children.get(name.substr(2))\n\t\telse if (name.startsWith(\"f_\"))\n\t\t\treturn this.fields.get(name.substr(2))\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\treturn this.values.get(name.substr(2))\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t__setattr__(name, value)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\tthis.children[name.substr(2)] = value;\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\tthis.fields.get(name.substr(2)).value = value;\n\t\telse\n\t\t\tthrow new ul4.AttributeError(this, name);\n\t}\n};\n\nla.Record.prototype._ul4onattrs = [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"];\nla.Record.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\");\nul4.expose(la.Record.prototype.is_dirty, []);\nul4.expose(la.Record.prototype.has_errors, []);\nul4.expose(la.Record.prototype.delete, []);\nul4.expose(la.Record.prototype.save, []);\nul4.expose(la.Record.prototype.update, [\"**values\"], {\"needsobject\": true});\n\nla.Control = class Control extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\t_logsearch(value, search)\n\t{\n\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t}\n\n\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t// ``value`` is the value of the field\n\t// ``search`` is an object with information what we're searching for\n\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\tsearch(value, search)\n\t{\n\t\treturn false;\n\t}\n};\n\nla.Control.prototype.type = null;\nla.Control.prototype.subtype = null;\nla.Control.prototype._ul4onattrs = [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"];\nla.Control.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\");\n\nla.BoolControl = class BoolControl extends la.Control\n{\n\t// ``search`` must by ``null``, ``false`` or ``true``\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.BoolControl.prototype.type = \"bool\";\n\nla.IntControl = class IntControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.IntControl.prototype.type = \"int\";\n\nla.NumberControl = class NumberControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"range\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn false;\n\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.NumberControl.prototype.type = \"number\";\n\nla.StringControl = class StringControl extends la.Control\n{\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (search.value === null || value === null)\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t}\n\t}\n};\n\nla.StringControl.prototype.type = \"string\";\n\nla.TextControl = class TextControl extends la.StringControl\n{\n};\n\nla.TextControl.prototype.subtype = \"text\";\n\nla.EmailControl = class EmailControl extends la.StringControl\n{\n};\n\nla.EmailControl.prototype.subtype = \"email\";\n\nla.URLControl = class URLControl extends la.StringControl\n{\n};\n\nla.URLControl.prototype.subtype = \"url\";\n\nla.TelControl = class TelControl extends la.StringControl\n{\n};\n\nla.TelControl.prototype.subtype = \"tel\";\n\nla.PasswordControl = class PasswordControl extends la.StringControl\n{\n};\n\nla.PasswordControl.prototype.subtype = \"password\";\n\nla.TextAreaControl = class TextAreaControl extends la.StringControl\n{\n};\n\nla.TextAreaControl.prototype.subtype = \"textarea\";\nla.TextAreaControl.prototype._ul4onattrs = la.StringControl.prototype._ul4onattrs.concat([\"encrypted\"]);\nla.TextAreaControl.prototype._ul4attrs = ul4._makeset(...la.StringControl.prototype._ul4attrs, \"encrypted\");\n\nla.DateControl = class DateControl extends la.Control\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y\";\n\t}\n\n\t// searchvalue must be ``null``, a ``Date`` object or a string\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\n\t\tlet searchvalue = search.value;\n\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\tif (value !== null)\n\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\tif (search.operator === \"equals\")\n\t\t\treturn searchvalue === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (searchvalue === null || value === null)\n\t\t\t\treturn searchvalue === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.DateControl.prototype.type = \"date\";\nla.DateControl.prototype.subtype = \"date\";\n\nla.DatetimeMinuteControl = class DatetimeMinuteControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t}\n};\n\nla.DatetimeMinuteControl.prototype.subtype = \"datetimeminute\";\n\nla.DatetimeSecondControl = class DatetimeSecondControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t}\n};\n\nla.DatetimeSecondControl.prototype.subtype = \"datetimesecond\";\n\nla.LookupControl = class LookupControl extends la.Control\n{\n\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn search.value === null;\n\t\t\telse\n\t\t\t\treturn value.key === search.value;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.LookupControl.prototype.type = \"lookup\";\nla.LookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupdata\"]);\nla.LookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupdata\");\n\nla.LookupSelectControl = class LookupSelectControl extends la.LookupControl\n{\n};\n\nla.LookupSelectControl.prototype.subtype = \"select\";\n\nla.LookupRadioControl = class LookupRadioControl extends la.LookupControl\n{\n};\n\nla.LookupRadioControl.prototype.subtype = \"radio\";\n\nla.LookupChoiceControl = class LookupChoiceControl extends la.LookupControl\n{\n};\n\nla.LookupChoiceControl.prototype.subtype = \"choice\";\n\nla.AppLookupControl = class AppLookupControl extends la.Control\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (value === null || search.value === null)\n\t\t\treturn value === search.value;\n\t\telse\n\t\t\treturn value.search(search);\n\t}\n};\n\nla.AppLookupControl.prototype.type = \"applookup\";\nla.AppLookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]);\nla.AppLookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupapp\", \"lookupcontrols\");\n\nla.AppLookupSelectControl = class AppLookupSelectControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupSelectControl.prototype.subtype = \"select\";\n\nla.AppLookupRadioControl = class AppLookupRadioControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupRadioControl.prototype.subtype = \"radio\";\n\nla.AppLookupChoiceControl = class AppLookupChoiceControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleLookupControl = class MultipleLookupControl extends la.LookupControl\n{\n\t// search.value must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tfor (let item of value)\n\t\t\t{\n\t\t\t\tif (item.key === search.value)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleLookupControl.prototype.subtype = \"multiplelookup\";\n\nla.MultipleLookupSelectControl = class MultipleLookupSelectControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleLookupCheckboxControl = class MultipleLookupCheckboxControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleLookupChoiceControl = class MultipleLookupChoiceControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleAppLookupControl = class MultipleAppLookupControl extends la.AppLookupControl\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (search.value === null)\n\t\t\t\treturn value.length === 0;\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (let item of value)\n\t\t\t\t{\n\t\t\t\t\tif (item.search(search.value))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleAppLookupControl.prototype.type = \"multipleapplookup\";\n\nla.MultipleAppLookupSelectControl = class MultipleAppLookupSelectControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleAppLookupCheckboxControl = class MultipleAppLookupCheckboxControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleAppLookupChoiceControl = class MultipleAppLookupChoiceControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.GeoControl = class GeoControl extends la.Control\n{\n};\n\nla.GeoControl.prototype.type = \"geo\";\n\nla.FileControl = class FileControl extends la.Control\n{\n};\n\nla.FileControl.prototype.type = \"file\";\n\nla.ButtonControl = class ButtonControl extends la.Control\n{\n};\n\nla.ButtonControl.prototype.type = \"button\";\n\nla.Field = class Field extends la.Base\n{\n\tconstructor(control, record, value)\n\t{\n\t\tsuper();\n\t\tthis.control = control;\n\t\tthis.record = record;\n\t\tthis._value = value;\n\t\tthis._dirty = false;\n\t\tthis.errors = [];\n\t}\n\n\tget value()\n\t{\n\t\treturn this._value;\n\t}\n\n\tset value(value)\n\t{\n\t\tlet oldvalue = this._value;\n\n\t\tif (ul4._ne(oldvalue, value))\n\t\t{\n\t\t\tthis.record.values.set(this.control.identifier, value);\n\t\t\tthis._value = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t}\n\n\tis_empty()\n\t{\n\t\treturn this._value === null || (ul4._islist(this._value) && this._value.length === 0);\n\t}\n\n\tis_dirty()\n\t{\n\t\treturn this._dirty;\n\t}\n\n\thas_errors()\n\t{\n\t\treturn this.errors.length !== 0;\n\t}\n\n\tsearch(searchvalue)\n\t{\n\t\treturn this.control.search(this.value, searchvalue);\n\t}\n\n\t__repr__()\n\t{\n\t\tlet s = \"\"\n\t\treturn s;\n\t}\n};\n\nla.LookupItem = class LookupItem extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.LookupItem.prototype._ul4onattrs = [\"key\", \"label\"];\nla.LookupItem.prototype._ul4attrs = ul4._makeset(\"key\", \"label\");\n\nla.User = class User extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.User.prototype._ul4onattrs = [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"];\nla.User.prototype._ul4attrs = ul4._makeset(\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\");\n\nla.File = class File extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.File.prototype._ul4onattrs = [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"internalid\", \"createdat\", \"size\"];\nla.File.prototype._ul4attrs = ul4._makeset(\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"size\", \"createdat\");\n\nla.Geo = class Geo extends la.Base\n{\n\tconstructor(lat, long, info)\n\t{\n\t\tsuper();\n\t\tthis.lat = lat;\n\t\tthis.long = long;\n\t\tthis.info = info;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Geo.prototype._ul4onattrs = [\"lat\", \"long\", \"info\"];\nla.Geo.prototype._ul4attrs = ul4._makeset(\"lat\", \"long\", \"info\");\n\nla.Attachment = class Attachment extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Attachment.prototype._ul4onattrs = [\"id\", \"record\", \"label\", \"active\"];\nla.Attachment.prototype._ul4attrs = ul4._makeset(\"id\", \"record\", \"label\", \"active\");\n\nla.NoteAttachment = class NoteAttachment extends la.Attachment\n{\n};\n\nla.NoteAttachment.prototype.type = \"noteattachment\";\nla.NoteAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.NoteAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.URLAttachment = class URLAttachment extends la.Attachment\n{\n};\n\nla.URLAttachment.prototype.type = \"urlattachment\";\nla.URLAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.URLAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.FileAttachment = class FileAttachment extends la.Attachment\n{\n};\n\nla.FileAttachment.prototype.type = \"fileattachment\";\nla.FileAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.FileAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.ImageAttachment = class ImageAttachment extends la.Attachment\n{\n};\n\nla.ImageAttachment.prototype.type = \"imageattachment\";\nla.ImageAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"]);\nla.ImageAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"original\", \"thumb\", \"small\", \"medium\", \"large\");\n\nla.JSONAttachment = class JSONAttachment extends la.Attachment\n{\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"value\")\n\t\t\treturn ul4._asjson(this.value);\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"value\")\n\t\t\tthis.value = ul4._fromjson(value);\n\t\telse\n\t\t\tthis[name] = value\n\t}\n};\n\nla.JSONAttachment.prototype.type = \"jsonattachment\";\nla.JSONAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.JSONAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.Installation = class Installation extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Installation.prototype._ul4onattrs = [\"id\", \"name\"];\nla.Installation.prototype._ul4attrs = ul4._makeset(\"id\", \"name\");\n\nla.Category = class Category extends la.Base\n{\n\t__repr__()\n\t{\n\t\tlet v = [];\n\t\tlet category = this;\n\t\twhile (category !== null)\n\t\t{\n\t\t\tv.splice(0, 0, category.identifier);\n\t\t\tcategory = category.parent;\n\t\t}\n\t\treturn \"\";\n\t}\n};\n\nla.Category.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"];\nla.Category.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\");\n\nla.KeyView = class KeyView extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.KeyView.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"key\", \"user\"];\nla.KeyView.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"key\", \"user\");\n\nla.AppParameter = class AppParameter extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.AppParameter.prototype._ul4onattrs = [\"id\", \"app\", \"identifier\", \"description\", \"value\"];\nla.AppParameter.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"identifier\", \"description\", \"value\");\n\nlet classes = [\n\tla.Globals,\n\tla.App,\n\tla.View,\n\tla.DataSourceData,\n\tla.Record,\n\tla.BoolControl,\n\tla.IntControl,\n\tla.NumberControl,\n\tla.TextControl,\n\tla.EmailControl,\n\tla.URLControl,\n\tla.TelControl,\n\tla.PasswordControl,\n\tla.TextAreaControl,\n\tla.DateControl,\n\tla.DatetimeMinuteControl,\n\tla.DatetimeSecondControl,\n\tla.LookupControl,\n\tla.LookupSelectControl,\n\tla.LookupRadioControl,\n\tla.LookupChoiceControl,\n\tla.AppLookupControl,\n\tla.AppLookupSelectControl,\n\tla.AppLookupRadioControl,\n\tla.AppLookupChoiceControl,\n\tla.MultipleLookupControl,\n\tla.MultipleLookupSelectControl,\n\tla.MultipleLookupCheckboxControl,\n\tla.MultipleLookupChoiceControl,\n\tla.MultipleAppLookupControl,\n\tla.MultipleAppLookupSelectControl,\n\tla.MultipleAppLookupCheckboxControl,\n\tla.MultipleAppLookupChoiceControl,\n\tla.GeoControl,\n\tla.FileControl,\n\tla.ButtonControl,\n\tla.Field,\n\tla.LookupItem,\n\tla.User,\n\tla.File,\n\tla.Geo,\n\tla.NoteAttachment,\n\tla.URLAttachment,\n\tla.FileAttachment,\n\tla.ImageAttachment,\n\tla.JSONAttachment,\n\tla.Installation,\n\tla.Category,\n\tla.KeyView,\n\tla.AppParameter\n];\n\nfor (let constructor of classes)\n{\n\t// Register under the old name\n\tul4.register(\"de.livingapps.appdd.\" + constructor.name.toLowerCase(), constructor);\n\t// Register under the new name\n\tul4.register(\"de.livinglogic.livingapi.\" + constructor.name.toLowerCase(), constructor);\n}\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4 } from './modules/ul4';\nimport * as https from 'https';\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["ul4","iscommon","module","exports","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","key","value","set","_setmap","__proto__","_emptymap","_getmap","get","_emptyset","_Set","_makeset","add","register","name","f","ul4onname","dumps","obj","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_level","_strings2index","_ids2index","_backrefs","line","this","push","oldindent","join","_line","type","Math","round","index","_str_repr","replace","_iscolor","r","g","b","a","_isdate","year","month","day","_isdatetime","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","ValueError","_repr","pos","backrefs","stack","charAt","re_white","c","match","result","substring","re_digits","readcharoreof","parseFloat","isNaN","oldpos","escapechar","chars","read","codepoint","parseInt","String","fromCharCode","typecode","readblackchar","readnumber","readchar","delimiter","c2","_readescape","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","backup","pop","_beginfakeloading","constructor","_endfakeloading","ul4onload","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_inherit","baseobj","attrs","Object","assign","create","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","Exception","toString","context","_internal_call","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_type","_unpackvar","lvalue","newvalue","iter","_iter","item","concat","_formatsource","out","finalout","level","needlf","part","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","_lt","__lt__","items","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","code","charCodeAt","escape","test","_lpad","_date_repr","_date","_datetime_repr","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","_typeof","__repr__","_ascii","_date_str","_datetime_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","ul4type","Protocol","_mod","div","mod","_getattr","attrname","default_","proto","getattr","AttributeError","_hasattr","hasattr","_dir","dir","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","call","_istemplate","Template","TemplateClosure","_isfunction","_isexception","_isanyset","__type__","Proto","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","StrProtocol","strip","root","JSON","parse","Function","_asul4on","_fromul4on","_format_datetime","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","DateTimeProtocol","yearday","_week4format","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","_nextid","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","_this","decname","arg","prefix","argObject","expose","count","options","ListProtocol","DateProtocol","SetProtocol","MapProtocol","ObjectProtocol","__getattr__","attr","realattr","object","sub","end","_count","_find","_rfind","old","new_","sep","splice","lstrip","lastIndexOf","rstrip","keepends","startpos","lineendlen","endpos","resultlist","singlepre","suffix","singlesuf","find","rfind","rsplit","splitlines","lower","capitalize","startswith","endswith","append","insert","_update","clear","update","weekday","firstweekday","mindaysinfirstweek","calendar","d","week","mimeformat","isoformat","offset","refDate","weekDayDiff","weekStartYear","weekStartMonth","weekStartDay","weekStart","diff","SubAST","_do","leap","_isleap","microsecond","realresult","Context","vars","indents","escapes","_output","message","fileName","lineNumber","instance","Error","setPrototypeOf","getPrototypeOf","enumerable","writable","configurable","InternalException","ReturnException","BreakException","ContinueException","SyntaxError","LValueRequiredError","NotSubscriptableError","ZeroDivisionError","IndexError","LocationError","location","template","parenttemplate","first","templateprefix","_templateprefix","sourceprefix","source","sourcesuffix","text","underline","col","AST","_col","_ul4onattrs","undefined","_eval","_decorate_exception","_eval_set","_eval_modify","decoder","_source","of","outerstartpos","innerstartpos","fullsource","maxprefix","preprefix","outerstoppos","innerstoppos","maxsuffix","postsuffix","_calculateLineCol","TextAST","IndentAST","_text","LineEndAST","CodeAST","ConstAST","ItemArgBase","_eval_list","_eval_dict","_eval_call","SeqItemAST","_handle_eval","UnpackSeqItemAST","DictItemAST","UnpackDictItemAST","subitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","_handle_eval_list","ListCompAST","varname","container","condition","localcontext","inheritvars","varitems","_handle_eval_set","SetAST","SetCompAST","DictAST","_handle_eval_dict","DictCompAST","GenExprAST","VarAST","_get","_modify","functions","_ido","UnaryAST","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","ItemAST","orgkey","__getitem__","__setitem__","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","__sub__","__rsub__","_date_sub","_datetime_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","__setattr__","oldvalue","CallAST","_handle_eval_call","_makeargs","RenderAST","_reprname","tag","withindent","_handle_additional_arguments","RenderXAST","RenderBlockAST","closure","content","RenderBlocksAST","BlockAST","SliceAST","index1","index2","SetVarAST","ModifyVarAST","_handle_eval_modify","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","ForBlockAST","_str_varname","WhileBlockAST","cond","BreakAST","ContinueAST","CondBlockAST","block","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","whitespace","startdelim","enddelim","docpos","_asts","doc","render","_renderbound","renders","_rendersbound","SignatureAST","clone","replaceoutput","getoutput","_callbound","params","param","endtag","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","higher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshold","pow","_md5","require","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","_datetime","_timedelta","_monthdelta","_hls","h","l","s","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","today","repr","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","isdatetime","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","datetime","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","lastIndex","jan1weekday","others","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","_js_Date","total_microseconds","total_seconds","minutes","hours","millisecond","_adddate","_adddatetime","myValue","otherValue","hasSeconds","hasMicroseconds","targetmonth","classes","la","Base","_dumpUL4ONAttr","loadcontent","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","_ul4attrs","realvalue","bind","Handler","record","Globals","platform","user","maxdbactions","maxtemplateruntime","flashmessages","handler","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","F","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","id","globals","save","Login","_insert","Record","entries","fields","startsWith","controls","View","DataSourceData","identifier","app","createdat","createdby","updatedat","updatedby","updatecount","_sparsevalues","_values","_fields","children","attachments","errors","_is_deleted","field","control","priority","is_dirty","has_errors","delete","search","fieldsearch","fieldvalue","Field","Control","subtype","BoolControl","_logsearch","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","language","searchvalue","formatstring","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleLookupChoiceControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","MultipleAppLookupChoiceControl","GeoControl","FileControl","ButtonControl","_value","_dirty","LookupItem","label","User","firstname","surname","email","File","url","filename","Geo","info","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","username","loginRequired","_userName","ecdhCurve","commonjs","ident","httpsAgent"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index eeb5df6..9386f3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -813,6 +813,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, + "optional": true, "requires": { "es6-promisify": "^5.0.0" } @@ -901,7 +902,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "ansi-styles": { "version": "3.2.1", @@ -1321,7 +1323,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "optional": true }, "assertion-error": { "version": "1.1.0", @@ -1618,6 +1621,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" } @@ -1795,16 +1799,17 @@ "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-more-ints": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", - "dev": true + "dev": true, + "optional": true }, "buffer-xor": { "version": "1.0.3", @@ -2202,6 +2207,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2574,7 +2580,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "dev": true, + "optional": true }, "depd": { "version": "1.1.2", @@ -2778,13 +2785,15 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true + "dev": true, + "optional": true }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, + "optional": true, "requires": { "es6-promise": "^4.0.3" } @@ -2819,7 +2828,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true + "dev": true, + "optional": true }, "estraverse": { "version": "4.2.0", @@ -3008,7 +3018,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "1.1.0", @@ -3189,7 +3200,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3210,12 +3222,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3230,17 +3244,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3357,7 +3374,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3369,6 +3387,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3383,6 +3402,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3390,12 +3410,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -3414,6 +3436,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3494,7 +3517,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3506,6 +3530,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3591,7 +3616,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3627,6 +3653,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3646,6 +3673,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3689,12 +3717,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4052,7 +4082,8 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "hosted-git-info": { "version": "2.7.1", @@ -4102,6 +4133,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, + "optional": true, "requires": { "agent-base": "4", "debug": "3.1.0" @@ -4112,6 +4144,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -4135,6 +4168,7 @@ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "dev": true, + "optional": true, "requires": { "httpreq": ">=0.4.22", "underscore": "~1.7.0" @@ -4144,7 +4178,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true + "dev": true, + "optional": true }, "https-browserify": { "version": "1.0.0", @@ -4157,6 +4192,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, + "optional": true, "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" @@ -4167,6 +4203,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -4253,7 +4290,8 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "dev": true, + "optional": true }, "ipaddr.js": { "version": "1.6.0", @@ -4441,7 +4479,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "dev": true, + "optional": true }, "is-stream": { "version": "1.1.0", @@ -4929,13 +4968,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true + "dev": true, + "optional": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", "dev": true, + "optional": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -4946,7 +4987,8 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true + "dev": true, + "optional": true } } }, @@ -4954,7 +4996,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true + "dev": true, + "optional": true }, "load-json-file": { "version": "1.1.0", @@ -5720,13 +5763,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true + "dev": true, + "optional": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", "dev": true, + "optional": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -5759,7 +5804,8 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true + "dev": true, + "optional": true }, "nopt": { "version": "3.0.6", @@ -6883,7 +6929,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "optional": true }, "semver": { "version": "5.5.1", @@ -7003,6 +7050,7 @@ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, + "optional": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -7263,9 +7311,9 @@ } }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7734,7 +7782,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true + "dev": true, + "optional": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", diff --git a/package.json b/package.json index 6c1078f..15eb44c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "url": "https://github.com/LivingLogic/LivingApps.Javascript.LivingAPI.git" }, "scripts": { - "test": "sh shellscripts/build.sh && mocha dist/test/**/*.test.js", + "test": "sh shellscripts/build.sh && mocha -r source-map-support/register dist/test/**/*.test.js", "build": "sh shellscripts/build.sh", "karma": "sh shellscripts/build.sh && karma start" }, @@ -39,6 +39,7 @@ "rollup-plugin-node-resolve": "^3.4.0", "rollup-plugin-sourcemaps": "^0.4.2", "rollup-plugin-uglify": "^5.0.2", + "source-map-support": "^0.5.12", "ts-node": "^6.1.0", "typescript": "^2.9.1" } diff --git a/rollup.config.js b/rollup.config.js index 31a4a25..b8ba3eb 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,13 +6,16 @@ const commonjs = require( 'rollup-plugin-commonjs' ); export default [ { - preferBuiltins: true, input: './dist/es2015/livingsdk.js', output: { file: './dist/umd/livingsdk.js', format: 'umd', name: 'livingsdk', - sourcemap: true + sourcemap: true, + globals: { + axios: 'axios', + https: 'https', + } }, plugins: [ uglify.uglify(), @@ -32,29 +35,21 @@ export default [ ] }, { - preferBuiltins: true, input: './dist/es2015/livingsdk.test.js', output: { file: './dist/test/livingsdk.test.js', format: 'umd', name: 'livingsdk', - sourcemap: true + sourcemap: true, + globals: { + axios: 'axios', + https: 'https', + chai: 'chai', + mocha: 'mocha' + } }, plugins: [ - uglify.uglify(), - sourcemaps(), - babel( - { - "presets": [ - [ - "@babel/preset-env", - { - "useBuiltIns": "usage" - } - ] - ] - } - ) + sourcemaps() ] }, ] \ No newline at end of file diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 7762c25..5885938 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -2,7 +2,7 @@ import axios, { AxiosResponse } from 'axios'; ///@ts-ignore import livingApi from './modules/livingapi'; ///@ts-ignore -import { ul4, ul4on } from './modules/ul4'; +import { ul4 } from './modules/ul4'; import * as https from 'https'; export type Auth_Token = string; @@ -77,7 +77,7 @@ export class LivingSDK { }) .then((res: AxiosResponse) => { let dump: any; - dump = ul4on.loads(res.data); + dump = ul4.loads(res.data); dump.get('globals').Login = this; return dump; }); diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index d5c70f4..7c80aa1 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -1,898 +1,1092 @@ -import { ul4, ul4on } from './ul4'; +import { ul4 } from './ul4'; let la = {}; -la.Base = ul4._inherit( - ul4.Proto, +la.Base = class Base extends ul4.Proto +{ + constructor() { - create: function () { - return ul4._clone(this); - }, - - ul4ondump: function ul4ondump(encoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); - }, + super(); + } - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - return this[name]; - }, - - ul4onload: function ul4onload(decoder) { - for (var i = 0, iter = decoder.loadcontent(); ; ++i) { - var iteritem = iter.next(); - if (iteritem.done) - break; - if (i < this._ul4onattrs.length) - this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); - } - for (; i < this._ul4onattrs.length; ++i) { - this._setDefaultUL4ONAttr(this._ul4onattrs[i]); - } - }, + ul4ondump(encoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + encoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i])); + } - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - this[name] = value; - }, + _dumpUL4ONAttr(name) + { + return this[name]; + } - _setDefaultUL4ONAttr: function _setDefaultUL4ONAttr(name) { - this[name] = null; + ul4onload(decoder) + { + let i = 0; + for (let iter = decoder.loadcontent(); ; ++i) + { + let iteritem = iter.next(); + if (iteritem.done) + break; + if (i < this._ul4onattrs.length) + this._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value); } + for (; i < this._ul4onattrs.length; ++i) + this._setDefaultUL4ONAttr(this._ul4onattrs[i]); } -); - -la.Globals = ul4._inherit( - la.Base, - { - _ul4onattrs: ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"], - - __repr__: function repr() { - return ""; - }, - - // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) - geodist: function geodist(geo1, geo2) { - var sqsin = function sqsin(x) { x = Math.sin(x); return x * x }; - var sqcos = function sqsos(x) { x = Math.cos(x); return x * x }; - var deg2rad = Math.PI / 180; // Conversion factor degree -> radians - var radius = 6378.137; // Equatorial radius of earth in km - var flat = 1 / 298.257223563; // Earth flattening - - var lat1 = geo1.lat * deg2rad; - var long1 = geo1.long * deg2rad; - var lat2 = geo2.lat * deg2rad; - var long2 = geo2.long * deg2rad; - var F = (lat1 + lat2) / 2; - var G = (lat1 - lat2) / 2; - var l = (long1 - long2) / 2; - var S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); - var C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); - var w = Math.atan(Math.sqrt(S / C)); - var D = 2 * w * radius; - var T = Math.sqrt(S * C) / w; - var H1 = (3 * T - 1) / (2 * C); - var H2 = (3 * T + 1) / (2 * S); - var s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); - return s; - } + + _loadUL4ONAttr(name, value) + { + this[name] = value; } -); -la.FlashMessage = ul4._inherit( - la.Base, + _setDefaultUL4ONAttr(name) { - _ul4onattrs: ["timestamp", "type", "title", "message"], + this[name] = null; + } - __repr__: function repr() { - return ""; + __getattr__(name) + { + if (this._ul4attrs.has(name)) + { + let value = this[name]; + if (typeof(value) === "function") + { + let realvalue = value.bind(this); + realvalue._ul4_name = value._ul4_name || value.name; + realvalue._ul4_signature = value._ul4_signature; + realvalue._ul4_needsobject = value._ul4_needsobject; + realvalue._ul4_needscontext = value._ul4_needscontext; + return realvalue; + } + return value; } + throw new ul4.AttributeError(this, name); } -); -la.App = ul4._inherit( - la.Base, + __repr__() { - _ul4onattrs: ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "owner", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier"], - - insert: function (values) { - return this.globals.Login._insert(this, values); - }, + return ""; + } +}; - __repr__: function repr() { - return ""; - } +la.Handler = class Handler +{ + save(record) + { } -); -la.View = ul4._inherit( - la.Base, + delete(record) { - _ul4onattrs: ["id", "name", "app", "order", "width", "height", "start", "end"], + } +}; - __repr__: function repr() { - return ""; - } +la.Globals = class Globals extends la.Base +{ + constructor() + { + super(); + this.version = null; + this.platform = null; + this.user = null; + this.maxdbactions = null; + this.maxtemplateruntime = null; + this.flashmessages = null; + this.handler = new la.Handler(); } -); -la.DataSource = ul4._inherit( - la.Base, + // distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde) + static geodist(geo1, geo2) { - _ul4onattrs: ["id", "identifier", "app", "apps"], + let sqsin = function sqsin(x) {x = Math.sin(x); return x*x}; + let sqcos = function sqsos(x) {x = Math.cos(x); return x*x}; + const deg2rad = Math.PI/180; // Conversion factor degree -> radians + const radius = 6378.137; // Equatorial radius of earth in km + const flat = 1/298.257223563; // Earth flattening + + const lat1 = geo1.lat * deg2rad; + const long1 = geo1.long * deg2rad; + const lat2 = geo2.lat * deg2rad; + const long2 = geo2.long * deg2rad; + const F = (lat1 + lat2)/2; + const G = (lat1 - lat2)/2; + const l = (long1 - long2)/2; + const S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l); + const C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l); + const w = Math.atan(Math.sqrt(S/C)); + const D = 2 * w * radius; + const T = Math.sqrt(S*C)/w; + const H1 = (3*T-1)/(2*C); + const H2 = (3*T+1)/(2*S); + const s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G)); + return s; + } - __repr__: function repr() { - return ""; - } + __repr__() + { + return ""; } -); +}; + +la.Globals.prototype._ul4onattrs = ["version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"]; +la.Globals.prototype._ul4attrs = ul4._makeset("version", "platform", "user", "maxdbactions", "maxtemplateruntime", "flashmessages"); -la.Record = ul4._inherit( - la.Base, +la.FlashMessage = class FlashMessage extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"], + return ""; + } +}; - delete: function () { - return this.app.globals.Login._delete(this); - }, +la.FlashMessage.prototype._ul4onattrs = ["timestamp", "type", "title", "message"]; +la.FlashMessage.prototype._ul4attrs = ul4._makeset("timestamp", "type", "title", "message"); - update: function (values) { - return this.app.globals.Login._update(this, values); - }, +la.App = class App extends la.Base +{ + __repr__() + { + return ""; + } - __repr__: function repr() { - return ""; - }, + insert(values={}) + { + let record = this.__call__(values); + this.globals.handler.save(this); + this.globals.Login._insert(this, values); + return record; + } - search: function search(search) { - for (var identifier in search) { - var fieldsearch = search[identifier]; - if (ul4._bool(fieldsearch)) { - if (!this.fields.get(identifier).search(fieldsearch)) - return false; - } + __call__(values={}) + { + let record = new la.Record(this); + if (ul4._ismap(values)) + { + for (let [key, value] of values.entries()) + { + if (!record.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = value; } - return true; - }, - - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - if (name === "values") - return this._sparsevalues; - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - if (name === "values") { - this._sparsevalues = value; - this._values = null; - this._fields = null; + } + else if (ul4._isobject(values)) + { + for (let key in values) + { + if (!record.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = values[key]; } - else - this[name] = value; } + else + throw new ul4.TypeError("values must be an object or a Map"); + return record; } -); -Object.defineProperty(la.Record, "values", { - get: function () { - if (this._values === null) { - this._values = ul4on._havemap ? new Map() : {}; - var self = this; - this.app.controls.forEach(function (control, id) { - var fieldvalue = self._sparsevalues.get(control.identifier); - if (typeof (fieldvalue) === "undefined") - fieldvalue = null; - self._values.set(id, fieldvalue); - }); + __getattr__(name) + { + if (name.startsWith("c_")) + { + if (!this.controls.has(name.substr(2))) + throw new ul4.AttributeError(this, name); + return this.controls.get(name.substr(2)); } - return this._values; + else + return super.__getattr__(name); } -}); - -Object.defineProperty(la.Record, "fields", { - get: function () { - if (this._fields === null) { - this._fields = ul4on._havemap ? new Map() : {}; - var self = this; - this.values.forEach(function (value, id) { - var field = la.Field.create(self.app.controls.get(id), self.app, value); - self._fields.set(id, field); - }); - } - return this._fields; +}; + +la.App.prototype._ul4onattrs = ["id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "createdby", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier", "basetable", "primarykey", "insertprocedure", "updateprocedure", "deleteprocedure", "templates", "createdat", "updatedat", "updatedby"]; +la.App.prototype._ul4attrs = ul4._makeset("id", "globals", "name", "description", "language", "startlink", "iconlarge", "iconsmall", "createdat", "createdby", "updatedat", "updatedby", "controls", "records", "recordcount", "installation", "categories", "params", "views", "datamanagement_identifier", "insert"); +ul4.expose(la.App.prototype.__call__, ["**values"], {"needsobject": true}); +ul4.expose(la.App.prototype.insert, ["**values"], {"needsobject": true}); + +la.View = class View extends la.Base +{ + __repr__() + { + return ""; } -}); +}; + +la.View.prototype._ul4onattrs = ["id", "name", "app", "order", "width", "height", "start", "end"]; +la.View.prototype._ul4attrs = ul4._makeset("id", "name", "app", "order", "width", "height", "start", "end"); -la.Control = ul4._inherit( - la.Base, +la.DataSourceData = class DataSourceData extends la.Base +{ + __repr__() { - type: null, - subtype: null, - _ul4onattrs: ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"], + return ""; + } +}; - __repr__: function repr() { - return ""; - }, +la.DataSourceData.prototype._ul4onattrs = ["id", "identifier", "app", "apps"]; +la.DataSourceData.prototype._ul4attrs = ul4._makeset("id", "identifier", "app", "apps"); - asjson: function (value) { - return value; - }, +la.Record = class Record extends la.Base +{ + constructor(app) + { + super(); + this.id = null; + this.app = app; + this.createdat = null; + this.createdby = null; + this.updatedat = null; + this.updatedby = null; + this.updatecount = 0; + this._sparsevalues = new Map(); + this._values = null; + this._fields = null; + this.children = new Map(); + this.attachments = null; + this.errors = []; + this._is_deleted = false; + } - _logsearch: function _logsearch(value, search) { - //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); - }, + - // base implemntation, always returns ``false`` (i.e. "not found") - // ``value`` is the value of the field - // ``search`` is an object with information what we're searching for - // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) - search: function search(value, search) { - return false; + __repr__() + { + let v = ["") + return v.join(""); } -); -la.BoolControl = ul4._inherit( - la.Control, + get values() { - type: "bool", - __type__: "BoolControl", - - // ``search`` must by ``null``, ``false`` or ``true`` - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; + if (this._values === null) + { + this._values = ul4._havemap ? new Map() : {}; + for (let [identifier, control] of this.app.controls.entries()) + { + let fieldvalue = this._sparsevalues.get(identifier); + if (typeof(fieldvalue) === "undefined") + fieldvalue = null; + this._values.set(identifier, fieldvalue); + } } + return this._values; } -); -la.IntControl = ul4._inherit( - la.Control, + get fields() { - type: "int", - __type__: "IntControl", - - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else - return false; + if (this._fields === null) + { + this._fields = ul4._havemap ? new Map() : {}; + for (let [identifier, value] of this.values.entries()) + { + let field = new la.Field(this.app.controls.get(identifier), this, value); + this._fields.set(identifier, field); + } } + return this._fields; } -); -la.NumberControl = ul4._inherit( - la.Control, + is_dirty() { - type: "number", - __type__: "NumberControl", + if (this.id === null) + return true; + for (let field of this.fields.values()) + { + if (field.is_dirty()) + return true; + } + return false; + } - // ``search.value`` must by ``null`` or an integer - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "range") { - if (value === null) - return false; - return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); - } - else - return false; + has_errors() + { + if (this.errors.length !== 0) + return true; + for (let field of this.fields.values()) + { + if (field.has_errors()) + return true; } + return false; } -); -la.StringControl = ul4._inherit( - la.Control, + delete() { - type: "string", + return this.app.globals.handler.delete(this); + } - asjson: function (value) { - return value; - }, + save() + { + this.app.globals.handler.save(this); + } - search: function search(value, search) { - this._logsearch(value, search); - if (search.operator === "equals") - return search.value === value; - else if (search.operator === "contains") { - if (search.value === null || value === null) - return search.value === value; - else - return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; + update(values={}) + { + if (ul4._ismap(values)) + { + for (let [key, value] of values.entries()) + { + if (!this.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + fields.get(key).value = value; + } + } + else if (ul4._isobject(values)) + { + for (let key in values) + { + if (!this.fields.has(key)) + throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); + record.fields.get(key).value = values[key]; } } + else + throw new ul4.TypeError("values must be an object or a Map"); + + this.app.globals.handler.save(this); } -); -la.TextControl = ul4._inherit( - la.StringControl, + search(search) { - subtype: "text", - __type__: "TextControl" + for (let identifier in search) + { + let fieldsearch = search[identifier]; + if (ul4._bool(fieldsearch)) + { + if (!this.fields.get(identifier).search(fieldsearch)) + return false; + } + } + return true; } -); -la.EmailControl = ul4._inherit( - la.StringControl, + _dumpUL4ONAttr(name) { - subtype: "email", - __type__: "EmailControl" + if (name === "values") + return this._sparsevalues; + else + return this[name]; } -); -la.URLControl = ul4._inherit( - la.StringControl, + _loadUL4ONAttr(name, value) { - subtype: "url", - __type__: "URLControl" + if (name === "values") + { + this._sparsevalues = value; + this._values = null; + this._fields = null; + } + else + this[name] = value; } -); -la.TelControl = ul4._inherit( - la.StringControl, + __getattr__(name) { - subtype: "tel" + if (name.startsWith("c_")) + return this.children.get(name.substr(2)) + else if (name.startsWith("f_")) + return this.fields.get(name.substr(2)) + else if (name.startsWith("v_")) + return this.values.get(name.substr(2)) + else + return this[name]; } -); -la.PasswordControl = ul4._inherit( - la.StringControl, + __setattr__(name, value) + { + if (name.startsWith("c_")) + this.children[name.substr(2)] = value; + else if (name.startsWith("v_")) + this.fields.get(name.substr(2)).value = value; + else + throw new ul4.AttributeError(this, name); + } +}; + +la.Record.prototype._ul4onattrs = ["id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"]; +la.Record.prototype._ul4attrs = ul4._makeset("id", "app", "createdat", "createdby", "updatedat", "updatedby", "updatecount", "values", "attachments", "children"); +ul4.expose(la.Record.prototype.is_dirty, []); +ul4.expose(la.Record.prototype.has_errors, []); +ul4.expose(la.Record.prototype.delete, []); +ul4.expose(la.Record.prototype.save, []); +ul4.expose(la.Record.prototype.update, ["**values"], {"needsobject": true}); + +la.Control = class Control extends la.Base +{ + __repr__() { - subtype: "password" + return ""; } -); -la.TextAreaControl = ul4._inherit( - la.StringControl, + _logsearch(value, search) { - subtype: "textarea", - __type__: "TextAreaControl" + //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); } -); -la.DateControl = ul4._inherit( - la.Control, + // base implemntation, always returns ``false`` (i.e. "not found") + // ``value`` is the value of the field + // ``search`` is an object with information what we're searching for + // keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator)) + search(value, search) { - type: "date", - subtype: "date", - __type__: "DateControl", + return false; + } +}; - asjson: function (value) { - if (value instanceof Date) { - value = `${value.getFullYear()}-${value.getMonth() + 1}-${value.getDate()} ${value.getHours()}:${value.getMinutes()}:${value.getSeconds()}`; - } - return value; - }, +la.Control.prototype.type = null; +la.Control.prototype.subtype = null; +la.Control.prototype._ul4onattrs = ["id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"]; +la.Control.prototype._ul4attrs = ul4._makeset("id", "identifier", "field", "app", "label", "priority", "order", "default", "ininsertprocedure", "inupdateprocedure"); - formatstring: function formatstring(language) { - language = language || this.app.language; +la.BoolControl = class BoolControl extends la.Control +{ + // ``search`` must by ``null``, ``false`` or ``true`` + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } +}; - if (language === "de") - return "%d.%m.%Y"; - else - return "%m/%d/%Y"; - }, +la.BoolControl.prototype.type = "bool"; - // searchvalue must be ``null``, a ``Date`` object or a string - search: function search(value, search) { - this._logsearch(value, search); +la.IntControl = class IntControl extends la.Control +{ + // ``search.value`` must by ``null`` or an integer + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else + return false; + } +}; - var searchvalue = search.value; - if (Object.prototype.toString.call(searchvalue) == "[object Date]") - searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); - if (value !== null) - value = ul4._format(value, this.formatstring(), this.app.language); +la.IntControl.prototype.type = "int"; - if (search.operator === "equals") - return searchvalue === value; - else if (search.operator === "contains") { - if (searchvalue === null || value === null) - return searchvalue === value; - else - return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; - } - else +la.NumberControl = class NumberControl extends la.Control +{ + // ``search.value`` must by ``null`` or an integer + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "range") + { + if (value === null) return false; + return (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue); } + else + return false; } -); - -la.DatetimeMinuteControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimeminute", - __type__: "DatetimeMinuteControl", +}; - formatstring: function formatstring(language) { - language = language || this.app.language; +la.NumberControl.prototype.type = "number"; - if (language === "de") - return "%d.%m.%Y %H:%M"; +la.StringControl = class StringControl extends la.Control +{ + search(value, search) + { + this._logsearch(value, search); + if (search.operator === "equals") + return search.value === value; + else if (search.operator === "contains") + { + if (search.value === null || value === null) + return search.value === value; else - return "%m/%d/%Y %H:%M"; + return value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0; } } -); +}; -la.DatetimeSecondControl = ul4._inherit( - la.DateControl, - { - subtype: "datetimesecond", - __type__: "DatetimeMinuteSecond", +la.StringControl.prototype.type = "string"; - formatstring: function formatstring(language) { - language = language || this.app.language; +la.TextControl = class TextControl extends la.StringControl +{ +}; - if (language === "de") - return "%d.%m.%Y %H:%M:%S"; - else - return "%m/%d/%Y %H:%M:%S"; - } - } -); +la.TextControl.prototype.subtype = "text"; -la.LookupControl = ul4._inherit( - la.Control, - { - type: "lookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupdata"]), +la.EmailControl = class EmailControl extends la.StringControl +{ +}; - // ``search.value`` must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (this.lookupapp === null) { - if (search.operator === "equals") { - if (value === null) - return search.value === null; - else - return value.key === search.value; - } - else - return false; - } - else { - if (value === null || search.value === null) - return value === search.value; - else - return value.search(search); - } - } - } -); +la.EmailControl.prototype.subtype = "email"; -la.LookupSelectControl = ul4._inherit( - la.LookupControl, - { - subtype: "select", - __type__: "LookupSelectControl" - } -); +la.URLControl = class URLControl extends la.StringControl +{ +}; -la.LookupRadioControl = ul4._inherit( - la.LookupControl, - { - subtype: "radio", - __type__: "LookupRadioControl" - } -); +la.URLControl.prototype.subtype = "url"; -la.LookupChoiceControl = ul4._inherit( - la.LookupControl, +la.TelControl = class TelControl extends la.StringControl +{ +}; + +la.TelControl.prototype.subtype = "tel"; + +la.PasswordControl = class PasswordControl extends la.StringControl +{ +}; + +la.PasswordControl.prototype.subtype = "password"; + +la.TextAreaControl = class TextAreaControl extends la.StringControl +{ +}; + +la.TextAreaControl.prototype.subtype = "textarea"; +la.TextAreaControl.prototype._ul4onattrs = la.StringControl.prototype._ul4onattrs.concat(["encrypted"]); +la.TextAreaControl.prototype._ul4attrs = ul4._makeset(...la.StringControl.prototype._ul4attrs, "encrypted"); + +la.DateControl = class DateControl extends la.Control +{ + formatstring(language) { - subtype: "choice", - __type__: "LookupChoiceControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y"; + else + return "%m/%d/%Y"; } -); -la.AppLookupControl = ul4._inherit( - la.Control, + // searchvalue must be ``null``, a ``Date`` object or a string + search(value, search) { - type: "applookup", - _ul4onattrs: la.Control._ul4onattrs.concat(["lookupapp", "lookupcontrols"]), - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (value === null || search.value === null) - return value === search.value; + this._logsearch(value, search); + + let searchvalue = search.value; + if (Object.prototype.toString.call(searchvalue) == "[object Date]") + searchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language); + if (value !== null) + value = ul4._format(value, this.formatstring(), this.app.language); + + if (search.operator === "equals") + return searchvalue === value; + else if (search.operator === "contains") + { + if (searchvalue === null || value === null) + return searchvalue === value; else - return value.search(search); + return value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0; } + else + return false; } -); +}; -la.AppLookupSelectControl = ul4._inherit( - la.AppLookupControl, - { - subtype: "select", - __type__: "AppLookupSelectControl" - } -); +la.DateControl.prototype.type = "date"; +la.DateControl.prototype.subtype = "date"; -la.AppLookupRadioControl = ul4._inherit( - la.AppLookupControl, +la.DatetimeMinuteControl = class DatetimeMinuteControl extends la.DateControl +{ + formatstring(language) { - subtype: "radio", - __type__: "AppLookupRadioControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M"; + else + return "%m/%d/%Y %H:%M"; } -); +}; -la.AppLookupChoiceControl = ul4._inherit( - la.AppLookupControl, +la.DatetimeMinuteControl.prototype.subtype = "datetimeminute"; + +la.DatetimeSecondControl = class DatetimeSecondControl extends la.DateControl +{ + formatstring(language) { - subtype: "choice", - __type__: "AppLookupChoiceControl" + language = language || this.app.language; + + if (language === "de") + return "%d.%m.%Y %H:%M:%S"; + else + return "%m/%d/%Y %H:%M:%S"; } -); +}; -la.MultipleLookupControl = ul4._inherit( - la.LookupControl, +la.DatetimeSecondControl.prototype.subtype = "datetimesecond"; + +la.LookupControl = class LookupControl extends la.Control +{ + // ``search.value`` must be ``null`` or a ``LookupItem`` key + search(value, search) { - type: "multiplelookup", - - // search.value must be ``null`` or a ``LookupItem`` key - // if this control is an applookup ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (search.operator === "equals") { - if (this.lookupapp === null) { - for (var i = 0; i < value.length; ++i) { - if (value[i].key === search.value) - return true; - } - return false; - } - else { - if (search.value === null) - return value.length === 0; - else { - for (var i = 0; i < value.length; ++i) { - if (value[i].search(search.value)) - return true; - } - return false; - } - } - } + if (search.operator === "equals") + { + if (value === null) + return search.value === null; else - return false; + return value.key === search.value; } + else + return false; } -); +}; -la.MultipleLookupSelectControl = ul4._inherit( - la.MultipleLookupControl, +la.LookupControl.prototype.type = "lookup"; +la.LookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat(["lookupdata"]); +la.LookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, "lookupdata"); + +la.LookupSelectControl = class LookupSelectControl extends la.LookupControl +{ +}; + +la.LookupSelectControl.prototype.subtype = "select"; + +la.LookupRadioControl = class LookupRadioControl extends la.LookupControl +{ +}; + +la.LookupRadioControl.prototype.subtype = "radio"; + +la.LookupChoiceControl = class LookupChoiceControl extends la.LookupControl +{ +}; + +la.LookupChoiceControl.prototype.subtype = "choice"; + +la.AppLookupControl = class AppLookupControl extends la.Control +{ + // ``search.value`` must be an object containing the search criteria for the referenced record + search(value, search) { - subtype: "select", - __type__: "MultipleLookupSelectControl" + if (value === null || search.value === null) + return value === search.value; + else + return value.search(search); } -); +}; -la.MultipleLookupCheckboxControl = ul4._inherit( - la.MultipleLookupControl, +la.AppLookupControl.prototype.type = "applookup"; +la.AppLookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat(["lookupapp", "lookupcontrols"]); +la.AppLookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, "lookupapp", "lookupcontrols"); + +la.AppLookupSelectControl = class AppLookupSelectControl extends la.AppLookupControl +{ +}; + +la.AppLookupSelectControl.prototype.subtype = "select"; + +la.AppLookupRadioControl = class AppLookupRadioControl extends la.AppLookupControl +{ +}; + +la.AppLookupRadioControl.prototype.subtype = "radio"; + +la.AppLookupChoiceControl = class AppLookupChoiceControl extends la.AppLookupControl +{ +}; + +la.AppLookupChoiceControl.prototype.subtype = "choice"; + +la.MultipleLookupControl = class MultipleLookupControl extends la.LookupControl +{ + // search.value must be ``null`` or a ``LookupItem`` key + search(value, search) { - subtype: "checkbox", - __type__: "MultipleLookupCheckboxControl" + if (search.operator === "equals") + { + for (let item of value) + { + if (item.key === search.value) + return true; + } + return false; + } + else + return false; } -); +}; -la.MultipleAppLookupControl = ul4._inherit( - la.AppLookupControl, +la.MultipleLookupControl.prototype.subtype = "multiplelookup"; + +la.MultipleLookupSelectControl = class MultipleLookupSelectControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupSelectControl.prototype.subtype = "select"; + +la.MultipleLookupCheckboxControl = class MultipleLookupCheckboxControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupCheckboxControl.prototype.subtype = "checkbox"; + +la.MultipleLookupChoiceControl = class MultipleLookupChoiceControl extends la.MultipleLookupControl +{ +}; + +la.MultipleLookupChoiceControl.prototype.subtype = "choice"; + +la.MultipleAppLookupControl = class MultipleAppLookupControl extends la.AppLookupControl +{ + // ``search.value`` must be an object containing the search criteria for the referenced record + search(value, search) { - type: "multipleapplookup", - - // ``search.value`` must be an object containing the search criteria for the referenced record - search: function search(value, search) { - if (search.operator === "equals") { - if (search.value === null) - return value.length === 0; - else { - for (var i = 0; i < value.length; ++i) { - if (value[i].search(search.value)) - return true; - } - return false; - } - } + if (search.operator === "equals") + { + if (search.value === null) + return value.length === 0; else + { + for (let item of value) + { + if (item.search(search.value)) + return true; + } return false; + } } + else + return false; } -); +}; -la.MultipleAppLookupSelectControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "select", - __type__: "MultipleAppLookupSelectControl" - } -); +la.MultipleAppLookupControl.prototype.type = "multipleapplookup"; -la.MultipleAppLookupCheckboxControl = ul4._inherit( - la.MultipleAppLookupControl, - { - subtype: "checkbox", - __type__: "MultipleAppLookupCheckboxControl" - } -); +la.MultipleAppLookupSelectControl = class MultipleAppLookupSelectControl extends la.MultipleAppLookupControl +{ +}; -la.GeoControl = ul4._inherit( - la.Control, - { - type: "geo", +la.MultipleAppLookupSelectControl.prototype.subtype = "select"; +la.MultipleAppLookupCheckboxControl = class MultipleAppLookupCheckboxControl extends la.MultipleAppLookupControl +{ +}; - asjson: function (value) { - if (la.Geo.isprotoof(value)) - value = `${value.lat}, ${value.long}, ${value.info}`; - return value; - }, +la.MultipleAppLookupCheckboxControl.prototype.subtype = "checkbox"; - __type__: "GeoControl" - } -); +la.MultipleAppLookupChoiceControl = class MultipleAppLookupChoiceControl extends la.MultipleAppLookupControl +{ +}; + +la.MultipleAppLookupChoiceControl.prototype.subtype = "choice"; -la.FileControl = ul4._inherit( - la.Control, +la.GeoControl = class GeoControl extends la.Control +{ +}; + +la.GeoControl.prototype.type = "geo"; + +la.FileControl = class FileControl extends la.Control +{ +}; + +la.FileControl.prototype.type = "file"; + +la.ButtonControl = class ButtonControl extends la.Control +{ +}; + +la.ButtonControl.prototype.type = "button"; + +la.Field = class Field extends la.Base +{ + constructor(control, record, value) { - type: "file", - __type__: "FileControl" + super(); + this.control = control; + this.record = record; + this._value = value; + this._dirty = false; + this.errors = []; } -); -la.ButtonControl = ul4._inherit( - la.Control, + get value() { - type: "button", - __type__: "ButtonControl" + return this._value; } -); -la.Field = ul4._inherit( - la.Base, + set value(value) { - create: function create(control, record, value) { - var field = la.Base.create.call(this); - field.control = control; - field.record = record; - field.value = value; - return field; - }, + let oldvalue = this._value; - search: function search(searchvalue) { - return this.control.search(this.value, searchvalue); - }, - - __repr__: function repr() { - return ""; + if (ul4._ne(oldvalue, value)) + { + this.record.values.set(this.control.identifier, value); + this._value = value; + this._dirty = true; } } -); -la.LookupItem = ul4._inherit( - la.Base, + is_empty() { - _ul4onattrs: ["key", "label"], - - __repr__: function repr() { - return ""; - } + return this._value === null || (ul4._islist(this._value) && this._value.length === 0); } -); -la.User = ul4._inherit( - la.Base, + is_dirty() { - _ul4onattrs: ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"], - - __repr__: function repr() { - return ""; - } + return this._dirty; } -); -la.File = ul4._inherit( - la.Base, + has_errors() { - _ul4onattrs: ["id", "url", "filename", "mimetype", "width", "height"], - - __repr__: function repr() { - return ""; - } + return this.errors.length !== 0; } -); -la.Geo = ul4._inherit( - la.Base, + search(searchvalue) { - _ul4onattrs: ["lat", "long", "info"], - - __repr__: function repr() { - return ""; - } + return this.control.search(this.value, searchvalue); } -); -la.Attachment = ul4._inherit( - la.Base, + __repr__() { - _ul4onattrs: ["id", "record", "label", "active"], - - __repr__: function repr() { - return ""; - } + let s = ""; } -); +}; + +la.LookupItem.prototype._ul4onattrs = ["key", "label"]; +la.LookupItem.prototype._ul4attrs = ul4._makeset("key", "label"); -la.URLAttachment = ul4._inherit( - la.Attachment, +la.User = class User extends la.Base +{ + __repr__() { - type: "urlattachment", - __type__: "URLAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + return ""; } -); +}; -la.FileAttachment = ul4._inherit( - la.Attachment, +la.User.prototype._ul4onattrs = ["_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"]; +la.User.prototype._ul4attrs = ul4._makeset("_id", "id", "gender", "firstname", "surname", "initials", "email", "language", "avatarsmall", "avatarlarge", "keyviews"); + +la.File = class File extends la.Base +{ + __repr__() { - type: "fileattachment", - __type__: "FileAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]) + return ""; } -); +}; + +la.File.prototype._ul4onattrs = ["id", "url", "filename", "mimetype", "width", "height", "internalid", "createdat", "size"]; +la.File.prototype._ul4attrs = ul4._makeset("id", "url", "filename", "mimetype", "width", "height", "size", "createdat"); -la.ImageAttachment = ul4._inherit( - la.Attachment, +la.Geo = class Geo extends la.Base +{ + constructor(lat, long, info) { - type: "imageattachment", - __type__: "ImageAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]) + super(); + this.lat = lat; + this.long = long; + this.info = info; } -); -la.JSONAttachment = ul4._inherit( - la.Attachment, + __repr__() { - type: "jsonattachment", - __type__: "JSONAttachment", - _ul4onattrs: la.Attachment._ul4onattrs.concat(["value"]), - _dumpUL4ONAttr: function _dumpUL4ONAttr(name) { - if (name === "value") - return ul4._asjson(this.value); - else - return this[name]; - }, - - _loadUL4ONAttr: function _loadUL4ONAttr(name, value) { - if (name === "value") - this.value = ul4._fromjson(value); - else - this[name] = value - } + return ""; } -); +}; -la.Installation = ul4._inherit( - la.Base, - { - _ul4onattrs: ["id", "name"], +la.Geo.prototype._ul4onattrs = ["lat", "long", "info"]; +la.Geo.prototype._ul4attrs = ul4._makeset("lat", "long", "info"); - __repr__: function repr() { - return ""; - } +la.Attachment = class Attachment extends la.Base +{ + __repr__() + { + return ""; } -); +}; + +la.Attachment.prototype._ul4onattrs = ["id", "record", "label", "active"]; +la.Attachment.prototype._ul4attrs = ul4._makeset("id", "record", "label", "active"); + +la.NoteAttachment = class NoteAttachment extends la.Attachment +{ +}; + +la.NoteAttachment.prototype.type = "noteattachment"; +la.NoteAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.NoteAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); + +la.URLAttachment = class URLAttachment extends la.Attachment +{ +}; + +la.URLAttachment.prototype.type = "urlattachment"; +la.URLAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.URLAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); -la.Category = ul4._inherit( - la.Base, +la.FileAttachment = class FileAttachment extends la.Attachment +{ +}; + +la.FileAttachment.prototype.type = "fileattachment"; +la.FileAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.FileAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); + +la.ImageAttachment = class ImageAttachment extends la.Attachment +{ +}; + +la.ImageAttachment.prototype.type = "imageattachment"; +la.ImageAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["original", "thumb", "small", "medium", "large"]); +la.ImageAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "original", "thumb", "small", "medium", "large"); + +la.JSONAttachment = class JSONAttachment extends la.Attachment +{ + _dumpUL4ONAttr(name) { - _ul4onattrs: ["id", "identifier", "name", "order", "parent", "children", "apps"], + if (name === "value") + return ul4._asjson(this.value); + else + return this[name]; + } - __repr__: function repr() { - var v = []; - var category = this; - while (category !== null) { - v.splice(0, 0, category.identifier); - category = category.parent; - } - return ""; - } + _loadUL4ONAttr(name, value) + { + if (name === "value") + this.value = ul4._fromjson(value); + else + this[name] = value } -); +}; + +la.JSONAttachment.prototype.type = "jsonattachment"; +la.JSONAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat(["value"]); +la.JSONAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, "value"); -la.KeyView = ul4._inherit( - la.Base, +la.Installation = class Installation extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "identifier", "name", "key", "user"], + return ""; + } +}; + +la.Installation.prototype._ul4onattrs = ["id", "name"]; +la.Installation.prototype._ul4attrs = ul4._makeset("id", "name"); - __repr__: function repr() { - return ""; +la.Category = class Category extends la.Base +{ + __repr__() + { + let v = []; + let category = this; + while (category !== null) + { + v.splice(0, 0, category.identifier); + category = category.parent; } + return ""; } -); +}; + +la.Category.prototype._ul4onattrs = ["id", "identifier", "name", "order", "parent", "children", "apps"]; +la.Category.prototype._ul4attrs = ul4._makeset("id", "identifier", "name", "order", "parent", "children", "apps"); -la.AppParameter = ul4._inherit( - la.Base, +la.KeyView = class KeyView extends la.Base +{ + __repr__() { - _ul4onattrs: ["id", "app", "identifier", "description", "value"], + return ""; + } +}; - __repr__: function repr() { - return ""; - } +la.KeyView.prototype._ul4onattrs = ["id", "identifier", "name", "key", "user"]; +la.KeyView.prototype._ul4attrs = ul4._makeset("id", "identifier", "name", "key", "user"); + +la.AppParameter = class AppParameter extends la.Base +{ + __repr__() + { + return ""; } -); - -var classes = [ - "Globals", - "App", - "View", - "DataSource", - "Record", - "BoolControl", - "IntControl", - "NumberControl", - "TextControl", - "EmailControl", - "URLControl", - "TelControl", - "PasswordControl", - "TextAreaControl", - "DateControl", - "DatetimeMinuteControl", - "DatetimeSecondControl", - "LookupControl", - "LookupSelectControl", - "LookupRadioControl", - "LookupChoiceControl", - "AppLookupControl", - "AppLookupSelectControl", - "AppLookupRadioControl", - "AppLookupChoiceControl", - "MultipleLookupControl", - "MultipleLookupSelectControl", - "MultipleLookupCheckboxControl", - "MultipleAppLookupControl", - "MultipleAppLookupSelectControl", - "MultipleAppLookupCheckboxControl", - "GeoControl", - "FileControl", - "ButtonControl", - "Field", - "LookupItem", - "User", - "File", - "Geo", - "NoteAttachment", - "URLAttachment", - "FileAttachment", - "ImageAttachment", - "JSONAttachment", - "Installation", - "Category", - "KeyView", - "AppParameter" +}; + +la.AppParameter.prototype._ul4onattrs = ["id", "app", "identifier", "description", "value"]; +la.AppParameter.prototype._ul4attrs = ul4._makeset("id", "app", "identifier", "description", "value"); + +let classes = [ + la.Globals, + la.App, + la.View, + la.DataSourceData, + la.Record, + la.BoolControl, + la.IntControl, + la.NumberControl, + la.TextControl, + la.EmailControl, + la.URLControl, + la.TelControl, + la.PasswordControl, + la.TextAreaControl, + la.DateControl, + la.DatetimeMinuteControl, + la.DatetimeSecondControl, + la.LookupControl, + la.LookupSelectControl, + la.LookupRadioControl, + la.LookupChoiceControl, + la.AppLookupControl, + la.AppLookupSelectControl, + la.AppLookupRadioControl, + la.AppLookupChoiceControl, + la.MultipleLookupControl, + la.MultipleLookupSelectControl, + la.MultipleLookupCheckboxControl, + la.MultipleLookupChoiceControl, + la.MultipleAppLookupControl, + la.MultipleAppLookupSelectControl, + la.MultipleAppLookupCheckboxControl, + la.MultipleAppLookupChoiceControl, + la.GeoControl, + la.FileControl, + la.ButtonControl, + la.Field, + la.LookupItem, + la.User, + la.File, + la.Geo, + la.NoteAttachment, + la.URLAttachment, + la.FileAttachment, + la.ImageAttachment, + la.JSONAttachment, + la.Installation, + la.Category, + la.KeyView, + la.AppParameter ]; -for (var i = 0; i < classes.length; ++i) { - var name = classes[i]; - var object = la[name]; - ul4on.register("de.livingapps.appdd." + name.toLowerCase(), object); +for (let constructor of classes) +{ + // Register under the old name + ul4.register("de.livingapps.appdd." + constructor.name.toLowerCase(), constructor); + // Register under the new name + ul4.register("de.livinglogic.livingapi." + constructor.name.toLowerCase(), constructor); } - export default la; \ No newline at end of file diff --git a/src/modules/ul4.js b/src/modules/ul4.js index 95ff35b..d8c3be2 100644 --- a/src/modules/ul4.js +++ b/src/modules/ul4.js @@ -3,8 +3,8 @@ * http://www.livinglogic.de/Python/ul4c/ * http://www.livinglogic.de/Python/ul4on/ * - * Copyright 2011-2017 by LivingLogic AG, Bayreuth/Germany - * Copyright 2011-2017 by Walter Dörwald + * Copyright 2011-2018 by LivingLogic AG, Bayreuth/Germany + * Copyright 2011-2018 by Walter Dörwald * * All Rights Reserved * @@ -28,3687 +28,5334 @@ */ /*jslint vars: true */ +export let ul4 = {}; +let iscommon = (typeof module === 'object' && module.exports); -export let ul4 = {}; -export let ul4on = {}; + ul4.version = "46"; -ul4.version = "41"; + // + // UL4ON + // -// -// UL4ON -// + ul4._registry = {}; -ul4on._registry = {}; + ul4._havemap = (typeof(Map) === "function" && typeof(Map.prototype.forEach) === "function"); -ul4on._havemap = (typeof (Map) === "function" && typeof (Map.prototype.forEach) === "function"); + ul4._havemapconstructor = (function () + { + if (ul4._havemap) + { + try + { + if (new Map([[1, 2]]).size == 1) + return true; + } + catch (error) + { + } + } + return false; + })(); -ul4on._havemapconstructor = false; + ul4._haveset = (typeof(Set) === "function" && typeof(Set.prototype.forEach) === "function"); -if (ul4on._havemap) { - try { - if (new Map([[1, 2]]).size == 1) - ul4on._havemapconstructor = true; - } - catch (error) { - } -} + ul4._havesetconstructor = (function () + { + if (ul4._haveset) + { + try + { + if (new Set([1, 2]).size == 2) + return true; + } + catch (error) + { + } + return false; + } + else + return false; + })(); -ul4on._haveset = (typeof (Set) === "function" && typeof (Set.prototype.forEach) === "function"); + // helper functions that work with Maps and objects + if (ul4._havemap) + { + ul4._makemap = function _makemap(...items) + { + let map = new Map(); -ul4on._havesetconstructor = false; + for (let i = 0; i < items.length; ++i) + { + let [key, value] = items[i]; + map.set(key, value); + } + return map; + }; -if (ul4on._haveset) { - try { - if (new Set([1, 2]).size == 2) - ul4on._havesetconstructor = true; - } - catch (error) { - } -} + ul4._setmap = function _setmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + map.set(key, value); + else + map[key] = value; + }; -// Function used for making maps, when the Map constructor doesn't work -ul4on._makemap = function _makemap() { - var map = new Map(); + ul4._emptymap = function _emptymap() + { + return new Map(); + }; - for (var i = 0; i < arguments.length; ++i) { - var argument = arguments[i]; - map.set(argument[0], argument[1]); + ul4._getmap = function _getmap(map, key, value) + { + if (map.__proto__ === Map.prototype) + return map.get(key); + else + return map[key]; + }; } - return map; -}; - -// Function that creates en empty Map (if supported) or an empty object -ul4on._emptymap = function _emptymap() { - return ul4on._havemap ? new Map() : {}; -}; - -// Function that adds a (key, value) item to an object (or map) -if (ul4on._havemap) { - ul4on._setmap = function _setmap(map, key, value) { - if (map.__proto__ === Map.prototype) - map.set(key, value); - else + else + { + ul4._makemap = function _makemap(...items) + { + let map = {}; + + for (let i = 0; i < items.length; ++i) + { + let [key, value] = items[i]; + map[key] = value; + } + return map; + }; + + ul4._setmap = function _setmap(map, key, value) + { map[key] = value; - }; -} -else { - ul4on._setmap = function _setmap(map, key, value) { - map[key] = value; - }; -} + }; -// Function used for making sets, when the Set constructor doesn't work (or we don't have sets) -if (ul4on._haveset) { - ul4on._makeset = function _makeset() { - var set = this._haveset ? new Set() : ul4._Set.create(); + ul4._emptymap = function _emptymap() + { + return {}; + }; - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); - return set; - }; -} -else { - ul4on._makeset = function _makeset() { - var set = ul4._Set.create(); + ul4._getmap = function _getmap(map, key, value) + { + return map[key]; + }; + } + + // Function used for making sets, when the Set constructor doesn't work (or we don't have sets) + if (ul4._haveset) + { + ul4._emptyset = function _emptyset() + { + return new Set(); + }; + } + else + { + ul4._emptyset = function _emptyset() + { + return new ul4._Set(); + }; + } + + ul4._makeset = function _makeset(...items) + { + let set = ul4._emptyset(); - for (var i = 0; i < arguments.length; ++i) - set.add(arguments[i]); + for (let i = 0; i < items.length; ++i) + set.add(items[i]); return set; }; -} -// Register the object ``obj`` under the name ``name`` with the UL4ON machinery -ul4on.register = function register(name, obj) { - obj.ul4onname = name; - ul4on._registry[name] = function () { return obj.create(); }; -}, + // Register the constructor function ``f`` under the name ``name`` with the UL4ON machinery + ul4.register = function register(name, f) + { + f.prototype.ul4onname = name; + ul4._registry[name] = f; + }; // Return a string that contains the object ``obj`` in the UL4ON serialization format - ul4on.dumps = function dumps(obj, indent) { - var encoder = ul4on.Encoder.create(indent); + ul4.dumps = function dumps(obj, indent) + { + let encoder = new ul4.Encoder(indent); encoder.dump(obj); return encoder.finish(); - }, + }; // Load an object from the string ``data``. // ``data`` must contain the object in the UL4ON serialization format - // ``registry`` may be null or a dictionary mapping type names to objects with a create method - ul4on.loads = function loads(data, registry) { - var decoder = ul4on.Decoder.create(data, registry); + // ``registry`` may be null or a dictionary mapping type names to constructor functions + ul4.loads = function loads(data, registry) + { + let decoder = new ul4.Decoder(data, registry); return decoder.load(); - }, + }; - // Helper "class" for encoding - ul4on.Encoder = { + // Helper class for encoding + ul4.Encoder = class Encoder + { // Create a new Encoder object - create: function create(indent) { - var encoder = ul4._clone(this); - encoder.indent = indent || null; - encoder.data = []; - encoder._level = 0; - encoder._strings2index = {}; - encoder._ids2index = {}; - encoder._backrefs = 0; - return encoder; - }, - - _line: function _line(line) { - var i, oldindent; - - if (this.indent !== null) { - for (i = 0; i < this._level; ++i) + constructor(indent=null) + { + this.indent = indent; + this.data = []; + this._level = 0; + this._strings2index = {}; + this._ids2index = {}; + this._backrefs = 0; + } + + _line(line, ...args) + { + if (this.indent !== null) + { + for (let i = 0; i < this._level; ++i) this.data.push(this.indent); } - else { + else + { if (this.data.length) this.data.push(" "); } this.data.push(line); - if (arguments.length > 1) { - oldindent = this.indent; + if (args.length) + { + let oldindent = this.indent; this.indent = null; - for (i = 1; i < arguments.length; ++i) - this.dump(arguments[i]); + for (let i = 0; i < args.length; ++i) + this.dump(args[i]); this.indent = oldindent; } if (this.indent !== null) this.data.push("\n"); - }, + } // Return the complete string written to the buffer - finish: function finish() { + finish() + { return this.data.join(""); - }, + } - dump: function dump(obj) { + dump(obj) + { if (obj === null) this._line("n"); - else if (typeof (obj) == "boolean") + else if (typeof(obj) == "boolean") this._line(obj ? "bT" : "bF"); - else if (typeof (obj) == "number") { - var type = (Math.round(obj) == obj) ? "i" : "f"; + else if (typeof(obj) == "number") + { + let type = (Math.round(obj) == obj) ? "i" : "f"; this._line(type + obj); } - else if (typeof (obj) == "string") { - var index = this._strings2index[obj]; - if (typeof (index) !== "undefined") { + else if (typeof(obj) == "string") + { + let index = this._strings2index[obj]; + if (typeof(index) !== "undefined") + { this._line("^" + index); } - else { + else + { this._strings2index[obj] = this._backrefs++; - this._line("S" + ul4._str_repr(obj)); + let dump = ul4._str_repr(obj).replace("<", "\\x3c"); + this._line("S" + dump); } } else if (ul4._iscolor(obj)) this._line("c", obj.r(), obj.g(), obj.b(), obj.a()); else if (ul4._isdate(obj)) - this._line("z", obj.getFullYear(), obj.getMonth() + 1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); + this._line("x", obj.year(), obj.month(), obj.day()); + else if (ul4._isdatetime(obj)) + this._line("z", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000); else if (ul4._istimedelta(obj)) this._line("t", obj.days(), obj.seconds(), obj.microseconds()); else if (ul4._ismonthdelta(obj)) this._line("m", obj.months()); - else if (typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.slice)) + else if (obj instanceof ul4.slice) this._line("r", obj.start, obj.stop); - else if (obj.ul4onname && obj.ul4ondump) { - if (obj.__id__) { - var index = this._ids2index[obj.__id__]; - if (typeof (index) != "undefined") { + else if (obj.ul4onname && obj.ul4ondump) + { + if (obj.__id__) + { + let index = this._ids2index[obj.__id__]; + if (typeof(index) != "undefined") + { this._line("^" + index); return; } - } - if (obj.__id__) this._ids2index[obj.__id__] = this._backrefs++; + } this._line("O", obj.ul4onname); ++this._level; obj.ul4ondump(this); --this._level; this._line(")"); } - else if (ul4._islist(obj)) { + else if (ul4._islist(obj)) + { this._line("l"); ++this._level; - for (var i in obj) + for (let i = 0; i < obj.length; ++i) this.dump(obj[i]); --this._level; this._line("]"); } - else if (ul4._ismap(obj)) { + else if (ul4._ismap(obj)) + { this._line("e"); ++this._level; - obj.forEach(function (value, key) { + obj.forEach(function(value, key) { this.dump(key); this.dump(value); }, this); --this._level; this._line("}"); } - else if (ul4._isdict(obj)) { + else if (ul4._isdict(obj)) + { this._line("d"); ++this._level; - for (var key in obj) { + for (let key in obj) + { this.dump(key); this.dump(obj[key]); } --this._level; this._line("}"); } - else if (ul4._isset(obj)) { + else if (ul4._isset(obj)) + { this._line("y"); ++this._level; - obj.forEach(function (value) { + obj.forEach(function(value) { this.dump(value); }, this); --this._level; this._line("}"); } else - throw "can't handle object"; + throw new ul4.ValueError("can't create UL4ON dump of object " + ul4._repr(obj)); } }; -// Helper "class" for decoding -ul4on.Decoder = { - // Creates a new decoder for reading from the string ``data`` - create: function create(data, registry) { - var decoder = ul4._clone(this); - decoder.data = data; - decoder.pos = 0; - decoder.backrefs = []; - decoder.registry = typeof (registry) === "undefined" ? null : registry; - return decoder; - }, - - // Read a character from the buffer - readchar: function readchar() { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - return this.data.charAt(this.pos++); - }, + // Helper class for decoding + ul4.Decoder = class Decoder + { + // Creates a new decoder for reading from the string ``data`` + constructor(data, registry) + { + this.data = data; + this.pos = 0; + this.backrefs = []; + this.registry = typeof(registry) === "undefined" ? null : registry; + this.stack = []; // Use for informative error messages + } + + // Read a character from the buffer + readchar() + { + if (this.pos >= this.data.length) + throw new ul4.ValueError("UL4 decoder at EOF"); + return this.data.charAt(this.pos++); + } - // Read a character from the buffer (return null on eof) - readcharoreof: function readcharoreof() { - if (this.pos >= this.data.length) - return null; - return this.data.charAt(this.pos++); - }, + // Read a character from the buffer (return null on eof) + readcharoreof() + { + if (this.pos >= this.data.length) + return null; + return this.data.charAt(this.pos++); + } - // Read next not-whitespace character from the buffer - readblackchar: function readblackchar() { - var re_white = /\s/; + // Read next not-whitespace character from the buffer + readblackchar() + { + let re_white = /\s/; - for (; ;) { - if (this.pos >= this.data.length) - throw "UL4 decoder at EOF"; - var c = this.data.charAt(this.pos++); - if (!c.match(re_white)) - return c; + for (;;) + { + if (this.pos >= this.data.length) + throw new ul4.ValueError("UL4 decoder at EOF at position " + this.pos + " with path " + this.stack.join("/")); + let c = this.data.charAt(this.pos++); + if (!c.match(re_white)) + return c; + } } - }, - // Read ``size`` characters from the buffer - read: function read(size) { - if (this.pos + size > this.length) - size = this.length - this.pos; - var result = this.data.substring(this.pos, this.pos + size); - this.pos += size; - return result; - }, + // Read ``size`` characters from the buffer + read(size) + { + if (this.pos+size > this.length) + size = this.length-this.pos; + let result = this.data.substring(this.pos, this.pos+size); + this.pos += size; + return result; + } - // "unread" one character - backup: function backup() { - --this.pos; - }, + // "unread" one character + backup() + { + --this.pos; + } - // Read a number from the buffer - readnumber: function readnumber() { - var re_digits = /[-+0123456789.eE]/, value = ""; - for (; ;) { - var c = this.readcharoreof(); - if (c !== null && c.match(re_digits)) - value += c; - else { - var result = parseFloat(value); - if (result == NaN) - throw "invalid number, got " + ul4._repr("value") + " at position " + this.pos; - return result; + // Read a number from the buffer + readnumber() + { + let re_digits = /[-+0123456789.eE]/, value = ""; + for (;;) + { + let c = this.readcharoreof(); + if (c !== null && c.match(re_digits)) + value += c; + else + { + let result = parseFloat(value); + if (isNaN(result)) + throw new ul4.ValueError("invalid number, got " + ul4._repr("value") + " at position " + this.pos + " with path " + this.stack.join("/")); + return result; + } } } - }, - _beginfakeloading: function _beginfakeloading() { - var oldpos = this.backrefs.length; - this.backrefs.push(null); - return oldpos; - }, + _beginfakeloading() + { + let oldpos = this.backrefs.length; + this.backrefs.push(null); + return oldpos; + } - _endfakeloading: function _endfakeloading(oldpos, value) { - this.backrefs[oldpos] = value; - }, + _endfakeloading(oldpos, value) + { + this.backrefs[oldpos] = value; + } - _readescape: function _readescape(escapechar, length) { - var chars = this.read(length); - if (chars.length != length) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - var codepoint = parseInt(chars, 16); - if (isNaN(codepoint)) - throw "broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos; - return String.fromCharCode(codepoint); - }, + _readescape(escapechar, length) + { + let chars = this.read(length); + if (chars.length != length) + throw new ul4.ValueError("broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos + " with path " + this.stack.join("/")); + let codepoint = parseInt(chars, 16); + if (isNaN(codepoint)) + throw new ul4.ValueError("broken escape " + ul4._repr("\\" + escapechar + chars) + " at position " + this.pos + " with path " + this.stack.join("/")); + return String.fromCharCode(codepoint); + } - // Load the next object from the buffer - load: function load() { - var typecode = this.readblackchar(); - var result; - switch (typecode) { - case "^": - return this.backrefs[this.readnumber()]; - case "n": - case "N": - if (typecode === "N") - this.backrefs.push(null); - return null; - case "b": - case "B": - result = this.readchar(); - if (result === "T") - result = true; - else if (result === "F") - result = false; - else - throw "wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos; - if (typecode === "B") - this.backrefs.push(result); - return result; - case "i": - case "I": - case "f": - case "F": - result = this.readnumber(); - if (typecode === "I" || typecode === "F") - this.backrefs.push(result); - return result; - case "s": - case "S": - result = []; - var delimiter = this.readblackchar(); - for (; ;) { - var c = this.readchar(); - if (c == delimiter) - break; - if (c == "\\") { - var c2 = this.readchar(); - if (c2 == "\\") - result.push("\\"); - else if (c2 == "n") - result.push("\n"); - else if (c2 == "r") - result.push("\r"); - else if (c2 == "t") - result.push("\t"); - else if (c2 == "f") - result.push("\u000c"); - else if (c2 == "b") - result.push("\u0008"); - else if (c2 == "a") - result.push("\u0007"); - else if (c2 == "'") - result.push("'"); - else if (c2 == '"') - result.push('"'); - else if (c2 == "x") - result.push(this._readescape("x", 2)); - else if (c2 == "u") - result.push(this._readescape("u", 4)); - else if (c2 == "U") - result.push(this._readescape("U", 8)); + // Load the next object from the buffer + load() + { + let typecode = this.readblackchar(); + let result; + switch (typecode) + { + case "^": + return this.backrefs[this.readnumber()]; + case "n": + case "N": + if (typecode === "N") + this.backrefs.push(null); + return null; + case "b": + case "B": + result = this.readchar(); + if (result === "T") + result = true; + else if (result === "F") + result = false; + else + throw new ul4.ValueError("wrong value for boolean, expected 'T' or 'F', got " + ul4._repr(result) + " at position " + this.pos + " with path " + this.stack.join("/")); + if (typecode === "B") + this.backrefs.push(result); + return result; + case "i": + case "I": + case "f": + case "F": + result = this.readnumber(); + if (typecode === "I" || typecode === "F") + this.backrefs.push(result); + return result; + case "s": + case "S": + result = []; + let delimiter = this.readblackchar(); + for (;;) + { + let c = this.readchar(); + if (c == delimiter) + break; + if (c == "\\") + { + let c2 = this.readchar(); + if (c2 == "\\") + result.push("\\"); + else if (c2 == "n") + result.push("\n"); + else if (c2 == "r") + result.push("\r"); + else if (c2 == "t") + result.push("\t"); + else if (c2 == "f") + result.push("\u000c"); + else if (c2 == "b") + result.push("\u0008"); + else if (c2 == "a") + result.push("\u0007"); + else if (c2 == "'") + result.push("'"); + else if (c2 == '"') + result.push('"'); + else if (c2 == "x") + result.push(this._readescape("x", 2)); + else if (c2 == "u") + result.push(this._readescape("u", 4)); + else if (c2 == "U") + result.push(this._readescape("U", 8)); + else + result.push("\\" + c2); + } else - result.push("\\" + c2); + result.push(c); } - else - result.push(c); - } - result = result.join(""); - if (typecode === "S") - this.backrefs.push(result); - return result; - case "c": - case "C": - result = ul4.Color.create(); - if (typecode === "C") - this.backrefs.push(result); - result._r = this.load(); - result._g = this.load(); - result._b = this.load(); - result._a = this.load(); - return result; - case "z": - case "Z": - result = new Date(); - result.setFullYear(this.load()); - result.setDate(1); - result.setMonth(this.load() - 1); - result.setDate(this.load()); - result.setHours(this.load()); - result.setMinutes(this.load()); - result.setSeconds(this.load()); - result.setMilliseconds(this.load() / 1000); - if (typecode === "Z") - this.backrefs.push(result); - return result; - case "t": - case "T": - result = ul4.TimeDelta.create(); - result._days = this.load(); - result._seconds = this.load(); - result._microseconds = this.load(); - if (typecode === "T") - this.backrefs.push(result); - return result; - case "r": - case "R": - result = ul4.slice.create(); - if (typecode === "R") - this.backrefs.push(result); - result.start = this.load(); - result.stop = this.load(); - return result; - case "m": - case "M": - result = ul4.MonthDelta.create(); - if (typecode === "M") - this.backrefs.push(result); - result._months = this.load(); - return result; - case "l": - case "L": - result = []; - if (typecode === "L") - this.backrefs.push(result); - for (; ;) { - typecode = this.readblackchar(); - if (typecode === "]") - return result; - this.backup(); - result.push(this.load()); - } - return result; - case "d": - case "D": - case "e": - case "E": - if (!ul4on._havemap && (typecode == "e" || typecode == "E")) - throw "ordered dictionaries are not supported!"; - result = ul4on._emptymap(); - if (typecode === "D" || typecode === "E") - this.backrefs.push(result); - for (; ;) { - typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - var key = this.load(); - var value = this.load(); - ul4on._setmap(result, key, value); + result = result.join(""); + if (typecode === "S") + this.backrefs.push(result); + return result; + case "c": + case "C": + result = new ul4.Color(); + if (typecode === "C") + this.backrefs.push(result); + result._r = this.load(); + result._g = this.load(); + result._b = this.load(); + result._a = this.load(); + return result; + case "x": + case "X": + { + let year = this.load(); + let month = this.load(); + let day = this.load(); + result = new ul4.Date(year, month, day); + if (typecode === "X") + this.backrefs.push(result); + return result; } - return result; - case "y": - case "Y": - result = ul4on._makeset(); - if (typecode === "Y") - this.backrefs.push(result); - for (; ;) { + case "z": + case "Z": + result = new Date(); + result.setFullYear(this.load()); + result.setDate(1); + result.setMonth(this.load() - 1); + result.setDate(this.load()); + result.setHours(this.load()); + result.setMinutes(this.load()); + result.setSeconds(this.load()); + result.setMilliseconds(this.load()/1000); + if (typecode === "Z") + this.backrefs.push(result); + return result; + case "t": + case "T": + result = new ul4.TimeDelta(); + result._days = this.load(); + result._seconds = this.load(); + result._microseconds = this.load(); + if (typecode === "T") + this.backrefs.push(result); + return result; + case "r": + case "R": + result = new ul4.slice(); + if (typecode === "R") + this.backrefs.push(result); + result.start = this.load(); + result.stop = this.load(); + return result; + case "m": + case "M": + result = new ul4.MonthDelta(); + if (typecode === "M") + this.backrefs.push(result); + result._months = this.load(); + return result; + case "l": + case "L": + this.stack.push("list"); + result = []; + if (typecode === "L") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "]") + break; + this.backup(); + result.push(this.load()); + } + this.stack.pop(); + return result; + case "d": + case "D": + case "e": + case "E": + if (!ul4._havemap && (typecode == "e" || typecode == "E")) + throw new ul4.ValueError("ordered dictionaries are not supported at position " + this.pos + " with path " + this.stack.join("/")); + result = ul4._emptymap(); + this.stack.push(typecode === "d" || typecode === "D" ? "dict" : "odict"); + if (typecode === "D" || typecode === "E") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + break; + this.backup(); + let key = this.load(); + let value = this.load(); + ul4._setmap(result, key, value); + } + this.stack.pop(); + return result; + case "y": + case "Y": + this.stack.push("set"); + result = ul4._makeset(); + if (typecode === "Y") + this.backrefs.push(result); + for (;;) + { + typecode = this.readblackchar(); + if (typecode === "}") + break; + this.backup(); + result.add(this.load()); + } + this.stack.pop(); + return result; + case "o": + case "O": + { + let oldpos; + if (typecode === "O") + oldpos = this._beginfakeloading(); + let name = this.load(); + this.stack.push(name); + let constructor; + if (this.registry !== null) + { + constructor = this.registry[name]; + if (typeof(constructor) === "undefined") + constructor = ul4._registry[name]; + } + else + constructor = ul4._registry[name]; + if (typeof(constructor) === "undefined") + throw new ul4.ValueError("can't load object of type " + ul4._repr(name) + " at position " + this.pos + " with path " + this.stack.join("/")); + result = new constructor(); + if (typecode === "O") + this._endfakeloading(oldpos, result); + result.ul4onload(this); typecode = this.readblackchar(); - if (typecode === "}") - return result; - this.backup(); - result.add(this.load()); - } - return result; - case "o": - case "O": - var oldpos; - if (typecode === "O") - oldpos = this._beginfakeloading(); - var name = this.load(); - var proto; - if (this.registry !== null) { - proto = this.registry[name]; - if (typeof (proto) === "undefined") - proto = ul4on._registry[name]; + if (typecode !== ")") + throw new ul4.ValueError("object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos + " with path " + this.stack.join("/")); + this.stack.pop(); + return result; } - else - proto = ul4on._registry[name]; - if (typeof (proto) === "undefined") - throw "can't load object of type " + ul4._repr(name); - result = proto(); - if (typecode === "O") - this._endfakeloading(oldpos, result); - result.ul4onload(this); - typecode = this.readblackchar(); - if (typecode !== ")") - throw "object terminator ')' for object of type '" + name + "' expected, got " + ul4._repr(typecode) + " at position " + this.pos; - return result; - default: - throw "unknown typecode " + ul4._repr(typecode) + " at position " + this.pos; + default: + throw new ul4.ValueError("unknown typecode " + ul4._repr(typecode) + " at position " + this.pos + " with path " + this.stack.join("/")); + } } - }, - // Return an iterator for loading the content of a object - loadcontent: function load(loadcontent) { - let self = this; - return { - next: function () { - let typecode = self.readblackchar(); - self.backup(); - if (typecode == ")") - return { done: true }; - else - return { done: false, value: self.load() }; - } - }; - } -}; - - -// -// UL4 -// - -// REs for parsing JSON -ul4._rvalidchars = /^[\],:{}\s]*$/; -ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; -ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; -ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - -/// Helper functions - -// Crockford style object creation -ul4._simpleclone = function _simpleclone(obj) { - function F() { }; - F.prototype = obj; - var result = new F(); - return result; -}; - -// Crockford style object creation + prototype chain + object ids -ul4._clone = function _clone(obj) { - var result = ul4._simpleclone(obj); - result.__prototype__ = obj; - result.__id__ = ul4.Proto._nextid++; - return result; -}; - -// Adds attributes from on object to another and returns it -ul4._extend = function _extend(obj, attrs) { - for (var name in attrs) - obj[name] = attrs[name]; - return obj; -}; - -// Clone an object via ``_simpleclone`` and extend it -ul4._simpleinherit = function _simpleinherit(baseobj, attrs) { - return ul4._extend(ul4._simpleclone(baseobj), attrs); -}; - -// Clone an object via ``_clone`` and extend it -ul4._inherit = function _inherit(baseobj, attrs) { - return ul4._extend(ul4._clone(baseobj), attrs); -}; - -// Convert a map to an object -ul4._map2object = function _map2object(obj) { - if (ul4._ismap(obj)) { - var newobj = {}; - obj.forEach(function (value, key) { - if (typeof (key) !== "string") - throw ul4.TypeError.create("keys must be strings"); - newobj[key] = value; - }); - return newobj; - } - return obj; -}; - -// Clip a number to the range [0;max) -ul4._bound = function _bound(value, upper) { - if (value < 0) - return 0; - else if (value > upper) - return upper; - else - return value; -}; - -// Create a pretty stacktrace from an exception -ul4._stacktrace = function _stacktrace(exc) { - var output = ul4._type(exc); - var s = exc.toString(); - if (s) - output += ": " + s; - if (exc.cause) - output += "\n\n" + ul4._stacktrace(exc.cause); - return output; -}; - -// Call a function ``f`` with UL4 argument handling -ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) { - var finalargs; - if (needsobject) { - if (signature === null) { - if (args.length) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = [kwargs]; + // Return an iterator for loading the content of a object + loadcontent() + { + let self = this; + return { + next: function() + { + let typecode = self.readblackchar(); + // Always "unread" the typecode even at the end + // so that at the end of a call to ul4onload() + // the next input is the "end of object" marker + // no matter whether ul4onload() uses loadcontent() or not. + self.backup(); + if (typecode == ")") + return {done: true}; + else + return {done: false, value: self.load()}; + } + }; } - else - finalargs = [signature.bindObject(name, args, kwargs)]; - } - else { - if (signature === null) - throw ul4.ArgumentError.create(ul4._repr(f) + " doesn't support positional arguments!"); - finalargs = signature.bindArray(name, args, kwargs); - } - if (needscontext) - finalargs.unshift(context); - return f.apply(functioncontext, finalargs); -}; - -ul4._callfunction = function _callfunction(context, f, args, kwargs) { - var name = f._ul4_name || f.name; - if (typeof (f._ul4_signature) === "undefined" || typeof (f._ul4_needsobject) === "undefined" || typeof (f._ul4_needscontext) === "undefined") - throw ul4.TypeError.create("call", "function " + ul4.repr(f) + " is not callable by UL4"); - return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); -} - -ul4._callobject = function _callobject(context, obj, args, kwargs) { - if (typeof (obj._ul4_callsignature) === "undefined" || typeof (obj._ul4_callneedsobject) === "undefined" || typeof (obj._ul4_callneedscontext) === "undefined") - throw ul4.TypeError.create("call", ul4.type(obj) + " object is not callable by UL4"); - return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); -} - -ul4._callrender = function _callrender(context, obj, args, kwargs) { - if (typeof (obj._ul4_rendersignature) === "undefined" || typeof (obj._ul4_renderneedsobject) === "undefined" || typeof (obj._ul4_renderneedscontext) === "undefined") - throw ul4.TypeError.create("render", ul4.type(obj) + " object is not renderable by UL4"); - return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); -} - -ul4._call = function _call(context, f, args, kwargs) { - if (typeof (f) === "function") - return ul4._callfunction(context, f, args, kwargs); - else if (f && typeof (f.__call__) === "function") - return ul4._callobject(context, f, args, kwargs); - else - throw ul4.TypeError.create("call", ul4._type(f) + " is not callable"); -} + }; -ul4._unpackvar = function _unpackvar(lvalue, value) { - if (!ul4._islist(lvalue)) - return [[lvalue, value]]; - else { - var newvalue = []; - var iter = ul4._iter(value); + // + // UL4 + // - for (var i = 0; ; ++i) { - var item = iter.next(); + // REs for parsing JSON + ul4._rvalidchars = /^[\],:{}\s]*$/; + ul4._rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + ul4._rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + ul4._rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; - if (item.done) { - if (i === lvalue.length) - break; - else - throw ul4.ValueError.create("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); - } - else { - if (i < lvalue.length) - newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); - else - throw ul4.ValueError.create("too many values to unpack (expected " + lvalue.length + ")"); - } - } - return newvalue; - } -}; + /// Helper functions + + // Clone an object and extend it + ul4._inherit = function _inherit(baseobj, attrs) + { + return Object.assign(Object.create(baseobj), attrs); + }; -ul4._formatsource = function _formatsource(out) { - var finalout = []; - var level = 0, needlf = false; - for (var i = 0; i < out.length; ++i) { - if (typeof (out[i]) === "number") { - level += out[i]; - needlf = true; + // Convert a map to an object + ul4._map2object = function _map2object(obj) + { + if (ul4._ismap(obj)) + { + let newobj = {}; + obj.forEach(function(value, key){ + if (typeof(key) !== "string") + throw new ul4.TypeError("keys must be strings"); + newobj[key] = value; + }); + return newobj; } - else { - if (needlf) { - finalout.push("\n"); - for (var j = 0; j < level; ++j) - finalout.push("\t"); - needlf = false; + return obj; + }; + + // Clip a number to the range [0;max) + ul4._bound = function _bound(value, upper) + { + if (value < 0) + return 0; + else if (value > upper) + return upper; + else + return value; + }; + + // Create a pretty stacktrace from an exception + ul4._stacktrace = function _stacktrace(exc) + { + let output = (exc instanceof ul4.Exception ? exc.constructor.name + ": " : "") + exc.toString(); + if (exc.context) + output = ul4._stacktrace(exc.context) + "\n\n" + output; + return output; + }; + + // Call a function ``f`` with UL4 argument handling + ul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs) + { + let finalargs; + if (needsobject) + { + if (signature === null) + { + if (args.length) + throw new ul4.ArgumentError(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = [kwargs]; } - finalout.push(out[i]); + else + finalargs = [signature.bindObject(name, args, kwargs)]; } - } - if (needlf) - finalout.push("\n"); - return finalout.join(""); -}; - -// Compare ``obj1`` and ``obj2`` if they have the same value -ul4._eq = function _eq(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__eq__) === "function") - return obj1.__eq__(obj2); - else if (obj2 && typeof (obj2.__eq__) === "function") - return obj2.__eq__(obj1); - else if (obj1 === null) - return obj2 === null; - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 == obj2 - else - return false; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 == obj2; - else - return false; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() == obj2.getTime(); else - return false; - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.length != obj2.length) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations - return false; - } - return true; - } + { + if (signature === null) + throw new ul4.ArgumentError(ul4._repr(f) + " doesn't support positional arguments!"); + finalargs = signature.bindArray(name, args, kwargs); + } + if (needscontext) + finalargs.unshift(context); + return f.apply(functioncontext, finalargs); + }; + + ul4._callfunction = function _callfunction(context, f, args, kwargs) + { + let name = f._ul4_name || f.name; + if (typeof(f._ul4_signature) === "undefined" || typeof(f._ul4_needsobject) === "undefined" || typeof(f._ul4_needscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(f) + " is not callable by UL4"); + return ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs); + }; + + ul4._callobject = function _callobject(context, obj, args, kwargs) + { + if (typeof(obj._ul4_callsignature) === "undefined" || typeof(obj._ul4_callneedsobject) === "undefined" || typeof(obj._ul4_callneedscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(obj) + " is not callable by UL4"); + return ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs); + }; + + ul4._callrender = function _callrender(context, obj, args, kwargs) + { + if (typeof(obj._ul4_rendersignature) === "undefined" || typeof(obj._ul4_renderneedsobject) === "undefined" || typeof(obj._ul4_renderneedscontext) === "undefined") + throw new ul4.TypeError(ul4._repr(obj) + " is not renderable by UL4"); + return ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs); + }; + + ul4._call = function _call(context, f, args, kwargs) + { + if (typeof(f) === "function") + return ul4._callfunction(context, f, args, kwargs); + else if (f && typeof(f.__call__) === "function") + return ul4._callobject(context, f, args, kwargs); else - return false; - } - else if (ul4._isobject(obj1)) { - if (ul4._isobject(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) { - if (obj2.hasOwnProperty(key)) { - if (!ul4._eq(obj1[key], obj2[key])) - return false; + throw new ul4.TypeError(ul4._type(f) + " is not callable"); + }; + + ul4._unpackvar = function _unpackvar(lvalue, value) + { + if (!ul4._islist(lvalue)) + return [[lvalue, value]]; + else + { + let newvalue = []; + let iter = ul4._iter(value); + + for (let i = 0;;++i) + { + let item = iter.next(); + + if (item.done) + { + if (i === lvalue.length) + break; + else + throw new ul4.ValueError("need " + lvalue.length + " value" + (lvalue.length === 1 ? "" : "s") + " to unpack, got " + i); } else - return false; - } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) { - if (!obj1.hasOwnProperty(key)) - return false; - } - return true; - } - else if (ul4._ismap(obj2)) { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - for (var key in obj1) { - if (obj2.has(key)) { - if (!ul4._eq(obj1[key], obj2.get(key))) - return false; + { + if (i < lvalue.length) + newvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value)); + else + throw new ul4.ValueError("too many values to unpack (expected " + lvalue.length + ")"); } - else - return false; } - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - var result = true; - obj2.forEach(function (value, key) { - if (!obj1.hasOwnProperty(key)) - result = false; - }); - return result; + return newvalue; } - else - return false; - } - else if (ul4._ismap(obj1)) { - if (ul4._isobject(obj2)) { - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function (value, key) { - if (result) // Skip code, if result is already ``false`` + }; + + ul4._formatsource = function _formatsource(out) + { + let finalout = []; + let level = 0, needlf = false; + for (let i = 0; i < out.length; ++i) + { + let part = out[i]; + if (typeof(part) === "number") + { + level += part; + needlf = true; + } + else + { + if (needlf) { - if (!obj2.hasOwnProperty(key)) - result = false; - else if (!ul4._eq(obj1.get(key), obj2[key])) - result = false; + finalout.push("\n"); + for (let j = 0; j < level; ++j) + finalout.push("\t"); + needlf = false; } - }); - if (!result) + finalout.push(part); + } + } + if (needlf) + finalout.push("\n"); + return finalout.join(""); + }; + + // Compare ``obj1`` and ``obj2`` if they have the same value + ul4._eq = function _eq(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__eq__) === "function") + return obj1.__eq__(obj2); + else if (obj2 && typeof(obj2.__eq__) === "function") + return obj2.__eq__(obj1); + else if (obj1 === null) + return obj2 === null; + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 == obj2; + else + return false; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 == obj2; + else return false; - // Test that each attribute of ``obj2`` is alos in ``obj1`` (the value has been tested before) - for (var key in obj2) { - if (!obj1.has(key)) + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() == obj2.getTime(); + else + return false; + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.length != obj2.length) return false; + for (let i = 0; i < obj1.length; ++i) + { + if (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations + return false; + } + return true; } - return true; + else + return false; } - else if (ul4._ismap(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) + else if (ul4._isobject(obj1)) + { + if (ul4._isobject(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (let key in obj1) + { + if (obj2.hasOwnProperty(key)) + { + if (!ul4._eq(obj1[key], obj2[key])) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + for (let key in obj2) + { + if (!obj1.hasOwnProperty(key)) + return false; + } return true; - if (obj1.size != obj2.size) + } + else if (ul4._ismap(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + for (let key in obj1) + { + if (obj2.has(key)) + { + if (!ul4._eq(obj1[key], obj2.get(key))) + return false; + } + else + return false; + } + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + let result = true; + obj2.forEach(function(value, key) { + if (!obj1.hasOwnProperty(key)) + result = false; + }, this); + return result; + } + else return false; - // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value - var result = true; - obj1.forEach(function (value, key) { - if (result) // Skip code, if result is already ``false`` + } + else if (ul4._ismap(obj1)) + { + if (ul4._isobject(obj2)) + { + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + obj1.forEach(function(value, key) { + if (!obj2.hasOwnProperty(key)) + return false; + else if (!ul4._eq(obj1.get(key), obj2[key])) + return false; + }, this); + // Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before) + for (let key in obj2) { + if (!obj1.has(key)) + return false; + } + return true; + } + else if (ul4._ismap(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + let result = true; + // Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value + obj1.forEach(function(value, key) { if (!obj2.has(key)) result = false; else if (!ul4._eq(obj1.get(key), obj2.get(key))) result = false; - } - }); - return result; - } - else - return false; - } - else if (ul4._isset(obj1)) { - // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` - if (ul4._isset(obj2)) { - // Shortcut, if it's the same object - if (obj1 === obj2) - return true; - if (obj1.size != obj2.size) + }); + return result; + } + else return false; - var result = true; - obj1.forEach(function (value) { - if (result) // Skip code, if result is already ``false`` - { + } + else if (ul4._isset(obj1)) + { + // We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__`` + if (ul4._isset(obj2)) + { + // Shortcut, if it's the same object + if (obj1 === obj2) + return true; + if (obj1.size != obj2.size) + return false; + let result = true; + obj1.forEach(function(value) { if (!obj2.has(value)) result = false; - } - }); - return result; + }); + return result; + } + else + return false; } else - return false; - } - else - return obj1 === obj2; -}; - -// Compare ``obj1`` and ``obj2`` if they don't have the same value -ul4._ne = function _ne(obj1, obj2) { - if (obj1 && typeof (obj1.__ne__) === "function") - return obj1.__ne__(obj2); - else if (obj2 && typeof (obj2.__ne__) === "function") - return obj2.__ne__(obj1); - else - return !ul4._eq(obj1, obj2); -} - -ul4._unorderable = function _unorderable(operator, obj1, obj2) { - throw ul4.TypeError.create(operator, "unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); -}; - -// Return: -// -1 when ``obj1 < obj2``, -// 0 when ``obj1 == obj2``, -// 1 when ``obj1 > obj2``, -// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) -// raise TypeError if objects are uncomparable -// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= -// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps - -ul4._cmp = function _cmp(operator, obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return (obj1 > obj2) - (obj1 < obj2); - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return (obj1 > obj2) - (obj1 < obj2); - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) { - var v1 = obj1.getTime(), v2 = obj2.getTime(); - return (v1 > v2) - (v1 < v2); + return obj1 === obj2; + }; + + // Compare ``obj1`` and ``obj2`` if they don't have the same value + ul4._ne = function _ne(obj1, obj2) + { + if (obj1 && typeof(obj1.__ne__) === "function") + return obj1.__ne__(obj2); + else if (obj2 && typeof(obj2.__ne__) === "function") + return obj2.__ne__(obj1); + else + return !ul4._eq(obj1, obj2); + }; + + ul4._unorderable = function _unorderable(operator, obj1, obj2) + { + throw new ul4.TypeError("unorderable types: " + ul4._type(obj1) + " " + operator + " " + ul4._type(obj2)); + }; + + // Return: + // -1 when ``obj1 < obj2``, + // 0 when ``obj1 == obj2``, + // 1 when ``obj1 > obj2``, + // null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets) + // raise TypeError if objects are uncomparable + // This the purpose of ``_cmp`` is to support implementation of <, <=, > and >= + // and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps + + ul4._cmp = function _cmp(operator, obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return (obj1 > obj2) - (obj1 < obj2); } - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return 0; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return 1; - var res = ul4._cmp(operator, obj1[i], obj2[i]); - if (res) - return res; - } - return obj2.length > obj1.length ? -1 : 0; + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return (obj1 > obj2) - (obj1 < obj2); } - } - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + { + let v1 = obj1.getTime(), v2 = obj2.getTime(); + return (v1 > v2) - (v1 < v2); } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return 0; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return 1; + let res = ul4._cmp(operator, obj1[i], obj2[i]); + if (res) + return res; } + return obj2.length > obj1.length ? -1 : 0; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + if (ul4._isset(obj2) || ul4._isul4set(obj2)) + { + let in1only = false; + let in2only = false; + + for (let iter = _iter(obj1);;) + { + let item = iter.next(); + if (item.done) break; - } - } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { + if (!obj2.has(item.value)) + { in1only = true; break; } } - for (var value in obj2.items) { - if (!obj1.items[value]) { + for (let iter = _iter(obj2);;) + { + let item = iter.next(); + if (item.done) + break; + if (!obj1.has(item.value)) + { in2only = true; break; } } + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } + else + { + if (in2only) + return -1; + else + return 0; + } } } - else - ul4._unorderable(operator, obj1, obj2); + return ul4._unorderable(operator, obj1, obj2); + }; - if (in1only) { - if (in2only) - return null; - else - return 1; - } - else { - if (in2only) - return -1; - else - return 0; - } - } - else - ul4._unorderable(operator, obj1, obj2); -} - -// Return whether ``obj1 < obj2`` -ul4._lt = function _lt(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__lt__) === "function") - return obj1.__lt__(obj2); - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 < obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 < obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() < obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) + // Return whether ``obj1 < obj2`` + ul4._lt = function _lt(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__lt__) === "function") + return obj1.__lt__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 < obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 < obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() < obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); + } + return obj1.length < obj2.length; } - return obj1.length < obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1)) { - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1)) + { + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + for (let key in obj1) + { + if (!obj2.has(obj1[key])) + in1only = true; + } + for (let key in obj2) + { + if (!obj1.has(obj2[key])) + in2only = true; } } - } - } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let key in obj1) + { + if (!obj2.items[obj1[key]]) + in1only = true; + } + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } - } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + for (let key in obj2) + { + if (!obj1.items[obj2[key]]) + in2only = true; + } + } + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable("<", obj1, obj2); -}; - -// Return whether ``obj1 <= obj2`` -ul4._le = function _le(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__le__) === "function") - return obj1.__le__(obj2); - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 <= obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 <= obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() <= obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return false; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._lt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length <= obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable("<", obj1, obj2); + }; + + // Return whether ``obj1 <= obj2`` + ul4._le = function _le(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__le__) === "function") + return obj1.__le__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 <= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 <= obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() <= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return false; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._lt(obj1[i], obj2[i]); } + return obj1.length <= obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable("<=", obj1, obj2); -}; - -// Return whether ``obj1 > obj2`` -ul4._gt = function _gt(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__gt__) === "function") - return obj1.__gt__(obj2); - if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 > obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 > obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() > obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return false; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length > obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable("<=", obj1, obj2); + }; + + // Return whether ``obj1 > obj2`` + ul4._gt = function _gt(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__gt__) === "function") + return obj1.__gt__(obj2); + if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 > obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 > obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() > obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return false; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); } + return obj1.length > obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; - } + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + { + in2only = true; + } + }); } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; else - return 1; - } - else { - if (in2only) - return -1; + ul4._unorderable(operator, obj1, obj2); + + if (in1only) + { + if (in2only) + return null; + else + return 1; + } else - return 0; - } - } - ul4._unorderable(">", obj1, obj2); -}; - -// Return whether ``obj1 >= obj2`` -ul4._ge = function _ge(obj1, obj2) { - var numbertypes = ["boolean", "number"]; - - if (obj1 && typeof (obj1.__ge__) === "function") - return obj1.__ge__(obj2); - else if (numbertypes.indexOf(typeof (obj1)) != -1) { - if (numbertypes.indexOf(typeof (obj2)) != -1) - return obj1 >= obj2; - } - else if (typeof (obj1) === "string") { - if (typeof (obj2) === "string") - return obj1 >= obj2; - } - else if (ul4._isdate(obj1)) { - if (ul4._isdate(obj2)) - return obj1.getTime() >= obj2.getTime(); - } - else if (ul4._islist(obj1)) { - if (ul4._islist(obj2)) { - if (obj1 === obj2) - return true; - for (var i = 0; i < obj1.length; ++i) { - if (i >= obj2.length) - return true; - var eq = ul4._eq(obj1[i], obj2[i]); - if (!eq) - return ul4._gt(obj1[i], obj2[i]); + { + if (in2only) + return -1; + else + return 0; } - return obj1.length >= obj2.length; } - } - // FIXME: Set comparison - else if (ul4._isset(obj1) || ul4._isul4set(obj1)) { - var in1only = false; - var in2only = false; - - if (ul4._isset(obj2)) { - if (ul4._isset(obj2)) { - obj1.forEach(function (value) { - if (!obj2.has(value)) - in1only = true; - }); - obj2.forEach(function (value) { - if (!obj1.has(value)) - in2only = true; - }); - } - else if (ul4._isul4set(obj2)) { - obj1.forEach(function (value) { - if (!obj2.items[value]) - in1only = true; - }); - for (var value in obj2.items) { - if (!obj1.has(value)) { - in2only = true; - break; - } + ul4._unorderable(">", obj1, obj2); + }; + + // Return whether ``obj1 >= obj2`` + ul4._ge = function _ge(obj1, obj2) + { + let numbertypes = ["boolean", "number"]; + + if (obj1 && typeof(obj1.__ge__) === "function") + return obj1.__ge__(obj2); + else if (numbertypes.indexOf(typeof(obj1)) != -1) + { + if (numbertypes.indexOf(typeof(obj2)) != -1) + return obj1 >= obj2; + } + else if (typeof(obj1) === "string") + { + if (typeof(obj2) === "string") + return obj1 >= obj2; + } + else if (ul4._isdatetime(obj1)) + { + if (ul4._isdatetime(obj2)) + return obj1.getTime() >= obj2.getTime(); + } + else if (ul4._islist(obj1)) + { + if (ul4._islist(obj2)) + { + if (obj1 === obj2) + return true; + for (let i = 0; i < obj1.length; ++i) + { + if (i >= obj2.length) + return true; + let eq = ul4._eq(obj1[i], obj2[i]); + if (!eq) + return ul4._gt(obj1[i], obj2[i]); } + return obj1.length >= obj2.length; } } - else if (ul4._isul4set(obj2)) { - if (ul4._isset(obj2)) { - for (var value in obj1.items) { - if (!obj2.has(value)) { - in1only = true; - break; + // FIXME: Set comparison + else if (ul4._isset(obj1) || ul4._isul4set(obj1)) + { + let in1only = false; + let in2only = false; + + if (ul4._isset(obj2)) + { + if (ul4._isset(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.has(value)) + in1only = true; + }); + obj2.forEach(function(value) { + if (!obj1.has(value)) + in2only = true; + }); + } + else if (ul4._isul4set(obj2)) + { + obj1.forEach(function(value) { + if (!obj2.items[value]) + in1only = true; + }); + for (let value in obj2.items) + { + if (!obj1.has(value)) + { + in2only = true; + break; + } } } - obj2.forEach(function (value) { - if (!obj1.items[value]) - in2only = true; - }); } - else if (ul4._isul4set(obj2)) { - for (var value in obj1.items) { - if (!obj2.items[value]) { - in1only = true; - break; + else if (ul4._isul4set(obj2)) + { + if (ul4._isset(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.has(value)) + { + in1only = true; + break; + } } + obj2.forEach(function(value, key) { + if (!obj1.items[value]) + in2only = true; + }); } - for (var value in obj2.items) { - if (!obj1.items[value]) { - in2only = true; - break; + else if (ul4._isul4set(obj2)) + { + for (let value in obj1.items) + { + if (!obj2.items[value]) + { + in1only = true; + break; + } + } + for (let value in obj2.items) + { + if (!obj1.items[value]) + { + in2only = true; + break; + } } } } - } - else - ul4._unorderable(operator, obj1, obj2); - - if (in1only) { - if (in2only) - return null; - else - return 1; - } - else { - if (in2only) - return -1; else - return 0; - } - } - ul4._unorderable(">=", obj1, obj2); -}; + ul4._unorderable(operator, obj1, obj2); -// Return an iterator for ``obj`` -ul4._iter = function _iter(obj) { - if (typeof (obj) === "string" || ul4._islist(obj)) { - return { - index: 0, - next: function () { - if (this.index < obj.length) - return { value: obj[this.index++], done: false }; + if (in1only) + { + if (in2only) + return null; else - return { done: true }; - } - }; - } - else if (ul4._isiter(obj)) - return obj; - else if (obj !== null && typeof (obj.__iter__) === "function") - return obj.__iter__(); - else if (ul4._ismap(obj)) { - var keys = []; - obj.forEach(function (value, key) { - keys.push(key); - }); - return { - index: 0, - next: function () { - if (this.index >= keys.length) - return { done: true }; - return { value: keys[this.index++], done: false }; - } - }; - } - else if (ul4._isset(obj)) { - var values = []; - obj.forEach(function (value, key) { - values.push(value); - }); - return { - index: 0, - next: function () { - if (this.index >= values.length) - return { done: true }; - return { value: values[this.index++], done: false }; + return 1; } - }; - } - else if (ul4._isul4set(obj)) { - return ul4._iter(obj.items); - } - else if (ul4._isobject(obj)) { - var keys = []; - for (var key in obj) - keys.push(key); - return { - index: 0, - next: function () { - if (this.index >= keys.length) - return { done: true }; - return { value: keys[this.index++], done: false }; + else + { + if (in2only) + return -1; + else + return 0; } - }; - } - throw ul4.TypeError.create("iter", ul4._type(obj) + " object is not iterable"); -}; - -ul4._str_repr = function _str_repr(str, ascii) { - var result = ""; - var squote = false, dquote = false; - - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - if (c == '"') { - dquote = true; - if (squote) - break; - } - else if (c == "'") { - squote = true; - if (dquote) - break; } - } - - // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes - var quote = (squote && !dquote) ? '"' : "'"; + ul4._unorderable(">=", obj1, obj2); + }; - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - switch (c) { - case '"': - result += (quote == c) ? '\\"' : c; - break; - case "'": - result += (quote == c) ? "\\'" : c; - break; - case "\\": - result += "\\\\"; - break; - case "\t": - result += "\\t"; - break; - case "\n": - result += "\\n"; - break; - case "\r": - result += "\\r"; - break; - default: - var code = str.charCodeAt(i); - var escape; - if (code < 32) - escape = 2; - else if (code < 0x7f) - escape = 0; - else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) - escape = 0; - else if (code <= 0xff) - escape = 2; - else if (code <= 0xffff) - escape = 4; - else - escape = 8; - - if (escape === 0) - result += c; - else if (escape === 2) - result += "\\x" + ul4._lpad(code.toString(16), "0", 2); - else if (escape === 4) - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - else - result += "\\U" + ul4._lpad(code.toString(16), "0", 8); - break; + // Return an iterator for ``obj`` + ul4._iter = function _iter(obj) + { + if (typeof(obj) === "string" || ul4._islist(obj)) + { + return { + index: 0, + next: function() + { + if (this.index < obj.length) + return {value: obj[this.index++], done: false}; + else + return {done: true}; + } + }; } - } - return quote + result + quote; -}; - -ul4._date_repr = function _date_repr(obj, ascii) { - var year = obj.getFullYear(); - var month = obj.getMonth() + 1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - var result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); - - if (hour || minute || second || ms) { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - result += ")"; - - return result; -}; - -ul4._map_repr = function _map_repr(obj, ascii) { - var v = []; - v.push("{"); - - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._repr_internal(key, ascii)); - v.push(": "); - v.push(ul4._repr_internal(value, ascii)); - }); + else if (ul4._isiter(obj)) + return obj; + else if (obj !== null && typeof(obj.__iter__) === "function") + return obj.__iter__(); + else if (ul4._ismap(obj)) + { + let keys = []; + obj.forEach(function(value, key) { + keys.push(key); + }); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + else if (ul4._isset(obj)) + { + let values = []; + obj.forEach(function(item) { + values.push(item); + }); + return { + index: 0, + next: function() + { + if (this.index >= values.length) + return {done: true}; + return {value: values[this.index++], done: false}; + } + }; + } + else if (ul4._isul4set(obj)) + { + return ul4._iter(obj.items); + } + else if (ul4._isobject(obj)) + { + let keys = []; + for (let key in obj) + keys.push(key); + return { + index: 0, + next: function() + { + if (this.index >= keys.length) + return {done: true}; + return {value: keys[this.index++], done: false}; + } + }; + } + throw new ul4.TypeError(ul4._type(obj) + " object is not iterable"); + }; - v.push("}"); - return v.join(""); -}; - -ul4._list_repr = function _list_repr(obj, ascii) { - var v = []; - v.push("["); - for (var i = 0; i < obj.length; ++i) { - if (i !== 0) - v.push(", "); - v.push(ul4._repr_internal(obj[i], ascii)); - } - v.push("]"); - return v.join(""); -}; - -ul4._set_repr = function _set_repr(obj, ascii) { - var v = []; - v.push("{"); - if (!obj.size) - v.push("/"); - else { - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._repr_internal(value, ascii)); - }); - } - v.push("}"); - return v.join(""); -}; - -ul4._object_repr = function _object_repr(obj, ascii) { - var v = []; - v.push("{"); - var i = 0; - for (var key in obj) { - if (!obj.hasOwnProperty(key)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr_internal(key, ascii)); - v.push(": "); - v.push(ul4._repr_internal(obj[key], ascii)); - } - v.push("}"); - return v.join(""); -}; - -ul4._repr_internal = function _repr_internal(obj, ascii) { - if (obj === null) - return "None"; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof (obj) === "string") - return ul4._str_repr(obj, ascii); - else if (typeof (obj) === "number") - return "" + obj; - else if (typeof (obj) === "function") - if (obj._ul4_name || obj.name) - return ""; - else - return ""; - else if (ul4._isdate(obj)) - return ul4._date_repr(obj, ascii); - else if (typeof (obj) === "undefined") - return ""; - else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._islist(obj)) - return ul4._list_repr(obj, ascii); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj, ascii); - else if (ul4._isset(obj)) - return ul4._set_repr(obj, ascii); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj, ascii); - return "?"; -}; - -// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` -ul4._repr = function _repr(obj) { - return ul4._repr_internal(obj, false); -} - -ul4._ascii = function _ascii(obj) { - return ul4._repr_internal(obj, true); -} - -ul4._date_str = function _date_str(obj) { - var year = obj.getFullYear(); - var month = obj.getMonth() + 1; - var day = obj.getDate(); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - - var result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - return result; -}; - -ul4._str = function _str(obj) { - if (typeof (obj) === "undefined") - return ""; - else if (obj === null) - return ""; - else if (obj === false) - return "False"; - else if (obj === true) - return "True"; - else if (typeof (obj) === "string") - return obj; - else if (typeof (obj) === "number") - return obj.toString(); - else if (ul4._isdate(obj)) - return ul4._date_str(obj); - else if (ul4._islist(obj)) - return ul4._list_repr(obj); - else if (ul4._isset(obj)) - return ul4._set_repr(obj); - else if (ul4._ismap(obj)) - return ul4._map_repr(obj); - else if (typeof (obj) === "object" && typeof (obj.__str__) === "function") - return obj.__str__(); - else if (typeof (obj) === "object" && typeof (obj.__repr__) === "function") - return obj.__repr__(); - else if (ul4._isobject(obj)) - return ul4._object_repr(obj); - return "?"; -}; - -// Convert ``obj`` to bool, according to its "truth value" -ul4._bool = function _bool(obj) { - if (typeof (obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") - return false; - else { - if (typeof (obj) === "object", typeof (obj.__bool__) === "function") - return obj.__bool__(); - if (ul4._islist(obj)) - return obj.length !== 0; - else if (ul4._ismap(obj) || ul4._isset(obj)) - return obj.size != 0; - else if (ul4._isobject(obj)) { - for (var key in obj) { - if (!obj.hasOwnProperty(key)) - continue; - return true; + ul4._str_repr = function _str_repr(str, ascii) + { + let result = ""; + let squote = false, dquote = false; + + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + if (c == '"') + { + dquote = true; + if (squote) + break; + } + else if (c == "'") + { + squote = true; + if (dquote) + break; } - return false; } - return true; - } -}; - -// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) -ul4._int = function _int(obj, base) { - var result; - if (base !== null) { - if (typeof (obj) !== "string" || !ul4._isint(base)) - throw ul4.TypeError.create("int()", "int() requires a string and an integer"); - result = parseInt(obj, base); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); + + // Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes + let quote = (squote && !dquote) ? '"' : "'"; + + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + switch (c) + { + case '"': + result += (quote == c) ? '\\"' : c; + break; + case "'": + result += (quote == c) ? "\\'" : c; + break; + case "\\": + result += "\\\\"; + break; + case "\t": + result += "\\t"; + break; + case "\n": + result += "\\n"; + break; + case "\r": + result += "\\r"; + break; + default: + let code = c.charCodeAt(0); + let escape; + if (code < 32) + escape = 2; + else if (code < 0x7f) + escape = 0; + else if (!ascii && !/[\u007f-\u00a0\u00ad\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u0560\u0588\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c-\u061d\u06dd\u070e-\u070f\u074b-\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e-\u082f\u083f\u085c-\u085d\u085f-\u089f\u08b5-\u08e2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c80\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b-\u0d3c\u0d45\u0d49\u0d4f-\u0d56\u0d58-\u0d5e\u0d64-\u0d65\u0d76-\u0d78\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u1680\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e-\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c80-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfb\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff-\u200f\u2028-\u202f\u205f-\u206f\u2072-\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23fb-\u23ff\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e43-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u3000\u3040\u3097-\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ae-\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c5-\ua8cd\ua8da-\ua8df\ua8fe-\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe-\uffff]/.test(c)) + escape = 0; + else if (code <= 0xff) + escape = 2; + else if (code <= 0xffff) + escape = 4; + else + escape = 8; + + if (escape === 0) + result += c; + else if (escape === 2) + result += "\\x" + ul4._lpad(code.toString(16), "0", 2); + else if (escape === 4) + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + else + result += "\\U" + ul4._lpad(code.toString(16), "0", 8); + break; + } + } + return quote + result + quote; + }; + + ul4._date_repr = function _date_repr(obj, ascii) + { + let year = obj._date.getFullYear(); + let month = obj._date.getMonth()+1; + let day = obj._date.getDate(); + let result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + ")"; return result; - } - else { - if (typeof (obj) == "string") { - result = parseInt(obj); - if (result.toString() == "NaN") - throw ul4.TypeError.create("int()", "invalid literal for int()"); - return result; + }; + + ul4._datetime_repr = function _datetime_repr(obj, ascii) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + let result = "@(" + year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + "T"; + + if (hour || minute || second || ms) + { + result += ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2); + if (second || ms) + { + result += ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } } - else if (typeof (obj) == "number") - return Math.floor(obj); - else if (obj === true) - return 1; - else if (obj === false) - return 0; - throw ul4.TypeError.create("int()", "int() argument must be a string or a number"); - } -}; + result += ")"; -// Convert ``obj`` to a float -ul4._float = function _float(obj) { - if (typeof (obj) === "string") - return parseFloat(obj); - else if (typeof (obj) === "number") - return obj; - else if (obj === true) - return 1.0; - else if (obj === false) - return 0.0; - throw ul4.TypeError.create("float()", "float() argument must be a string or a number"); -}; - -// Convert ``obj`` to a list -ul4._list = function _list(obj) { - var iter = ul4._iter(obj); - - var result = []; - for (; ;) { - var value = iter.next(); - if (value.done) - return result; - result.push(value.value); - } -}; + return result; + }; -// Convert ``obj`` to a set -ul4._set = function _set(obj) { - var iter = ul4._iter(obj); + ul4._map_repr = function _map_repr(obj, ascii) + { + let v = []; + v.push("{"); - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (; ;) { - var value = iter.next(); - if (value.done) - return result; - result.add(value.value); - } -}; - -// Return the length of ``sequence`` -ul4._len = function _len(sequence) { - if (typeof (sequence) == "string" || ul4._islist(sequence)) - return sequence.length; - else if (ul4._ismap(sequence) || ul4._isset(sequence)) - return sequence.size; - else if (ul4._isobject(sequence)) { - var i = 0; - for (var key in sequence) - ++i; - return i; - } - throw ul4.TypeError.create("len", "object of type '" + ul4._type(sequence) + "' has no len()"); -}; - -ul4._type = function _type(obj) { - if (obj === null) - return "none"; - else if (obj === false || obj === true) - return "bool"; - else if (typeof (obj) === "undefined") - return "undefined"; - else if (typeof (obj) === "string") - return "str"; - else if (typeof (obj) === "number") - return Math.round(obj) == obj ? "int" : "float"; - else if (ul4._islist(obj)) - return "list"; - else if (ul4._isset(obj)) - return "set"; - else if (ul4._isdate(obj)) - return "date"; - else if (typeof (obj.__type__) !== "undefined") - return obj.__type__; - else if (ul4._istimedelta(obj)) - return "timedelta"; - else if (ul4._isdict(obj)) - return "dict"; - else if (ul4._istemplate(obj)) - return "template"; - else if (ul4._isfunction(obj)) - return "function"; - return null; -}; - - -// Return whether any of the items in ``iterable`` are true -ul4._any = function _any(iterable) { - if (typeof (iterable) == "string") { - for (var i = 0; i < iterable.length; ++i) { - if (iterable[i] !== '\x00') - return true; - } - return false; - } - else { - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - return false; - if (ul4._bool(item.value)) - return true; - } - } -}; + let i = 0; + obj.forEach(function(value, key) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(key, ascii)); + v.push(": "); + v.push(ul4._repr_internal(value, ascii)); + }); -// Return whether all of the items in ``iterable`` are true -ul4._all = function _all(iterable) { - if (typeof (iterable) == "string") { - for (var i = 0; i < iterable.length; ++i) { - if (iterable[i] === '\x00') - return false; - } - return true; - } - else { - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - return true; - if (!ul4._bool(item.value)) - return false; - } - } -}; - -// Check if ``obj`` is undefined -ul4._isundefined = function _isundefined(obj) { - return typeof (obj) === "undefined"; -}; - - -// Check if ``obj`` is *not* undefined -ul4._isdefined = function _isdefined(obj) { - return typeof (obj) !== "undefined"; -}; - -// Check if ``obj`` is ``None`` -ul4._isnone = function _isnone(obj) { - return obj === null; -}; - -// Check if ``obj`` is a boolean -ul4._isbool = function _isbool(obj) { - return typeof (obj) == "boolean"; -}; - -// Check if ``obj`` is a int -ul4._isint = function _isint(obj) { - return (typeof (obj) == "number") && Math.round(obj) == obj; -}; - -// Check if ``obj`` is a float -ul4._isfloat = function _isfloat(obj) { - return (typeof (obj) == "number") && Math.round(obj) != obj; -}; - -// Check if ``obj`` is a string -ul4._isstr = function _isstr(obj) { - return typeof (obj) == "string"; -}; - -// Check if ``obj`` is a date -ul4._isdate = function _isdate(obj) { - return Object.prototype.toString.call(obj) == "[object Date]"; -}; - -// Check if ``obj`` is a color -ul4._iscolor = function _iscolor(obj) { - return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Color)); -}; - -// Check if ``obj`` is a timedelta object -ul4._istimedelta = function _istimedelta(obj) { - return (obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.TimeDelta)); -}; - -// Check if ``obj`` is a monthdelta object -ul4._ismonthdelta = function _ismonthdelta(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.MonthDelta); -}; - -// Check if ``obj`` is a template -ul4._istemplate = function _istemplate(obj) { - return Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure"); -}; - -// Check if ``obj`` is a function -ul4._isfunction = function _isfunction(obj) { - return typeof (obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj.__type__ === "ul4.Template" || obj.__type__ === "ul4.TemplateClosure")); -}; - -// Check if ``obj`` is a list -ul4._islist = function _islist(obj) { - return Object.prototype.toString.call(obj) == "[object Array]"; -}; - -// Check if ``obj`` is a set -ul4._isset = function _isset(obj) { - return Object.prototype.toString.call(obj) == "[object Set]"; -}; - -// Check if ``obj`` is an exception (at least a UL4 exception) -ul4._isexception = function _isexception(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4.Error); -}; - -ul4._isul4set = function _isul4set(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.isa) === "function" && obj.isa(ul4._Set); -}; - -// Check if ``obj`` is an iterator -ul4._isiter = function _isiter(obj) { - return obj !== null && typeof (obj) === "object" && typeof (obj.next) === "function"; -}; - -// Check if ``obj`` is a JS object -ul4._isobject = function _isobject(obj) { - return Object.prototype.toString.call(obj) == "[object Object]" && typeof (obj.__type__) === "undefined"; -}; - -// Check if ``obj`` is a map -ul4._ismap = function _ismap(obj) { - if (ul4on._havemap) - return obj !== null && typeof (obj) === "object" && typeof (obj.__proto__) === "object" && obj.__proto__ === Map.prototype; - return false; -}; - -// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) -ul4._isdict = function _isdict(obj) { - return ul4._isobject(obj) || ul4._ismap(obj); -}; - - -// Repeat string ``str`` ``rep`` times -ul4._str_repeat = function _str_repeat(str, rep) { - var result = ""; - for (; rep > 0; --rep) - result += str; - return result; -}; - -ul4._list_repeat = function _list_repeat(list, rep) { - var result = []; - for (; rep > 0; --rep) - for (var i = 0; i < list.length; ++i) - result.push(list[i]); - return result; -}; - -ul4._str_json = function _str_json(str) { - var result = ""; - for (var i = 0; i < str.length; ++i) { - var c = str[i]; - switch (c) { - case "\r": - result += "\\r"; - break; - case "\n": - result += "\\n"; - break; - case "\t": - result += "\\t"; - break; - case "\\": - result += "\\\\"; - break; - case '"': - result += '\\"'; - break; - default: - var code = str.charCodeAt(i); - if (code >= 32 && code < 128) - result += c; - else - result += "\\u" + ul4._lpad(code.toString(16), "0", 4); - break; - } - } - return '"' + result + '"'; -}; - -// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) -ul4._asjson = function _asjson(obj) { - if (obj === null) - return "null"; - else if (typeof (obj) === "undefined") - return "{}.undefined"; - else if (obj === false) - return "false"; - else if (obj === true) - return "true"; - else if (typeof (obj) === "string") - return ul4._str_json(obj); - else if (typeof (obj) === "number") { - return "" + obj; - } - else if (ul4._islist(obj)) { - var v = []; + v.push("}"); + return v.join(""); + }; + + ul4._list_repr = function _list_repr(obj, ascii) + { + let v = []; v.push("["); - for (var i = 0; i < obj.length; ++i) { - if (i != 0) + for (let i = 0; i < obj.length; ++i) + { + let item = obj[i]; + if (i) v.push(", "); - v.push(ul4._asjson(obj[i])); + v.push(ul4._repr_internal(item, ascii)); } v.push("]"); return v.join(""); - } - else if (ul4._ismap(obj)) { - var v = []; + }; + + ul4._set_repr = function _set_repr(obj, ascii) + { + let v = []; v.push("{"); - var i = 0; - obj.forEach(function (value, key) { - if (i++) - v.push(", "); - v.push(ul4._asjson(key)); - v.push(": "); - v.push(ul4._asjson(value)); - }); + if (!obj.size) + v.push("/"); + else + { + let i = 0; + obj.forEach(function(value) { + if (i++) + v.push(", "); + v.push(ul4._repr_internal(value, ascii)); + }); + } v.push("}"); return v.join(""); - } - else if (ul4._isobject(obj)) { - var v = []; + }; + + ul4._object_repr = function _object_repr(obj, ascii) + { + let v = []; v.push("{"); - var i = 0; - for (var key in obj) { + let i = 0; + for (let key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; if (i++) v.push(", "); - v.push(ul4._asjson(key)); + v.push(ul4._repr_internal(key, ascii)); v.push(": "); - v.push(ul4._asjson(obj[key])); + v.push(ul4._repr_internal(obj[key], ascii)); } v.push("}"); return v.join(""); - } - else if (ul4._isdate(obj)) { - return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; - } - else if (ul4._istimedelta(obj)) { - return "ul4.TimeDelta.create(" + obj.days + ", " + obj.seconds + ", " + obj.microseconds + ")"; - } - else if (ul4._ismonthdelta(obj)) { - return "ul4.MonthDelta.create(" + obj.months + ")"; - } - else if (ul4._iscolor(obj)) { - return "ul4.Color.create(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; - } - else if (ul4._istemplate(obj)) { - return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; - } - throw ul4.TypeError.create("asjson()", "asjson() requires a serializable object"); -}; - -// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object -ul4._fromjson = function _fromjson(string) { - // The following is from jQuery's parseJSON function - string = ul4._strip(string, null); - if (root.JSON && root.JSON.parse) - return root.JSON.parse(string); - if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) - return (new Function("return " + string))(); - throw ul4.TypeError.create("fromjson()", "invalid JSON"); -}; - -// Encodes ``obj`` in the UL4 Object Notation format -ul4._asul4on = function _asul4on(obj) { - return ul4on.dumps(obj); -}; - -// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object -ul4._fromul4on = function _fromul4on(string) { - return ul4on.loads(string); -}; - -ul4._format_date = function _format_date(obj, fmt, lang) { - var translations = { - de: { - ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], - ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - en: { - ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - xf: "%m/%d/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %I:%M:%S %p " - }, - fr: { - ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], - ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], - ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], - wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - es: { - ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], - ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], - ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], - wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], - xf: "%d/%m/%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - it: { - ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], - ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], - ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], - wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], - xf: "%d/%m/%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - da: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], - ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], - wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sv: { - ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], - ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], - wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%a %d %b %Y %H.%M.%S" - }, - nl: { - ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], - ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], - wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - xf: "%d-%m-%y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - pt: { - ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], - ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], - ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], - wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - cs: { - ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], - ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], - ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], - wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - sk: { - ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], - ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], - wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" - }, - pl: { - ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], - ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], - ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], - wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a, %d %b %Y, %H:%M:%S" - }, - hr: { - ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], - ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], - ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], - wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - sr: { - ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], - ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], - ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], - wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y.", - Xf: "%H:%M:%S", - cf: "%A, %d. %B %Y. %H:%M:%S" - }, - ro: { - ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], - ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], - ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], - wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - hu: { - ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], - ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], - ws: ["v", "h", "k", "sze", "cs", "p", "szo"], - wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], - xf: "%Y-%m-%d", - Xf: "%H.%M.%S", - cf: "%Y. %b. %d., %A, %H.%M.%S" - }, - tr: { - ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], - ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], - ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], - wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], - xf: "%d-%m-%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - ru: { - ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], - ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], - ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], - wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], - xf: "%d.%m.%Y", - Xf: "%H:%M:%S", - cf: "%a %d %b %Y %H:%M:%S" - }, - zh: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], - ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], - wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], - xf: "%Y\u5e74%b%d\u65e5", - Xf: "%H\u65f6%M\u5206%S\u79d2", - cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" - }, - ko: { - ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], - ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], - wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], - xf: "%Y\ub144 %B %d\uc77c", - Xf: "%H\uc2dc %M\ubd84 %S\ucd08", - cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" - }, - ja: { - ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], - ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], - wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], - xf: "%Y\u5e74%B%d\u65e5", - Xf: "%H\u6642%M\u5206%S\u79d2", - cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" - } - }; - - var translation = translations[lang]; - - var firstday; - - var result = []; - var inspec = false; - for (var i = 0; i < fmt.length; ++i) { - var c = fmt[i]; - if (inspec) { - switch (c) { - case "a": - c = translation.ws[obj.getDay()]; - break; - case "A": - c = translation.wl[obj.getDay()]; - break; - case "b": - c = translation.ms[obj.getMonth()]; - break; - case "B": - c = translation.ml[obj.getMonth()]; - break; - case "c": - c = ul4._format(obj, translation.cf, lang); - break; - case "d": - c = ul4._lpad(obj.getDate(), "0", 2); - break; - case "f": - c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; - break; - case "H": - c = ul4._lpad(obj.getHours(), "0", 2); - break; - case "I": - c = ul4._lpad(((obj.getHours() - 1) % 12) + 1, "0", 2); - break; - case "j": - c = ul4._lpad(ul4._yearday(obj), "0", 3); - break; - case "m": - c = ul4._lpad(obj.getMonth() + 1, "0", 2); - break; - case "M": - c = ul4._lpad(obj.getMinutes(), "0", 2); - break; - case "p": - c = obj.getHours() < 12 ? "AM" : "PM"; - break; - case "S": - c = ul4._lpad(obj.getSeconds(), "0", 2); - break; - case "U": - c = ul4._lpad(ul4._week(obj, 6), "0", 2); - break; - case "w": - c = obj.getDay(); - break; - case "W": - c = ul4._lpad(ul4._week(obj, 0), "0", 2); - break; - case "x": - c = ul4._format(obj, translation.xf, lang); - break; - case "X": - c = ul4._format(obj, translation.Xf, lang); - break; - case "y": - c = (obj.getFullYear() % 100).toString(); - break; - case "Y": - c = obj.getFullYear().toString(); - break; - case "z": - // UTC offset in the form +HHMM or -HHMM - c = ""; - break; - case "Z": - // Time zone name - c = ""; - break; + }; + + ul4._repr_internal = function _repr_internal(obj, ascii) + { + if (obj === null) + return "None"; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return ul4._str_repr(obj, ascii); + else if (typeof(obj) === "number") + return "" + obj; + else if (typeof(obj) === "function") + if (obj._ul4_name || obj.name) + return ""; + else + return ""; + else if (ul4._isdate(obj)) + return ul4._date_repr(obj, ascii); + else if (ul4._isdatetime(obj)) + return ul4._datetime_repr(obj, ascii); + else if (typeof(obj) === "undefined") + return ""; + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._islist(obj)) + return ul4._list_repr(obj, ascii); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj, ascii); + else if (ul4._isset(obj)) + return ul4._set_repr(obj, ascii); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj, ascii); + return "?"; + }; + + // Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>`` + ul4._repr = function _repr(obj) + { + return ul4._repr_internal(obj, false); + }; + + ul4._ascii = function _ascii(obj) + { + return ul4._repr_internal(obj, true); + }; + + ul4._date_str = function _date_str(obj) + { + let year = obj._date.getFullYear(); + let month = obj._date.getMonth()+1; + let day = obj._date.getDate(); + + return year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2); + }; + + ul4._datetime_str = function _datetime_str(obj) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + + let result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + " " + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2); + if (second || ms) + { + result += ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + } + return result; + }; + + ul4._str = function _str(obj) + { + if (typeof(obj) === "undefined") + return ""; + else if (obj === null) + return ""; + else if (obj === false) + return "False"; + else if (obj === true) + return "True"; + else if (typeof(obj) === "string") + return obj; + else if (typeof(obj) === "number") + return obj.toString(); + else if (ul4._isdate(obj)) + return ul4._date_str(obj); + else if (ul4._isdatetime(obj)) + return ul4._datetime_str(obj); + else if (ul4._islist(obj)) + return ul4._list_repr(obj); + else if (ul4._isset(obj)) + return ul4._set_repr(obj); + else if (ul4._ismap(obj)) + return ul4._map_repr(obj); + else if (typeof(obj) === "object" && typeof(obj.__str__) === "function") + return obj.__str__(); + else if (typeof(obj) === "object" && typeof(obj.__repr__) === "function") + return obj.__repr__(); + else if (ul4._isobject(obj)) + return ul4._object_repr(obj); + return "?"; + }; + + // Convert ``obj`` to bool, according to its "truth value" + ul4._bool = function _bool(obj) + { + if (typeof(obj) === "undefined" || obj === null || obj === false || obj === 0 || obj === "") + return false; + else + { + if (typeof(obj) === "object", typeof(obj.__bool__) === "function") + return obj.__bool__(); + if (ul4._islist(obj)) + return obj.length !== 0; + else if (ul4._ismap(obj) || ul4._isset(obj)) + return obj.size != 0; + else if (ul4._isobject(obj)) + { + for (let key in obj) + { + if (!obj.hasOwnProperty(key)) + continue; + return true; + } + return false; + } + return true; + } + }; + + // Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10)) + ul4._int = function _int(obj, base) + { + let result; + if (base !== null) + { + if (typeof(obj) !== "string" || !ul4._isint(base)) + throw new ul4.TypeError("int() requires a string and an integer"); + result = parseInt(obj, base); + if (result.toString() == "NaN") + throw new ul4.TypeError("invalid literal for int()"); + return result; + } + else + { + if (typeof(obj) == "string") + { + result = parseInt(obj); + if (result.toString() == "NaN") + throw new ul4.TypeError("invalid literal for int()"); + return result; + } + else if (typeof(obj) == "number") + return Math.floor(obj); + else if (obj === true) + return 1; + else if (obj === false) + return 0; + throw new ul4.TypeError("int() argument must be a string or a number"); + } + }; + + // Convert ``obj`` to a float + ul4._float = function _float(obj) + { + if (typeof(obj) === "string") + return parseFloat(obj); + else if (typeof(obj) === "number") + return obj; + else if (obj === true) + return 1.0; + else if (obj === false) + return 0.0; + throw new ul4.TypeError("float() argument must be a string or a number"); + }; + + // Convert ``obj`` to a list + ul4._list = function _list(obj) + { + let iter = ul4._iter(obj); + + let result = []; + for (;;) + { + let value = iter.next(); + if (value.done) + return result; + result.push(value.value); + } + }; + + // Convert ``obj`` to a set + ul4._set = function _set(obj) + { + let iter = ul4._iter(obj); + + let result = ul4._emptyset(); + for (;;) + { + let value = iter.next(); + if (value.done) + return result; + result.add(value.value); + } + }; + + // Return the length of ``sequence`` + ul4._len = function _len(sequence) + { + if (typeof(sequence) == "string" || ul4._islist(sequence)) + return sequence.length; + else if (ul4._ismap(sequence) || ul4._isset(sequence)) + return sequence.size; + else if (ul4._isobject(sequence)) + { + let i = 0; + for (let key in sequence) + ++i; + return i; + } + throw new ul4.TypeError("object of type '" + ul4._type(sequence) + "' has no len()"); + }; + + ul4._type = function _type(obj) + { + if (obj === null) + return "none"; + else if (obj === false || obj === true) + return "bool"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (typeof(obj) === "number") + return Math.round(obj) == obj ? "int" : "float"; + else if (typeof(obj) === "function") + return "function"; + else + { + if (typeof(obj.ul4type) === "function") + return obj.ul4type(); + else + return ul4.Protocol.get(obj).ul4type(obj); + } + }; + + // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) + ul4._mod = function _mod(obj1, obj2) + { + let div = Math.floor(obj1 / obj2); + let mod = obj1 - div * obj2; + + if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) + { + mod += obj2; + --div; + } + return obj1 - div * obj2; + }, + + // Return the attribute with the name ``attrname`` of the object ``obj`` + // If ``obj`` doesn't have such an attribute, return ``default_`` + ul4._getattr = function _getattr(obj, attrname, default_=null) + { + let proto = ul4.Protocol.get(obj); + try + { + return proto.getattr(obj, attrname); + } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === obj) + return default_; + else + throw exc; + } + }; + + // Return wether the object ``obj`` has an attribute with the name ``attrname`` + ul4._hasattr = function _hasattr(obj, attrname) + { + let proto = ul4.Protocol.get(obj); + return proto.hasattr(obj, attrname); + }; + + // Return the names of the attributes of the object ``obj`` as a set. + ul4._dir = function _dir(obj) + { + let proto = ul4.Protocol.get(obj); + return proto.dir(); + }; + + // Return whether any of the items in ``iterable`` are true + ul4._any = function _any(iterable) + { + if (typeof(iterable) == "string") + { + for (let i = 0; i < iterable.length; ++i) + { + if (iterable[i] !== '\x00') + return true; + } + return false; + } + else + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + return false; + if (ul4._bool(item.value)) + return true; + } + } + }; + + // Return whether all of the items in ``iterable`` are true + ul4._all = function _all(iterable) + { + if (typeof(iterable) == "string") + { + for (let i = 0; i < iterable.length; ++i) + { + if (iterable[i] === '\x00') + return false; + } + return true; + } + else + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + return true; + if (!ul4._bool(item.value)) + return false; + } + } + }; + + // Check if ``obj`` is undefined + ul4._isundefined = function _isundefined(obj) + { + return typeof(obj) === "undefined"; + }; + + + // Check if ``obj`` is *not* undefined + ul4._isdefined = function _isdefined(obj) + { + return typeof(obj) !== "undefined"; + }; + + // Check if ``obj`` is ``None`` + ul4._isnone = function _isnone(obj) + { + return obj === null; + }; + + // Check if ``obj`` is a boolean + ul4._isbool = function _isbool(obj) + { + return typeof(obj) == "boolean"; + }; + + // Check if ``obj`` is a int + ul4._isint = function _isint(obj) + { + return (typeof(obj) == "number") && Math.round(obj) == obj; + }; + + // Check if ``obj`` is a float + ul4._isfloat = function _isfloat(obj) + { + return (typeof(obj) == "number") && Math.round(obj) != obj; + }; + + // Check if ``obj`` is a string + ul4._isstr = function _isstr(obj) + { + return typeof(obj) == "string"; + }; + + // Check if ``obj`` is a datetime + ul4._isdatetime = function _isdate(obj) + { + return Object.prototype.toString.call(obj) == "[object Date]"; + }; + + ul4._isdate = function _isdate(obj) + { + return (obj instanceof ul4.Date); + }; + + // Check if ``obj`` is a color + ul4._iscolor = function _iscolor(obj) + { + return (obj instanceof ul4.Color); + }; + + // Check if ``obj`` is a timedelta object + ul4._istimedelta = function _istimedelta(obj) + { + return (obj instanceof ul4.TimeDelta); + }; + + // Check if ``obj`` is a monthdelta object + ul4._ismonthdelta = function _ismonthdelta(obj) + { + return (obj instanceof ul4.MonthDelta); + }; + + // Check if ``obj`` is a template + ul4._istemplate = function _istemplate(obj) + { + return (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure); + }; + + // Check if ``obj`` is a function + ul4._isfunction = function _isfunction(obj) + { + return typeof(obj) === "function" || (Object.prototype.toString.call(obj) == "[object Object]" && (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure)); + }; + + // Check if ``obj`` is a list + ul4._islist = function _islist(obj) + { + return Object.prototype.toString.call(obj) == "[object Array]"; + }; + + // Check if ``obj`` is a set + ul4._isset = function _isset(obj) + { + return Object.prototype.toString.call(obj) == "[object Set]"; + }; + + // Check if ``obj`` is an exception (at least a UL4 exception) + ul4._isexception = function _isexception(obj) + { + return (obj instanceof ul4.Exception); + }; + + ul4._isul4set = function _isul4set(obj) + { + return (obj instanceof ul4._Set); + }; + + ul4._isanyset = function _isanyset(obj) + { + return (ul4._isset(obj) || ul4._isul4set(obj)); + }; + + // Check if ``obj`` is an iterator + ul4._isiter = function _isiter(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.next) === "function"; + }; + + // Check if ``obj`` is a JS object + ul4._isobject = function _isobject(obj) + { + return Object.prototype.toString.call(obj) == "[object Object]" && typeof(obj.__type__) === "undefined" && !(obj instanceof ul4.Proto); + }; + + if (ul4._havemap) + { + // Check if ``obj`` is a ``Map`` + ul4._ismap = function _ismap(obj) + { + return obj !== null && typeof(obj) === "object" && typeof(obj.__proto__) === "object" && obj.__proto__ === Map.prototype; + }; + + // Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``) + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj) || ul4._ismap(obj); + }; + } + else + { + ul4._ismap = function _ismap(obj) + { + return false; + }; + + ul4._isdict = function _isdict(obj) + { + return ul4._isobject(obj); + }; + } + + // Repeat string ``str`` ``rep`` times + ul4._str_repeat = function _str_repeat(str, rep) + { + let result = ""; + for (; rep>0; --rep) + result += str; + return result; + }; + + ul4._list_repeat = function _list_repeat(list, rep) + { + let result = []; + for (; rep>0; --rep) + for (let i = 0; i < list.length; ++i) + result.push(list[i]); + return result; + }; + + ul4._str_json = function _str_json(str) + { + let result = ""; + for (let i = 0; i < str.length; ++i) + { + let c = str[i]; + switch (c) + { + case "\r": + result += "\\r"; + break; + case "\n": + result += "\\n"; + break; + case "\t": + result += "\\t"; + break; + case "\\": + result += "\\\\"; + break; + case '"': + result += '\\"'; + break; + case '<': + result += '\\u003c'; + break; + default: + let code = c.charCodeAt(0); + if (code >= 32 && code < 128) + result += c; + else + result += "\\u" + ul4._lpad(code.toString(16), "0", 4); + break; + } + } + return '"' + result + '"'; + }; + + // Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates) + ul4._asjson = function _asjson(obj) + { + if (obj === null) + return "null"; + else if (typeof(obj) === "undefined") + return "undefined"; + else if (obj === false) + return "false"; + else if (obj === true) + return "true"; + else if (typeof(obj) === "string") + return ul4._str_json(obj); + else if (typeof(obj) === "number") + { + return "" + obj; + } + else if (ul4._islist(obj)) + { + let v = []; + v.push("["); + for (let i = 0; i < obj.length; ++i) + { + if (i != 0) + v.push(", "); + v.push(ul4._asjson(obj[i])); + } + v.push("]"); + return v.join(""); + } + else if (ul4._ismap(obj)) + { + let v = []; + v.push("{"); + let i = 0; + obj.forEach(function(value, key) { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(value)); + }); + v.push("}"); + return v.join(""); + } + else if (ul4._isobject(obj)) + { + let v = []; + v.push("{"); + let i = 0; + for (let key in obj) + { + if (i++) + v.push(", "); + v.push(ul4._asjson(key)); + v.push(": "); + v.push(ul4._asjson(obj[key])); + } + v.push("}"); + return v.join(""); + } + else if (ul4._isdate(obj)) + { + return "new ul4.Date(" + obj._date.getFullYear() + ", " + (obj._date.getMonth()+1) + ", " + obj._date.getDate() + ")"; + } + else if (ul4._isdatetime(obj)) + { + return "new Date(" + obj.getFullYear() + ", " + obj.getMonth() + ", " + obj.getDate() + ", " + obj.getHours() + ", " + obj.getMinutes() + ", " + obj.getSeconds() + ", " + obj.getMilliseconds() + ")"; + } + else if (ul4._istimedelta(obj)) + { + return "new ul4.TimeDelta(" + obj._days + ", " + obj._seconds + ", " + obj._microseconds + ")"; + } + else if (ul4._ismonthdelta(obj)) + { + return "new ul4.MonthDelta(" + obj._months + ")"; + } + else if (ul4._iscolor(obj)) + { + return "new ul4.Color(" + obj._r + ", " + obj._g + ", " + obj._b + ", " + obj._a + ")"; + } + else if (ul4._istemplate(obj)) + { + return "ul4.Template.loads(" + ul4._repr(obj.dumps()) + ")"; + } + throw new ul4.TypeError("asjson() requires a serializable object"); + }; + + // Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object + ul4._fromjson = function _fromjson(string) + { + // The following is from jQuery's parseJSON function + string = ul4.StrProtocol.strip(string); + if (root.JSON && root.JSON.parse) + return root.JSON.parse(string); + if (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, "@").replace(ul4._rvalidtokens, "]").replace(ul4._rvalidbraces, ""))) + return (new Function("return " + string))(); + throw new ul4.TypeError("invalid JSON"); + }; + + // Encodes ``obj`` in the UL4 Object Notation format + ul4._asul4on = function _asul4on(obj) + { + return ul4.dumps(obj); + }; + + // Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object + ul4._fromul4on = function _fromul4on(string) + { + return ul4.loads(string); + }; + + ul4._format_datetime = function _format_datetime(obj, fmt, lang) + { + let translations = { + de: { + ms: ["Jan", "Feb", "M\u00e4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + ml: ["Januar", "Februar", "M\u00e4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + ws: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + wl: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + en: { + ms: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + ml: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ws: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + wl: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + xf: "%m/%d/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %I:%M:%S %p" + }, + fr: { + ms: ["janv.", "f\u00e9vr.", "mars", "avril", "mai", "juin", "juil.", "ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c."], + ml: ["janvier", "f\u00e9vrier", "mars", "avril", "mai", "juin", "juillet", "ao\u00fbt", "septembre", "octobre", "novembre", "d\u00e9cembre"], + ws: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + wl: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + es: { + ms: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"], + ml: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + ws: ["dom", "lun", "mar", "mi\u00e9", "jue", "vie", "s\u00e1b"], + wl: ["domingo", "lunes", "martes", "mi\u00e9rcoles", "jueves", "viernes", "s\u00e1bado"], + xf: "%d/%m/%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + it: { + ms: ["gen", "feb", "mar", "apr", "mag", "giu", "lug", "ago", "set", "ott", "nov", "dic"], + ml: ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"], + ws: ["dom", "lun", "mar", "mer", "gio", "ven", "sab"], + wl: ["domenica", "luned\u00ec", "marted\u00ec", "mercoled\u00ec", "gioved\u00ec", "venerd\u00ec", "sabato"], + xf: "%d/%m/%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + da: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + ws: ["s\u00f8n", "man", "tir", "ons", "tor", "fre", "l\u00f8r"], + wl: ["s\u00f8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00f8rdag"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sv: { + ms: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"], + ws: ["s\u00f6n", "m\u00e5n", "tis", "ons", "tor", "fre", "l\u00f6r"], + wl: ["s\u00f6ndag", "m\u00e5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00f6rdag"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%a %d %b %Y %H.%M.%S" + }, + nl: { + ms: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"], + ml: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + ws: ["zo", "ma", "di", "wo", "do", "vr", "za"], + wl: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + xf: "%d-%m-%y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + pt: { + ms: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + ml: ["Janeiro", "Fevereiro", "Mar\u00e7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + ws: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00e1b"], + wl: ["Domingo", "Segunda", "Ter\u00e7a", "Quarta", "Quinta", "Sexta", "S\u00e1bado"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + cs: { + ms: ["led", "\u00fano", "b\u0159e", "dub", "kv\u011b", "\u010den", "\u010dec", "srp", "z\u00e1\u0159", "\u0159\u00edj", "lis", "pro"], + ml: ["leden", "\u00fanor", "b\u0159ezen", "duben", "kv\u011bten", "\u010derven", "\u010dervenec", "srpen", "z\u00e1\u0159\u00ed", "\u0159\u00edjen", "listopad", "prosinec"], + ws: ["Ne", "Po", "\u00dat", "St", "\u010ct", "P\u00e1", "So"], + wl: ["Ned\u011ble", "Pond\u011bl\u00ed", "\u00dater\u00fd", "St\u0159eda", "\u010ctvrtek", "P\u00e1tek", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + sk: { + ms: ["jan", "feb", "mar", "apr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "sep", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "marec", "apr\u00edl", "m\u00e1j", "j\u00fan", "j\u00fal", "august", "september", "okt\u00f3ber", "november", "december"], + ws: ["Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So"], + wl: ["Nede\u013ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a\u00a0%d.\u00a0%B\u00a0%Y,\u00a0%H:%M:%S" + }, + pl: { + ms: ["sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"], + ml: ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"], + ws: ["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"], + wl: ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a, %d %b %Y, %H:%M:%S" + }, + hr: { + ms: ["Sij", "Vel", "O\u017eu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + ml: ["Sije\u010danj", "Velja\u010da", "O\u017eujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + ws: ["Ned", "Pon", "Uto", "Sri", "\u010cet", "Pet", "Sub"], + wl: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010cetvrtak", "Petak", "Subota"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + sr: { + ms: ["\u0458\u0430\u043d", "\u0444\u0435\u0431", "\u043c\u0430\u0440", "\u0430\u043f\u0440", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433", "\u0441\u0435\u043f", "\u043e\u043a\u0442", "\u043d\u043e\u0432", "\u0434\u0435\u0446"], + ml: ["\u0458\u0430\u043d\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043c\u0430\u0440\u0442", "\u0430\u043f\u0440\u0438\u043b", "\u043c\u0430\u0458", "\u0458\u0443\u043d", "\u0458\u0443\u043b", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440"], + ws: ["\u043d\u0435\u0434", "\u043f\u043e\u043d", "\u0443\u0442\u043e", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043f\u0435\u0442", "\u0441\u0443\u0431"], + wl: ["\u043d\u0435\u0434\u0435\u0459\u0430", "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", "\u0443\u0442\u043e\u0440\u0430\u043a", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", "\u043f\u0435\u0442\u0430\u043a", "\u0441\u0443\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y.", + Xf: "%H:%M:%S", + cf: "%A, %d. %B %Y. %H:%M:%S" + }, + ro: { + ms: ["ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec"], + ml: ["ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"], + ws: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sb"], + wl: ["duminic\u0103", "luni", "mar\u0163i", "miercuri", "joi", "vineri", "s\u00e2mb\u0103t\u0103"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + hu: { + ms: ["jan", "febr", "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", "aug", "szept", "okt", "nov", "dec"], + ml: ["janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", "augusztus", "szeptember", "okt\u00f3ber", "november", "december"], + ws: ["v", "h", "k", "sze", "cs", "p", "szo"], + wl: ["vas\u00e1rnap", "h\u00e9tf\u0151", "kedd", "szerda", "cs\u00fct\u00f6rt\u00f6k", "p\u00e9ntek", "szombat"], + xf: "%Y-%m-%d", + Xf: "%H.%M.%S", + cf: "%Y. %b. %d., %A, %H.%M.%S" + }, + tr: { + ms: ["Oca", "\u015eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011fu", "Eyl", "Eki", "Kas", "Ara"], + ml: ["Ocak", "\u015eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011fustos", "Eyl\u00fcl", "Ekim", "Kas\u0131m", "Aral\u0131k"], + ws: ["Paz", "Pzt", "Sal", "\u00c7r\u015f", "Pr\u015f", "Cum", "Cts"], + wl: ["Pazar", "Pazartesi", "Sal\u0131", "\u00c7ar\u015famba", "Per\u015fembe", "Cuma", "Cumartesi"], + xf: "%d-%m-%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + ru: { + ms: ["\u042f\u043d\u0432", "\u0424\u0435\u0432", "\u041c\u0430\u0440", "\u0410\u043f\u0440", "\u041c\u0430\u0439", "\u0418\u044e\u043d", "\u0418\u044e\u043b", "\u0410\u0432\u0433", "\u0421\u0435\u043d", "\u041e\u043a\u0442", "\u041d\u043e\u044f", "\u0414\u0435\u043a"], + ml: ["\u042f\u043d\u0432\u0430\u0440\u044c", "\u0424\u0435\u0432\u0440\u0430\u043b\u044c", "\u041c\u0430\u0440\u0442", "\u0410\u043f\u0440\u0435\u043b\u044c", "\u041c\u0430\u0439", "\u0418\u044e\u043d\u044c", "\u0418\u044e\u043b\u044c", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c", "\u041e\u043a\u0442\u044f\u0431\u0440\u044c", "\u041d\u043e\u044f\u0431\u0440\u044c", "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"], + ws: ["\u0412\u0441\u043a", "\u041f\u043d\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041f\u0442\u043d", "\u0421\u0431\u0442"], + wl: ["\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", "\u0412\u0442\u043e\u0440\u043d\u0438\u043a", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043e\u0442\u0430"], + xf: "%d.%m.%Y", + Xf: "%H:%M:%S", + cf: "%a %d %b %Y %H:%M:%S" + }, + zh: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"], + ws: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"], + wl: ["\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"], + xf: "%Y\u5e74%b%d\u65e5", + Xf: "%H\u65f6%M\u5206%S\u79d2", + cf: "%Y\u5e74%b%d\u65e5 %A %H\u65f6%M\u5206%S\u79d2" + }, + ko: { + ms: [" 1\uc6d4", " 2\uc6d4", " 3\uc6d4", " 4\uc6d4", " 5\uc6d4", " 6\uc6d4", " 7\uc6d4", " 8\uc6d4", " 9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ml: ["1\uc6d4", "2\uc6d4", "3\uc6d4", "4\uc6d4", "5\uc6d4", "6\uc6d4", "7\uc6d4", "8\uc6d4", "9\uc6d4", "10\uc6d4", "11\uc6d4", "12\uc6d4"], + ws: ["\uc77c", "\uc6d4", "\ud654", "\uc218", "\ubaa9", "\uae08", "\ud1a0"], + wl: ["\uc77c\uc694\uc77c", "\uc6d4\uc694\uc77c", "\ud654\uc694\uc77c", "\uc218\uc694\uc77c", "\ubaa9\uc694\uc77c", "\uae08\uc694\uc77c", "\ud1a0\uc694\uc77c"], + xf: "%Y\ub144 %B %d\uc77c", + Xf: "%H\uc2dc %M\ubd84 %S\ucd08", + cf: "%Y\ub144 %B %d\uc77c (%a) %p %I\uc2dc %M\ubd84 %S\ucd08" + }, + ja: { + ms: [" 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ml: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"], + ws: ["\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"], + wl: ["\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"], + xf: "%Y\u5e74%B%d\u65e5", + Xf: "%H\u6642%M\u5206%S\u79d2", + cf: "%Y\u5e74%B%d\u65e5 %H\u6642%M\u5206%S\u79d2" + } + }; + + let translation = translations[lang]; + + let result = []; + let inspec = false; + for (let i = 0; i < fmt.length; ++i) + { + let c = fmt[i]; + if (inspec) + { + switch (c) + { + case "a": + c = translation.ws[obj.getDay()]; + break; + case "A": + c = translation.wl[obj.getDay()]; + break; + case "b": + c = translation.ms[obj.getMonth()]; + break; + case "B": + c = translation.ml[obj.getMonth()]; + break; + case "c": + c = ul4._format(obj, translation.cf, lang); + break; + case "d": + c = ul4._lpad(obj.getDate(), "0", 2); + break; + case "f": + c = ul4._lpad(obj.getMilliseconds(), "0", 3) + "000"; + break; + case "H": + c = ul4._lpad(obj.getHours(), "0", 2); + break; + case "I": + c = ul4._lpad(((obj.getHours()-1) % 12)+1, "0", 2); + break; + case "j": + c = ul4._lpad(ul4.DateTimeProtocol.yearday(obj), "0", 3); + break; + case "m": + c = ul4._lpad(obj.getMonth()+1, "0", 2); + break; + case "M": + c = ul4._lpad(obj.getMinutes(), "0", 2); + break; + case "p": + c = obj.getHours() < 12 ? "AM" : "PM"; + break; + case "S": + c = ul4._lpad(obj.getSeconds(), "0", 2); + break; + case "U": + c = ul4._lpad(ul4._week4format(obj, 6), "0", 2); + break; + case "w": + c = obj.getDay(); + break; + case "W": + c = ul4._lpad(ul4._week4format(obj, 0), "0", 2); + break; + case "x": + c = ul4._format(obj, translation.xf, lang); + break; + case "X": + c = ul4._format(obj, translation.Xf, lang); + break; + case "y": + c = (obj.getFullYear() % 100).toString(); + break; + case "Y": + c = obj.getFullYear().toString(); + break; + case "z": + // UTC offset in the form +HHMM or -HHMM + c = ""; + break; + case "Z": + // Time zone name + c = ""; + break; + } + result.push(c); + inspec = false; + } + else + { + if (c == "%") + inspec = true; + else + result.push(c); + } + } + return result.join(""); + }; + + ul4._format_int = function _format_int(obj, fmt, lang) + { + let work = fmt; + + // Defaults + let fill = ' '; + let align = '>'; // '<', '>', '=' or '^' + let sign = '-'; // '+', '-' or ' ' + let alternate = false; + let minimumwidth = 0; + let type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' + + // Determine output type + if (/[bcdoxXn]$/.test(work)) + { + type = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract minimum width + if (/\d+$/.test(work)) + { + let minimumwidthStr = /\d+$/.exec(work); + work = work.replace(/\d+$/, ""); + if (/^0/.test(minimumwidthStr)) + { + align = '='; + fill = '0'; + } + minimumwidth = parseInt(minimumwidthStr); + } + + // Alternate form? + if (/#$/.test(work)) + { + alternate = true; + work = work.substring(0, work.length-1); + } + + // Determine sign + if (/[+ -]$/.test(work)) + { + if (type == 'c') + throw new ul4.ValueError("sign not allowed for integer format type 'c'"); + sign = work.substring(work.length-1); + work = work.substring(0, work.length-1); + } + + // Extract fill and align char + if (work.length >= 3) + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + else if (work.length == 2) + { + if (/[<>=^]$/.test(work)) + { + align = work[1]; + fill = work[0]; + } + else + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + } + else if (work.length == 1) + { + if (/^[<>=^]$/.test(work)) + align = work; + else + throw new ul4.ValueError("illegal integer format string " + ul4._repr(fmt)); + } + + // Basic number formatting + let neg = obj < 0; + + if (neg) + obj = -obj; + + let output; + switch (type) + { + case 'b': + output = obj.toString(2); + break; + case 'c': + if (neg || obj > 65535) + throw new ul4.ValueError("value out of bounds for c format"); + output = String.fromCharCode(obj); + break; + case 'd': + output = obj.toString(); + break; + case 'o': + output = obj.toString(8); + break; + case 'x': + output = obj.toString(16); + break; + case 'X': + output = obj.toString(16).toUpperCase(); + break; + case 'n': + // FIXME: locale formatting + output = obj.toString(); + break; + } + + // The rest of the formatting + if (align === '=') + { + if (neg || sign !== '-') + --minimumwidth; + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + minimumwidth -= 2; + + if (output.length < minimumwidth) + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + + if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) + output = "0" + type + output; + + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + } + else + { + if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) + output = "0" + type + output; + if (neg) + output = "-" + output; + else if (sign != '-') + output = sign + output; + if (output.length < minimumwidth) + { + if (align == '<') + output = output + ul4._str_repeat(fill, minimumwidth-output.length); + else if (align == '>') + output = ul4._str_repeat(fill, minimumwidth-output.length) + output; + else // if (align == '^') + { + let pad = minimumwidth - output.length; + let padBefore = Math.floor(pad/2); + let padAfter = pad-padBefore; + output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); + } + } + } + return output; + }; + + // Format ``obj`` using the format string ``fmt`` in the language ``lang`` + ul4._format = function _format(obj, fmt, lang) + { + if (typeof(lang) === "undefined" || lang === null) + lang = "en"; + else + { + let translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null}; + lang = lang.toLowerCase(); + if (typeof(translations[lang]) === "undefined") + { + lang = lang.split(/_/)[0]; + if (typeof(translations[lang]) === "undefined") + lang = "en"; + } + } + if (ul4._isdate(obj)) + return ul4._format_datetime(obj._date, fmt, lang); + if (ul4._isdatetime(obj)) + return ul4._format_datetime(obj, fmt, lang); + else if (ul4._isint(obj)) + return ul4._format_int(obj, fmt, lang); + else if (obj === true) + return ul4._format_int(1, fmt, lang); + else if (obj === false) + return ul4._format_int(0, fmt, lang); + }; + + ul4._lpad = function _lpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = pad + string; + return string; + }; + + ul4._rpad = function _rpad(string, pad, len) + { + if (typeof(string) === "number") + string = string.toString(); + while (string.length < len) + string = string + pad; + return string; + }; + + // This is outside of ``Proto`` on purpose + // This way reactive frameworks like ``Vue.js`` don't get to see it + // and complain about mutating render functions when those create new objects. + let _nextid = 1; + + ul4.Proto = class Proto + { + constructor() + { + this.__id__ = _nextid++; + } + + ul4type() + { + return this.constructor.name; + } + + // equality comparison of objects defaults to identity comparison + __eq__(other) + { + return this === other; + } + + // To overwrite equality comparison, you only have to overwrite ``__eq__``, + // ``__ne__`` will be synthesized from that + __ne__(other) + { + return !this.__eq__(other); + } + + // For other comparison operators, each method has to be implemented: + // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and + // ``>=`` calls ``__ge__`` + + __bool__() + { + return true; + } + }; + + ul4.Signature = class Signature extends ul4.Proto + { + constructor(...args) + { + super(); + this.args = []; + this.argNames = {}; + this.remargs = null; + this.remkwargs = null; + + let nextDefault = false; + let lastArgname = null; + for (let i = 0; i < args.length; ++i) + { + let argName = args[i]; + if (nextDefault) + { + this.args.push({name: lastArgname, defaultValue: argName}); + this.argNames[lastArgname] = true; + nextDefault = false; + } + else + { + if (argName.substr(argName.length-1) === "=") + { + lastArgname = argName.substr(0, argName.length-1); + nextDefault = true; + } + else if (argName.substr(0, 2) === "**") + this.remkwargs = argName.substr(2); + else if (argName.substr(0, 1) === "*") + this.remargs = argName.substr(1); + else + { + this.args.push({name: argName}); + this.argNames[argName] = true; + } + } + } + } + + // Create the argument array for calling a function with this signature with the arguments available from ``args`` + bindArray(name, args, kwargs) + { + let finalargs = []; + let decname = name !== null ? name + "() " : ""; + + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + if (i < args.length) + { + if (kwargs.hasOwnProperty(arg.name)) + throw new ul4.ArgumentError(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); + finalargs.push(args[i]); + } + else + { + if (kwargs.hasOwnProperty(arg.name)) + finalargs.push(kwargs[arg.name]); + else + { + if (arg.hasOwnProperty("defaultValue")) + finalargs.push(arg.defaultValue); + else + throw new ul4.ArgumentError("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); + } + } + } + + // Do we accept additional positional arguments? + if (this.remargs === null) + { + // No, but we have them -> complain + if (args.length > this.args.length) + { + let prefix = name === null ? "expected" : name + "() expects"; + throw new ul4.ArgumentError(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); + } + } + else + { + // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) + finalargs.push(args.slice(this.args.length)); + } + + // Do we accept arbitrary keyword arguments? + if (this.remkwargs === null) + { + // No => complain about unknown ones + for (let key in kwargs) + { + if (!this.argNames[key]) + { + if (name === null) + throw new ul4.ArgumentError("an argument named " + ul4._repr(key) + " isn't supported"); + else + throw new ul4.ArgumentError(name + "() doesn't support an argument named " + ul4._repr(key)); + } + } + } + else + { + // Yes => Put the unknown ones into an object and add that to the arguments array + let remkwargs = ul4._emptymap(); + for (let key in kwargs) + { + if (!this.argNames[key]) + ul4._setmap(remkwargs, key, kwargs[key]); + } + finalargs.push(remkwargs); + } + + return finalargs; + } + + // Create the argument object for calling a function with this signature with the arguments available from ``args`` + bindObject(name, args, kwargs) + { + args = this.bindArray(name, args, kwargs); + let argObject = {}; + let i; + for (i = 0; i < this.args.length; ++i) + argObject[this.args[i].name] = args[i]; + if (this.remargs !== null) + argObject[this.remargs] = args[i++]; + if (this.remkwargs !== null) + argObject[this.remkwargs] = args[i++]; + return argObject; + } + + __repr__() + { + return ""; + } + + __str__() + { + return this.toString(); + } + + toString() + { + let v = []; + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + if (arg.hasOwnProperty("defaultValue")) + v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); + else + v.push(arg.name); + } + if (this.remargs !== null) + v.push("*" + this.remargs); + if (this.remkwargs !== null) + v.push("**" + this.remkwargs); + return "(" + v.join(", ") + ")"; + } + }; + + // When we don't have a real ``Set`` type, emulate one that supports strings + ul4._Set = class _Set + { + constructor(...items) + { + this.items = {}; + this.add(...items); + } + + add(...items) + { + for (let i = 0; i < items.length; ++i) + this.items[items[i]] = true; + } + + clear() + { + this.items = {}; + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { + case "add": + return ul4.expose(function add(items){ self.add(...items); }, ["*items"]); + default: + throw new ul4.AttributeError(this, attrname); + } + } + + __contains__(item) + { + return this.items[item] || false; + } + + has(item) + { + return this.items[item] || false; + } + + __bool__() + { + for (let item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + return true; + } + return false; + } + + __repr__() + { + let v = []; + v.push("{"); + let i = 0; + for (let item in this.items) + { + if (!this.items.hasOwnProperty(item)) + continue; + if (i++) + v.push(", "); + v.push(ul4._repr(item)); + } + if (!i) + v.push("/"); + v.push("}"); + return v.join(""); + } + + __eq__(other) + { + // We'll check that everything in ``this`` is in ``other`` + // and if both have the same number of items they are equal + if (ul4._isset(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.has(item)) + return false; + // count the number of items we have + ++count; + } + return other.size == count; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other[item]) + return false; + // count the number of items we have + ++count; + } + // Subtract the number of items that ``other`` has + for (let item in other.items) + --count; + return count == 0; + } + else + return false; + } + + __le__(other) + { + // check that ``this`` is a subset of ``other``, + // i.e. everything in ``this`` is also in ``other`` + if (ul4._isset(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.has(item)) + return false; + } + return true; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let item in this.items) + { + if (!other.items[item]) + return false; + } + return true; + } + else + ul4._unorderable("<", this, other); + } + + __ge__(other) + { + // check that ``this`` is a superset of ``other``, + // i.e. everything in ``other`` is also in ``this`` + if (ul4._isset(other)) + { + other.forEach(function(value) { + if (!this.items[value]) + return false; + }, this); + return true; + } + else if (ul4._isul4set(other)) + { + let count = 0; + for (let key in other.items) + { + if (!this.items[key]) + return false; + } + return true; + } + else + ul4._unorderable("<=", this, other); + } + }; + + ul4._Set.prototype.__type__ = "set"; + + // Adds name and signature to a function/method and makes the method callable in templates + ul4.expose = function expose(f, signature, options) + { + options = options || {}; + if (options.name) + f._ul4_name = options.name; + if (ul4._islist(signature)) + signature = new ul4.Signature(...signature); + f._ul4_signature = signature; + f._ul4_needsobject = options.needsobject || false; + f._ul4_needscontext = options.needscontext || false; + }; + + // Protocol objects for all builtin types + // These objects are singleton, so we replace the constructor with the prototype object afterwards + ul4.Protocol = class Protocol + { + ul4type() + { + return this.constructor.name; + } + + dir() + { + return this.attrs; + } + + get(obj) + { + if (ul4._isstr(obj)) + return ul4.StrProtocol; + else if (ul4._islist(obj)) + return ul4.ListProtocol; + else if (ul4._isdate(obj)) + return ul4.DateProtocol; + else if (ul4._isset(obj)) + return ul4.SetProtocol; + else if (ul4._ismap(obj)) + return ul4.MapProtocol; + else if (ul4._isdatetime(obj)) + return ul4.DateTimeProtocol; + else if (ul4._isobject(obj)) + return ul4.ObjectProtocol; + else + return ul4.Protocol; + } + + getattr(obj, attrname) + { + if (obj === null || typeof(obj) === "undefined") + throw new ul4.AttributeError(obj, attrname); + else if (typeof(obj.__getattr__) === "function") + return obj.__getattr__(attrname); + else if (this.attrs.has(attrname)) + { + let attr = this[attrname]; + let realattr = function realattr(...args) { + return attr.apply(this, [obj, ...args]); + }; + realattr.name = attr.name; + realattr._ul4_name = attr._ul4_name || attr.name; + realattr._ul4_signature = attr._ul4_signature; + realattr._ul4_needsobject = attr._ul4_needsobject; + realattr._ul4_needscontext = attr._ul4_needscontext; + return realattr; + } + else + throw new ul4.AttributeError(obj, attrname); + } + + hasattr(obj, attrname) + { + if (obj === null || typeof(obj) === "undefined") + return false; + else if (typeof(obj.__getattr__) === "function") + { + try + { + obj.__getattr__(attrname); + return true; + } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === object) + return false; + else + throw exc; + } + } + else + return this.attrs.has(attrname); + } + }; + + ul4.Protocol = ul4.Protocol.prototype; + ul4.Protocol.attrs = ul4._emptyset(); + + ul4.StrProtocol = class StrProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "str"; + } + + count(obj, sub, start=null, end=null) + { + return ul4._count(obj, sub, start, end); + } + + find(obj, sub, start=null, end=null) + { + return ul4._find(obj, sub, start, end); + } + + rfind(obj, sub, start=null, end=null) + { + return ul4._rfind(obj, sub, start, end); + } + + replace(obj, old, new_, count=null) + { + if (count === null) + count = obj.length; + + let result = []; + while (obj.length) + { + let pos = obj.indexOf(old); + if (pos === -1 || !count--) + { + result.push(obj); + break; + } + result.push(obj.substr(0, pos)); + result.push(new_); + obj = obj.substr(pos + old.length); + } + return result.join(""); + } + + strip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("strip() requires a string argument"); + + while (obj && chars.indexOf(obj[0]) >= 0) + obj = obj.substr(1); + while (obj && chars.indexOf(obj[obj.length-1]) >= 0) + obj = obj.substr(0, obj.length-1); + return obj; + } + + lstrip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("lstrip() requires a string argument"); + + while (obj && chars.indexOf(obj[0]) >= 0) + obj = obj.substr(1); + return obj; + } + + rstrip(obj, chars=null) + { + chars = chars || " \r\n\t"; + if (typeof(chars) !== "string") + throw new ul4.TypeError("rstrip() requires a string argument"); + + while (obj && chars.indexOf(obj[obj.length-1]) >= 0) + obj = obj.substr(0, obj.length-1); + return obj; + } + + split(obj, sep=null, count=null) + { + if (sep !== null && typeof(sep) !== "string") + throw new ul4.TypeError("split() requires a string"); + + if (count === null) + { + let result = obj.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + let result = []; + while (obj.length) + { + let pos = obj.indexOf(sep); + if (pos === -1 || !count--) + { + result.push(obj); + break; + } + result.push(obj.substr(0, pos)); + obj = obj.substr(pos + sep.length); + } + return result; + } + else + { + let result = []; + while (obj.length) + { + obj = ul4.StrProtocol.lstrip(obj, null); + let part; + if (!count--) + part = obj; // Take the rest of the string + else + part = obj.split(/[ \n\r\t]+/, 1)[0]; + if (part.length) + result.push(part); + obj = obj.substr(part.length); + } + return result; + } + } + } + + rsplit(obj, sep=null, count=null) + { + if (sep !== null && typeof(sep) !== "string") + throw new ul4.TypeError("rsplit() requires a string as second argument"); + + if (count === null) + { + let result = obj.split(sep !== null ? sep : /[ \n\r\t]+/); + if (sep === null) + { + if (result.length && !result[0].length) + result.splice(0, 1); + if (result.length && !result[result.length-1].length) + result.splice(-1); + } + return result; + } + else + { + if (sep !== null) + { + let result = []; + while (obj.length) + { + let pos = obj.lastIndexOf(sep); + if (pos === -1 || !count--) + { + result.unshift(obj); + break; + } + result.unshift(obj.substr(pos+sep.length)); + obj = obj.substr(0, pos); + } + return result; + } + else + { + let result = []; + while (obj.length) + { + obj = ul4.StrProtocol.rstrip(obj); + let part; + if (!count--) + part = obj; // Take the rest of the string + else + { + part = obj.split(/[ \n\r\t]+/); + part = part[part.length-1]; + } + if (part.length) + result.unshift(part); + obj = obj.substr(0, obj.length-part.length); + } + return result; + } + } + } + + splitlines(obj, keepends=false) + { + let pos = 0; + let lookingAtLineEnd = function lookingAtLineEnd() + { + let c = obj[pos]; + if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') + return 1; + if (c === '\r') + { + if (pos == length-1) + return 1; + if (obj[pos+1] === '\n') + return 2; + return 1; + } + return 0; + }; + + let result = [], length = obj.length; + + for (pos = 0, startpos = 0;;) + { + if (pos >= length) + { + if (startpos != pos) + result.push(obj.substring(startpos)); + return result; + } + let lineendlen = lookingAtLineEnd(); + if (!lineendlen) + ++pos; + else + { + let endpos = pos + (keepends ? lineendlen : 0); + result.push(obj.substring(startpos, endpos)); + pos += lineendlen; + startpos = pos; + } + } + } + + lower(obj) + { + return obj.toLowerCase(); + } + + upper(obj) + { + return obj.toUpperCase(); + } + + capitalize(obj) + { + if (obj.length) + obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); + return obj; + } + + join(obj, iterable) + { + let resultlist = []; + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + resultlist.push(item.value); + } + return resultlist.join(obj); + } + + startswith(obj, prefix) + { + if (typeof(prefix) === "string") + return obj.substr(0, prefix.length) === prefix; + else if (ul4._islist(prefix)) + { + for (let i = 0; i < prefix.length; ++i) + { + let singlepre = prefix[i]; + if (obj.substr(0, singlepre.length) === singlepre) + return true; + } + return false; + } + else + throw new ul4.TypeError("startswith() argument must be string"); + } + + endswith(obj, suffix) + { + if (typeof(suffix) === "string") + return obj.substr(obj.length-suffix.length) === suffix; + else if (ul4._islist(suffix)) + { + for (let i = 0; i < suffix.length; ++i) + { + let singlesuf = suffix[i]; + if (obj.substr(obj.length-singlesuf.length) === singlesuf) + return true; + } + return false; + } + else + throw new ul4.TypeError("endswith() argument must be string or list of strings"); + } + }; + + ul4.StrProtocol = ul4.StrProtocol.prototype; + ul4.StrProtocol.attrs = ul4._makeset( + "split", + "rsplit", + "splitlines", + "strip", + "lstrip", + "rstrip", + "upper", + "lower", + "capitalize", + "startswith", + "endswith", + "replace", + "count", + "find", + "rfind", + "join" + ); + + ul4.expose(ul4.StrProtocol.count, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.find, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.rfind, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.StrProtocol.replace, ["old", "new", "count=", null]); + ul4.expose(ul4.StrProtocol.strip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.lstrip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.rstrip, ["chars=", null]); + ul4.expose(ul4.StrProtocol.split, ["sep=", null, "count=", null]); + ul4.expose(ul4.StrProtocol.rsplit, ["sep=", null, "count=", null]); + ul4.expose(ul4.StrProtocol.splitlines, ["keepends=", false]); + ul4.expose(ul4.StrProtocol.lower, []); + ul4.expose(ul4.StrProtocol.upper, []); + ul4.expose(ul4.StrProtocol.capitalize, []); + ul4.expose(ul4.StrProtocol.join, ["iterable"]); + ul4.expose(ul4.StrProtocol.startswith, ["prefix"]); + ul4.expose(ul4.StrProtocol.endswith, ["suffix"]); + + ul4.ListProtocol = class ListProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "list"; + } + + append(obj, items) + { + for (let i = 0; i < items.length; ++i) + obj.push(items[i]); + return null; + } + + insert(obj, pos, items) + { + if (pos < 0) + pos += obj.length; + + for (let i = 0; i < items.length; ++i) + obj.splice(pos++, 0, items[i]); + return null; + } + + pop(obj, pos) + { + if (pos < 0) + pos += obj.length; + + let result = obj[pos]; + obj.splice(pos, 1); + return result; + } + + count(obj, sub, start=null, end=null) + { + return ul4._count(obj, sub, start, end); + } + + find(obj, sub, start=null, end=null) + { + return ul4._find(obj, sub, start, end); + } + + rfind(obj, sub, start=null, end=null) + { + return ul4._rfind(obj, sub, start, end); + } + }; + + ul4.ListProtocol = ul4.ListProtocol.prototype; + ul4.ListProtocol.attrs = ul4._makeset( + "append", + "insert", + "pop", + "count", + "find", + "rfind" + ); + + ul4.expose(ul4.ListProtocol.append, ["*items"]); + ul4.expose(ul4.ListProtocol.insert, ["pos", "*items"]); + ul4.expose(ul4.ListProtocol.pop, ["pos=", -1]); + ul4.expose(ul4.ListProtocol.count, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.ListProtocol.find, ["sub", "start=", null, "end=", null]); + ul4.expose(ul4.ListProtocol.rfind, ["sub", "start=", null, "end=", null]); + + ul4.MapProtocol = class MapProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "dict"; + } + + getattr(obj, attrname) + { + if (this.attrs.has(attrname)) + { + let attr = this[attrname]; + let realattr = function realattr(...args) { + return attr.apply(this, [obj, ...args]); + }; + realattr.name = attr.name; + realattr._ul4_name = attr._ul4_name || attr.name; + realattr._ul4_signature = attr._ul4_signature; + realattr._ul4_needsobject = attr._ul4_needsobject; + realattr._ul4_needscontext = attr._ul4_needscontext; + return realattr; + } + else + return obj.get(attrname); + } + + get(obj, key, default_=null) + { + if (obj.has(key)) + return obj.get(key); + return default_; + } + + items(obj) + { + let result = []; + obj.forEach(function(value, key) { + result.push([key, value]); + }); + return result; + } + + values(obj) + { + let result = []; + obj.forEach(function(value, key) { + result.push(value); + }); + return result; + } + + update(obj, other, kwargs) + { + return ul4._update(obj, other, kwargs); + } + + clear(obj) + { + obj.clear(); + return null; + } + }; + + ul4.MapProtocol = ul4.MapProtocol.prototype; + ul4.MapProtocol.attrs = ul4._makeset("get", "items", "values", "update", "clear"); + + ul4.expose(ul4.MapProtocol.get, ["key", "default=", null]); + ul4.expose(ul4.MapProtocol.items, []); + ul4.expose(ul4.MapProtocol.values, []); + ul4.expose(ul4.MapProtocol.update, ["*other", "**kwargs"]); + ul4.expose(ul4.MapProtocol.clear, []); + + ul4.SetProtocol = class SetProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "set"; + } + + add(obj, items) + { + for (let i = 0; i < items.length; ++i) + { + obj.add(items[i]); } - result.push(c); - inspec = false; } - else { - if (c == "%") - inspec = true; - else - result.push(c); + + clear(obj) + { + obj.clear(); + return null; } - } - return result.join(""); -}; - -ul4._format_int = function _format_int(obj, fmt, lang) { - var work = fmt; - - // Defaults - var fill = ' '; - var align = '>'; // '<', '>', '=' or '^' - var sign = '-'; // '+', '-' or ' ' - var alternate = false; - var minimumwidth = 0; - var type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n' - - // Determine output type - if (/[bcdoxXn]$/.test(work)) { - type = work.substring(work.length - 1); - work = work.substring(0, work.length - 1); - } + }; + + ul4.SetProtocol = ul4.SetProtocol.prototype; + ul4.SetProtocol.attrs = ul4._makeset("add", "clear"); - // Extract minimum width - if (/\d+$/.test(work)) { - var minimumwidthStr = /\d+$/.exec(work); - work = work.replace(/\d+$/, ""); - if (/^0/.test(minimumwidthStr)) { - align = '='; - fill = '0'; + ul4.expose(ul4.SetProtocol.add, ["*items"]); + ul4.expose(ul4.SetProtocol.clear, []); + + ul4.DateProtocol = class DateProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "date"; } - minimumwidth = parseInt(minimumwidthStr); - } - // Alternate form? - if (/#$/.test(work)) { - alternate = true; - work = work.substring(0, work.length - 1); - } + weekday(obj) + { + return ul4.DateTimeProtocol.weekday(obj._date); + } - // Determine sign - if (/[+ -]$/.test(work)) { - if (type == 'c') - throw ul4.ValueError.create("sign not allowed for integer format type 'c'"); - sign = work.substring(work.length - 1); - work = work.substring(0, work.length - 1); - } + calendar(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateTimeProtocol.calendar(obj._date, firstweekday, mindaysinfirstweek); + } - // Extract fill and align char - if (work.length >= 3) - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - else if (work.length == 2) { - if (/[<>=^]$/.test(work)) { - align = work[1]; - fill = work[0]; + week(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1]; } - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - else if (work.length == 1) { - if (/^[<>=^]$/.test(work)) - align = work; - else - throw ul4.ValueError.create("illegal integer format string " + ul4._repr(fmt)); - } - // Basic number formatting - var neg = obj < 0; - - if (neg) - obj = -obj; - - var output; - switch (type) { - case 'b': - output = obj.toString(2); - break; - case 'c': - if (neg || obj > 65535) - throw ul4.ValueError.create("value out of bounds for c format"); - output = String.fromCharCode(obj); - break; - case 'd': - output = obj.toString(); - break; - case 'o': - output = obj.toString(8); - break; - case 'x': - output = obj.toString(16); - break; - case 'X': - output = obj.toString(16).toUpperCase(); - break; - case 'n': - // FIXME: locale formatting - output = obj.toString(); - break; - } + day(obj) + { + return obj._date.getDate(); + } - // The rest of the formatting - if (align === '=') { - if (neg || sign !== '-') - --minimumwidth; - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - minimumwidth -= 2; + month(obj) + { + return obj._date.getMonth()+1; + } - if (output.length < minimumwidth) - output = ul4._str_repeat(fill, minimumwidth - output.length) + output; + year(obj) + { + return obj._date.getFullYear(); + } - if (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X')) - output = "0" + type + output; + mimeformat(obj) + { + let weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + let monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + let d = obj._date; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - } - else { - if (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X')) - output = "0" + type + output; - if (neg) - output = "-" + output; - else if (sign != '-') - output = sign + output; - if (output.length < minimumwidth) { - if (align == '<') - output = output + ul4._str_repeat(fill, minimumwidth - output.length); - else if (align == '>') - output = ul4._str_repeat(fill, minimumwidth - output.length) + output; - else // if (align == '^') - { - var pad = minimumwidth - output.length; - var padBefore = Math.floor(pad / 2); - var padAfter = pad - padBefore; - output = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter); - } + return weekdayname[ul4.DateTimeProtocol.weekday(d)] + ", " + ul4._lpad(d.getDate(), "0", 2) + " " + monthname[d.getMonth()] + " " + d.getFullYear(); } - } - return output; -}; - -// Format ``obj`` using the format string ``fmt`` in the language ``lang`` -ul4._format = function _format(obj, fmt, lang) { - if (typeof (lang) === "undefined" || lang === null) - lang = "en"; - else { - var translations = { de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null }; - lang = lang.toLowerCase(); - if (typeof (translations[lang]) === "undefined") { - lang = lang.split(/_/)[0]; - if (typeof (translations[lang]) === "undefined") - lang = "en"; + + isoformat(obj) + { + let d = obj._date; + return d.getFullYear() + "-" + ul4._lpad((d.getMonth()+1).toString(), "0", 2) + "-" + ul4._lpad(d.getDate().toString(), "0", 2); } - } - if (ul4._isdate(obj)) - return ul4._format_date(obj, fmt, lang); - else if (ul4._isint(obj)) - return ul4._format_int(obj, fmt, lang); - else if (obj === true) - return ul4._format_int(1, fmt, lang); - else if (obj === false) - return ul4._format_int(0, fmt, lang); -}; - -ul4._lpad = function _lpad(string, pad, len) { - if (typeof (string) === "number") - string = string.toString(); - while (string.length < len) - string = pad + string; - return string; -}; - -ul4._rpad = function _rpad(string, pad, len) { - if (typeof (string) === "number") - string = string.toString(); - while (string.length < len) - string = string + pad; - return string; -}; - -ul4.Proto = { - __prototype__: null, - __id__: 0, - _nextid: 1, - isa: function isa(type) { - if (this === type) - return true; - if (this.__prototype__ === null) - return false; - return this.__prototype__.isa(type); - }, - isprotoof: function isprotoof(obj) { - while (true) { - if (obj === null || Object.prototype.toString.call(obj) !== "[object Object]" || typeof (obj.__prototype__) === "undefined") - return false; - if (obj === this) - return true; - obj = obj.__prototype__; + yearday(obj) + { + return ul4.DateTimeProtocol.yearday(obj._date); } - }, + }; - // equality comparison of objects defaults to identity comparison - __eq__: function __eq__(other) { - return this === other; - }, + ul4.DateProtocol = ul4.DateProtocol.prototype; + ul4.DateProtocol.attrs = ul4._makeset("weekday", "week", "calendar", "day", "month", "year", "mimeformat", "isoformat", "yearday"); - // To overwrite equality comparison, you only have to overwrite ``__eq__``, - // ``__ne__`` will be synthesized from that - __ne__: function __ne__(other) { - return !this.__eq__(other); - }, + ul4.expose(ul4.DateProtocol.weekday, []); + ul4.expose(ul4.DateProtocol.calendar, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateProtocol.week, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateProtocol.day, []); + ul4.expose(ul4.DateProtocol.month, []); + ul4.expose(ul4.DateProtocol.year, []); + ul4.expose(ul4.DateProtocol.mimeformat, []); + ul4.expose(ul4.DateProtocol.isoformat, []); + ul4.expose(ul4.DateProtocol.yearday, []); - // For other comparison operators, each method has to be implemented: - // ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and - // ``>=`` calls ``__ge__`` + ul4.DateTimeProtocol = class DatetimeProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "datetime"; + } - __bool__: function __bool__() { - return true; - } -}; - -ul4.Signature = ul4._inherit( - ul4.Proto, - { - create: function create() { - var signature = ul4._clone(this); - signature.args = []; - signature.argNames = {}; - signature.remargs = null; - signature.remkwargs = null; - - var nextDefault = false; - var lastArgname = null; - for (var i = 0; i < arguments.length; ++i) { - var argName = arguments[i]; - if (nextDefault) { - signature.args.push({ name: lastArgname, defaultValue: argName }); - signature.argNames[lastArgname] = true; - nextDefault = false; - } - else { - if (argName.substr(argName.length - 1) === "=") { - lastArgname = argName.substr(0, argName.length - 1); - nextDefault = true; - } - else if (argName.substr(0, 2) === "**") - signature.remkwargs = argName.substr(2); - else if (argName.substr(0, 1) === "*") - signature.remargs = argName.substr(1); - else { - signature.args.push({ name: argName }); - signature.argNames[argName] = true; - } - } - } - return signature; - }, + weekday(obj) + { + let d = obj.getDay(); + return d ? d-1 : 6; + } - // Create the argument array for calling a function with this signature with the arguments available from ``args`` - bindArray: function bindArray(name, args, kwargs) { - var finalargs = []; - var decname = name !== null ? name + "() " : ""; + calendar(obj, firstweekday=0, mindaysinfirstweek=4) + { + // Normalize parameters + firstweekday = ul4._mod(firstweekday, 7); + if (mindaysinfirstweek < 1) + mindaysinfirstweek = 1; + else if (mindaysinfirstweek > 7) + mindaysinfirstweek = 7; - for (var i = 0; i < this.args.length; ++i) { - var arg = this.args[i]; - if (i < args.length) { - if (kwargs.hasOwnProperty(arg.name)) - throw ul4.ArgumentError.create(decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") specified multiple times"); - finalargs.push(args[i]); - } - else { - if (kwargs.hasOwnProperty(arg.name)) - finalargs.push(kwargs[arg.name]); - else { - if (arg.hasOwnProperty("defaultValue")) - finalargs.push(arg.defaultValue); - else - throw ul4.ArgumentError.create("required " + decname + "argument " + ul4._repr(arg.name) + " (position " + i + ") missing"); - } + // ``obj`` might be in the first week of the next year, or last week of + // the previous year, so we might have to try those too. + for (let offset = +1; offset >= -1; --offset) + { + let year = obj.getFullYear() + offset; + // ``refdate`` will always be in week 1 + let refDate = new Date(year, 0, mindaysinfirstweek); + // Go back to the start of ``refdate``s week (i.e. day 1 of week 1) + let weekDayDiff = ul4._mod(ul4.DateTimeProtocol.weekday(refDate) - firstweekday, 7); + let weekStartYear = refDate.getFullYear(); + let weekStartMonth = refDate.getMonth(); + let weekStartDay = refDate.getDate() - weekDayDiff; + let weekStart = new Date(weekStartYear, weekStartMonth, weekStartDay); + // Is our date ``obj`` at or after day 1 of week 1? + if (obj.getTime() >= weekStart.getTime()) + { + let diff = ul4.SubAST.prototype._do(obj, weekStart); + // Add 1, because the first week is week 1, not week 0 + let week = Math.floor(diff.days()/7) + 1; + return [year, week, ul4.DateTimeProtocol.weekday(obj)]; } } + } - // Do we accept additional positional arguments? - if (this.remargs === null) { - // No, but we have them -> complain - if (args.length > this.args.length) { - var prefix = name === null ? "expected" : name + "() expects"; - throw ul4.ArgumentError.create(prefix + " at most " + this.args.length + " positional argument" + (this.args.length != 1 ? "s" : "") + ", " + args.length + " given"); - } - } - else { - // Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list) - finalargs.push(args.slice(this.args.length)); - } + week(obj, firstweekday=0, mindaysinfirstweek=4) + { + return ul4.DateTimeProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1]; + } - // Do we accept arbitrary keyword arguments? - if (this.remkwargs === null) { - // No => complain about unknown ones - for (var key in kwargs) { - if (!this.argNames[key]) { - if (name === null) - throw ul4.ArgumentError.create("an argument named " + ul4._repr(key) + " isn't supported"); - else - throw ul4.ArgumentError.create(name + "() doesn't support an argument named " + ul4._repr(key)); - } - } - } - else { - // Yes => Put the unknown ones into an object and add that to the arguments array - var remkwargs = {}; - for (var key in kwargs) { - if (!this.argNames[key]) - remkwargs[key] = kwargs[key]; - } - finalargs.push(remkwargs); - } + day(obj) + { + return obj.getDate(); + } - return finalargs; - }, + month(obj) + { + return obj.getMonth()+1; + } - // Create the argument object for calling a function with this signature with the arguments available from ``args`` - bindObject: function bindObject(name, args, kwargs) { - args = this.bindArray(name, args, kwargs); - var argObject = {}; - var i; - for (i = 0; i < this.args.length; ++i) - argObject[this.args[i].name] = args[i]; - if (this.remargs !== null) - argObject[this.remargs] = args[i++]; - if (this.remkwargs !== null) - argObject[this.remkwargs] = args[i++]; - return argObject; - }, + year(obj) + { + return obj.getFullYear(); + } - __repr__: function __repr__() { - return ""; - }, + hour(obj) + { + return obj.getHours(); + } - __str__: function __str__() { - return this.toString(); - }, + minute(obj) + { + return obj.getMinutes(); + } - toString: function toString() { - var v = []; - for (var i = 0; i < this.args.length; ++i) { - var arg = this.args[i]; + second(obj) + { + return obj.getSeconds(); + } - if (arg.hasOwnProperty("defaultValue")) - v.push(arg.name + "=" + ul4._repr(arg.defaultValue)); - else - v.push(arg.name); + microsecond(obj) + { + return obj.getMilliseconds() * 1000; + } + + mimeformat(obj) + { + let weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + let monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + return weekdayname[ul4.DateTimeProtocol.weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; + } + + isoformat(obj) + { + let year = obj.getFullYear(); + let month = obj.getMonth()+1; + let day = obj.getDate(); + let hour = obj.getHours(); + let minute = obj.getMinutes(); + let second = obj.getSeconds(); + let ms = obj.getMilliseconds(); + let result = year + "-" + ul4._lpad(month.toString(), "0", 2) + "-" + ul4._lpad(day.toString(), "0", 2) + "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); + if (ms) + result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; + return result; + } + + yearday(obj) + { + let leap = ul4._isleap(obj) ? 1 : 0; + let day = obj.getDate(); + switch (obj.getMonth()) + { + case 0: + return day; + case 1: + return 31 + day; + case 2: + return 31 + 28 + leap + day; + case 3: + return 31 + 28 + leap + 31 + day; + case 4: + return 31 + 28 + leap + 31 + 30 + day; + case 5: + return 31 + 28 + leap + 31 + 30 + 31 + day; + case 6: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; + case 7: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; + case 8: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; + case 9: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; + case 10: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; + case 11: + return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; } - if (this.remargs !== null) - v.push("*" + this.remargs); - if (this.remkwargs !== null) - v.push("**" + this.remkwargs); - return "(" + v.join(", ") + ")"; } - } -); + }; -// Adds name and signature to a function/method and makes the method callable in templates -ul4.expose = function expose(signature, options, f) { - if (typeof (f) === "undefined") { - f = options; - options = {}; - } - if (options.name) - f._ul4_name = options.name; - if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); - f._ul4_signature = signature; - f._ul4_needsobject = options.needsobject || false; - f._ul4_needscontext = options.needscontext || false; - - return f; -}; - -ul4.Context = ul4._inherit( - ul4.Proto, - { - create: function create(vars) { - if (vars === null || typeof (vars) === "undefined") + ul4.DateTimeProtocol = ul4.DateTimeProtocol.prototype; + ul4.DateTimeProtocol.attrs = ul4._makeset("weekday", "week", "calendar", "day", "month", "year", "hour", "minute", "second", "microsecond", "mimeformat", "isoformat", "yearday"); + + ul4.expose(ul4.DateTimeProtocol.weekday, []); + ul4.expose(ul4.DateTimeProtocol.calendar, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateTimeProtocol.week, ["firstweekday=", 0, "mindaysinfirstweek=", 4]); + ul4.expose(ul4.DateTimeProtocol.day, []); + ul4.expose(ul4.DateTimeProtocol.month, []); + ul4.expose(ul4.DateTimeProtocol.year, []); + ul4.expose(ul4.DateTimeProtocol.hour, []); + ul4.expose(ul4.DateTimeProtocol.minute, []); + ul4.expose(ul4.DateTimeProtocol.second, []); + ul4.expose(ul4.DateTimeProtocol.microsecond, []); + ul4.expose(ul4.DateTimeProtocol.mimeformat, []); + ul4.expose(ul4.DateTimeProtocol.isoformat, []); + ul4.expose(ul4.DateTimeProtocol.yearday, []); + + ul4.ObjectProtocol = class ObjectProtocol extends ul4.Protocol.constructor + { + ul4type(obj) + { + return "dict"; + } + + getattr(obj, attrname) + { + let result; + if (obj && typeof(obj.__getattr__) === "function") // test this before the generic object test + result = obj.__getattr__(attrname); + else + result = obj[attrname]; + if (typeof(result) !== "function") + return result; + let realresult = function(...args) { + // We can use ``apply`` here, as we know that ``obj`` is a real object. + return result.apply(obj, args); + }; + realresult._ul4_name = result._ul4_name || result.name; + realresult._ul4_signature = result._ul4_signature; + realresult._ul4_needsobject = result._ul4_needsobject; + realresult._ul4_needscontext = result._ul4_needscontext; + return realresult; + } + + get(obj, key, default_=null) + { + let result = obj[key]; + if (typeof(result) === "undefined") + return default_; + return result; + } + + items(obj) + { + let result = []; + for (let key in obj) + result.push([key, obj[key]]); + return result; + } + + values(obj) + { + let result = []; + for (let key in obj) + result.push(obj[key]); + return result; + } + + clear(obj) + { + for (let key in obj) + delete obj[key]; + } + }; + + ul4.ObjectProtocol = ul4.ObjectProtocol.prototype; + ul4.ObjectProtocol.attrs = ul4._makeset("get", "items", "values", "update", "clear"); + + ul4.expose(ul4.ObjectProtocol.get, ["key", "default=", null]); + ul4.expose(ul4.ObjectProtocol.items, []); + ul4.expose(ul4.ObjectProtocol.values, []); + ul4.expose(ul4.ObjectProtocol.clear, []); + + ul4.Context = class Context + { + constructor(vars) + { + if (vars === null || typeof(vars) === "undefined") vars = {}; - var context = ul4._clone(this); - context.vars = vars; - context.indents = []; - context._output = []; - return context; - }, + this.vars = vars; + this.indents = []; + this.escapes = []; + this._output = []; + } /* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one. * This is used by the various comprehensions to avoid leaking loop variables. */ - inheritvars: function inheritvars() { - var context = ul4._clone(this); - context.vars = ul4._simpleclone(this.vars); + inheritvars() + { + let context = Object.create(this); + context.vars = Object.create(this.vars); return context; - }, + } /* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */ - withindent: function withindent(indent) { - var context = ul4._clone(this); - if (indent !== null) { + withindent(indent) + { + let context = Object.create(this); + if (indent !== null) + { context.indents = this.indents.slice(); context.indents.push(indent); } return context; - }, + } /* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */ - replaceoutput: function replaceoutput() { - var context = ul4._clone(this); + replaceoutput() + { + let context = Object.create(this); context._output = []; return context; - }, + } - clone: function clone(vars) { - return ul4._clone(this); - }, + clone(vars) + { + return Object.create(this); + } - output: function output(value) { + output(value) + { + for (let i = 0; i < this.escapes.length; ++i) + { + let escape = this.escapes[i]; + value = escape(value); + } this._output.push(value); - }, + } - getoutput: function getoutput() { + getoutput() + { return this._output.join(""); - }, + } - get: function get(name) { + get(name) + { return this.vars[name]; - }, + } - set: function set(name, value) { + set(name, value) + { this.vars[name] = value; } - } -); + }; -/// Exceptions + /// Exceptions -ul4.Exception = ul4._inherit( - ul4.Proto, + // Note that extending ``Error`` doesn't work, so we do it the "classic" way + ul4.Exception = function Exception(message, fileName, lineNumber) { - __type__: "ul4.Exception", - "cause": null, + let instance = new Error(message, fileName, lineNumber); + Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); + instance.__id__ = _nextid++; + instance.context = null; + return instance; + }; - __getattr__: function __getattr__(attrname) { - switch (attrname) { - case "cause": - return this.cause; - default: - return undefined; - } + ul4.Exception.prototype = Object.create(Error.prototype, { + constructor: { + value: Error, + enumerable: false, + writable: true, + configurable: true } - } -); + }); + + if (Object.setPrototypeOf) + Object.setPrototypeOf(ul4.Exception, Error); + else + ul4.Exception.__proto__ = Error; + + ul4.Exception.prototype.__getattr__ = function __getattr__(attrname) + { + switch (attrname) + { + case "context": + return this.context; + default: + throw new ul4.AttributeError(this, attrname); + } + }; + + // Exceptions used internally by UL4 for flow control + ul4.InternalException = class InternalException extends ul4.Exception + { + }; -// Exceptions used internally by UL4 for flow control -ul4.InternalException = ul4._inherit(ul4.Exception, {}); + // Control flow exceptions + ul4.ReturnException = class ReturnException extends ul4.InternalException + { + constructor(result) + { + super("return"); + this.result = result; + } + }; -// Control flow exceptions -ul4.ReturnException = ul4._inherit( - ul4.InternalException, + ul4.BreakException = class BreakException extends ul4.InternalException { - __type__: "ul4.ReturnException", + constructor() + { + super("break"); + } + }; - create: function create(result) { - var exception = ul4._clone(this); - exception.result = result; - return exception; + ul4.ContinueException = class ContinueException extends ul4.InternalException + { + constructor() + { + super("continue"); } - } -); + }; -ul4.BreakException = ul4._inherit( - ul4.InternalException, + // Real exceptions raised by various parts of UL4 + ul4.SyntaxError = class SyntaxError extends ul4.Exception { - __type__: "ul4.BreakException" - } -); + }; -ul4.ContinueException = ul4._inherit( - ul4.InternalException, + ul4.LValueRequiredError = class LValueRequiredError extends ul4.SyntaxError { - __type__: "ul4.ContinueException" - } -); + constructor() + { + super("lvalue required"); + } + }; -// Real exceptions raised by various parts of UL4 -ul4.SyntaxError = ul4._inherit( - ul4.Exception, + ul4.TypeError = class TypeError extends ul4.Exception { - __type__: "ul4.SyntaxError" - } -); + }; + + ul4.ValueError = class ValueError extends ul4.Exception + { + }; -ul4.LValueRequiredError = ul4._inherit( - ul4.SyntaxError, + ul4.ArgumentError = class ArgumentError extends ul4.Exception { - __type__: "ul4.LValueRequiredError", + }; - toString: function toString() { - return "lvalue required!"; + ul4.NotSubscriptableError = class NotSubscriptableError extends ul4.Exception + { + constructor(obj) + { + super("Object of type " + _type(obj) + " is not subscriptable"); + this.obj = obj; } - } -); -ul4.TypeError = ul4._inherit( - ul4.Exception, + toString() + { + return "Object of type " + _type(this.obj) + " is not subscriptable"; + } + }; + + ul4.ZeroDivisionError = class ZeroDivisionError extends ul4.Exception + { + constructor() + { + super("division by zero"); + } + }; + + ul4.IndexError = class IndexError extends ul4.Exception { - __type__: "ul4.TypeError", + constructor(obj, index) + { + super("index " + ul4._repr(index) + " out of range"); + this.obj = obj; + this.index = index; + } - create: function create(operation, message) { - var exception = ul4._clone(this); - exception.operation = operation; - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + toString() + { + return "index " + this.index + " out of range for " + ul4._type(this.obj); } - } -); + }; + + ul4.AttributeError = class AttributeError extends ul4.Exception + { + constructor(obj, attrname) + { + super("object of type " + ul4._type(obj) + " has no attribute " + ul4._repr(attrname)); + this.obj = obj; + this.attrname = attrname; + } + }; -ul4.ValueError = ul4._inherit( - ul4.Exception, + /// Exception that wraps other exceptions while they bubble up the stack + ul4.LocationError = class LocationError extends ul4.Exception { - __type__: "ul4.ValueError", + constructor(location) + { + super("nested exception in " + ul4._repr(location)); + this.location = location; + } + + _templateprefix() + { + let template = this.location.template; + let out = []; + if (template.parenttemplate !== null) + out.push("in local template "); + else + out.push("in template "); + let first = true; + while (template != null) + { + if (first) + first = false; + else + out.push(" in "); + out.push(template.name ? ul4._repr(template.name) : "(unnamed)"); + template = template.parenttemplate; + } + return out.join(""); + } + + toString() + { + let template = this.location.template; + let templateprefix = this._templateprefix(); + + let prefix = this.location.sourceprefix; + let code = this.location.source; + let suffix = this.location.sourcesuffix; + prefix = ul4._repr(prefix).slice(1, -1); + code = ul4._repr(code).slice(1, -1); + suffix = ul4._repr(suffix).slice(1, -1); + + let text = prefix + code + suffix; + let underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); + + let pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + this.location.line + "; col " + this.location.col; + + let message = templateprefix + ": " + pos + "\n" + text + "\n" + underline; + return message; + } - create: function create(message) { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + __getattr__(attrname) + { + switch (attrname) + { + case "context": + return this.context; + case "location": + return this.location; + default: + throw new ul4.AttributeError(this, attrname); + } } - } -); + }; -ul4.ArgumentError = ul4._inherit( - ul4.Exception, + /// Classes for the syntax tree + ul4.AST = class AST extends ul4.Proto { - __type__: "ul4.ArgumentError", + constructor(template, pos) + { + super(); + this.template = template; + this.pos = pos; + this._line = null; + this._col = null; + } - create: function create(message) { - var exception = ul4._clone(this); - exception.message = message; - return exception; - }, - toString: function toString() { - return this.message; + get fullsource() + { + return this.template._source; } - } -); -/// Exception that wraps other exceptions while they bubble up the stack -ul4.LocationError = ul4._inherit( - ul4.Exception, - { - __type__: "ul4.LocationError", + get source() + { + return this.pos.of(this.template._source); + } - create: function create(location, cause) { - var exception = ul4._clone(this); - exception.location = location; - exception.cause = cause; - return exception; - }, + get sourceprefix() + { + let outerstartpos = this.pos.start; + let innerstartpos = outerstartpos; + let source = this.fullsource; - _templateprefix: function (template) { - var out = []; - if (template.parenttemplate !== null) - out.push("in local template "); - else - out.push("in template "); - var first = true; - while (template != null) { - if (first) - first = false; - else - out.push(" in "); - out.push(template.name !== null ? ul4._repr(template.name) : "(unnamed)"); - template = template.parenttemplate; + let maxprefix = 40; + let preprefix = "\u2026"; + while (maxprefix > 0) + { + // We arrived at the start of the source code + if (outerstartpos === 0) + { + preprefix = ""; + break; + } + // We arrived at the start of the line + if (source.charAt(outerstartpos-1) === "\n") + { + preprefix = ""; + break; + } + --maxprefix; + --outerstartpos; } - return out.join(""); - }, + return preprefix + source.substring(outerstartpos, innerstartpos); + } - _template: function _template() { - if (ul4.Tag.isprotoof(this.location)) - return this.location.template; - else - return this.location.tag.template; - }, - - _outerpos: function _outerpos() { - if (ul4.Tag.isprotoof(this.location)) - return this.location.pos; - else { - var tag = this.location.tag; - if (tag === null) // A top level template as no tag - return this.location.pos; - else - return tag.pos; + get sourcesuffix() + { + let outerstoppos = this.pos.stop; + let innerstoppos = outerstoppos; + let source = this.fullsource; + + let maxsuffix = 40; + let postsuffix = "\u2026"; + while (maxsuffix > 0) + { + // We arrived at the ed of the source code + if (outerstoppos >= source.length) + { + postsuffix = ""; + break; + } + // We arrived at the end of the line + if (source.charAt(outerstoppos) === "\n") + { + postsuffix = ""; + break; + } + --maxsuffix; + ++outerstoppos; } - }, + return source.substring(innerstoppos, outerstoppos) + postsuffix; + } - _innerpos: function _innerpos() { - return this.location.pos; - }, + get line() + { + if (this._line === null) + this._calculateLineCol(); + return this._line; + } - toString: function toString() { - var template = this._template(); - var templateprefix = this._templateprefix(template); - var outerpos = this._outerpos(); - var innerpos = this._innerpos(); + get col() + { + if (this._col === null) + this._calculateLineCol(); + return this._col; + } - var prefix = template.source.substring(outerpos.start, innerpos.start); - var code = template.source.substring(innerpos.start, innerpos.stop); - var suffix = template.source.substring(innerpos.stop, outerpos.stop); - prefix = ul4._repr(prefix).slice(1, -1); - code = ul4._repr(code).slice(1, -1); - suffix = ul4._repr(suffix).slice(1, -1); - var text = prefix + code + suffix; - var underline = ul4._str_repeat("\u00a0", prefix.length) + ul4._str_repeat("~", code.length); - - // find line numbers - var lineno = 1, colno = 1; - for (var i = 0; i < innerpos.start; ++i) { - if (template.source[i] === "\n") { - ++lineno; - colno = 1; + _calculateLineCol() + { + this._line = 1 + this._col = 1; + let stop = this.pos.start; + for (let i = 0; i < stop; ++i) + { + if (this.template.source[i] === "\n") + { + ++this._line; + this._col = 1; } else - ++colno; + ++this._col; } + } - pos = "offset " + this.location.pos.start + ":" + this.location.pos.stop + "; line " + lineno + "; col " + colno; - - return templateprefix + ": " + pos + "\n" + text + "\n" + underline; - }, - - __getattr__: function __getattr__(attrname) { - switch (attrname) { - case "cause": - return this.cause; - case "location": - return this.location; - case "template": - return this._template; - case "outerpos": - return this._outerpos; - case "innerpos": - return this._innerpos; - default: - return undefined; - } + __getattr__(attrname) + { + if (attrname === "type" || attrname === "fullsource" || attrname === "source" || attrname === "sourceprefix" || attrname === "sourcesuffix" || attrname === "line" || attrname === "col") + return this[attrname]; + else if (this._ul4onattrs.indexOf(attrname) >= 0) + return this[attrname]; + throw new ul4.AttributeError(this, attrname); } - } -); + __setitem__(attrname, value) + { + throw new ul4.TypeError("object is immutable"); + } -/// Classes for the syntax tree -ul4.AST = ul4._inherit( - ul4.Proto, - { - create: function create(pos) { - var ast = ul4._clone(this); - ast.pos = pos; - return ast; - }, - __str__: function __str__() { - var out = []; + __str__() + { + let out = []; this._str(out); return ul4._formatsource(out); - }, - __repr__: function __repr__() { - var out = []; + } + + __repr__() + { + let out = []; this._repr(out); return ul4._formatsource(out); - }, - _handle_eval: function _handle_eval(context) { - try { + } + + _decorate_exception(exc) + { + while (exc.context !== undefined && exc.context !== null) + exc = exc.context; + exc.context = new ul4.LocationError(this); + } + + _handle_eval(context) + { + try + { return this._eval(context); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_set: function _handle_eval_set(context, value) { - try { + } + + _handle_eval_set(context, value) + { + try + { return this._eval_set(context, value); } - catch (exc) { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _eval_set: function _eval_set(context, value) { - throw ul4.LValueRequiredError; - }, - _handle_eval_modify: function _handle_eval_modify(context, operator, value) { - try { + } + + _eval_set(context, value) + { + throw new ul4.LValueRequiredError(); + } + + _handle_eval_modify(context, operator, value) + { + try + { return this._eval_modify(context, operator, value); } - catch (exc) { - if (!ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _eval_modify: function _eval_modify(context, operator, value) { - throw ul4.LValueRequiredError; - }, - _repr: function _repr(out) { - }, - _str: function _str(out) { - }, - ul4ondump: function ul4ondump(encoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - encoder.dump(this[this._ul4onattrs[i]]); - }, - ul4onload: function ul4onload(decoder) { - for (var i = 0; i < this._ul4onattrs.length; ++i) - this[this._ul4onattrs[i]] = decoder.load(); - }, - __setitem__: function __setitem__(attrname, value) { - throw ul4.TypeError.create("mutate", "object is immutable"); - }, - // used in ul4ondump/ul4ondump to automatically dump these attributes - _ul4onattrs: ["pos"] - } -); - -ul4.TextAST = ul4._inherit( - ul4.AST, - { - create: function create(template, pos) { - var text = ul4.AST.create.call(this, pos); - text.template = template; - return text; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["template"]), - _text: function _text() { - return this.template.source.substring(this.pos.start, this.pos.stop); - }, - _eval: function _eval(context) { - context.output(this._text()); - }, - _str: function _str(out) { + } + + _eval_modify(context, operator, value) + { + throw new ul4.LValueRequiredError(); + } + + _repr(out) + { + } + + _str(out) + { + out.push(this.source.replace(/\r?\n/g, ' ')); + } + + ul4ondump(encoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + { + let attrname = this._ul4onattrs[i]; + encoder.dump(this[attrname]); + } + } + + ul4onload(decoder) + { + for (let i = 0; i < this._ul4onattrs.length; ++i) + { + let attrname = this._ul4onattrs[i]; + this[attrname] = decoder.load(); + } + } + }; + + // used in ul4ondump/ul4ondump to automatically dump these attributes + ul4.AST.prototype._ul4onattrs = ["template", "pos"]; + + ul4.TextAST = class TextAST extends ul4.AST + { + constructor(template, pos) + { + super(template, pos); + } + + get text() + { + return this.source; + } + + _eval(context) + { + context.output(this.text); + } + + _str(out) + { out.push("text "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); - -ul4.IndentAST = ul4._inherit( - ul4.TextAST, - { - create: function create(template, pos, text) { - var indent = ul4.TextAST.create.call(this, template, pos); - indent._maketext(text); - return indent; - }, - _maketext: function _maketext(text) { - if (typeof (this.template) !== "undefined") { - if (text === null) - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - else - this.text = text; - } - else - this.text = null; - }, - _text: function _text() { - if (this.text === null) - return this.template.source.substring(this.pos.start, this.pos.stop); + }; + + ul4.IndentAST = class IndentAST extends ul4.TextAST + { + constructor(template, pos, text) + { + super(template, pos); + this._text = text; + } + + get text() + { + if (typeof(this.template) !== "undefined") + return this._text === null ? this.source : this._text; else - return this.text; - }, - _eval: function _eval(context) { - for (var i = 0; i < context.indents.length; ++i) - context.output(context.indents[i]); - context.output(this._text()); - }, - ul4ondump: function ul4ondump(encoder) { - ul4.TextAST.ul4ondump.call(this, encoder); - - if (this.text === this.template.source.substring(this.pos.start, this.pos.stop)) + return null; + } + + _eval(context) + { + for (let i = 0; i < context.indents.length; ++i) + { + let indent = context.indents[i]; + context.output(indent); + } + context.output(this.text); + } + + ul4ondump(encoder) + { + super.ul4ondump(encoder); + + if (this._text === this.source) encoder.dump(null); else - encoder.dump(this.text); - }, - ul4onload: function ul4onload(decoder) { - ul4.TextAST.ul4onload.call(this, decoder); - // Recreate ``text`` attribute - this._maketext(decoder.load()); - }, - _str: function _str(out) { + encoder.dump(this._text); + } + + ul4onload(decoder) + { + super.ul4onload(decoder); + this._text = decoder.load(); + } + + _str(out) + { out.push("indent "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.LineEndAST = ul4._inherit( - ul4.TextAST, + ul4.LineEndAST = class LineEndAST extends ul4.TextAST { - _str: function _str(out) { + _str(out) + { out.push("lineend "); - out.push(ul4._repr(this._text())); - }, - _repr: function _repr(out) { + out.push(ul4._repr(this.text)); + } + + _repr(out) + { out.push(""); } - } -); - -ul4.Tag = ul4._inherit( - ul4.AST, - { - create: function create(template, tag, tagpos, codepos) { - var tago = ul4.AST.create.call(this, tagpos); - tago.template = template; - tago.tag = tag; - tago.codepos = codepos; - tago._maketext(); - return tago; - }, - _maketext: function _maketext() { - if (typeof (this.template) !== "undefined") { - this.text = this.template.source.substring(this.pos.start, this.pos.stop); - this.code = this.template.source.substring(this.codepos.start, this.codepos.stop); - } - else { - this.text = null; - this.code = null; - } - }, - ul4ondump: function ul4ondump(encoder) { - ul4.AST.ul4ondump.call(this, encoder); - encoder.dump(this.template); - encoder.dump(this.tag); - encoder.dump(this.codepos); - }, - ul4onload: function ul4onload(decoder) { - ul4.TextAST.ul4onload.call(this, decoder); - this.template = decoder.load(); - this.tag = decoder.load(); - this.codepos = decoder.load(); - // Recreate ``text`` attribute - this._maketext(); - } - } -); + }; -ul4.CodeAST = ul4._inherit( - ul4.AST, + ul4.CodeAST = class CodeAST extends ul4.AST { - create: function create(tag, pos) { - var code = ul4.AST.create.call(this, pos); - code.tag = tag; - return code; - }, - _ul4onattrs: ul4.AST._ul4onattrs.concat(["tag"]), - _str: function _str(out) { - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); + }; + + ul4.ConstAST = class ConstAST extends ul4.CodeAST + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; } - } -); - -ul4.ConstAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, value) { - var constant = ul4.CodeAST.create.call(this, tag, pos); - constant.value = value; - return constant; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { + } + + _eval(context) + { return this.value; } - } -); + }; + + ul4.ConstAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["value"]); -ul4.ItemArgBase = ul4._inherit( - ul4.CodeAST, + ul4.ItemArgBase = class ItemArgBase extends ul4.CodeAST { - _handle_eval_list: function _handle_eval_list(context, result) { - try { + _handle_eval_list(context, result) + { + try + { return this._eval_list(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_set: function _handle_eval_set(context, result) { - try { + } + + _handle_eval_set(context, result) + { + try + { return this._eval_set(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_dict: function _handle_eval_dict(context, result) { - try { + } + + _handle_eval_dict(context, result) + { + try + { return this._eval_dict(context, result); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } - }, - _handle_eval_call: function _handle_eval_call(context, args, kwargs) { - try { + } + + _handle_eval_call(context, args, kwargs) + { + try + { return this._eval_call(context, args, kwargs); } - catch (exc) { - if (!ul4.InternalException.isprotoof(exc) && !ul4.LocationError.isprotoof(exc)) - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + if (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError)) + this._decorate_exception(exc); throw exc; } } - } -); - -ul4.SeqItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) { - var seqitem = ul4.ItemArgBase.create.call(this, tag, pos); - seqitem.value = value; - return seqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + }; + + ul4.SeqItemAST = class SeqItemAST extends ul4.ItemArgBase + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_list: function _eval_list(context, result) { - var value = this.value._handle_eval(context); + } + + _eval_list(context, result) + { + let value = this.value._handle_eval(context); result.push(value); - }, - _eval_set: function _eval_set(context, result) { - var value = this.value._handle_eval(context); + } + + _eval_set(context, result) + { + let value = this.value._handle_eval(context); result.add(value); } - } -); + }; + ul4.SeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); -ul4.UnpackSeqItemAST = ul4._inherit( - ul4.ItemArgBase, + ul4.UnpackSeqItemAST = class UnpackSeqItemAST extends ul4.ItemArgBase { - create: function create(tag, pos, value) { - var unpackseqitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackseqitem.value = value; - return unpackseqitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_list: function _eval_list(context, result) { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + } + + _eval_list(context, result) + { + let value = this.value._handle_eval(context); + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; result.push(item.value); } - }, - _eval_set: function _eval_set(context, result) { - var value = this.value._handle_eval(context); - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + } + + _eval_set(context, result) + { + let value = this.value._handle_eval(context); + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; result.add(item.value); } } - } -); - -ul4.DictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, key, value) { - var dictitem = ul4.ItemArgBase.create.call(this, tag, pos); - dictitem.key = key; - dictitem.value = value; - return dictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["key", "value"]), - _repr: function _repr(out) { + }; + + ul4.UnpackSeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); + + ul4.DictItemAST = class DictItemAST extends ul4.ItemArgBase + { + constructor(template, pos, key, value) + { + super(template, pos); + this.key = key; + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_dict: function _eval_dict(context, result) { - var key = this.key._handle_eval(context); - var value = this.value._handle_eval(context); - ul4on._setmap(result, key, value); } - } -); - -ul4.UnpackDictItemAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var unpackdictitem = ul4.ItemArgBase.create.call(this, tag, pos); - unpackdictitem.item = item; - return unpackdictitem; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + + _eval_dict(context, result) + { + let key = this.key._handle_eval(context); + let value = this.value._handle_eval(context); + ul4._setmap(result, key, value); + } + }; + + ul4.DictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["key", "value"]), + + ul4.UnpackDictItemAST = class UnpackDictItemAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_dict: function _eval_dict(context, result) { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) { - for (var i = 0; i < item.length; ++i) { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; - ul4on._setmap(result, key, value); + } + + _eval_dict(context, result) + { + let item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (let i = 0; i < item.length; ++i) + { + let subitem = item[i]; + if (!ul4._islist(subitem) || subitem.length != 2) + throw new ul4.ArgumentError("** requires a list of (key, value) pairs"); + ul4._setmap(result, subitem[0], subitem[1]); } } - else if (ul4._ismap(item)) { - item.forEach(function (value, key) { - ul4on._setmap(result, key, value); + else if (ul4._ismap(item)) + { + item.forEach(function(value, key) { + ul4._setmap(result, key, value); }); } - else if (ul4._isobject(item)) { - for (var key in item) - ul4on._setmap(result, key, item[key]); + else if (ul4._isobject(item)) + { + for (let key in item) + ul4._setmap(result, key, item[key]); } } - } -); - -ul4.PosArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, value) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["value"]), - _repr: function _repr(out) { + }; + + ul4.UnpackDictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.PosArgAST = class PosArgAST extends ul4.ItemArgBase + { + constructor(template, pos, value) + { + super(template, pos); + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var value = this.value._handle_eval(context); + } + + _eval_call(context, args, kwargs) + { + let value = this.value._handle_eval(context); args.push(value); } - } -); - -ul4.KeywordArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, name, value) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.name = name; - arg.value = value; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["name", "value"]), - _repr: function _repr(out) { + }; + + ul4.PosArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["value"]); + + ul4.KeywordArgAST = class KeywordArgAST extends ul4.ItemArgBase + { + constructor(template, pos, name, value) + { + super(template, pos); + this.name = name; + this.value = value; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { + } + + _eval_call(context, args, kwargs) + { if (kwargs.hasOwnProperty(this.name)) - throw ul4.ArgumentError.create("duplicate keyword argument " + this.name); - var value = this.value._handle_eval(context); + throw new ul4.ArgumentError("duplicate keyword argument " + this.name); + let value = this.value._handle_eval(context); kwargs[this.name] = value; } - } -); - -ul4.UnpackListArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + }; + + ul4.KeywordArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["name", "value"]); + + ul4.UnpackListArgAST = class UnpackListArgAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var item = this.item._handle_eval(context); - args.push.apply(args, item); } - } -); - -ul4.UnpackDictArgAST = ul4._inherit( - ul4.ItemArgBase, - { - create: function create(tag, pos, item) { - var arg = ul4.ItemArgBase.create.call(this, tag, pos); - arg.item = item; - return arg; - }, - _ul4onattrs: ul4.ItemArgBase._ul4onattrs.concat(["item"]), - _repr: function _repr(out) { + + _eval_call(context, args, kwargs) + { + let item = this.item._handle_eval(context); + args.push(...item); + } + }; + + ul4.UnpackListArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.UnpackDictArgAST = class UnpackDictArgAST extends ul4.ItemArgBase + { + constructor(template, pos, item) + { + super(template, pos); + this.item = item; + } + + _repr(out) + { out.push(""); - }, - _eval_call: function _eval_call(context, args, kwargs) { - var item = this.item._handle_eval(context); - if (ul4._islist(item)) { - for (var i = 0; i < item.length; ++i) { - if (!ul4._islist(item[i]) || item[i].length != 2) - throw ul4.ArgumentError.create("** requires a list of (key, value) pairs"); - var key = item[i][0], value = item[i][1]; + } + + _eval_call(context, args, kwargs) + { + let item = this.item._handle_eval(context); + if (ul4._islist(item)) + { + for (let i = 0; i < item.length; ++i) + { + let subitem = item[i]; + if (!ul4._islist(subitem) || subitem.length != 2) + throw new ul4.ArgumentError("** requires a list of (key, value) pairs"); + let [key, value] = subitem; if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = value; } } - else if (ul4._ismap(item)) { - item.forEach(function (value, key) { + else if (ul4._ismap(item)) + { + item.forEach(function(value, key) { if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = value; }); } - else if (ul4._isobject(item)) { - for (var key in item) { + else if (ul4._isobject(item)) + { + for (let key in item) + { if (kwargs.hasOwnProperty(key)) - throw ul4.ArgumentError.create("duplicate keyword argument " + key); + throw new ul4.ArgumentError("duplicate keyword argument " + key); kwargs[key] = item[key]; } } } - } -); - -ul4.ListAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var list = ul4.CodeAST.create.call(this, tag, pos); - list.items = []; - return list; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { + }; + + ul4.UnpackDictArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat(["item"]); + + ul4.ListAST = class ListAST extends ul4.CodeAST + { + constructor(template, pos) + { + super(template, pos); + this.items = []; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var result = []; - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_list(context, result); + } + + _eval(context) + { + let result = []; + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_list(context, result); + } return result; } - } -); - -ul4.ListCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.item = item; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { + }; + + ul4.ListAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["items"]); + + ul4.ListCompAST = class ListCompAST extends ul4.CodeAST + { + constructor(template, pos, item, varname, container, condition) + { + super(template, pos); + this.item = item; + this.varname = varname; + this.container = container; + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } - var localcontext = context.inheritvars(); + _eval(context) + { + let container = this.container._handle_eval(context); - var result = []; - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + let localcontext = context.inheritvars(); + + let result = []; + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) result.push(this.item._handle_eval(localcontext)); } return result; } - } -); - -ul4.DictAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var dict = ul4.CodeAST.create.call(this, tag, pos); - dict.items = []; - return dict; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var result = ul4on._emptymap(); - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_dict(context, result); + } + + _eval(context) + { + let result = ul4._emptyset(); + + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_set(context, result); + } + return result; } - } -); - -ul4.DictCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, key, value, varname, container, condition) { - var listcomp = ul4.CodeAST.create.call(this, tag, pos); - listcomp.key = key; - listcomp.value = value; - listcomp.varname = varname; - listcomp.container = container; - listcomp.condition = condition; - return listcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } - var localcontext = context.inheritvars(); + _eval(context) + { + let container = this.container._handle_eval(context); - var result = ul4on._emptymap(); + let localcontext = context.inheritvars(); - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + let result = ul4._emptyset(); + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) { - var key = this.key._handle_eval(localcontext); - var value = this.value._handle_eval(localcontext); - ul4on._setmap(result, key, value); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); } + if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) + result.add(this.item._handle_eval(localcontext)); } return result; } - } -); - -ul4.SetAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos) { - var set = ul4.CodeAST.create.call(this, tag, pos); - set.items = []; - return set; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["items"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - - for (var i = 0; i < this.items.length; ++i) - this.items[i]._handle_eval_set(context, result); + } + _eval(context) + { + let result = ul4._emptymap(); + for (let i = 0; i < this.items.length; ++i) + { + let item = this.items[i]; + item._handle_eval_dict(context, result); + } return result; } - } -); - -ul4.SetCompAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var setcomp = ul4.CodeAST.create.call(this, tag, pos); - setcomp.item = item; - setcomp.container = container; - setcomp.condition = condition; - return setcomp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { - out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } + + _eval(context) + { + let container = this.container._handle_eval(context); + + let localcontext = context.inheritvars(); - var localcontext = context.inheritvars(); + let result = ul4._emptymap(); - var result = ul4on._haveset ? new Set() : ul4._Set.create(); - for (var iter = ul4._iter(container); ;) { - var item = iter.next(); + for (let iter = ul4._iter(container);;) + { + let item = iter.next(); if (item.done) break; - var varitems = ul4._unpackvar(this.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); + let varitems = ul4._unpackvar(this.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } if (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext))) - result.add(this.item._handle_eval(localcontext)); + { + let key = this.key._handle_eval(localcontext); + let value = this.value._handle_eval(localcontext); + ul4._setmap(result, key, value); + } } return result; } - } -); - -ul4.GenExprAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, item, varname, container, condition) { - var genexp = ul4.CodeAST.create.call(this, tag, pos); - genexp.item = item; - genexp.varname = varname; - genexp.container = container; - genexp.condition = condition; - return genexp; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["item", "varname", "container", "condition"]), - _repr: function _repr(out) { + }; + + ul4.DictCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["key", "value", "varname", "container", "condition"]); + + ul4.GenExprAST = class GenExprAST extends ul4.CodeAST + { + constructor(template, pos, item, varname, container, condition) + { + super(template, pos); + this.item = item; + this.varname = varname; + this.container = container; + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); - var iter = ul4._iter(container); + } + + _eval(context) + { + let container = this.container._handle_eval(context); + let iter = ul4._iter(container); - var localcontext = context.inheritvars(); + let localcontext = context.inheritvars(); - var self = this; + let self = this; - var result = { - next: function () { - while (true) { - var item = iter.next(); + let result = { + next: function(){ + while (true) + { + let item = iter.next(); if (item.done) return item; - var varitems = ul4._unpackvar(self.varname, item.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(localcontext, varitems[i][1]); - if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) { - var value = self.item._handle_eval(localcontext); - return { value: value, done: false }; + let varitems = ul4._unpackvar(self.varname, item.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(localcontext, value); + } + if (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext))) + { + let value = self.item._handle_eval(localcontext); + return {value: value, done: false}; } } } @@ -3956,118 +5677,132 @@ ul4.GenExprAST = ul4._inherit( return result; } - } -); - -ul4.VarAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, name) { - var variable = ul4.CodeAST.create.call(this, tag, pos); - variable.name = name; - return variable; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["name"]), - _repr: function _repr(out) { + }; + + ul4.GenExprAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["item", "varname", "container", "condition"]); + + ul4.VarAST = class VarAST extends ul4.CodeAST + { + constructor(template, pos, name) + { + super(template, pos); + this.name = name; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { + } + + _eval(context) + { return this._get(context, this.name); - }, - _eval_set: function _eval_set(context, value) { + } + + _eval_set(context, value) + { this._set(context, this.name, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { + } + + _eval_modify(context, operator, value) + { this._modify(context, operator, this.name, value); - }, - _get: function _get(context, name) { - var result = context.get(name); - if (typeof (result) === "undefined") + } + + _get(context, name) + { + let result = context.get(name); + if (typeof(result) === "undefined") result = ul4.functions[name]; return result; - }, - _set: function _set(context, name, value) { + } + + _set(context, name, value) + { context.set(name, value); - }, - _modify: function _modify(context, operator, name, value) { - var newvalue = operator._ido(context.get(name), value) + } + + _modify(context, operator, name, value) + { + let newvalue = operator._ido(context.get(name), value); context.set(name, newvalue); } - } -); - -ul4.UnaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj) { - var unary = ul4.CodeAST.create.call(this, tag, pos); - unary.obj = obj; - return unary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj"]), - _repr: function _repr(out) { + }; + + ul4.VarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["name"]); + + ul4.UnaryAST = class UnaryAST extends ul4.CodeAST + { + constructor(template, pos, obj) + { + super(template, pos); + this.obj = obj; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" obj="); this.obj._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); return this._do(obj); } - } -); + }; + + ul4.UnaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj"]); -// Negation -ul4.NegAST = ul4._inherit( - ul4.UnaryAST, + // Negation + ul4.NegAST = class NegAST extends ul4.UnaryAST { - _do: function _do(obj) { - if (obj !== null && typeof (obj.__neg__) === "function") + _do(obj) + { + if (obj !== null && typeof(obj.__neg__) === "function") return obj.__neg__(); return -obj; } - } -); + }; -// Bitwise not -ul4.BitNotAST = ul4._inherit( - ul4.UnaryAST, + // Bitwise not + ul4.BitNotAST = class BitNotAST extends ul4.UnaryAST { - _do: function _do(obj) { - return -obj - 1; + _do(obj) + { + return -obj-1; } - } -); + }; -// Not -ul4.NotAST = ul4._inherit( - ul4.UnaryAST, + // Not + ul4.NotAST = class NotAST extends ul4.UnaryAST { - _do: function _do(obj) { + _do(obj) + { return !ul4._bool(obj); } - } -); - -// If expression -ul4.IfAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, objif, objcond, objelse) { - var ifexpr = ul4.CodeAST.create.call(this, tag, pos); - ifexpr.objif = objif; - ifexpr.objcond = objcond; - ifexpr.objelse = objelse; - return ifexpr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["objif", "objcond", "objelse"]), - _repr: function _repr(out) { + }; + + // If expression + ul4.IfAST = class IfAST extends ul4.CodeAST + { + constructor(template, pos, objif, objcond, objelse) + { + super(template, pos); + this.objif = objif; + this.objcond = objcond; + this.objelse = objelse; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(+1); out.push("objif="); this.objif._repr(out); @@ -4079,138 +5814,160 @@ ul4.IfAST = ul4._inherit( this.objelse._repr(out); out.push(-1); out.push(">"); - }, - _eval: function _eval(context) { - var result; - var condvalue = this.objcond._handle_eval(context); + } + + _eval(context) + { + let result; + let condvalue = this.objcond._handle_eval(context); if (ul4._bool(condvalue)) result = this.objif._handle_eval(context); else result = this.objelse._handle_eval(context); return result; } - } -); + }; -ul4.ReturnAST = ul4._inherit( - ul4.UnaryAST, + ul4.IfAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["objif", "objcond", "objelse"]); + + ul4.ReturnAST = class ReturnAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var result = this.obj._handle_eval(context); - throw ul4.ReturnException.create(result); - }, - _str: function _str(out) { + _eval(context) + { + let result = this.obj._handle_eval(context); + throw new ul4.ReturnException(result); + } + + _str(out) + { out.push("return "); this.obj._str(out); } - } -); + }; -ul4.PrintAST = ul4._inherit( - ul4.UnaryAST, + ul4.PrintAST = class PrintAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var output = ul4._str(obj); + _eval(context) + { + let obj = this.obj._handle_eval(context); + let output = ul4._str(obj); context.output(output); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("print "); this.obj._str(out); } - } -); + }; -ul4.PrintXAST = ul4._inherit( - ul4.UnaryAST, + ul4.PrintXAST = class PrintXAST extends ul4.UnaryAST { - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var output = ul4._xmlescape(obj); + _eval(context) + { + let obj = this.obj._handle_eval(context); + let output = ul4._xmlescape(obj); context.output(output); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("printx "); this.obj._str(out); } - } -); - -ul4.BinaryAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj1, obj2) { - var binary = ul4.CodeAST.create.call(this, tag, pos); - binary.obj1 = obj1; - binary.obj2 = obj2; - return binary; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj1", "obj2"]), - _repr: function _repr(out) { + }; + + ul4.BinaryAST = class BinaryAST extends ul4.CodeAST + { + constructor(template, pos, obj1, obj2) + { + super(template, pos); + this.obj1 = obj1; + this.obj2 = obj2; + } + + _repr(out) + { out.push("<"); - out.push(this.type); + out.push(this.constructor.name); out.push(" obj1="); this.obj1._repr(out); out.push(" obj2="); this.obj2._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return this._do(obj1, obj2); } - } -); + }; + + ul4.BinaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj1", "obj2"]); -// Item access and assignment: dict[key], list[index], string[index], color[index] -ul4.ItemAST = ul4._inherit( - ul4.BinaryAST, + // Item access and assignment: dict[key], list[index], string[index], color[index] + ul4.ItemAST = class ItemAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - var result = this._get(obj1, obj2); + _do(obj1, obj2) + { + let result = this._get(obj1, obj2); return result; - }, - _eval_set: function _eval_set(context, value) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval_set(context, value) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); this._set(obj1, obj2, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { - var obj1 = this.obj1._handle_eval(context); - var obj2 = this.obj2._handle_eval(context); + } + + _eval_modify(context, operator, value) + { + let obj1 = this.obj1._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); this._modify(operator, obj1, obj2, value); - }, - _get: function _get(container, key) { - if (typeof (container) === "string" || ul4._islist(container)) { - if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { - var start = key.start, stop = key.stop; - if (typeof (start) === "undefined" || start === null) + } + + _get(container, key) + { + if (typeof(container) === "string" || ul4._islist(container)) + { + if (key instanceof ul4.slice) + { + let start = key.start, stop = key.stop; + if (typeof(start) === "undefined" || start === null) start = 0; - if (typeof (stop) === "undefined" || stop === null) + if (typeof(stop) === "undefined" || stop === null) stop = container.length; return container.slice(start, stop); } - else { - var orgkey = key; + else + { + let orgkey = key; if (key < 0) key += container.length; + if (key < 0 || key >= container.length) + throw new ul4.IndexError(container, orgkey); return container[key]; } } - else if (container && typeof (container.__getitem__) === "function") // test this before the generic object test + else if (container && typeof(container.__getitem__) === "function") // objects without ``_getitem__`` don't support item access return container.__getitem__(key); else if (ul4._ismap(container)) return container.get(key); - else if (Object.prototype.toString.call(container) === "[object Object]") - return container[key]; else - throw ul4.TypeError.create("[]", ul4._type(container) + " object is not subscriptable"); - }, - _set: function _set(container, key, value) { - if (ul4._islist(container)) { - if (typeof (key) === "object" && typeof (key.isa) === "function" && key.isa(ul4.slice)) { - var start = key.start, stop = key.stop; + throw new ul4.TypeError(ul4._type(container) + " object is not subscriptable"); + } + + _set(container, key, value) + { + if (ul4._islist(container)) + { + if (key instanceof ul4.slice) + { + let start = key.start, stop = key.stop; if (start === null) start = 0; else if (start < 0) @@ -4229,293 +5986,315 @@ ul4.ItemAST = ul4._inherit( stop = container.length; if (stop < start) stop = start; - container.splice(start, stop - start); // Remove old element - for (var iter = ul4._iter(value); ;) { - var item = iter.next(); + container.splice(start, stop-start); // Remove old element + for (let iter = ul4._iter(value);;) + { + let item = iter.next(); if (item.done) break; container.splice(start++, 0, item.value); } } - else { - var orgkey = key; + else + { + let orgkey = key; if (key < 0) key += container.length; + if (key < 0 || key >= container.length) + throw new ul4.IndexError(container, orgkey); container[key] = value; } } - else if (container && typeof (container.__setitem__) === "function") // test this before the generic object test + else if (container && typeof(container.__setitem__) === "function") // test this before the generic object test container.__setitem__(key, value); else if (ul4._ismap(container)) container.set(key, value); - else if (Object.prototype.toString.call(container) === "[object Object]") + else if (ul4._isobject(container)) container[key] = value; else - throw ul4.NotSubscriptableError.create(container); - }, - _modify: function _modify(operator, container, key, value) { + throw new ul4.NotSubscriptableError(container); + } + + _modify(operator, container, key, value) + { this._set(container, key, operator._ido(this._get(container, key), value)); } - } -); + }; -// Identifty test operator ``is`` -ul4.IsAST = ul4._inherit( - ul4.BinaryAST, + // Identifty test operator ``is`` + ul4.IsAST = class IsAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return obj1 === obj2; } - } -); + }; -// Inverted tdentifty test operator ``is not`` -ul4.IsNotAST = ul4._inherit( - ul4.BinaryAST, + // Inverted identity test operator ``is not`` + ul4.IsNotAST = class IsNotAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return obj1 !== obj2; } - } -); + }; -// Comparison operator == -ul4.EQAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator == + ul4.EQAST = class EQAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._eq(obj1, obj2); } - } -); + }; -// Comparison operator != -ul4.NEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator != + ul4.NEAST = class NEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._ne(obj1, obj2); } - } -); + }; -// Comparison operator < -ul4.LTAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator < + ul4.LTAST = class LTAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._lt(obj1, obj2); } - } -); + }; -// Comparison operator <= -ul4.LEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator <= + ul4.LEAST = class LEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._le(obj1, obj2); } - } -); + }; -// Comparison operator > -ul4.GTAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator > + ul4.GTAST = class GTAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._gt(obj1, obj2); } - } -); + }; -// Comparison operator >= -ul4.GEAST = ul4._inherit( - ul4.BinaryAST, + // Comparison operator >= + ul4.GEAST = class GEAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { return ul4._ge(obj1, obj2); } - } -); + }; -// Containment test: string in string, obj in list, key in dict, value in rgb -ul4.ContainsAST = ul4._inherit( - ul4.BinaryAST, + // Containment test: string in string, obj in list, key in dict, value in rgb + ul4.ContainsAST = class ContainsAST extends ul4.BinaryAST { - _do: function _do(obj, container) { - if (typeof (obj) === "string" && typeof (container) === "string") { + _do(obj, container) + { + if (typeof(obj) === "string" && typeof(container) === "string") + { return container.indexOf(obj) !== -1; } - else if (ul4._islist(container)) { + else if (ul4._islist(container)) + { return container.indexOf(obj) !== -1; } - else if (container && typeof (container.__contains__) === "function") // test this before the generic object test + else if (container && typeof(container.__contains__) === "function") // test this before the generic object test return container.__contains__(obj); else if (ul4._ismap(container) || ul4._isset(container)) return container.has(obj); - else if (ul4._isobject(container)) { - for (var key in container) { + else if (ul4._isobject(container)) + { + for (let key in container) + { if (key === obj) return true; } return false; } - else if (ul4._iscolor(container)) { + else if (ul4._iscolor(container)) + { return container._r === obj || container._g === obj || container._b === obj || container._a === obj; } - throw ul4.TypeError.create("in", ul4._type(container) + " object is not iterable"); + throw new ul4.TypeError(ul4._type(container) + " object is not iterable"); } - } -); + }; -// Inverted containment test -ul4.NotContainsAST = ul4._inherit( - ul4.BinaryAST, + // Inverted containment test + ul4.NotContainsAST = class NotContainsAST extends ul4.BinaryAST { - _do: function _do(obj, container) { - return !ul4.ContainsAST._do(obj, container); + _do(obj, container) + { + return !ul4.ContainsAST.prototype._do(obj, container); } - } -); + }; -// Addition: num + num, string + string -ul4.AddAST = ul4._inherit( - ul4.BinaryAST, + // Addition: num + num, string + string + ul4.AddAST = class AddAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__add__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__add__) === "function") return obj1.__add__(obj2); - else if (obj2 && typeof (obj2.__radd__) === "function") + else if (obj2 && typeof(obj2.__radd__) === "function") return obj2.__radd__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("+", ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); - if (ul4._islist(obj1) && ul4._islist(obj2)) { - var result = []; - ul4._append(result, obj1); - ul4._append(result, obj2); - return result; - } + throw new ul4.TypeError(ul4._type(this.obj1) + " + " + ul4._type(this.obj2) + " is not supported"); + if (ul4._islist(obj1) && ul4._islist(obj2)) + return [...obj1, ...obj2]; else return obj1 + obj2; - }, - _ido: function _ido(obj1, obj2) { - if (ul4._islist(obj1) && ul4._islist(obj2)) { - ul4._append(obj1, obj2); + } + + _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._islist(obj2)) + { + ul4.ListProtocol.append(obj1, obj2); return obj1; } else return this._do(obj1, obj2); } - } -); + }; -// Substraction: num - num -ul4.SubAST = ul4._inherit( - ul4.BinaryAST, + // Substraction: num - num + ul4.SubAST = class SubAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__sub__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__sub__) === "function") return obj1.__sub__(obj2); - else if (obj2 && typeof (obj2.__rsub__) === "function") + else if (obj2 && typeof(obj2.__rsub__) === "function") return obj2.__rsub__(obj1); else if (ul4._isdate(obj1) && ul4._isdate(obj2)) return this._date_sub(obj1, obj2); + else if (ul4._isdatetime(obj1) && ul4._isdatetime(obj2)) + return this._datetime_sub(obj1, obj2); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("-", ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); + throw new ul4.TypeError(ul4._type(this.obj1) + " - " + ul4._type(this.obj2) + " is not supported"); return obj1 - obj2; - }, - _date_sub: function _date_sub(obj1, obj2) { - var swap = (obj2 > obj1); + } + + _date_sub(obj1, obj2) + { + return this._datetime_sub(obj1._date, obj2._date); + } + + _datetime_sub(obj1, obj2) + { + let swap = (obj2 > obj1); - if (swap) { - var t = obj1; + if (swap) + { + let t = obj1; obj1 = obj2; obj2 = t; } // From now on obj1 is > than obj2 - var year1 = obj1.getFullYear(); - var yearday1 = ul4._yearday(obj1); - var year2 = obj2.getFullYear(); - var yearday2 = ul4._yearday(obj2); + let year1 = obj1.getFullYear(); + let yearday1 = ul4.DateTimeProtocol.yearday(obj1); + let year2 = obj2.getFullYear(); + let yearday2 = ul4.DateTimeProtocol.yearday(obj2); - var diffdays = 0; + let diffdays = 0; - while (year1 > year2) { - diffdays += ul4._yearday(ul4._date(year2, 12, 31)); + while (year1 > year2) + { + diffdays += ul4.DateProtocol.yearday(ul4._date(year2, 12, 31)); ++year2; } diffdays += yearday1 - yearday2; - var hours1 = obj1.getHours(); - var minutes1 = obj1.getMinutes(); - var seconds1 = obj1.getSeconds(); - var hours2 = obj2.getHours(); - var minutes2 = obj2.getMinutes(); - var seconds2 = obj2.getSeconds(); + let hours1 = obj1.getHours(); + let minutes1 = obj1.getMinutes(); + let seconds1 = obj1.getSeconds(); + let hours2 = obj2.getHours(); + let minutes2 = obj2.getMinutes(); + let seconds2 = obj2.getSeconds(); - var diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); + let diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2)); - var diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); + let diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds(); - if (swap) { + if (swap) + { diffdays = -diffdays; diffseconds = -diffseconds; diffmilliseconds = -diffmilliseconds; } - return ul4.TimeDelta.create(diffdays, diffseconds, 1000 * diffmilliseconds); - }, - _ido: function _ido(obj1, obj2) { + return new ul4.TimeDelta(diffdays, diffseconds, 1000*diffmilliseconds); + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; + -// Multiplication: num * num, int * str, str * int, int * list, list * int -ul4.MulAST = ul4._inherit( - ul4.BinaryAST, + // Multiplication: num * num, int * str, str * int, int * list, list * int + ul4.MulAST = class MulAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__mul__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__mul__) === "function") return obj1.__mul__(obj2); - else if (obj2 && typeof (obj2.__rmul__) === "function") + else if (obj2 && typeof(obj2.__rmul__) === "function") return obj2.__rmul__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("*", ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); - else if (ul4._isint(obj1) || ul4._isbool(obj1)) { - if (typeof (obj2) === "string") { + throw new ul4.TypeError(ul4._type(obj1) + " * " + ul4._type(obj2) + " not supported"); + else if (ul4._isint(obj1) || ul4._isbool(obj1)) + { + if (typeof(obj2) === "string") + { if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._str_repeat(obj2, obj1); } - else if (ul4._islist(obj2)) { + else if (ul4._islist(obj2)) + { if (obj1 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._list_repeat(obj2, obj1); } } - else if (ul4._isint(obj2) || ul4._isbool(obj2)) { - if (typeof (obj1) === "string") { + else if (ul4._isint(obj2) || ul4._isbool(obj2)) + { + if (typeof(obj1) === "string") + { if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._str_repeat(obj1, obj2); } - else if (ul4._islist(obj1)) { + else if (ul4._islist(obj1)) + { if (obj2 < 0) - throw ul4.ValueError.create("repetition counter must be positive"); + throw new ul4.ValueError("repetition counter must be positive"); return ul4._list_repeat(obj1, obj2); } } return obj1 * obj2; - }, - _ido: function _ido(obj1, obj2) { - if (ul4._islist(obj1) && ul4._isint(obj2)) { - if (obj2 > 0) { - var i = 0; - var targetsize = obj1.length * obj2; + } + + _ido(obj1, obj2) + { + if (ul4._islist(obj1) && ul4._isint(obj2)) + { + if (obj2 > 0) + { + let i = 0; + let targetsize = obj1.length * obj2; while (obj1.length < targetsize) - obj1.push(obj1[i++]) + obj1.push(obj1[i++]); } else obj1.splice(0, obj1.length); @@ -4524,79 +6303,77 @@ ul4.MulAST = ul4._inherit( else return this._do(obj1, obj2); } - } -); + }; -// Truncating division -ul4.FloorDivAST = ul4._inherit( - ul4.BinaryAST, + // Truncating division + ul4.FloorDivAST = class FloorDivAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__floordiv__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__floordiv__) === "function") return obj1.__floordiv__(obj2); - else if (obj2 && typeof (obj2.__rfloordiv__) === "function") + else if (obj2 && typeof(obj2.__rfloordiv__) === "function") return obj2.__rfloordiv__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("//", ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + throw new ul4.TypeError(ul4._type(obj1) + " // " + ul4._type(obj2) + " not supported"); + else if (typeof(obj1) === "number" && typeof(obj2) === "number" && obj2 === 0) + throw new ul4.ZeroDivisionError(); return Math.floor(obj1 / obj2); - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// "Real" division -ul4.TrueDivAST = ul4._inherit( - ul4.BinaryAST, + // "Real" division + ul4.TrueDivAST = class TrueDivAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { - if (obj1 && typeof (obj1.__truediv__) === "function") + _do(obj1, obj2) + { + if (obj1 && typeof(obj1.__truediv__) === "function") return obj1.__truediv__(obj2); - else if (obj2 && typeof (obj2.__rtruediv__) === "function") + else if (obj2 && typeof(obj2.__rtruediv__) === "function") return obj2.__rtruediv__(obj1); if (obj1 === null || obj2 === null) - throw ul4.TypeError.create("/", ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + throw new ul4.TypeError(ul4._type(obj1) + " / " + ul4._type(obj2) + " not supported"); + else if (typeof(obj1) === "number" && typeof(obj2) === "number" && obj2 === 0) + throw new ul4.ZeroDivisionError(); return obj1 / obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Modulo -ul4.ModAST = ul4._inherit( - ul4.BinaryAST, + // Modulo + ul4.ModAST = class ModAST extends ul4.BinaryAST { - // (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``) - _do: function _do(obj1, obj2) { - var div = Math.floor(obj1 / obj2); - var mod = obj1 - div * obj2; + _do(obj1, obj2) + { + return ul4._mod(obj1, obj2); + } - if (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0))) { - mod += obj2; - --div; - } - return obj1 - div * obj2; - }, - _ido: function _ido(obj1, obj2) { + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise left shift -ul4.ShiftLeftAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise left shift + ul4.ShiftLeftAST = class ShiftLeftAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; if (obj2 < 0) - return ul4.ShiftRightAST._do(obj1, -obj2); + return ul4.ShiftRightAST.prototype._do(obj1, -obj2); if (obj1 === false) obj1 = 0; else if (obj1 === true) @@ -4604,24 +6381,25 @@ ul4.ShiftLeftAST = ul4._inherit( while (obj2--) obj1 *= 2; return obj1; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise right shift -ul4.ShiftRightAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise right shift + ul4.ShiftRightAST = class ShiftRightAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; if (obj2 < 0) - return ul4.ShiftLeftAST._do(obj1, -obj2); + return ul4.ShiftLeftAST.prototype._do(obj1, -obj2); if (obj1 === false) obj1 = 0; else if (obj1 === true) @@ -4629,554 +6407,597 @@ ul4.ShiftRightAST = ul4._inherit( while (obj2--) obj1 /= 2; return Math.floor(obj1); - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise and -ul4.BitAndAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise and + ul4.BitAndAST = class BitAndAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 & obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise exclusive or -ul4.BitXOrAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise exclusive or + ul4.BitXOrAST = class BitXOrAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 ^ obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -// Bitwise or -ul4.BitOrAST = ul4._inherit( - ul4.BinaryAST, + // Bitwise or + ul4.BitOrAST = class BitOrAST extends ul4.BinaryAST { - _do: function _do(obj1, obj2) { + _do(obj1, obj2) + { if (obj2 === false) obj2 = 0; else if (obj2 === true) obj2 = 1; return obj1 | obj2; - }, - _ido: function _ido(obj1, obj2) { + } + + _ido(obj1, obj2) + { return this._do(obj1, obj2); } - } -); + }; -ul4.AndAST = ul4._inherit( - ul4.BinaryAST, + ul4.AndAST = class AndAST extends ul4.BinaryAST { - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); if (!ul4._bool(obj1)) return obj1; - var obj2 = this.obj2._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return obj2; } - } -); + }; -ul4.OrAST = ul4._inherit( - ul4.BinaryAST, + ul4.OrAST = class OrAST extends ul4.BinaryAST { - _eval: function _eval(context) { - var obj1 = this.obj1._handle_eval(context); + _eval(context) + { + let obj1 = this.obj1._handle_eval(context); if (ul4._bool(obj1)) return obj1; - var obj2 = this.obj2._handle_eval(context); + let obj2 = this.obj2._handle_eval(context); return obj2; } - } -); - -ul4.AttrAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, attrname) { - var attr = ul4.CodeAST.create.call(this, tag, pos); - attr.obj = obj; - attr.attrname = attrname; - return attr; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "attrname"]), - _repr: function _repr(out) { + }; + + ul4.AttrAST = class AttrAST extends ul4.CodeAST + { + constructor(template, pos, obj, attrname) + { + super(template, pos); + this.obj = obj; + this.attrname = attrname; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var result = this._get(obj, this.attrname); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); + let result = this._get(obj, this.attrname); return result; - }, - _eval_set: function _eval_set(context, value) { - var obj = this.obj._handle_eval(context); + } + + _eval_set(context, value) + { + let obj = this.obj._handle_eval(context); this._set(obj, this.attrname, value); - }, - _eval_modify: function _eval_modify(context, operator, value) { - var obj = this.obj._handle_eval(context); + } + + _eval_modify(context, operator, value) + { + let obj = this.obj._handle_eval(context); this._modify(operator, obj, this.attrname, value); - }, - _get: function _get(object, attrname) { - if (typeof (object) === "string") { - switch (attrname) { - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); - case "replace": - return ul4.expose(["old", "new", "count=", null], function replace(old, new_, count) { return ul4._replace(object, old, new_, count); }); - case "strip": - return ul4.expose(["chars=", null], function strip(chars) { return ul4._strip(object, chars); }); - case "lstrip": - return ul4.expose(["chars=", null], function lstrip(chars) { return ul4._lstrip(object, chars); }); - case "rstrip": - return ul4.expose(["chars=", null], function rstrip(chars) { return ul4._rstrip(object, chars); }); - case "split": - return ul4.expose(["sep=", null, "count=", null], function split(sep, count) { return ul4._split(object, sep, count); }); - case "rsplit": - return ul4.expose(["sep=", null, "count=", null], function rsplit(sep, count) { return ul4._rsplit(object, sep, count); }); - case "splitlines": - return ul4.expose(["keepends=", false], function splitlines(keepends) { return ul4._splitlines(object, keepends); }); - case "lower": - return ul4.expose([], function lower() { return object.toLowerCase(); }); - case "upper": - return ul4.expose([], function upper() { return object.toUpperCase(); }); - case "capitalize": - return ul4.expose([], function capitalize() { return ul4._capitalize(object); }); - case "join": - return ul4.expose(["iterable"], function join(iterable) { return ul4._join(object, iterable); }); - case "startswith": - return ul4.expose(["prefix"], function startswith(prefix) { return ul4._startswith(object, prefix); }); - case "endswith": - return ul4.expose(["suffix"], function endswith(suffix) { return ul4._endswith(object, suffix); }); - default: - return undefined; - } - } - else if (ul4._islist(object)) { - switch (attrname) { - case "append": - return ul4.expose(["*items"], function append(items) { return ul4._append(object, items); }); - case "insert": - return ul4.expose(["pos", "*items"], function insert(pos, items) { return ul4._insert(object, pos, items); }); - case "pop": - return ul4.expose(["pos=", -1], function pop(pos) { return ul4._pop(object, pos); }); - case "count": - return ul4.expose(["sub", "start=", null, "end=", null], function count(sub, start, end) { return ul4._count(object, sub, start, end); }); - case "find": - return ul4.expose(["sub", "start=", null, "end=", null], function find(sub, start, end) { return ul4._find(object, sub, start, end); }); - case "rfind": - return ul4.expose(["sub", "start=", null, "end=", null], function rfind(sub, start, end) { return ul4._rfind(object, sub, start, end); }); - default: - return undefined; - } - } - else if (ul4._isdate(object)) { - switch (attrname) { - case "weekday": - return ul4.expose([], function weekday() { return ul4._weekday(object); }); - case "week": - return ul4.expose(["firstweekday=", null], function week(firstweekday) { return ul4._week(object, firstweekday); }); - case "day": - return ul4.expose([], function day() { return object.getDate(); }); - case "month": - return ul4.expose([], function month() { return object.getMonth() + 1; }); - case "year": - return ul4.expose([], function year() { return object.getFullYear(); }); - case "hour": - return ul4.expose([], function hour() { return object.getHours(); }); - case "minute": - return ul4.expose([], function minute() { return object.getMinutes(); }); - case "second": - return ul4.expose([], function second() { return object.getSeconds(); }); - case "microsecond": - return ul4.expose([], function microsecond() { return object.getMilliseconds() * 1000; }); - case "mimeformat": - return ul4.expose([], function mimeformat() { return ul4._mimeformat(object); }); - case "isoformat": - return ul4.expose([], function isoformat() { return ul4._isoformat(object); }); - case "yearday": - return ul4.expose([], function yearday() { return ul4._yearday(object); }); - default: - return undefined; - } - } - else if (ul4._ismap(object)) { - switch (attrname) { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items() { return ul4._items(object); }); - case "values": - return ul4.expose([], function values() { return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - return object.get(attrname); - } - } - else if (ul4._isset(object)) { - switch (attrname) { - case "add": - return ul4.expose(["*items"], function add(items) { for (var i = 0; i < items.length; ++i) { object.add(items[i]); } }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - return undefined; - } + } + + _get(object, attrname) + { + let proto = ul4.Protocol.get(object); + try + { + return proto.getattr(object, attrname); } - else if (Object.prototype.toString.call(object) === "[object Object]") { - switch (attrname) { - case "get": - return ul4.expose(["key", "default=", null], function get(key, default_) { return ul4._get(object, key, default_); }); - case "items": - return ul4.expose([], function items() { return ul4._items(object); }); - case "values": - return ul4.expose([], function values() { return ul4._values(object); }); - case "update": - return ul4.expose(["*other", "**kwargs"], function update(other, kwargs) { return ul4._update(object, other, kwargs); }); - case "clear": - return ul4.expose([], function clear() { return ul4._clear(object); }); - default: - var result; - if (object && typeof (object.__getattr__) === "function") // test this before the generic object test - result = object.__getattr__(attrname); - else - result = object[attrname]; - if (typeof (result) !== "function") - return result; - var realresult = function () { - return result.apply(object, arguments); - }; - realresult._ul4_name = result._ul4_name || result.name; - realresult._ul4_signature = result._ul4_signature; - realresult._ul4_needsobject = result._ul4_needsobject; - realresult._ul4_needscontext = result._ul4_needscontext; - return realresult; - } + catch (exc) + { + if (exc instanceof ul4.AttributeError && exc.obj === object) + return undefined; + else + throw exc; } - throw ul4.TypeError.create("get", ul4._type(object) + " object has no readable attributes"); - }, - _set: function _set(object, attrname, value) { - if (typeof (object) === "object" && typeof (object.__setattr__) === "function") + } + + _set(object, attrname, value) + { + if (typeof(object) === "object" && typeof(object.__setattr__) === "function") object.__setattr__(attrname, value); else if (ul4._ismap(object)) - object.set(attrname, value) + object.set(attrname, value); else if (ul4._isobject(object)) object[attrname] = value; else - throw ul4.TypeError.create("set", ul4._type(object) + " object has no writable attributes"); - }, - _modify: function _modify(operator, object, attrname, value) { - var oldvalue = this._get(object, attrname); - var newvalue = operator._ido(oldvalue, value); + throw new ul4.TypeError(ul4._type(object) + " object has no writable attributes"); + } + + _modify(operator, object, attrname, value) + { + let oldvalue = this._get(object, attrname); + let newvalue = operator._ido(oldvalue, value); this._set(object, attrname, newvalue); } - } -); - -ul4.CallAST = ul4._inherit( - ul4.CodeAST, - { - create: function create(tag, pos, obj, args) { - var call = ul4.CodeAST.create.call(this, tag, pos); - call.obj = obj; - call.args = args; - return call; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["obj", "args"]), - _repr: function _repr(out) { + }; + + ul4.AttrAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj", "attrname"]); + + ul4.CallAST = class CallAST extends ul4.CodeAST + { + constructor(template, pos, obj, args) + { + super(template, pos); + this.obj = obj; + this.args = args; + } + + _repr(out) + { out.push(""); - }, - _makeargs: function _makeargs(context) { - var args = [], kwargs = {}; - for (var i = 0; i < this.args.length; ++i) - this.args[i]._handle_eval_call(context, args, kwargs); - return { args: args, kwargs: kwargs }; - }, - _handle_eval: function _handle_eval(context) { - try { + } + + _makeargs(context) + { + let args = [], kwargs = {}; + for (let i = 0; i < this.args.length; ++i) + { + let arg = this.args[i]; + arg._handle_eval_call(context, args, kwargs); + } + return {args: args, kwargs: kwargs}; + } + + _handle_eval(context) + { + try + { return this._eval(context); } - catch (exc) { - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + this._decorate_exception(exc); throw exc; } - }, - _eval: function _eval(context) { - var obj = this.obj._handle_eval(context); - var args = this._makeargs(context); - var result = ul4._call(context, obj, args.args, args.kwargs); + } + + _eval(context) + { + let obj = this.obj._handle_eval(context); + let args = this._makeargs(context); + let result = ul4._call(context, obj, args.args, args.kwargs); return result; } - } -); - -ul4.RenderAST = ul4._inherit( - ul4.CallAST, - { - create: function create(tag, pos, obj, args) { - var render = ul4.CallAST.create.call(this, tag, pos, obj, args); - render.indent = null; - return render; - }, - _ul4onattrs: ul4.CallAST._ul4onattrs.concat(["indent"]), - _repr: function _repr(out) { + }; + + ul4.CallAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["obj", "args"]); + + ul4.RenderAST = class RenderAST extends ul4.CallAST + { + constructor(template, pos, obj, args) + { + super(template, pos, obj, args); + this.indent = null; + } + + _repr(out) + { + out.push("<"); + out.push(this._reprname); out.push(""); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("render "); - out.push(this.tag.source.substring(this.pos.start, this.pos.stop).replace(/\r?\n/g, ' ')); - if (this.indent !== null) { + out.push(this.tag.code.replace(/\r?\n/g, ' ')); + if (this.indent !== null) + { out.push(" with indent "); - out.push(ul4._repr(this.indent._text())); + out.push(ul4._repr(this.indent.text)); } - }, - _handle_eval: function _handle_eval(context) { - var localcontext = context.withindent(this.indent !== null ? this.indent._text() : null); - var obj = this.obj._handle_eval(localcontext); - var args = this._makeargs(localcontext); + } + + _handle_eval(context) + { + let localcontext = context.withindent(this.indent !== null ? this.indent.text : null); + let obj = this.obj._handle_eval(localcontext); + let args = this._makeargs(localcontext); + this._handle_additional_arguments(localcontext, args); - try { - var result = ul4._callrender(localcontext, obj, args.args, args.kwargs); + try + { + let result = ul4._callrender(localcontext, obj, args.args, args.kwargs); return result; } - catch (exc) { - exc = ul4.LocationError.create(this, exc); + catch (exc) + { + this._decorate_exception(exc); throw exc; } } - } -); -// Slice object -ul4.slice = ul4._inherit( - ul4.Proto, + _handle_additional_arguments(context, args) + { + } + }; + + ul4.RenderAST.prototype._ul4onattrs = ul4.CallAST.prototype._ul4onattrs.concat(["indent"]); + ul4.RenderAST.prototype._reprname = "RenderAST"; + + ul4.RenderXAST = class RenderXAST extends ul4.RenderAST { - create: function create(start, stop) { - var slice = ul4._clone(this); - slice.start = start; - slice.stop = stop; - return slice; - }, - __repr__: function __repr__() { - return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ")"; + _handle_eval(context) + { + context.escapes.push(ul4._xmlescape); + + let result = null; + try + { + result = super._handle_eval(context); + } + finally + { + context.escapes.splice(context.escapes.length-1, 1); + } + return result; } - } -); + }; + + ul4.RenderBlockAST = class RenderBlockAST extends ul4.RenderAST + { + _handle_additional_arguments(context, args) + { + if (args.kwargs.hasOwnProperty("content")) + throw new ul4.ArgumentError("duplicate keyword argument content"); + let closure = new ul4.TemplateClosure(this.content, this.content.signature, context.vars); + args.kwargs.content = closure; + } + }; + + ul4.RenderBlockAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat(["content"]); + + ul4.RenderBlocksAST = class RenderBlocksAST extends ul4.RenderAST + { + _handle_additional_arguments(context, args) + { + let localcontext = context.inheritvars(); + ul4.BlockAST.prototype._eval.call(this, localcontext); + + for (let key in localcontext.vars) + { + if (localcontext.vars.hasOwnProperty(key)) + { + if (key in args.kwargs) + throw new ul4.ArgumentError("duplicate keyword argument " + key); + args.kwargs[key] = localcontext.get(key); + } + } + } + }; + + ul4.RenderBlocksAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat(["content"]); + + // Slice object + ul4.slice = class slice extends ul4.Proto + { + constructor(start, stop) + { + super(); + this.start = start; + this.stop = stop; + } + + of(string) + { + let start = this.start || 0; + let stop = this.stop === null ? string.length : this.stop; + return string.slice(start, stop); + } + + __repr__() + { + return "slice(" + ul4._repr(this.start) + ", " + ul4._repr(this.stop) + ", None)"; + } + + __getattr__(attrname) + { + switch (attrname) + { + case "start": + return this.start; + case "stop": + return this.stop; + default: + throw new ul4.AttributeError(this, attrname); + } + } + }; -// List/String slice -ul4.SliceAST = ul4._inherit( - ul4.CodeAST, + // List/String slice + ul4.SliceAST = class SliceAST extends ul4.CodeAST { - create: function create(tag, pos, index1, index2) { - var slice = ul4.CodeAST.create.call(this, tag, pos); - slice.index1 = index1; - slice.index2 = index2; - return slice; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["index1", "index2"]), - _repr: function _repr(out) { + constructor(template, pos, index1, index2) + { + super(template, pos); + this.index1 = index1; + this.index2 = index2; + } + + _repr(out) + { out.push(""); - }, - _eval: function _eval(context) { - var index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; - var index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; - return ul4.slice.create(index1, index2); } - } -); + _eval(context) + { + let index1 = this.index1 !== null ? this.index1._handle_eval(context) : null; + let index2 = this.index2 !== null ? this.index2._handle_eval(context) : null; + return new ul4.slice(index1, index2); + } + }; + + ul4.SliceAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["index1", "index2"]); -ul4.SetVarAST = ul4._inherit( - ul4.CodeAST, + ul4.SetVarAST = class SetVarAST extends ul4.CodeAST { - create: function create(tag, pos, lvalue, value) { - var changevar = ul4.CodeAST.create.call(this, tag, pos); - changevar.lvalue = lvalue; - changevar.value = value; - return changevar; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["lvalue", "value"]), - _repr: function _repr(out) { + constructor(template, pos, lvalue, value) + { + super(template, pos); + this.lvalue = lvalue; + this.value = value; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" lvalue="); out.push(ul4._repr(this.lvalue)); out.push(" value="); this.value._repr(out); out.push(">"); - }, - _eval: function _eval(context) { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) { - var item = items[i]; - item[0]._handle_eval_set(context, item[1]); + } + + _eval(context) + { + let value = this.value._handle_eval(context); + let items = ul4._unpackvar(this.lvalue, value); + for (let i = 0; i < items.length; ++i) + { + let [lvalue, value] = items[i]; + lvalue._handle_eval_set(context, value); } } - } -); + }; -ul4.ModifyVarAST = ul4._inherit( - ul4.SetVarAST, + ul4.SetVarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["lvalue", "value"]); + + ul4.ModifyVarAST = class ModifyVarAST extends ul4.SetVarAST { - _eval: function _eval(context) { - var value = this.value._handle_eval(context); - var items = ul4._unpackvar(this.lvalue, value); - for (var i = 0; i < items.length; ++i) { - var item = items[i]; - item[0]._handle_eval_modify(context, this._operator, item[1]); + _eval(context) + { + let value = this.value._handle_eval(context); + let items = ul4._unpackvar(this.lvalue, value); + for (let i = 0; i < items.length; ++i) + { + let [lvalue, value] = items[i]; + lvalue._handle_eval_modify(context, this._operator, value); } } - } -); + }; + + ul4.AddVarAST = class AddVarAST extends ul4.ModifyVarAST + { + }; + + ul4.AddVarAST.prototype._operator = ul4.AddAST.prototype; + + ul4.SubVarAST = class SubVarAST extends ul4.ModifyVarAST + { + }; + + ul4.SubVarAST.prototype._operator = ul4.SubAST.prototype; -ul4.AddVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.AddAST }); + ul4.MulVarAST = class MulVarAST extends ul4.ModifyVarAST + { + }; + + ul4.MulVarAST.prototype._operator = ul4.MulAST.prototype; + + ul4.TrueDivVarAST = class TrueDivVarAST extends ul4.ModifyVarAST + { + }; + + ul4.TrueDivVarAST.prototype._operator = ul4.TrueDivAST.prototype; + + ul4.FloorDivVarAST = class FloorDivVarAST extends ul4.ModifyVarAST + { + }; + + ul4.FloorDivVarAST.prototype._operator = ul4.FloorDivAST.prototype; + + ul4.ModVarAST = class ModVarAST extends ul4.ModifyVarAST + { + }; -ul4.SubVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.SubAST }); + ul4.ModVarAST.prototype._operator = ul4.ModAST.prototype; + + ul4.ShiftLeftVarAST = class ShiftLeftVarAST extends ul4.ModifyVarAST + { + }; -ul4.MulVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.MulAST }); + ul4.ShiftLeftVarAST.prototype._operator = ul4.ShiftLeftAST.prototype; -ul4.TrueDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.TrueDivAST }); + ul4.ShiftRightVarAST = class ShiftRightVarAST extends ul4.ModifyVarAST + { + }; -ul4.FloorDivVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.FloorDivAST }); + ul4.ShiftRightVarAST.prototype._operator = ul4.ShiftRightAST.prototype; -ul4.ModVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ModAST }); + ul4.BitAndVarAST = class BitAndVarAST extends ul4.ModifyVarAST + { + }; -ul4.ShiftLeftVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftLeftAST }); + ul4.BitAndVarAST.prototype._operator = ul4.BitAndAST.prototype; -ul4.ShiftRightVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.ShiftRightAST }); + ul4.BitXOrVarAST = class BitXOrVarAST extends ul4.ModifyVarAST + { + }; -ul4.BitAndVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitAndAST }); + ul4.BitXOrVarAST.prototype._operator = ul4.BitXOrAST.prototype; -ul4.BitXOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitXOrAST }); + ul4.BitOrVarAST = class BitOrVarAST extends ul4.ModifyVarAST + { + }; -ul4.BitOrVarAST = ul4._inherit(ul4.ModifyVarAST, { _operator: ul4.BitOrAST }); + ul4.BitOrVarAST.prototype._operator = ul4.BitOrAST.prototype; -ul4.BlockAST = ul4._inherit( - ul4.CodeAST, + ul4.BlockAST = class BlockAST extends ul4.CodeAST { - create: function create(tag, pos) { - var block = ul4.CodeAST.create.call(this, tag, pos); - block.endtag = null; - block.content = []; - return block; - }, - _ul4onattrs: ul4.CodeAST._ul4onattrs.concat(["endtag", "content"]), - _eval: function _eval(context) { - for (var i = 0; i < this.content.length; ++i) - this.content[i]._handle_eval(context); - }, - _str: function _str(out) { - if (this.content.length) { - for (var i = 0; i < this.content.length; ++i) { - this.content[i]._str(out); + constructor(template, pos) + { + super(template, pos); + this.content = []; + } + + _eval(context) + { + for (let i = 0; i < this.content.length; ++i) + { + let item = this.content[i]; + item._handle_eval(context); + } + } + + _str(out) + { + if (this.content.length) + { + for (let i = 0; i < this.content.length; ++i) + { + let item = this.content[i]; + item._str(out); out.push(0); } } - else { + else + { out.push("pass"); out.push(0); } } - } -); - -ul4.ForBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, varname, container) { - var for_ = ul4.BlockAST.create.call(this, tag, pos); - for_.varname = varname; - for_.container = container; - return for_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["varname", "container"]), - _repr: function _repr(out) { + }; + + ul4.BlockAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat(["content"]); + + ul4.ForBlockAST = class ForBlockAST extends ul4.BlockAST + { + constructor(template, pos, varname, container) + { + super(template, pos); + this.varname = varname; + this.container = container; + } + + _repr(out) + { out.push(""); - }, - _str_varname: function _str_varname(out, varname) { - if (ul4._islist(varname)) { + } + + _str_varname(out, varname) + { + if (ul4._islist(varname)) + { out.push("("); - for (var i = 0; i < varname.length; ++i) { + for (let i = 0; i < varname.length; ++i) + { if (i) out.push(", "); this._str_varname(out, varname[i]); @@ -5187,248 +7008,314 @@ ul4.ForBlockAST = ul4._inherit( } else varname._str(out); - }, - _eval: function _eval(context) { - var container = this.container._handle_eval(context); + } + + _eval(context) + { + let container = this.container._handle_eval(context); - for (var iter = ul4._iter(container); ;) { - var value = iter.next(); + for (let iter = ul4._iter(container);;) + { + let value = iter.next(); if (value.done) break; - var varitems = ul4._unpackvar(this.varname, value.value); - for (var i = 0; i < varitems.length; ++i) - varitems[i][0]._handle_eval_set(context, varitems[i][1]); - try { + let varitems = ul4._unpackvar(this.varname, value.value); + for (let i = 0; i < varitems.length; ++i) + { + let [lvalue, value] = varitems[i]; + lvalue._handle_eval_set(context, value); + } + try + { // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); + super._eval(context); } - catch (exc) { - if (exc === ul4.BreakException) + catch (exc) + { + if (exc instanceof ul4.BreakException) break; - else if (exc === ul4.ContinueException) + else if (exc instanceof ul4.ContinueException) ; else throw exc; } } - }, - _str: function _str(out) { + } + + _str(out) + { out.push("for "); this._str_varname(out, this.varname); out.push(" in "); this.container._str(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); } - } -); - -ul4.WhileBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) { - var while_ = ul4.BlockAST.create.call(this, tag, pos); - while_.condition = condition; - return while_; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) { + }; + + ul4.ForBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["varname", "container"]); + + ul4.WhileBlockAST = class WhileBlockAST extends ul4.BlockAST + { + constructor(template, pos, condition) + { + super(template, pos); + this.condition = condition; + } + + _repr(out) + { out.push(""); - }, - _str: function _str(out) { - out.push("while "), - this.container._repr(out); + } + + _str(out) + { + out.push("while "); + this.condition._repr(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _eval: function _eval(context) { - while (true) { - var cond = this.condition._handle_eval(context); + } + + _eval(context) + { + while (true) + { + let cond = this.condition._handle_eval(context); if (!ul4._bool(cond)) break; - try { + try + { // We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion - // But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels - ul4.BlockAST._eval.call(this, context); + // But we don't have to, as wrapping the original exception in ``Error`` has already been done by the lower levels + super._eval(context); } - catch (exc) { - if (exc === ul4.BreakException) + catch (exc) + { + if (exc instanceof ul4.BreakException) break; - else if (exc === ul4.ContinueException) + else if (exc instanceof ul4.ContinueException) ; else throw exc; } } - }, - _str: function _str(out) { - out.push("while "); - ul4.AST._str.call(this, out); - out.push(":"); - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); } - } -); + }; -ul4.BreakAST = ul4._inherit( - ul4.CodeAST, + ul4.WhileBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["condition"]); + + ul4.BreakAST = class BreakAST extends ul4.CodeAST { - _eval: function _eval(context) { - throw ul4.BreakException; - }, - _str: function _str(out) { + _eval(context) + { + throw new ul4.BreakException(); + } + + _str(out) + { out.push("break"); out.push(0); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.ContinueAST = ul4._inherit( - ul4.CodeAST, + ul4.ContinueAST = class ContinueAST extends ul4.CodeAST { - _eval: function _eval(context) { - throw ul4.ContinueException; - }, - _str: function _str(out) { + _eval(context) + { + throw new ul4.ContinueException(); + } + + _str(out) + { out.push("continue"); out.push(0); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push(""); } - } -); + }; -ul4.CondBlockAST = ul4._inherit( - ul4.BlockAST, + ul4.CondBlockAST = class CondBlockAST extends ul4.BlockAST { - _eval: function _eval(context) { - for (var i = 0; i < this.content.length; ++i) { - var block = this.content[i]; - var execute = block._execute(context); - if (execute) { + _eval(context) + { + for (let i = 0; i < this.content.length; ++i) + { + let block = this.content[i]; + let execute = block._execute(context); + if (execute) + { block._handle_eval(context); break; } } } - } -); - -ul4.ConditionalBlockAST = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, condition) { - var block = ul4.BlockAST.create.call(this, tag, pos); - block.condition = condition; - return block; - }, - _ul4onattrs: ul4.BlockAST._ul4onattrs.concat(["condition"]), - _repr: function _repr(out) { + }; + + ul4.ConditionalBlockAST = class ConditionalBlockAST extends ul4.BlockAST + { + constructor(template, pos, condition) + { + super(template, pos); + this.condition = condition; + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" condition="); this.condition._repr(out); out.push(">"); - }, - _str: function _str(out) { + } + + _str(out) + { out.push(this._strname); out.push(" "); this.condition._str(out); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _execute: function _execute(context) { - var cond = this.condition._handle_eval(context); - var result = ul4._bool(cond); + } + + _execute(context) + { + let cond = this.condition._handle_eval(context); + let result = ul4._bool(cond); return result; } - } -); + }; + + ul4.ConditionalBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat(["condition"]); + + ul4.IfBlockAST = class IfBlockAST extends ul4.ConditionalBlockAST + { + }; + + ul4.IfBlockAST.prototype._strname = "if"; -ul4.IfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "if" }); + ul4.ElIfBlockAST = class ElIfBlockAST extends ul4.ConditionalBlockAST + { + }; -ul4.ElIfBlockAST = ul4._inherit(ul4.ConditionalBlockAST, { _strname: "else if" }); + ul4.ElIfBlockAST.prototype._strname = "else if"; -ul4.ElseBlockAST = ul4._inherit( - ul4.BlockAST, + ul4.ElseBlockAST = class ElseBlockAST extends ul4.BlockAST { - _repr: function _repr(out) { + _repr(out) + { out.push(""); - }, - _str: function _str(out) { - out.push("else:"), - out.push(+1); - ul4.BlockAST._str.call(this, out); - out.push(-1); - }, - _execute: function _execute(context) { - return true; - }, - _str: function _str(out) { + } + + _str(out) + { out.push("else:"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); } - } -); - -ul4.Template = ul4._inherit( - ul4.BlockAST, - { - create: function create(tag, pos, source, name, whitespace, startdelim, enddelim, signature) { - var template = ul4.BlockAST.create.call(this, tag, pos); - template.source = source; - template.name = name; - template.whitespace = whitespace; - template.startdelim = startdelim; - template.enddelim = enddelim; - template.docpos = null; - template.signature = signature; - template._jsfunction = null; - template._asts = null; - template._ul4_callsignature = signature; - template._ul4_rendersignature = signature; - template.parenttemplate = null; - return template; - }, - ul4ondump: function ul4ondump(encoder) { - var signature; + + _execute(context) + { + return true; + } + }; + + ul4.Template = class Template extends ul4.BlockAST + { + constructor(template, pos, source, name, whitespace, startdelim, enddelim, signature) + { + super(template, pos); + this._source = source; + this.name = name; + this.whitespace = whitespace; + this.startdelim = startdelim; + this.enddelim = enddelim; + this.docpos = null; + this.signature = signature; + this._asts = null; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; + this.parenttemplate = null; + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { + case "content": + return this.content; + case "source": + return this.source; + case "name": + return this.name; + case "whitespace": + return this.whitespace; + case "startdelim": + return this.startdelim; + case "enddelim": + return this.enddelim; + case "doc": + return this.doc(); + case "signature": + return this.signature; + case "parenttemplate": + return this.parenttemplate; + case "render": + let render = function render(context, vars){ self._renderbound(context, vars); }; + ul4.expose(render, this.signature, {needscontext: true, needsobject: true}); + return render; + case "renders": + let renders = function renders(context, vars){ return self._rendersbound(context, vars); }; + ul4.expose(renders, this.signature, {needscontext: true, needsobject: true}); + return renders; + default: + return super.__getattr__(attrname); + } + } + + ul4ondump(encoder) + { + let signature; encoder.dump(ul4.version); encoder.dump(this.name); - encoder.dump(this.source); + encoder.dump(this._source); encoder.dump(this.whitespace); encoder.dump(this.startdelim); encoder.dump(this.enddelim); encoder.dump(this.docpos); encoder.dump(this.parenttemplate); - if (this.signature === null || ul4.SignatureAST.isprotoof(this.signature)) + if (this.signature === null || this.signature instanceof ul4.SignatureAST) signature = this.signature; - else { + else + { signature = []; - for (var i = 0; i < this.signature.args.length; ++i) { - var arg = this.signature.args[i]; - if (typeof (arg.defaultValue) === "undefined") + for (let i = 0; i < this.signature.args.length; ++i) + { + let arg = this.signature.args[i]; + if (typeof(arg.defaultValue) === "undefined") signature.push(arg.name); else - signature.push(arg.name + "=", arg.defaultValue); + signature.push(arg.name+"=", arg.defaultValue); } if (this.signature.remargs !== null) signature.push("*" + this.signature.remargs); @@ -5436,19 +7323,22 @@ ul4.Template = ul4._inherit( signature.push("**" + this.signature.remkwargs); } encoder.dump(signature); - ul4.BlockAST.ul4ondump.call(this, encoder); - }, - ul4onload: function ul4onload(decoder) { - var version = decoder.load(); - var signature; + super.ul4ondump(encoder); + } + + ul4onload(decoder) + { + let version = decoder.load(); + let signature; if (version === null) - throw ul4.ValueError.create("UL4ON doesn't support templates in 'source' format in Javascript implementation"); + throw new ul4.ValueError("UL4ON doesn't support templates in 'source' format in Javascript implementation"); if (version !== ul4.version) - throw ul4.ValueError.create("invalid version, expected " + ul4.version + ", got " + version); + throw new ul4.ValueError("invalid version, expected " + ul4.version + ", got " + version); + this.name = decoder.load(); - this.source = decoder.load(); + this._source = decoder.load(); this.whitespace = decoder.load(); this.startdelim = decoder.load(); this.enddelim = decoder.load(); @@ -5456,1568 +7346,1463 @@ ul4.Template = ul4._inherit( this.parenttemplate = decoder.load(); signature = decoder.load(); if (ul4._islist(signature)) - signature = ul4.Signature.create.apply(ul4.Signature, signature); + signature = new ul4.Signature(...signature); this.signature = signature; this._ul4_callsignature = signature; this._ul4_rendersignature = signature; - ul4.BlockAST.ul4onload.call(this, decoder); - }, - loads: function loads(string) { - return ul4on.loads(string); - }, - _eval: function _eval(context) { - var signature = null; + super.ul4onload(decoder); + } + + loads(string) + { + return ul4.loads(string); + } + + _eval(context) + { + let signature = null; if (this.signature !== null) signature = this.signature._handle_eval(context); - var closure = ul4.TemplateClosure.create(this, signature, context.vars); + let closure = new ul4.TemplateClosure(this, signature, context.vars); context.set(this.name, closure); - }, - _repr: function _repr(out) { + } + + _repr(out) + { out.push("") { + if (this.enddelim !== "?>") + { out.push(" enddelim="); out.push(ul4._repr(this.enddelim)); } out.push(">"); - }, - _str: function _str(out) { + } + + _str(out) + { out.push("def "); out.push(this.name ? this.name : "unnamed"); out.push(":"); out.push(+1); - ul4.BlockAST._str.call(this, out); + ul4.BlockAST.prototype._str.call(this, out); out.push(-1); - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - _renderbound: function _renderbound(context, vars) { - var localcontext = context.clone(); + } + + _renderbound(context, vars) + { + let localcontext = context.clone(); localcontext.vars = vars; - try { - ul4.BlockAST._eval.call(this, localcontext); + try + { + ul4.BlockAST.prototype._eval.call(this, localcontext); } - catch (exc) { - if (!ul4.ReturnException.isprotoof(exc)) + catch (exc) + { + if (!(exc instanceof ul4.ReturnException)) throw exc; } - }, - __render__: function __render__(context, vars) { + } + + __render__(context, vars) + { this._renderbound(context, vars); - }, - render: function render(context, vars) { + } + + render(context, vars) + { this._renderbound(context, vars); - }, - _rendersbound: function _rendersbound(context, vars) { - var localcontext = context.replaceoutput(); + } + + _rendersbound(context, vars) + { + let localcontext = context.replaceoutput(); this._renderbound(localcontext, vars); return localcontext.getoutput(); - }, - renders: function renders(vars) { + } + + renders(vars) + { vars = vars || {}; - var context = ul4.Context.create(); + let context = new ul4.Context(); if (this.signature !== null) vars = this.signature.bindObject(this.name, [], vars); return this._rendersbound(context, vars); - }, - doc: function doc() { - return this.docpos != null ? this.source.substring(this.docpos.start, this.docpos.stop) : null; - }, - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { - case "tag": - return this.tag; - case "endtag": - return this.endtag; - case "content": - return this.content; - case "source": - return this.source; - case "name": - return this.name; - case "whitespace": - return this.whitespace; - case "startdelim": - return this.startdelim; - case "enddelim": - return this.enddelim; - case "doc": - return this.doc(); - case "signature": - return this.signature; - case "parenttemplate": - return this.parenttemplate; - case "render": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); - case "renders": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); - default: - return undefined; - } - }, - _callbound: function _callbound(context, vars) { - var localcontext = context.clone(); + } + + doc() + { + return this.docpos != null ? this.docpos.of(this._source) : null; + } + + _callbound(context, vars) + { + let localcontext = context.clone(); localcontext.vars = vars; - try { - ul4.BlockAST._eval.call(this, localcontext); + try + { + ul4.BlockAST.prototype._eval.call(this, localcontext); } - catch (exc) { - if (ul4.ReturnException.isprotoof(exc)) + catch (exc) + { + if (exc instanceof ul4.ReturnException) return exc.result; else throw exc; } return null; - }, - call: function call(vars) { + } + + call(vars) + { vars = vars || {}; - var context = ul4.Context.create(); + let context = new ul4.Context(); if (this.signature !== null) vars = this.signature.bindObject(this.name, [], vars); return this._callbound(context, vars); - }, - __call__: function __call__(context, vars) { + } + + __call__(context, vars) + { return this._callbound(context, vars); - }, - __type__: "ul4.Template" // used by ``istemplate()`` - } -); + } + + ul4type() + { + return "template"; + } + }; -ul4.SignatureAST = ul4._inherit( - ul4.CodeAST, + ul4.Template.prototype._ul4_callneedsobject = true; + ul4.Template.prototype._ul4_callneedscontext = true; + ul4.Template.prototype._ul4_renderneedsobject = true; + ul4.Template.prototype._ul4_renderneedscontext = true; + + ul4.SignatureAST = class SignatureAST extends ul4.CodeAST { - create: function create(tag, pos) { - var signature = ul4.CodeAST.create.call(this, tag, pos); - signature.params = []; - return signature; - }, - ul4ondump: function ul4ondump(encoder) { - ul4.CodeAST.ul4ondump.call(this, encoder); + constructor(template, pos) + { + super(template, pos); + this.params = []; + } + + ul4ondump(encoder) + { + super.ul4ondump(encoder); - var dump = []; + let dump = []; - for (var i = 0; i < this.params.length; ++i) { - var param = this.params[i]; + for (let i = 0; i < this.params.length; ++i) + { + let param = this.params[i]; if (param[1] === null) dump.push(param[0]); else dump.push(param); } encoder.dump(dump); - }, - ul4onload: function ul4onload(decoder) { - ul4.AST.ul4onload.call(this, decoder); - var dump = decoder.load(); + } + + ul4onload(decoder) + { + super.ul4onload(decoder); + let dump = decoder.load(); this.params = []; - for (var i = 0; i < dump.length; ++i) { - var param = dump[i]; - if (typeof (param) === "string") + for (let i = 0; i < dump.length; ++i) + { + let param = dump[i]; + if (typeof(param) === "string") this.params.push([param, null]); else this.params.push(param); } - }, - _eval: function _eval(context) { - var args = []; - for (var i = 0; i < this.params.length; ++i) { - var param = this.params[i]; + } + + _eval(context) + { + let args = []; + for (let i = 0; i < this.params.length; ++i) + { + let param = this.params[i]; if (param[1] === null) args.push(param[0]); - else { + else + { args.push(param[0] + "="); args.push(param[1]._handle_eval(context)); } } - return ul4.Signature.create.apply(ul4.Signature, args); - }, - _repr: function _repr(out) { + return new ul4.Signature(...args); + } + + _repr(out) + { out.push("<"); - out.push(this.typename); + out.push(this.constructor.name); out.push(" params="); this.params._repr(out); out.push(">"); } - } -); - -ul4.TemplateClosure = ul4._inherit( - ul4.Proto, - { - create: function create(template, signature, vars) { - var closure = ul4._clone(this); - closure.template = template; - closure.signature = signature; - closure.vars = vars; - closure._ul4_callsignature = signature; - closure._ul4_rendersignature = signature; + }; + + ul4.TemplateClosure = class TemplateClosure extends ul4.Proto + { + constructor(template, signature, vars) + { + super(); + this.template = template; + this.signature = signature; + this.vars = vars; + this._ul4_callsignature = signature; + this._ul4_rendersignature = signature; // Copy over the required attribute from the template - closure.name = template.name; - closure.tag = template.tag; - closure.endtag = template.endtag; - closure.source = template.source; - closure.startdelim = template.startdelim; - closure.enddelim = template.enddelim; - closure.docpos = template.docpos; - closure.content = template.content; - return closure; - }, - _ul4_callneedsobject: true, - _ul4_callneedscontext: true, - _ul4_renderneedsobject: true, - _ul4_renderneedscontext: true, - __render__: function __render__(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - render: function render(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __call__: function __call__(context, vars) { - return this.template._callbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _renderbound: function _renderbound(context, vars) { - this.template._renderbound(context, ul4._simpleinherit(this.vars, vars)); - }, - _rendersbound: function _rendersbound(context, vars) { - return this.template._rendersbound(context, ul4._simpleinherit(this.vars, vars)); - }, - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + this.name = template.name; + this.tag = template.tag; + this.endtag = template.endtag; + this._source = template._source; + this.startdelim = template.startdelim; + this.enddelim = template.enddelim; + this.docpos = template.docpos; + this.content = template.content; + } + + __render__(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + render(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + __call__(context, vars) + { + return this.template._callbound(context, ul4._inherit(this.vars, vars)); + } + + _renderbound(context, vars) + { + this.template._renderbound(context, ul4._inherit(this.vars, vars)); + } + + _rendersbound(context, vars) + { + return this.template._rendersbound(context, ul4._inherit(this.vars, vars)); + } + + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "render": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function render(context, vars) { self._renderbound(context, vars); }); + let render = function render(context, vars){ self._renderbound(context, vars); }; + ul4.expose(render, this.signature, {needscontext: true, needsobject: true}); + return render; case "renders": - return ul4.expose(this.signature, { needscontext: true, needsobject: true }, function renders(context, vars) { return self._rendersbound(context, vars); }); + let renders = function renders(context, vars){ return self._rendersbound(context, vars); }; + ul4.expose(renders, this.signature, {needscontext: true, needsobject: true}); + return renders; case "signature": return this.signature; default: return this.template.__getattr__(attrname); } - }, - __type__: "ul4.TemplateClosure" // used by ``istemplate()`` - } -); - -// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` -ul4._rgb = function _rgb(r, g, b, a) { - return this.Color.create(255 * r, 255 * g, 255 * b, 255 * a); -}; - -// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference -ul4._xmlescape = function _xmlescape(obj) { - obj = ul4._str(obj); - obj = obj.replace(/&/g, "&"); - obj = obj.replace(//g, ">"); - obj = obj.replace(/'/g, "'"); - obj = obj.replace(/"/g, """); - return obj; -}; - -// Convert ``obj`` to a string suitable for output into a CSV file -ul4._csv = function _csv(obj) { - if (obj === null) - return ""; - else if (typeof (obj) !== "string") - obj = ul4._repr(obj); - if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) - obj = '"' + obj.replace(/"/g, '""') + '"'; - return obj; -}; - -// Return a string containing one character with the codepoint ``i`` -ul4._chr = function _chr(i) { - if (typeof (i) != "number") - throw ul4.TypeError.create("chr()", "chr() requires an int"); - return String.fromCharCode(i); -}; - -// Return the codepoint for the one and only character in the string ``c`` -ul4._ord = function _ord(c) { - if (typeof (c) != "string" || c.length != 1) - throw ul4.TypeError.create("ord()", "ord() requires a string of length 1"); - return c.charCodeAt(0); -}; - -// Convert an integer to a hexadecimal string -ul4._hex = function _hex(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("hex()", "hex() requires an int"); - if (number < 0) - return "-0x" + number.toString(16).substr(1); - else - return "0x" + number.toString(16); -}; - -// Convert an integer to a octal string -ul4._oct = function _oct(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("oct()", "oct() requires an int"); - if (number < 0) - return "-0o" + number.toString(8).substr(1); - else - return "0o" + number.toString(8); -}; - -// Convert an integer to a binary string -ul4._bin = function _bin(number) { - if (typeof (number) != "number") - throw ul4.TypeError.create("bin()", "bin() requires an int"); - if (number < 0) - return "-0b" + number.toString(2).substr(1); - else - return "0b" + number.toString(2); -}; - -// Return the minimum value -ul4._min = function _min(obj) { - if (obj.length == 0) - throw ul4.ArgumentError.create("min() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) { - var item = iter.next(); - if (item.done) { - if (first) - throw ul4.ValueError.create("min() argument is an empty sequence!"); - return result; } - if (first || (item.value < result)) - result = item.value; - first = false; - } -}; - -// Return the maximum value -ul4._max = function _max(obj) { - if (obj.length == 0) - throw ul4.ArgumentError.create("max() requires at least 1 argument, 0 given"); - else if (obj.length == 1) - obj = obj[0]; - var iter = ul4._iter(obj); - var result; - var first = true; - while (true) { - var item = iter.next(); - if (item.done) { - if (first) - throw ul4.ValueError.create("max() argument is an empty sequence!"); - return result; + + ul4type() + { + return "template"; } - if (first || (item.value > result)) - result = item.value; - first = false; - } -}; - -// Return the of the values from the iterable starting with ``start`` (default ``0``) -ul4._sum = function _sum(iterable, start) { - if (typeof (start) === "undefined") - start = 0; - - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - start += item.value; - } - return start; -}; - -// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) -ul4._first = function _first(iterable, defaultValue) { - if (typeof (defaultValue) === "undefined") - defaultValue = null; - - var item = ul4._iter(iterable).next(); - return item.done ? defaultValue : item.value; -}; - -// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) -ul4._last = function _last(iterable, defaultValue) { - if (typeof (defaultValue) === "undefined") - defaultValue = null; - - var value = defaultValue; - - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - value = item.value; - } - return value; -}; - -// Return a sorted version of ``iterable`` -ul4._sorted = function _sorted(context, iterable, key, reverse) { - var cmp; - if (key === null) { - // FIXME: stability - if (reverse) { - cmp = function cmp(a, b) { - return -ul4._cmp("<=>", a, b); + }; + + ul4.TemplateClosure.prototype._ul4_callneedsobject = true; + ul4.TemplateClosure.prototype._ul4_callneedscontext = true; + ul4.TemplateClosure.prototype._ul4_renderneedsobject = true; + ul4.TemplateClosure.prototype._ul4_renderneedscontext = true; + + // Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b`` + ul4._rgb = function _rgb(r, g, b, a) + { + return new this.Color(255*r, 255*g, 255*b, 255*a); + }; + + // Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``"`` with their XML character/entity reference + ul4._xmlescape = function _xmlescape(obj) + { + obj = ul4._str(obj); + obj = obj.replace(/&/g, "&"); + obj = obj.replace(//g, ">"); + obj = obj.replace(/'/g, "'"); + obj = obj.replace(/"/g, """); + return obj; + }; + + // Convert ``obj`` to a string suitable for output into a CSV file + ul4._csv = function _csv(obj) + { + if (obj === null) + return ""; + else if (typeof(obj) !== "string") + obj = ul4._repr(obj); + if (obj.indexOf(",") !== -1 || obj.indexOf('"') !== -1 || obj.indexOf("\n") !== -1) + obj = '"' + obj.replace(/"/g, '""') + '"'; + return obj; + }; + + // Return a string containing one character with the codepoint ``i`` + ul4._chr = function _chr(i) + { + if (typeof(i) != "number") + throw new ul4.TypeError("chr() requires an int"); + return String.fromCharCode(i); + }; + + // Return the codepoint for the one and only character in the string ``c`` + ul4._ord = function _ord(c) + { + if (typeof(c) != "string" || c.length != 1) + throw new ul4.TypeError("ord() requires a string of length 1"); + return c.charCodeAt(0); + }; + + // Convert an integer to a hexadecimal string + ul4._hex = function _hex(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("hex() requires an int"); + if (number < 0) + return "-0x" + number.toString(16).substr(1); + else + return "0x" + number.toString(16); + }; + + // Convert an integer to a octal string + ul4._oct = function _oct(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("oct() requires an int"); + if (number < 0) + return "-0o" + number.toString(8).substr(1); + else + return "0o" + number.toString(8); + }; + + // Convert an integer to a binary string + ul4._bin = function _bin(number) + { + if (typeof(number) != "number") + throw new ul4.TypeError("bin() requires an int"); + if (number < 0) + return "-0b" + number.toString(2).substr(1); + else + return "0b" + number.toString(2); + }; + + // Return the minimum value + ul4._min = function _min(obj) + { + if (obj.length == 0) + throw new ul4.ArgumentError("min() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + let iter = ul4._iter(obj); + let result; + let first = true; + while (true) + { + let item = iter.next(); + if (item.done) + { + if (first) + throw new ul4.ValueError("min() argument is an empty sequence!"); + return result; } + if (first || (item.value < result)) + result = item.value; + first = false; + } + }; + + // Return the maximum value + ul4._max = function _max(obj) + { + if (obj.length == 0) + throw new ul4.ArgumentError("max() requires at least 1 argument, 0 given"); + else if (obj.length == 1) + obj = obj[0]; + let iter = ul4._iter(obj); + let result; + let first = true; + while (true) + { + let item = iter.next(); + if (item.done) + { + if (first) + throw new ul4.ValueError("max() argument is an empty sequence!"); + return result; + } + if (first || (item.value > result)) + result = item.value; + first = false; + } + }; + + // Return the of the values from the iterable starting with ``start`` (default ``0``) + ul4._sum = function _sum(iterable, start=0) + { + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + start += item.value; + } + return start; + }; + + // Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._first = function _first(iterable, defaultValue=null) + { + let item = ul4._iter(iterable).next(); + return item.done ? defaultValue : item.value; + }; + + // Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty) + ul4._last = function _last(iterable, defaultValue=null) + { + let value = defaultValue; + + for (let iter = ul4._iter(iterable);;) + { + let item = iter.next(); + if (item.done) + break; + value = item.value; } - else { - cmp = function cmp(a, b) { + return value; + }; + + // Return a sorted version of ``iterable`` + ul4._sorted = function _sorted(context, iterable, key=null, reverse=false) + { + if (key === null) + { + // FIXME: stability + let cmp = reverse ? function cmp(a, b) + { + return -ul4._cmp("<=>", a, b); + } : function cmp(a, b) + { return ul4._cmp("<=>", a, b); + }; + let result = ul4._list(iterable); + result.sort(cmp); + return result; + } + else + { + let sort = []; + + for (let i = 0, iter = ul4._iter(iterable);;++i) + { + let item = iter.next(); + if (item.done) + break; + let keyvalue = ul4._call(context, key, [item.value], {}); + // For a stable sorting we have to use the nagative index if + // reverse sorting is specified + sort.push([keyvalue, reverse ? -i : i, item.value]); + } + cmp = function cmp(s1, s2) + { + let res = ul4._cmp("<=>", s1[0], s2[0]); + if (res) + return reverse ? -res : res; + res = ul4._cmp("<=>", s1[1], s2[1]); + return reverse ? -res : res; + }; + + sort.sort(cmp); + + let result = []; + for (let i = 0; i < sort.length; ++i) + { + let item = sort[i]; + result.push(item[2]); } + return result; } - var result = ul4._list(iterable); - result.sort(cmp); - return result; - } - else { - var sort = []; + }; - for (var i = 0, iter = ul4._iter(iterable); ; ++i) { - var item = iter.next(); - if (item.done) - break; - var keyvalue = ul4._call(context, key, [item.value], {}); - sort.push([keyvalue, i, item.value]); + // Return a iterable object iterating from ``start`` up to (but not including) ``stop`` with a step size of ``step`` + ul4._range = function _range(args) + { + let start, stop, step; + if (args.length < 1) + throw new ul4.ArgumentError("required range() argument missing"); + else if (args.length > 3) + throw new ul4.ArgumentError("range() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + let lower, higher; + if (step === 0) + throw new ul4.ValueError("range() requires a step argument != 0"); + else if (step > 0) + { + lower = start; + higher = stop; } - cmp = function cmp(s1, s2) { - var res = ul4._cmp("<=>", s1[0], s2[0]); - if (res) - return reverse ? -res : res; - res = ul4._cmp(s1[1], s2[1]); - return reverse ? -res : res; + else + { + lower = stop; + higher = start; } + let length = (lower < higher) ? Math.floor((higher - lower - 1)/Math.abs(step)) + 1 : 0; - sort.sort(cmp); + return { + index: 0, + next: function() + { + if (this.index >= length) + return {done: true}; + return {value: start + (this.index++) * step, done: false}; + } + }; + }; - var result = []; - for (var i = 0; i < sort.length; ++i) { - result.push(sort[i][2]); - } - return result; - } -}; - -// Return a iterable object iterating from ``start`` upto (but not including) ``stop`` with a step size of ``step`` -ul4._range = function _range(args) { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required range() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("range() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var lower, higher; - if (step === 0) - throw ul4.ValueError.create("range() requires a step argument != 0"); - else if (step > 0) { - lower = start; - heigher = stop; - } - else { - lower = stop; - heigher = start; - } - var length = (lower < heigher) ? Math.floor((heigher - lower - 1) / Math.abs(step)) + 1 : 0; - - return { - index: 0, - next: function () { - if (this.index >= length) - return { done: true }; - return { value: start + (this.index++) * step, done: false }; - } - }; -}; - -// Return a iterable object returning a slice from the argument -ul4._slice = function _slice(args) { - var iterable, start, stop, step; - if (args.length < 2) - throw ul4.ArgumentError.create("required slice() argument missing"); - else if (args.length > 4) - throw ul4.ArgumentError.create("slice() expects at most 4 positional arguments, " + args.length + " given"); - else if (args.length == 2) { - iterable = args[0]; - start = 0; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = 1; - } - else if (args.length == 4) { - iterable = args[0]; - start = args[1] !== null ? args[1] : 0; - stop = args[2]; - step = args[3] !== null ? args[3] : 1; - } - if (start < 0) - throw ul4.ValueError.create("slice() requires a start argument >= 0"); - if (stop < 0) - throw ul4.ValueError.create("slice() requires a stop argument >= 0"); - if (step <= 0) - throw ul4.ValueError.create("slice() requires a step argument > 0"); - - var next = start, count = 0; - var iter = ul4._iter(iterable); - return { - next: function () { - var result; - while (count < next) { + // Return a iterable object returning a slice from the argument + ul4._slice = function _slice(args) + { + let iterable, start, stop, step; + if (args.length < 2) + throw new ul4.ArgumentError("required slice() argument missing"); + else if (args.length > 4) + throw new ul4.ArgumentError("slice() expects at most 4 positional arguments, " + args.length + " given"); + else if (args.length == 2) + { + iterable = args[0]; + start = 0; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = 1; + } + else if (args.length == 4) + { + iterable = args[0]; + start = args[1] !== null ? args[1] : 0; + stop = args[2]; + step = args[3] !== null ? args[3] : 1; + } + if (start < 0) + throw new ul4.ValueError("slice() requires a start argument >= 0"); + if (stop < 0) + throw new ul4.ValueError("slice() requires a stop argument >= 0"); + if (step <= 0) + throw new ul4.ValueError("slice() requires a step argument > 0"); + + let next = start, count = 0; + let iter = ul4._iter(iterable); + return { + next: function() { + let result; + while (count < next) + { + result = iter.next(); + if (result.done) + return result; + ++count; + } + if (stop !== null && count >= stop) + return {done: true}; result = iter.next(); if (result.done) return result; ++count; - } - if (stop !== null && count >= stop) - return { done: true }; - result = iter.next(); - if (result.done) + next += step; + if (stop !== null && next > stop) + next = stop; return result; - ++count; - next += step; - if (stop !== null && next > stop) - next = stop; - return result; - } + } + }; }; -}; - -// ``%`` escape unsafe characters in the string ``string`` -ul4._urlquote = function _urlquote(string) { - return encodeURIComponent(string); -}; - -// The inverse function of ``urlquote`` -ul4._urlunquote = function _urlunquote(string) { - return decodeURIComponent(string); -}; - -// Return a reverse iterator over ``sequence`` -ul4._reversed = function _reversed(sequence) { - if (typeof (sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists - sequence = ul4._list(sequence); - return { - index: sequence.length - 1, - next: function () { - return this.index >= 0 ? { value: sequence[this.index--], done: false } : { done: true }; - } - }; -}; - -// Returns a random number in the interval ``[0;1[`` -ul4._random = function _random() { - return Math.random(); -}; - -// Return a randomly select item from ``range(start, stop, step)`` -ul4._randrange = function _randrange(args) { - var start, stop, step; - if (args.length < 1) - throw ul4.ArgumentError.create("required randrange() argument missing"); - else if (args.length > 3) - throw ul4.ArgumentError.create("randrange() expects at most 3 positional arguments, " + args.length + " given"); - else if (args.length == 1) { - start = 0; - stop = args[0]; - step = 1; - } - else if (args.length == 2) { - start = args[0]; - stop = args[1]; - step = 1; - } - else if (args.length == 3) { - start = args[0]; - stop = args[1]; - step = args[2]; - } - var width = stop - start; - var value = Math.random(); + // ``%`` escape unsafe characters in the string ``string`` + ul4._urlquote = function _urlquote(string) + { + return encodeURIComponent(string); + }; - var n; - if (step > 0) - n = Math.floor((width + step - 1) / step); - else if (step < 0) - n = Math.floor((width + step + 1) / step); - else - throw ul4.ValueError.create("randrange() requires a step argument != 0"); - return start + step * Math.floor(value * n); -}; - -// Return a random item/char from the list/string ``sequence`` -ul4._randchoice = function _randchoice(sequence) { - var iscolor = ul4._iscolor(sequence); - if (typeof (sequence) !== "string" && !ul4._islist(sequence) && !iscolor) - throw ul4.TypeError.create("randchoice() requires a string or list"); - if (iscolor) - sequence = ul4._list(sequence); - return sequence[Math.floor(Math.random() * sequence.length)]; -}; - -// Round a number ``x`` to ``digits`` decimal places (may be negative) -ul4._round = function _round(x, digits) { - if (typeof (digits) === "undefined") - digits = 0; - if (digits) { - var threshhold = Math.pow(10, digits); - return Math.round(x * threshhold) / threshhold; - } - else - return Math.round(x); -}; - -// Return a hex-encode MD5 hash of the argument -// This uses the m55 function from https://github.com/blueimp/JavaScript-MD5 -ul4._md5 = function _md5(string) { - return md5(string); -}; - -// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) -ul4._enumerate = function _enumerate(iterable, start) { - if (typeof (start) === "undefined") - start = 0; - - return { - iter: ul4._iter(iterable), - index: start, - next: function () { - var item = this.iter.next(); - return item.done ? item : { value: [this.index++, item.value], done: false }; - } - }; -}; - -// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) -ul4._isfirst = function _isfirst(iterable) { - var iter = ul4._iter(iterable); - var isfirst = true; - return { - next: function () { - var item = iter.next(); - var result = item.done ? item : { value: [isfirst, item.value], done: false }; - isfirst = false; - return result; - } + // The inverse function of ``urlquote`` + ul4._urlunquote = function _urlunquote(string) + { + return decodeURIComponent(string); }; -}; -// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) -ul4._islast = function _islast(iterable) { - var iter = ul4._iter(iterable); - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [item.done, lastitem.value], done: false }; - lastitem = item; - return result; - } + // Return a reverse iterator over ``sequence`` + ul4._reversed = function _reversed(sequence) + { + if (typeof(sequence) != "string" && !ul4._islist(sequence)) // We don't have to materialize strings or lists + sequence = ul4._list(sequence); + return { + index: sequence.length-1, + next: function() { + return this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true}; + } + }; }; -}; - -// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) -ul4._isfirstlast = function _isfirstlast(iterable) { - var iter = ul4._iter(iterable); - var isfirst = true; - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [isfirst, item.done, lastitem.value], done: false }; - lastitem = item; - isfirst = false; - return result; - } + + // Returns a random number in the interval ``[0;1[`` + ul4._random = function _random() + { + return Math.random(); }; -}; - -// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) -ul4._enumfl = function _enumfl(iterable, start) { - var iter = ul4._iter(iterable); - var i = start; - var isfirst = true; - var lastitem = iter.next(); - return { - next: function () { - if (lastitem.done) - return lastitem; - var item = iter.next(); - var result = { value: [i++, isfirst, item.done, lastitem.value], done: false }; - lastitem = item; - isfirst = false; - return result; + + // Return a randomly select item from ``range(start, stop, step)`` + ul4._randrange = function _randrange(args) + { + let start, stop, step; + if (args.length < 1) + throw new ul4.ArgumentError("required randrange() argument missing"); + else if (args.length > 3) + throw new ul4.ArgumentError("randrange() expects at most 3 positional arguments, " + args.length + " given"); + else if (args.length == 1) + { + start = 0; + stop = args[0]; + step = 1; + } + else if (args.length == 2) + { + start = args[0]; + stop = args[1]; + step = 1; + } + else if (args.length == 3) + { + start = args[0]; + stop = args[1]; + step = args[2]; + } + let width = stop-start; + + let value = Math.random(); + + let n; + if (step > 0) + n = Math.floor((width + step - 1) / step); + else if (step < 0) + n = Math.floor((width + step + 1) / step); + else + throw new ul4.ValueError("randrange() requires a step argument != 0"); + return start + step*Math.floor(value * n); + }; + + // Return a random item/char from the list/string ``sequence`` + ul4._randchoice = function _randchoice(sequence) + { + let iscolor = ul4._iscolor(sequence); + if (typeof(sequence) !== "string" && !ul4._islist(sequence) && !iscolor) + throw new ul4.TypeError("randchoice() requires a string or list"); + if (iscolor) + sequence = ul4._list(sequence); + return sequence[Math.floor(Math.random() * sequence.length)]; + }; + + // Round a number ``x`` to ``digits`` decimal places (may be negative) + ul4._round = function _round(x, digits=0) + { + if (digits) + { + let threshold = Math.pow(10, digits); + return Math.round(x*threshold)/threshold; } + else + return Math.round(x); }; -}; -// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) -ul4._zip = function _zip(iterables) { - var result; - if (iterables.length) { - var iters = []; - for (var i = 0; i < iterables.length; ++i) - iters.push(ul4._iter(iterables[i])); + // Return a hex-encode MD5 hash of the argument + // This uses the md5 function from https://github.com/blueimp/JavaScript-MD5 + if (iscommon) + { + ul4._md5 = function _md5(string) + { + let md5 = require('blueimp-md5'); + return md5(string); + }; + } + else + { + ul4._md5 = function _md5(string) + { + return md5(string); + }; + } + // Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0) + ul4._enumerate = function _enumerate(iterable, start=0) + { return { - next: function () { - var items = []; - for (var i = 0; i < iters.length; ++i) { - var item = iters[i].next(); - if (item.done) - return item; - items.push(item.value); - } - return { value: items, done: false }; + iter: ul4._iter(iterable), + index: start, + next: function() { + let item = this.iter.next(); + return item.done ? item : {value: [this.index++, item.value], done: false}; } }; - } - else { + }; + + // Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise) + ul4._isfirst = function _isfirst(iterable) + { + let iter = ul4._iter(iterable); + let isfirst = true; return { - next: function () { - return { done: true }; + next: function() { + let item = iter.next(); + let result = item.done ? item : {value: [isfirst, item.value], done: false}; + isfirst = false; + return result; } }; - } -}; - -// Return the absolute value for the number ``number`` -ul4._abs = function _abs(number) { - if (number !== null && typeof (number.__abs__) === "function") - return number.__abs__(); - return Math.abs(number); -}; - -// Return a ``Date`` object from the arguments passed in -ul4._date = function _date(year, month, day, hour, minute, second, microsecond) { - if (typeof (hour) === "undefined") - hour = 0; - - if (typeof (minute) === "undefined") - minute = 0; - - if (typeof (second) === "undefined") - second = 0; - - if (typeof (microsecond) === "undefined") - microsecond = 0; - - return new Date(year, month - 1, day, hour, minute, second, microsecond / 1000); -}; - -// Return a ``TimeDelta`` object from the arguments passed in -ul4._timedelta = function _timedelta(days, seconds, microseconds) { - return this.TimeDelta.create(days, seconds, microseconds); -}; - -// Return a ``MonthDelta`` object from the arguments passed in -ul4._monthdelta = function _monthdelta(months) { - return this.MonthDelta.create(months); -}; - -// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) -ul4._hls = function _hls(h, l, s, a) { - var _v = function (m1, m2, hue) { - hue = hue % 1.0; - if (hue < 1 / 6) - return m1 + (m2 - m1) * hue * 6.0; - else if (hue < 0.5) - return m2; - else if (hue < 2 / 3) - return m1 + (m2 - m1) * (2 / 3 - hue) * 6.0; - return m1; - }; - - var m1, m2; - if (typeof (a) === "undefined") - a = 1; - if (s === 0.0) - return ul4._rgb(l, l, l, a); - if (l <= 0.5) - m2 = l * (1.0 + s); - else - m2 = l + s - (l * s); - m1 = 2.0 * l - m2; - return ul4._rgb(_v(m1, m2, h + 1 / 3), _v(m1, m2, h), _v(m1, m2, h - 1 / 3), a); -}; - -// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) -ul4._hsv = function _hsv(h, s, v, a) { - if (s === 0.0) - return ul4._rgb(v, v, v, a); - var i = Math.floor(h * 6.0); - var f = (h * 6.0) - i; - var p = v * (1.0 - s); - var q = v * (1.0 - s * f); - var t = v * (1.0 - s * (1.0 - f)); - switch (i % 6) { - case 0: - return ul4._rgb(v, t, p, a); - case 1: - return ul4._rgb(q, v, p, a); - case 2: - return ul4._rgb(p, v, t, a); - case 3: - return ul4._rgb(p, q, v, a); - case 4: - return ul4._rgb(t, p, v, a); - case 5: - return ul4._rgb(v, p, q, a); - } -}; - -// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` -ul4._get = function _get(container, key, defaultvalue) { - if (ul4._ismap(container)) { - if (container.has(key)) - return container.get(key); - return defaultvalue; - } - else if (ul4._isobject(container)) { - var result = container[key]; - if (typeof (result) === "undefined") - return defaultvalue; - return result; - } - throw ul4.TypeError.create("get()", "get() requires a dict"); -}; - -// Return a ``Date`` object for the current time -ul4.now = function now() { - return new Date(); -}; - -// Return a ``Date`` object for the current time in UTC -ul4.utcnow = function utcnow() { - var now = new Date(); - // FIXME: The timezone is wrong for the new ``Date`` object. - return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); -}; - -ul4.functions = { - repr: ul4.expose(["obj"], { name: "repr" }, ul4._repr), - ascii: ul4.expose(["obj"], { name: "ascii" }, ul4._ascii), - str: ul4.expose(["obj=", ""], { name: "str" }, ul4._str), - int: ul4.expose(["obj=", 0, "base=", null], { name: "int" }, ul4._int), - float: ul4.expose(["obj=", 0.0], { name: "float" }, ul4._float), - list: ul4.expose(["iterable=", []], { name: "list" }, ul4._list), - set: ul4.expose(["iterable=", []], { name: "set" }, ul4._set), - bool: ul4.expose(["obj=", false], { name: "bool" }, ul4._bool), - len: ul4.expose(["sequence"], { name: "len" }, ul4._len), - type: ul4.expose(["obj"], { name: "type" }, ul4._type), - format: ul4.expose(["obj", "fmt", "lang=", null], { name: "format" }, ul4._format), - any: ul4.expose(["iterable"], { name: "any" }, ul4._any), - all: ul4.expose(["iterable"], { name: "all" }, ul4._all), - zip: ul4.expose(["*iterables"], { name: "zip" }, ul4._zip), - isundefined: ul4.expose(["obj"], { name: "isundefined" }, ul4._isundefined), - isdefined: ul4.expose(["obj"], { name: "isdefined" }, ul4._isdefined), - isnone: ul4.expose(["obj"], { name: "isnone" }, ul4._isnone), - isbool: ul4.expose(["obj"], { name: "isbool" }, ul4._isbool), - isint: ul4.expose(["obj"], { name: "isint" }, ul4._isint), - isfloat: ul4.expose(["obj"], { name: "isfloat" }, ul4._isfloat), - isstr: ul4.expose(["obj"], { name: "isstr" }, ul4._isstr), - isdate: ul4.expose(["obj"], { name: "isdate" }, ul4._isdate), - iscolor: ul4.expose(["obj"], { name: "iscolor" }, ul4._iscolor), - istimedelta: ul4.expose(["obj"], { name: "istimedelta" }, ul4._istimedelta), - ismonthdelta: ul4.expose(["obj"], { name: "ismonthdelta" }, ul4._ismonthdelta), - istemplate: ul4.expose(["obj"], { name: "istemplate" }, ul4._istemplate), - isfunction: ul4.expose(["obj"], { name: "isfunction" }, ul4._isfunction), - islist: ul4.expose(["obj"], { name: "islist" }, ul4._islist), - isset: ul4.expose(["obj"], { name: "isset" }, ul4on._haveset ? ul4._isset : ul4._isul4set), - isdict: ul4.expose(["obj"], { name: "isdict" }, ul4._isdict), - isexception: ul4.expose(["obj"], { name: "isexception" }, ul4._isexception), - asjson: ul4.expose(["obj"], { name: "asjson" }, ul4._asjson), - fromjson: ul4.expose(["string"], { name: "fromjson" }, ul4._fromjson), - asul4on: ul4.expose(["obj"], { name: "asul4on" }, ul4._asul4on), - fromul4on: ul4.expose(["string"], { name: "fromul4on" }, ul4._fromul4on), - now: ul4.expose([], ul4.now), - utcnow: ul4.expose([], ul4.utcnow), - enumerate: ul4.expose(["iterable", "start=", 0], { name: "enumerate" }, ul4._enumerate), - isfirst: ul4.expose(["iterable"], { name: "isfirst" }, ul4._isfirst), - islast: ul4.expose(["iterable"], { name: "islast" }, ul4._islast), - isfirstlast: ul4.expose(["iterable"], { name: "isfirstlast" }, ul4._isfirstlast), - enumfl: ul4.expose(["iterable", "start=", 0], { name: "enumfl" }, ul4._enumfl), - abs: ul4.expose(["number"], { name: "abs" }, ul4._abs), - date: ul4.expose(["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], { name: "date" }, ul4._date), - timedelta: ul4.expose(["days=", 0, "seconds=", 0, "microseconds=", 0], { name: "timedelta" }, ul4._timedelta), - monthdelta: ul4.expose(["months=", 0], { name: "monthdelta" }, ul4._monthdelta), - rgb: ul4.expose(["r", "g", "b", "a=", 1.0], { name: "rgb" }, ul4._rgb), - hls: ul4.expose(["h", "l", "s", "a=", 1.0], { name: "hls" }, ul4._hls), - hsv: ul4.expose(["h", "s", "v", "a=", 1.0], { name: "hsv" }, ul4._hsv), - xmlescape: ul4.expose(["obj"], { name: "xmlescape" }, ul4._xmlescape), - csv: ul4.expose(["obj"], { name: "csv" }, ul4._csv), - chr: ul4.expose(["i"], { name: "chr" }, ul4._chr), - ord: ul4.expose(["c"], { name: "ord" }, ul4._ord), - hex: ul4.expose(["number"], { name: "hex" }, ul4._hex), - oct: ul4.expose(["number"], { name: "oct" }, ul4._oct), - bin: ul4.expose(["number"], { name: "bin" }, ul4._bin), - min: ul4.expose(["*obj"], { name: "min" }, ul4._min), - max: ul4.expose(["*obj"], { name: "max" }, ul4._max), - sum: ul4.expose(["iterable", "start=", 0], { name: "sum" }, ul4._sum), - first: ul4.expose(["iterable", "default=", null], { name: "first" }, ul4._first), - last: ul4.expose(["iterable", "default=", null], { name: "last" }, ul4._last), - sorted: ul4.expose(["iterable", "key=", null, "reverse=", false], { name: "sorted", needscontext: true }, ul4._sorted), - range: ul4.expose(["*args"], { name: "range" }, ul4._range), - slice: ul4.expose(["*args"], { name: "slice" }, ul4._slice), - urlquote: ul4.expose(["string"], { name: "urlquote" }, ul4._urlquote), - urlunquote: ul4.expose(["string"], { name: "urlunquote" }, ul4._urlunquote), - reversed: ul4.expose(["sequence"], { name: "reversed" }, ul4._reversed), - random: ul4.expose([], { name: "random" }, ul4._random), - randrange: ul4.expose(["*args"], { name: "randrange" }, ul4._randrange), - randchoice: ul4.expose(["sequence"], { name: "randchoice" }, ul4._randchoice), - round: ul4.expose(["x", "digit=", 0], { name: "round" }, ul4._round), - md5: ul4.expose(["string"], { name: "md5" }, ul4._md5) -}; - -// Functions implementing UL4 methods -ul4._replace = function _replace(string, old, new_, count) { - if (count === null) - count = string.length; - - var result = []; - while (string.length) { - var pos = string.indexOf(old); - if (pos === -1 || !count--) { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - result.push(new_); - string = string.substr(pos + old.length); - } - return result.join(""); -}; - -ul4._strip = function _strip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("strip()", "strip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - while (string && chars.indexOf(string[string.length - 1]) >= 0) - string = string.substr(0, string.length - 1); - return string; -}; - -ul4._lstrip = function _lstrip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("lstrip()", "lstrip() requires two strings"); - - while (string && chars.indexOf(string[0]) >= 0) - string = string.substr(1); - return string; -}; - -ul4._rstrip = function _rstrip(string, chars) { - if (chars === null) - chars = " \r\n\t"; - else if (typeof (chars) !== "string") - throw ul4.TypeError.create("rstrip()", "rstrip() requires two strings"); - - while (string && chars.indexOf(string[string.length - 1]) >= 0) - string = string.substr(0, string.length - 1); - return string; -}; - -ul4._split = function _split(string, sep, count) { - if (sep !== null && typeof (sep) !== "string") - throw ul4.TypeError.create("split()", "split() requires a string"); - - if (count === null) { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length - 1].length) - result.splice(-1); - } - return result; - } - else { - if (sep !== null) { - var result = []; - while (string.length) { - var pos = string.indexOf(sep); - if (pos === -1 || !count--) { - result.push(string); - break; - } - result.push(string.substr(0, pos)); - string = string.substr(pos + sep.length); + }; + + // Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise) + ul4._islast = function _islast(iterable) + { + let iter = ul4._iter(iterable); + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [item.done, lastitem.value], done: false}; + lastitem = item; + return result; } - return result; - } - else { - var result = []; - while (string.length) { - string = ul4._lstrip(string, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else - part = string.split(/[ \n\r\t]+/, 1)[0]; - if (part.length) - result.push(part); - string = string.substr(part.length); + }; + }; + + // Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._isfirstlast = function _isfirstlast(iterable) + { + let iter = ul4._iter(iterable); + let isfirst = true; + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; } - return result; - } - } -}; + }; + }; + + // Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise) + ul4._enumfl = function _enumfl(iterable, start=0) + { + let iter = ul4._iter(iterable); + let i = start; + let isfirst = true; + let lastitem = iter.next(); + return { + next: function() { + if (lastitem.done) + return lastitem; + let item = iter.next(); + let result = {value: [i++, isfirst, item.done, lastitem.value], done: false}; + lastitem = item; + isfirst = false; + return result; + } + }; + }; -ul4._rsplit = function _rsplit(string, sep, count) { - if (sep !== null && typeof (sep) !== "string") - throw ul4.TypeError.create("rsplit()", "rsplit() requires a string as second argument"); + // Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends) + ul4._zip = function _zip(iterables) + { + let result; + if (iterables.length) + { + let iters = []; + for (let i = 0; i < iterables.length; ++i) + iters.push(ul4._iter(iterables[i])); - if (count === null) { - var result = string.split(sep !== null ? sep : /[ \n\r\t]+/); - if (sep === null) { - if (result.length && !result[0].length) - result.splice(0, 1); - if (result.length && !result[result.length - 1].length) - result.splice(-1); - } - return result; - } - else { - if (sep !== null) { - var result = []; - while (string.length) { - var pos = string.lastIndexOf(sep); - if (pos === -1 || !count--) { - result.unshift(string); - break; + return { + next: function() { + let items = []; + for (let i = 0; i < iters.length; ++i) + { + let item = iters[i].next(); + if (item.done) + return item; + items.push(item.value); + } + return {value: items, done: false}; } - result.unshift(string.substr(pos + sep.length)); - string = string.substr(0, pos); - } - return result; + }; } - else { - var result = []; - while (string.length) { - string = ul4._rstrip(string, null, null); - var part; - if (!count--) - part = string; // Take the rest of the string - else { - part = string.split(/[ \n\r\t]+/); - part = part[part.length - 1]; + else + { + return { + next: function() { + return {done: true}; } - if (part.length) - result.unshift(part); - string = string.substr(0, string.length - part.length); - } - return result; - } - } -}; - -ul4._splitlines = function _splitlines(string, keepends) { - var lookingAtLineEnd = function lookingAtLineEnd() { - var c = string[pos]; - if (c === '\n' || c == '\u000B' || c == '\u000C' || c == '\u001C' || c == '\u001D' || c == '\u001E' || c == '\u0085' || c == '\u2028' || c == '\u2029') - return 1; - if (c === '\r') { - if (pos == length - 1) - return 1; - if (string[pos + 1] === '\n') - return 2; - return 1; + }; } - return 0; }; - var result = [], length = string.length; + // Return the absolute value for the number ``number`` + ul4._abs = function _abs(number) + { + if (number !== null && typeof(number.__abs__) === "function") + return number.__abs__(); + return Math.abs(number); + }; + + // Return a ``Date`` object from the arguments passed in + ul4._date = function _date(year, month, day) + { + return new ul4.Date(year, month, day); + }; + + ul4._datetime = function _datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0) + { + return new Date(year, month-1, day, hour, minute, second, microsecond/1000); + }; - for (var pos = 0, startpos = 0; ;) { - if (pos >= length) { - if (startpos != pos) - result.push(string.substring(startpos)); - return result; + // Return a ``TimeDelta`` object from the arguments passed in + ul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0) + { + return new this.TimeDelta(days, seconds, microseconds); + }; + + // Return a ``MonthDelta`` object from the arguments passed in + ul4._monthdelta = function _monthdelta(months=0) + { + return new this.MonthDelta(months); + }; + + // Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model) + ul4._hls = function _hls(h, l, s, a) + { + let _v = function(m1, m2, hue) + { + hue = hue % 1.0; + if (hue < 1/6) + return m1 + (m2-m1)*hue*6.0; + else if (hue < 0.5) + return m2; + else if (hue < 2/3) + return m1 + (m2-m1)*(2/3-hue)*6.0; + return m1; + }; + + let m1, m2; + if (typeof(a) === "undefined") + a = 1; + if (s === 0.0) + return ul4._rgb(l, l, l, a); + if (l <= 0.5) + m2 = l * (1.0+s); + else + m2 = l+s-(l*s); + m1 = 2.0*l - m2; + return ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a); + }; + + // Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model) + ul4._hsv = function _hsv(h, s, v, a) + { + if (s === 0.0) + return ul4._rgb(v, v, v, a); + let i = Math.floor(h*6.0); + let f = (h*6.0) - i; + let p = v*(1.0 - s); + let q = v*(1.0 - s*f); + let t = v*(1.0 - s*(1.0-f)); + switch (i%6) + { + case 0: + return ul4._rgb(v, t, p, a); + case 1: + return ul4._rgb(q, v, p, a); + case 2: + return ul4._rgb(p, v, t, a); + case 3: + return ul4._rgb(p, q, v, a); + case 4: + return ul4._rgb(t, p, v, a); + case 5: + return ul4._rgb(v, p, q, a); + } + }; + + // Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue`` + ul4._get = function _get(container, key, defaultvalue) + { + if (ul4._ismap(container)) + { + if (container.has(key)) + return container.get(key); + return defaultvalue; } - var lineendlen = lookingAtLineEnd(); - if (!lineendlen) - ++pos; - else { - var endpos = pos + (keepends ? lineendlen : 0); - result.push(string.substring(startpos, endpos)); - pos += lineendlen; - startpos = pos; + else if (ul4._isobject(container)) + { + let result = container[key]; + if (typeof(result) === "undefined") + return defaultvalue; + return result; } - } -}; + throw new ul4.TypeError("get() requires a dict"); + }; + + // Return a ``Date`` object for the current time + ul4.now = function now() + { + return new Date(); + }; -ul4._count = function _count(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; + // Return a ``Date`` object for the current time in UTC + ul4.utcnow = function utcnow() + { + let now = new Date(); + // FIXME: The timezone is wrong for the new ``Date`` object. + return new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + }; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; + // Return an ``ul4.Date`` object for today + ul4.today = function today() + { + let now = new Date(); + return new ul4.Date(now.getFullYear(), now.getMonth()+1, now.getDate()); + }; - var isstr = ul4._isstr(obj); + ul4.functions = { + repr: ul4._repr, + ascii: ul4._ascii, + str: ul4._str, + int: ul4._int, + float: ul4._float, + list: ul4._list, + set: ul4._set, + bool: ul4._bool, + len: ul4._len, + type: ul4._type, + format: ul4._format, + any: ul4._any, + all: ul4._all, + zip: ul4._zip, + getattr: ul4._getattr, + hasattr: ul4._hasattr, + dir: ul4._dir, + isundefined: ul4._isundefined, + isdefined: ul4._isdefined, + isnone: ul4._isnone, + isbool: ul4._isbool, + isint: ul4._isint, + isfloat: ul4._isfloat, + isstr: ul4._isstr, + isdate: ul4._isdate, + isdatetime: ul4._isdatetime, + iscolor: ul4._iscolor, + istimedelta: ul4._istimedelta, + ismonthdelta: ul4._ismonthdelta, + istemplate: ul4._istemplate, + isfunction: ul4._isfunction, + islist: ul4._islist, + isset: ul4._isanyset, + isdict: ul4._isdict, + isexception: ul4._isexception, + asjson: ul4._asjson, + fromjson: ul4._fromjson, + asul4on: ul4._asul4on, + fromul4on: ul4._fromul4on, + now: ul4.now, + utcnow: ul4.utcnow, + today: ul4.today, + enumerate: ul4._enumerate, + isfirst: ul4._isfirst, + islast: ul4._islast, + isfirstlast: ul4._isfirstlast, + enumfl: ul4._enumfl, + abs: ul4._abs, + date: ul4._date, + datetime: ul4._datetime, + timedelta: ul4._timedelta, + monthdelta: ul4._monthdelta, + rgb: ul4._rgb, + hls: ul4._hls, + hsv: ul4._hsv, + xmlescape: ul4._xmlescape, + csv: ul4._csv, + chr: ul4._chr, + ord: ul4._ord, + hex: ul4._hex, + oct: ul4._oct, + bin: ul4._bin, + min: ul4._min, + max: ul4._max, + sum: ul4._sum, + first: ul4._first, + last: ul4._last, + sorted: ul4._sorted, + range: ul4._range, + slice: ul4._slice, + urlquote: ul4._urlquote, + urlunquote: ul4._urlunquote, + reversed: ul4._reversed, + random: ul4._random, + randrange: ul4._randrange, + randchoice: ul4._randchoice, + round: ul4._round, + md5: ul4._md5 + }; - if (isstr && !sub.length) { - if (end < 0 || start > obj.length || start > end) - return 0; - var result = end - start + 1; - if (result > obj.length + 1) - result = obj.length + 1; - return result; - } + ul4.expose(ul4._repr, ["obj"], {name: "repr"}); + ul4.expose(ul4._ascii, ["obj"], {name: "ascii"}); + ul4.expose(ul4._str, ["obj=", ""], {name: "str"}); + ul4.expose(ul4._int, ["obj=", 0, "base=", null], {name: "int"}); + ul4.expose(ul4._float, ["obj=", 0.0], {name: "float"}); + ul4.expose(ul4._list, ["iterable=", []], {name: "list"}); + ul4.expose(ul4._set, ["iterable=", []], {name: "set"}); + ul4.expose(ul4._bool, ["obj=", false], {name: "bool"}); + ul4.expose(ul4._len, ["sequence"], {name: "len"}); + ul4.expose(ul4._type, ["obj"], {name: "type"}); + ul4.expose(ul4._format, ["obj", "fmt", "lang=", null], {name: "format"}); + ul4.expose(ul4._any, ["iterable"], {name: "any"}); + ul4.expose(ul4._all, ["iterable"], {name: "all"}); + ul4.expose(ul4._zip, ["*iterables"], {name: "zip"}); + ul4.expose(ul4._getattr, ["obj", "attrname", "default=", null], {name: "getattr"}); + ul4.expose(ul4._hasattr, ["obj", "attrname"], {name: "hasattr"}); + ul4.expose(ul4._dir, ["obj"], {name: "dir"}); + ul4.expose(ul4._isundefined, ["obj"], {name: "isundefined"}); + ul4.expose(ul4._isdefined, ["obj"], {name: "isdefined"}); + ul4.expose(ul4._isnone, ["obj"], {name: "isnone"}); + ul4.expose(ul4._isbool, ["obj"], {name: "isbool"}); + ul4.expose(ul4._isint, ["obj"], {name: "isint"}); + ul4.expose(ul4._isfloat, ["obj"], {name: "isfloat"}); + ul4.expose(ul4._isstr, ["obj"], {name: "isstr"}); + ul4.expose(ul4._isdate, ["obj"], {name: "isdate"}); + ul4.expose(ul4._isdatetime, ["obj"], {name: "isdatetime"}); + ul4.expose(ul4._iscolor, ["obj"], {name: "iscolor"}); + ul4.expose(ul4._istimedelta, ["obj"], {name: "istimedelta"}); + ul4.expose(ul4._ismonthdelta, ["obj"], {name: "ismonthdelta"}); + ul4.expose(ul4._istemplate, ["obj"], {name: "istemplate"}); + ul4.expose(ul4._isfunction, ["obj"], {name: "isfunction"}); + ul4.expose(ul4._islist, ["obj"], {name: "islist"}); + ul4.expose(ul4._isanyset, ["obj"], {name: "isset"}); + ul4.expose(ul4._isdict, ["obj"], {name: "isdict"}); + ul4.expose(ul4._isexception, ["obj"], {name: "isexception"}); + ul4.expose(ul4._asjson, ["obj"], {name: "asjson"}); + ul4.expose(ul4._fromjson, ["string"], {name: "fromjson"}); + ul4.expose(ul4._asul4on, ["obj"], {name: "asul4on"}); + ul4.expose(ul4._fromul4on, ["string"], {name: "fromul4on"}); + ul4.expose(ul4.now, []); + ul4.expose(ul4.utcnow, []); + ul4.expose(ul4.today, []); + ul4.expose(ul4._enumerate, ["iterable", "start=", 0], {name: "enumerate"}); + ul4.expose(ul4._isfirst, ["iterable"], {name: "isfirst"}); + ul4.expose(ul4._islast, ["iterable"], {name: "islast"}); + ul4.expose(ul4._isfirstlast, ["iterable"], {name: "isfirstlast"}); + ul4.expose(ul4._enumfl, ["iterable", "start=", 0], {name: "enumfl"}); + ul4.expose(ul4._abs, ["number"], {name: "abs"}); + ul4.expose(ul4._date, ["year", "month", "day"], {name: "date"}); + ul4.expose(ul4._datetime, ["year", "month", "day", "hour=", 0, "minute=", 0, "second=", 0, "microsecond=", 0], {name: "datetime"}); + ul4.expose(ul4._timedelta, ["days=", 0, "seconds=", 0, "microseconds=", 0], {name: "timedelta"}); + ul4.expose(ul4._monthdelta, ["months=", 0], {name: "monthdelta"}); + ul4.expose(ul4._rgb, ["r", "g", "b", "a=", 1.0], {name: "rgb"}); + ul4.expose(ul4._hls, ["h", "l", "s", "a=", 1.0], {name: "hls"}); + ul4.expose(ul4._hsv, ["h", "s", "v", "a=", 1.0], {name: "hsv"}); + ul4.expose(ul4._xmlescape, ["obj"], {name: "xmlescape"}); + ul4.expose(ul4._csv, ["obj"], {name: "csv"}); + ul4.expose(ul4._chr, ["i"], {name: "chr"}); + ul4.expose(ul4._ord, ["c"], {name: "ord"}); + ul4.expose(ul4._hex, ["number"], {name: "hex"}); + ul4.expose(ul4._oct, ["number"], {name: "oct"}); + ul4.expose(ul4._bin, ["number"], {name: "bin"}); + ul4.expose(ul4._min, ["*obj"], {name: "min"}); + ul4.expose(ul4._max, ["*obj"], {name: "max"}); + ul4.expose(ul4._sum, ["iterable", "start=", 0], {name: "sum"}); + ul4.expose(ul4._first, ["iterable", "default=", null], {name: "first"}); + ul4.expose(ul4._last, ["iterable", "default=", null], {name: "last"}); + ul4.expose(ul4._sorted, ["iterable", "key=", null, "reverse=", false], {name: "sorted", needscontext: true}); + ul4.expose(ul4._range, ["*args"], {name: "range"}); + ul4.expose(ul4._slice, ["*args"], {name: "slice"}); + ul4.expose(ul4._urlquote, ["string"], {name: "urlquote"}); + ul4.expose(ul4._urlunquote, ["string"], {name: "urlunquote"}); + ul4.expose(ul4._reversed, ["sequence"], {name: "reversed"}); + ul4.expose(ul4._random, [], {name: "random"}); + ul4.expose(ul4._randrange, ["*args"], {name: "randrange"}); + ul4.expose(ul4._randchoice, ["sequence"], {name: "randchoice"}); + ul4.expose(ul4._round, ["x", "digit=", 0], {name: "round"}); + ul4.expose(ul4._md5, ["string"], {name: "md5"}); + + // Functions implementing UL4 methods + ul4._count = function _count(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + + let isstr = ul4._isstr(obj); + + if (isstr && !sub.length) + { + if (end < 0 || start > obj.length || start > end) + return 0; + let result = end - start + 1; + if (result > obj.length + 1) + result = obj.length + 1; + return result; + } - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); - var count = 0; - if (ul4._islist(obj)) { - for (var i = start; i < end; ++i) { - if (ul4._eq(obj[i], sub)) + let count = 0; + if (ul4._islist(obj)) + { + for (let i = start; i < end; ++i) + { + if (ul4._eq(obj[i], sub)) + ++count; + } + return count; + } + else // string + { + let lastIndex = start; + + for (;;) + { + lastIndex = obj.indexOf(sub, lastIndex); + if (lastIndex == -1) + break; + if (lastIndex + sub.length > end) + break; ++count; + lastIndex += sub.length; + } + return count; } - return count; - } - else // string - { - var lastIndex = start; + }; - for (; ;) { - lastIndex = obj.indexOf(sub, lastIndex); - if (lastIndex == -1) - break; - if (lastIndex + sub.length > end) - break; - ++count; - lastIndex += sub.length; + ul4._find = function _find(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); } - return count; - } -}; - -ul4._find = function _find(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) { - if (typeof (obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.indexOf(sub); - if (result !== -1) - result += start; - return result; -}; - -ul4._rfind = function _rfind(obj, sub, start, end) { - if (start < 0) - start += obj.length; - if (start === null) - start = 0; - if (end < 0) - end += obj.length; - if (end === null) - end = obj.length; - start = ul4._bound(start, obj.length); - end = ul4._bound(end, obj.length); - - if (start !== 0 || end !== obj.length) { - if (typeof (obj) == "string") - obj = obj.substring(start, end); - else - obj = obj.slice(start, end); - } - var result = obj.lastIndexOf(sub); - if (result !== -1) - result += start; - return result; -}; - -ul4._capitalize = function _capitalize(obj) { - if (typeof (obj) != "string") - throw ul4.TypeError.create("capitalize()", "capitalize() requires a string"); - - if (obj.length) - obj = obj[0].toUpperCase() + obj.slice(1).toLowerCase(); - return obj; -}; - -ul4._items = function _items(obj) { - if (ul4._ismap(obj)) { - var result = []; - obj.forEach(function (value, key) { - result.push([key, value]); - }); - return result; - } - else if (ul4._isobject(obj)) { - var result = []; - for (var key in obj) - result.push([key, obj[key]]); + let result = obj.indexOf(sub); + if (result !== -1) + result += start; return result; - } - throw ul4.TypeError.create("items()", "items() requires a dict"); -}; + }; -ul4._values = function _values(obj) { - if (ul4._ismap(obj)) { - var result = []; - obj.forEach(function (value, key) { - result.push(value); - }); - return result; - } - else if (ul4._isobject(obj)) { - var result = []; - for (var key in obj) - result.push(obj[key]); + ul4._rfind = function _rfind(obj, sub, start=null, end=null) + { + if (start < 0) + start += obj.length; + if (start === null) + start = 0; + if (end < 0) + end += obj.length; + if (end === null) + end = obj.length; + start = ul4._bound(start, obj.length); + end = ul4._bound(end, obj.length); + + if (start !== 0 || end !== obj.length) + { + if (typeof(obj) == "string") + obj = obj.substring(start, end); + else + obj = obj.slice(start, end); + } + let result = obj.lastIndexOf(sub); + if (result !== -1) + result += start; return result; - } - throw ul4.TypeError.create("values()", "values() requires a dict"); -}; - -ul4._join = function _join(sep, iterable) { - var resultlist = []; - for (var iter = ul4._iter(iterable); ;) { - var item = iter.next(); - if (item.done) - break; - resultlist.push(item.value); - } - return resultlist.join(sep); -}; - -ul4._startswith = function _startswith(string, prefix) { - if (typeof (prefix) !== "string") - throw ul4.TypeError.create("startswith()", "startswith() argument must be string"); - - return string.substr(0, prefix.length) === prefix; -}; - -ul4._endswith = function _endswith(string, suffix) { - if (typeof (suffix) !== "string") - throw ul4.TypeError.create("endswith()", "endswith() argument must be string"); - - return string.substr(string.length - suffix.length) === suffix; -}; - -ul4._isoformat = function _isoformat(obj) { - if (!ul4._isdate(obj)) - throw ul4.TypeError.create("isoformat()", "isoformat() requires a date"); - - var result = obj.getFullYear() + "-" + ul4._lpad((obj.getMonth() + 1).toString(), "0", 2) + "-" + ul4._lpad(obj.getDate().toString(), "0", 2); - var hour = obj.getHours(); - var minute = obj.getMinutes(); - var second = obj.getSeconds(); - var ms = obj.getMilliseconds(); - if (hour || minute || second || ms) { - result += "T" + ul4._lpad(hour.toString(), "0", 2) + ":" + ul4._lpad(minute.toString(), "0", 2) + ":" + ul4._lpad(second.toString(), "0", 2); - if (ms) - result += "." + ul4._lpad(ms.toString(), "0", 3) + "000"; - } - return result; -}; - -ul4._mimeformat = function _mimeformat(obj) { - var weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; - var monthname = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + }; - return weekdayname[ul4._weekday(obj)] + ", " + ul4._lpad(obj.getDate(), "0", 2) + " " + monthname[obj.getMonth()] + " " + obj.getFullYear() + " " + ul4._lpad(obj.getHours(), "0", 2) + ":" + ul4._lpad(obj.getMinutes(), "0", 2) + ":" + ul4._lpad(obj.getSeconds(), "0", 2) + " GMT"; -}; + ul4._week4format = function _week(obj, firstweekday=null) + { + if (firstweekday === null) + firstweekday = 0; + else + firstweekday %= 7; -ul4._weekday = function _weekday(obj) { - var d = obj.getDay(); - return d ? d - 1 : 6; -}; + let yearday = ul4.DateTimeProtocol.yearday(obj)+6; + let jan1 = new Date(obj.getFullYear(), 0, 1); + let jan1weekday = jan1.getDay(); + if (--jan1weekday < 0) + jan1weekday = 6; -ul4._week = function _week(obj, firstweekday) { - if (firstweekday === null) - firstweekday = 0; - else - firstweekday %= 7; - - var yearday = ul4._yearday(obj) + 6; - var jan1 = new Date(obj.getFullYear(), 0, 1); - var jan1weekday = jan1.getDay(); - if (--jan1weekday < 0) - jan1weekday = 6; - - while (jan1weekday != firstweekday) { - --yearday; - if (++jan1weekday == 7) - jan1weekday = 0; - } - return Math.floor(yearday / 7); -}; - -ul4._isleap = function _isleap(obj) { - return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; -}; - -ul4._yearday = function _yearday(obj) { - var leap = ul4._isleap(obj) ? 1 : 0; - var day = obj.getDate(); - switch (obj.getMonth()) { - case 0: - return day; - case 1: - return 31 + day; - case 2: - return 31 + 28 + leap + day; - case 3: - return 31 + 28 + leap + 31 + day; - case 4: - return 31 + 28 + leap + 31 + 30 + day; - case 5: - return 31 + 28 + leap + 31 + 30 + 31 + day; - case 6: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + day; - case 7: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day; - case 8: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day; - case 9: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; - case 10: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; - case 11: - return 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; - } -}; - -ul4._append = function _append(obj, items) { - for (var i = 0; i < items.length; ++i) - obj.push(items[i]); - return null; -}; - -ul4._insert = function _insert(obj, pos, items) { - if (pos < 0) - pos += obj.length; - - for (var i = 0; i < items.length; ++i) - obj.splice(pos++, 0, items[i]); - return null; -}; - -ul4._pop = function _pop(obj, pos) { - if (pos < 0) - pos += obj.length; - - var result = obj[pos]; - obj.splice(pos, 1); - return result; -}; - -ul4._update = function _update(obj, others, kwargs) { - if (!ul4._isdict(obj)) - throw ul4.TypeError.create("update()", "update() requires a dict"); - for (var i = 0; i < others.length; ++i) { - var other = others[i]; - if (ul4._ismap(other)) { - other.forEach(function (value, key) { - ul4on._setmap(obj, key, value); - }); - } - else if (ul4._isobject(other)) { - for (var key in other) - ul4on._setmap(obj, key, other[key]); + while (jan1weekday != firstweekday) + { + --yearday; + if (++jan1weekday == 7) + jan1weekday = 0; } - else if (ul4._islist(other)) { - for (var j = 0; j < other.length; ++j) { - if (!ul4._islist(other[j]) || (other[j].length != 2)) - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - ul4on._setmap(obj, other[j][0], other[j][1]); + return Math.floor(yearday/7); + }; + + ul4._isleap = function _isleap(obj) + { + return new Date(obj.getFullYear(), 1, 29).getMonth() === 1; + }; + + ul4._update = function _update(obj, others, kwargs) + { + if (!ul4._isdict(obj)) + throw new ul4.TypeError("update() requires a dict"); + for (let i = 0; i < others.length; ++i) + { + let other = others[i]; + if (ul4._ismap(other)) + { + other.forEach(function(value, key) { + ul4._setmap(obj, key, value); + }); } - } - else - throw ul4.TypeError.create("update()", "update() requires a dict or a list of (key, value) pairs"); - } - for (var key in kwargs) - ul4on._setmap(obj, key, kwargs[key]); - return null; -}; - -ul4._clear = function _clear(obj) { - if (ul4._ismap(obj)) - obj.clear(); - else if (ul4._isset(obj)) - obj.clear(); - else if (ul4._isobject(obj)) { - for (var key in obj) - delete obj[key]; - } - else - throw ul4.TypeError.create("clear()", "clear() requires a dict or set"); - return null; -}; - -ul4.Color = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.Color", - - create: function create(r, g, b, a) { - var c = ul4._clone(this); - c._r = typeof (r) !== "undefined" ? r : 0; - c._g = typeof (g) !== "undefined" ? g : 0; - c._b = typeof (b) !== "undefined" ? b : 0; - c._a = typeof (a) !== "undefined" ? a : 255; - return c; - }, - - __repr__: function __repr__() { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); - if (this._a !== 0xff) { + else if (ul4._isobject(other)) + { + for (let key in other) + ul4._setmap(obj, key, other[key]); + } + else if (ul4._islist(other)) + { + for (let i = 0; i < other.length; ++i) + { + let item = other[i]; + if (!ul4._islist(item) || (item.length != 2)) + throw new ul4.TypeError("update() requires a dict or a list of (key, value) pairs"); + ul4._setmap(obj, item[0], item[1]); + } + } + else + throw new ul4.TypeError("update() requires a dict or a list of (key, value) pairs"); + } + kwargs.forEach(function(value, key) { + ul4._setmap(obj, key, value); + }); + return null; + }; + + ul4.Color = class Color extends ul4.Proto + { + constructor(r=0, g=0, b=0, a=255) + { + super(); + this._r = r; + this._g = g; + this._b = b; + this._a = a; + } + + __repr__() + { + let r = ul4._lpad(this._r.toString(16), "0", 2); + let g = ul4._lpad(this._g.toString(16), "0", 2); + let b = ul4._lpad(this._b.toString(16), "0", 2); + let a = ul4._lpad(this._a.toString(16), "0", 2); + if (this._a !== 0xff) + { if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1]) return "#" + r[0] + g[0] + b[0] + a[0]; else return "#" + r + g + b + a; } - else { + else + { if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) return "#" + r[0] + g[0] + b[0]; else return "#" + r + g + b; } - }, + } - __str__: function __str__() { - if (this._a !== 0xff) { - return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a / 255) + ")"; + __str__() + { + if (this._a !== 0xff) + { + return "rgba(" + this._r + ", " + this._g + ", " + this._b + ", " + (this._a/255) + ")"; } - else { - var r = ul4._lpad(this._r.toString(16), "0", 2); - var g = ul4._lpad(this._g.toString(16), "0", 2); - var b = ul4._lpad(this._b.toString(16), "0", 2); - var a = ul4._lpad(this._a.toString(16), "0", 2); + else + { + let r = ul4._lpad(this._r.toString(16), "0", 2); + let g = ul4._lpad(this._g.toString(16), "0", 2); + let b = ul4._lpad(this._b.toString(16), "0", 2); if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) return "#" + r[0] + g[0] + b[0]; else return "#" + r + g + b; } - }, + } - __iter__: function __iter__() { + __iter__() + { return { obj: this, index: 0, - next: function () { - if (this.index == 0) { + next: function() { + if (this.index == 0) + { ++this.index; - return { value: this.obj._r, done: false }; + return {value: this.obj._r, done: false}; } - else if (this.index == 1) { + else if (this.index == 1) + { ++this.index; - return { value: this.obj._g, done: false }; + return {value: this.obj._g, done: false}; } - else if (this.index == 2) { + else if (this.index == 2) + { ++this.index; - return { value: this.obj._b, done: false }; + return {value: this.obj._b, done: false}; } - else if (this.index == 3) { + else if (this.index == 3) + { ++this.index; - return { value: this.obj._a, done: false }; + return {value: this.obj._a, done: false}; } else - return { done: true }; + return {done: true}; } }; - }, + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "r": - return ul4.expose([], function r() { return self._r; }); + let r = function r(){ return self._r; }; + ul4.expose(r, []); + return r; case "g": - return ul4.expose([], function g() { return self._g; }); + let g = function g(){ return self._g; }; + ul4.expose(g, []); + return g; case "b": - return ul4.expose([], function b() { return self._b; }); + let b = function b(){ return self._b; }; + ul4.expose(b, []); + return b; case "a": - return ul4.expose([], function a() { return self._a; }); + let a = function a(){ return self._a; }; + ul4.expose(a, []); + return a; case "lum": - return ul4.expose([], function lum() { return self.lum(); }); + let lum = function lum(){ return self.lum(); }; + ul4.expose(lum, []); + return lum; case "hls": - return ul4.expose([], function hls() { return self.hls(); }); + let hls = function hls(){ return self.hls(); }; + ul4.expose(hls, []); + return hls; case "hlsa": - return ul4.expose([], function hlsa() { return self.hlsa(); }); + let hlsa = function hlsa(){ return self.hlsa(); }; + ul4.expose(hlsa, []); + return hlsa; case "hsv": - return ul4.expose([], function hsv() { return self.hsv(); }); + let hsv = function hsv(){ return self.hsv(); }; + ul4.expose(hsv, []); + return hsv; case "hsva": - return ul4.expose([], function hsva() { return self.hsva(); }); + let hsva = function hsva(){ return self.hsva(); }; + ul4.expose(hsva, []); + return hsva; case "witha": - return ul4.expose(["a"], function witha(a) { return self.witha(a); }); + let witha = function witha(a){ return self.witha(a); }; + ul4.expose(witha, ["a"]); + return witha; case "withlum": - return ul4.expose(["lum"], function withlum(lum) { return self.withlum(lum); }); + let withlum = function withlum(lum){ return self.withlum(lum); }; + ul4.expose(withlum, ["lum"]); + return withlum; case "abslum": - return ul4.expose(["lum"], function abslum(lum) { return self.abslum(lum); }); + let abslum = function abslum(lum){ return self.abslum(lum); }; + ul4.expose(abslum, ["lum"]); + return abslum; case "rellum": - return ul4.expose(["lum"], function rellum(lum) { return self.rellum(lum); }); + let rellum = function rellum(lum){ return self.rellum(lum); }; + ul4.expose(rellum, ["lum"]); + return rellum; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - __getitem__: function __getitem__(key) { - var orgkey = key; + __getitem__(key) + { + let orgkey = key; if (key < 0) key += 4; - switch (key) { + switch (key) + { case 0: return this._r; case 1: @@ -7027,171 +8812,280 @@ ul4.Color = ul4._inherit( case 3: return this._a; default: - return undefined; + throw new ul4.IndexError(this, orgkey); } - }, + } - __eq__: function __eq__(other) { - if (ul4._iscolor(other)) + __eq__(other) + { + if (other instanceof ul4.Color) return this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a; return false; - }, + } - r: ul4.expose([], function r() { return this._r; }), + r() + { + return this._r; + } - g: ul4.expose([], function g() { return this._g; }), + g() + { + return this._g; + } - b: ul4.expose([], function b() { return this._b; }), + b() + { + return this._b; + } - a: ul4.expose([], function a() { return this._a; }), + a() + { + return this._a; + } - lum: ul4.expose([], function lum() { return this.hls()[1]; }), + lum() + { + return this.hls()[1]; + } - hls: ul4.expose([], - function hls() { - var r = this._r / 255.0; - var g = this._g / 255.0; - var b = this._b / 255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var h, l, s; - var rc, gc, bc; + hls() + { + let r = this._r/255.0; + let g = this._g/255.0; + let b = this._b/255.0; + let maxc = Math.max(r, g, b); + let minc = Math.min(r, g, b); + let h, l, s; + let rc, gc, bc; - l = (minc + maxc) / 2.0; - if (minc == maxc) - return [0.0, l, 0.0]; - if (l <= 0.5) - s = (maxc - minc) / (maxc + minc); - else - s = (maxc - minc) / (2.0 - maxc - minc); - rc = (maxc - r) / (maxc - minc); - gc = (maxc - g) / (maxc - minc); - bc = (maxc - b) / (maxc - minc); - if (r == maxc) - h = bc - gc; - else if (g == maxc) - h = 2.0 + rc - bc; - else - h = 4.0 + gc - rc; - h = (h / 6.0) % 1.0; - return [h, l, s]; - } - ), - - hlsa: ul4.expose([], - function hlsa() { - var hls = this.hls(); - return hls.concat(this._a / 255.0); - } - ), - - hsv: ul4.expose([], - function hsv() { - var r = this._r / 255.0; - var g = this._g / 255.0; - var b = this._b / 255.0; - var maxc = Math.max(r, g, b); - var minc = Math.min(r, g, b); - var v = maxc; - if (minc == maxc) - return [0.0, 0.0, v]; - var s = (maxc - minc) / maxc; - var rc = (maxc - r) / (maxc - minc); - var gc = (maxc - g) / (maxc - minc); - var bc = (maxc - b) / (maxc - minc); - var h; - if (r == maxc) - h = bc - gc; - else if (g == maxc) - h = 2.0 + rc - bc; - else - h = 4.0 + gc - rc; - h = (h / 6.0) % 1.0; - return [h, s, v]; - } - ), + l = (minc+maxc)/2.0; + if (minc == maxc) + return [0.0, l, 0.0]; + if (l <= 0.5) + s = (maxc-minc) / (maxc+minc); + else + s = (maxc-minc) / (2.0-maxc-minc); + rc = (maxc-r) / (maxc-minc); + gc = (maxc-g) / (maxc-minc); + bc = (maxc-b) / (maxc-minc); + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, l, s]; + } + + hlsa() + { + let hls = this.hls(); + return hls.concat(this._a/255.0); + } + + hsv() + { + let r = this._r/255.0; + let g = this._g/255.0; + let b = this._b/255.0; + let maxc = Math.max(r, g, b); + let minc = Math.min(r, g, b); + let v = maxc; + if (minc == maxc) + return [0.0, 0.0, v]; + let s = (maxc-minc) / maxc; + let rc = (maxc-r) / (maxc-minc); + let gc = (maxc-g) / (maxc-minc); + let bc = (maxc-b) / (maxc-minc); + let h; + if (r == maxc) + h = bc-gc; + else if (g == maxc) + h = 2.0+rc-bc; + else + h = 4.0+gc-rc; + h = (h/6.0) % 1.0; + return [h, s, v]; + } - hsva: ul4.expose([], - function hsva() { - var hsv = this.hsv(); - return hsv.concat(this._a / 255.0); - } - ), + hsva() + { + let hsv = this.hsv(); + return hsv.concat(this._a/255.0); + } - witha: ul4.expose(["a"], - function witha(a) { - if (typeof (a) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - return ul4.Color.create(this._r, this._g, this._b, a); - } - ), + witha(a) + { + if (typeof(a) !== "number") + throw new ul4.TypeError("witha() requires a number"); + return new ul4.Color(this._r, this._g, this._b, a); + } - withlum: ul4.expose(["lum"], - function withlum(lum) { - if (typeof (lum) !== "number") - throw ul4.TypeError.create("witha()", "witha() requires a number"); - var hlsa = this.hlsa(); - return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); - } - ) - } -); + withlum(lum) + { + if (typeof(lum) !== "number") + throw new ul4.TypeError("witha() requires a number"); + let hlsa = this.hlsa(); + return ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]); + } + + ul4type() + { + return "color"; + } + }; -ul4.TimeDelta = ul4._inherit( - ul4.Proto, + ul4.expose(ul4.Color.prototype.r, []); + ul4.expose(ul4.Color.prototype.g, []); + ul4.expose(ul4.Color.prototype.b, []); + ul4.expose(ul4.Color.prototype.a, []); + ul4.expose(ul4.Color.prototype.lum, []); + ul4.expose(ul4.Color.prototype.hls, []); + ul4.expose(ul4.Color.prototype.hlsa, []); + ul4.expose(ul4.Color.prototype.hsv, []); + ul4.expose(ul4.Color.prototype.hsva, []); + ul4.expose(ul4.Color.prototype.witha, ["a"]); + ul4.expose(ul4.Color.prototype.withlum, ["lum"]); + + const _js_Date = Date; + + ul4.Date = class Date extends ul4.Proto { - __type__: "ul4.TimeDelta", + constructor(year, month, day) + { + super(); + this._date = new _js_Date(year, month-1, day); + } + + __repr__() + { + return '@(' + this.__str__() + ")"; + } + + __str__() + { + return ul4._lpad(this._date.getFullYear(), "0", 4) + "-" + ul4._lpad(this._date.getMonth()+1, "0", 2) + "-" + ul4._lpad(this._date.getDate(), "0", 2); + } + + __eq__(other) + { + if (other instanceof ul4.Date) + return this._date.getTime() === other._date.getTime(); + return false; + } + + __lt__(other) + { + if (other instanceof ul4.Date) + return this._date < other._date; + ul4._unorderable("<", this, other); + } + + __le__(other) + { + if (other instanceof ul4.Date) + return this._date <= other._date; + ul4._unorderable("<=", this, other); + } + + __gt__(other) + { + if (other instanceof ul4.Date) + return this._date > other._date; + ul4._unorderable(">", this, other); + } + + __ge__(other) + { + if (other instanceof ul4.Date) + return this._date >= other._date; + ul4._unorderable(">=", this, other); + } + + year() + { + return this._date.getFullYear(); + } + + month() + { + return this._date.getMonth()+1; + } + + day() + { + return this._date.getDate(); + } - create: function create(days, seconds, microseconds) { - var td = ul4._clone(this); - if (typeof (days) === "undefined") - days = 0; - if (typeof (seconds) === "undefined") - seconds = 0; - if (typeof (microseconds) === "undefined") - microseconds = 0; + ul4type() + { + return "date"; + } + }; - var total_microseconds = Math.floor((days * 86400 + seconds) * 1000000 + microseconds); - microseconds = ul4.ModAST._do(total_microseconds, 1000000); - var total_seconds = Math.floor(total_microseconds / 1000000); - seconds = ul4.ModAST._do(total_seconds, 86400); + ul4.TimeDelta = class TimeDelta extends ul4.Proto + { + constructor(days=0, seconds=0, microseconds=0) + { + super(); + let total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds); + + microseconds = ul4.ModAST.prototype._do(total_microseconds, 1000000); + let total_seconds = Math.floor(total_microseconds / 1000000); + seconds = ul4.ModAST.prototype._do(total_seconds, 86400); days = Math.floor(total_seconds / 86400); - if (seconds < 0) { + if (seconds < 0) + { seconds += 86400; --days; } - td._microseconds = microseconds; - td._seconds = seconds; - td._days = days; - - return td; - }, + this._microseconds = microseconds; + this._seconds = seconds; + this._days = days; + } - __repr__: function __repr__() { - if (!this._microseconds) { - if (!this._seconds) { - if (!this._days) - return "timedelta()"; - return "timedelta(" + this._days + ")"; - } - return "timedelta(" + this._days + ", " + this._seconds + ")"; + __repr__() + { + let v = [], first = true; + v.push("timedelta("); + if (this._days) + { + v.push("days=" + this._days); + first = false; } - return "timedelta(" + this._days + ", " + this._seconds + ", " + this._microseconds + ")"; - }, + if (this._seconds) + { + if (!first) + v.push(", "); + v.push("seconds=" + this._seconds); + first = false; + } + if (this._microseconds) + { + if (!first) + v.push(", "); + v.push("microseconds=" + this._microseconds); + } + v.push(")"); + return v.join(""); + } - __str__: function __str__() { - var v = []; - if (this._days) { + __str__() + { + let v = []; + if (this._days) + { v.push(this._days + " day"); if (this._days !== -1 && this._days !== 1) v.push("s"); v.push(", "); } - var seconds = this._seconds % 60; - var minutes = Math.floor(this._seconds / 60); - var hours = Math.floor(minutes / 60); + let seconds = this._seconds % 60; + let minutes = Math.floor(this._seconds / 60); + let hours = Math.floor(minutes / 60); minutes = minutes % 60; v.push("" + hours); @@ -7199,29 +9093,35 @@ ul4.TimeDelta = ul4._inherit( v.push(ul4._lpad(minutes.toString(), "0", 2)); v.push(":"); v.push(ul4._lpad(seconds.toString(), "0", 2)); - if (this._microseconds) { + if (this._microseconds) + { v.push("."); v.push(ul4._lpad(this._microseconds.toString(), "0", 6)); } return v.join(""); - }, + } - __bool__: function __bool__() { + __bool__() + { return this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0; - }, + } - __abs__: function __abs__() { - return this._days < 0 ? ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds) : this; - }, + __abs__() + { + return this._days < 0 ? new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds) : this; + } - __eq__: function __eq__(other) { - if (ul4._istimedelta(other)) + __eq__(other) + { + if (other instanceof ul4.TimeDelta) return (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds); return false; - }, + } - __lt__: function __lt__(other) { - if (ul4._istimedelta(other)) { + __lt__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days < other._days; if (this._seconds != other._seconds) @@ -7229,10 +9129,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds < other._microseconds; } ul4._unorderable("<", this, other); - }, + } - __le__: function __le__(other) { - if (ul4._istimedelta(other)) { + __le__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days < other._days; if (this._seconds != other._seconds) @@ -7240,10 +9142,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds <= other._microseconds; } ul4._unorderable("<=", this, other); - }, + } - __gt__: function __gt__(other) { - if (ul4._istimedelta(other)) { + __gt__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days > other._days; if (this._seconds != other._seconds) @@ -7251,10 +9155,12 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds > other._microseconds; } ul4._unorderable(">", this, other); - }, + } - __ge__: function __ge__(other) { - if (ul4._istimedelta(other)) { + __ge__(other) + { + if (other instanceof ul4.TimeDelta) + { if (this._days != other._days) return this._days > other._days; if (this._seconds != other._seconds) @@ -7262,494 +9168,443 @@ ul4.TimeDelta = ul4._inherit( return this._microseconds >= other._microseconds; } ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() { - return ul4.TimeDelta.create(-this._days, -this._seconds, -this._microseconds); - }, - - _add: function _add(date, days, seconds, microseconds) { - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate() + days; - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds() + seconds; - var millisecond = date.getMilliseconds() + microseconds / 1000; + } + + __neg__() + { + return new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds); + } + + adddate(date, days) + { + let year = date._date.getFullYear(); + let month = date._date.getMonth(); + let day = date._date.getDate() + days; + return new ul4.Date(year, month, day); + } + + _adddatetime(date, days, seconds, microseconds) + { + let year = date.getFullYear(); + let month = date.getMonth(); + let day = date.getDate() + days; + let hour = date.getHours(); + let minute = date.getMinutes(); + let second = date.getSeconds() + seconds; + let millisecond = date.getMilliseconds() + microseconds/1000; return new Date(year, month, day, hour, minute, second, millisecond); - }, + } - __add__: function __add__(other) { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); + __add__(other) + { + if (other instanceof ul4.TimeDelta) + return new ul4.TimeDelta(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds); else if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, + return this._adddate(other, this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._days, this._seconds, this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __radd__: function __radd__(other) { + __radd__(other) + { if (ul4._isdate(other)) - return this._add(other, this._days, this._seconds, this._microseconds); - throw ul4.TypeError.create("+", ul4._type(this) + " + " + ul4._type(other) + " not supported"); - }, + return this._adddate(other, this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._days, this._seconds, this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __sub__: function __sub__(other) { - if (ul4._istimedelta(other)) - return ul4.TimeDelta.create(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, + __sub__(other) + { + if (other instanceof ul4.TimeDelta) + return new ul4.TimeDelta(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds); + throw new ul4.TypeError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } - __rsub__: function __rsub__(other) { + __rsub__(other) + { if (ul4._isdate(other)) - return this._add(other, -this._days, -this._seconds, -this._microseconds); - throw ul4.TypeError.create("-", ul4._type(this) + " - " + ul4._type(other) + " not supported"); - }, - - __mul__: function __mul__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __rmul__: function __rmul__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days * other, this._seconds * other, this._microseconds * other); - } - throw ul4.TypeError.create("*", ul4._type(this) + " * " + ul4._type(other) + " not supported"); - }, - - __truediv__: function __truediv__(other) { - if (typeof (other) === "number") { - return ul4.TimeDelta.create(this._days / other, this._seconds / other, this._microseconds / other); - } - else if (ul4._istimedelta(other)) { - var myValue = this._days; - var otherValue = other._days; - var hasSeconds = this._seconds || other._seconds; - var hasMicroseconds = this._microseconds || other._microseconds; - if (hasSeconds || hasMicroseconds) { - myValue = myValue * 86400 + this._seconds; - otherValue = otherValue * 86400 + other._seconds; - if (hasMicroseconds) { + return this._adddate(other, -this._days); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, -this._days, -this._seconds, -this._microseconds); + throw new ul4.TypeError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } + + __mul__(other) + { + if (typeof(other) === "number") + return new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other); + throw new ul4.TypeError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __rmul__(other) + { + if (typeof(other) === "number") + return new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other); + throw new ul4.TypeError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __truediv__(other) + { + if (typeof(other) === "number") + { + return new ul4.TimeDelta(this._days / other, this._seconds / other, this._microseconds / other); + } + else if (other instanceof ul4.TimeDelta) + { + let myValue = this._days; + let otherValue = other._days; + let hasSeconds = this._seconds || other._seconds; + let hasMicroseconds = this._microseconds || other._microseconds; + if (hasSeconds || hasMicroseconds) + { + myValue = myValue*86400+this._seconds; + otherValue = otherValue*86400 + other._seconds; + if (hasMicroseconds) + { myValue = myValue * 1000000 + this._microseconds; otherValue = otherValue * 1000000 + other._microseconds; } } - return myValue / otherValue; + return myValue/otherValue; } - throw ul4.TypeError.create("/", ul4._type(this) + " / " + ul4._type(other) + " not supported"); - }, + throw new ul4.TypeError(ul4._type(this) + " / " + ul4._type(other) + " not supported"); + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "days": - return ul4.expose([], function days() { return self._days; }); + let days = function days(){ return self._days; }; + ul4.expose(days, []); + return days; case "seconds": - return ul4.expose([], function seconds() { return self._seconds; }); + let seconds = function seconds(){ return self._seconds; }; + ul4.expose(seconds, []); + return seconds; case "microseconds": - return ul4.expose([], function microseconds() { return self._microseconds; }); + let microseconds = function microseconds(){ return self._microseconds; }; + ul4.expose(microseconds, []); + return microseconds; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - days: function days() { + days() + { return this._days; - }, + } - seconds: function seconds() { + seconds() + { return this._seconds; - }, + } - microseconds: function microseconds() { + microseconds() + { return this._microseconds; } - } -); -ul4.MonthDelta = ul4._inherit( - ul4.Proto, - { - __type__: "ul4.MonthDelta", + ul4type() + { + return "timedelta"; + } + }; + - create: function create(months) { - var md = ul4._clone(this); - md._months = typeof (months) !== "undefined" ? months : 0; - return md; - }, + ul4.MonthDelta = class MonthDelta extends ul4.Proto + { + constructor(months=0) + { + super(); + this._months = months; + } - __repr__: function __repr__() { + __repr__() + { if (!this._months) return "monthdelta()"; return "monthdelta(" + this._months + ")"; - }, + } - __str__: function __str__() { - if (this._months) { + __str__() + { + if (this._months) + { if (this._months !== -1 && this._months !== 1) return this._months + " months"; return this._months + " month"; } return "0 months"; - }, + } + + toString() + { + return this.__str__(); + } - __bool__: function __bool__() { + __bool__() + { return this._months !== 0; - }, + } - __abs__: function __abs__() { - return this._months < 0 ? ul4.MonthDelta.create(-this._months) : this; - }, + __abs__() + { + return this._months < 0 ? new ul4.MonthDelta(-this._months) : this; + } - __eq__: function __eq__(other) { - if (ul4._ismonthdelta(other)) + __eq__(other) + { + if (other instanceof MonthDelta) return this._months === other._months; return false; - }, + } - __lt__: function __lt__(other) { - if (ul4._ismonthdelta(other)) + __lt__(other) + { + if (other instanceof ul4.MonthDelta) return this._months < other._months; ul4._unorderable("<", this, other); - }, + } - __le__: function __le__(other) { - if (ul4._ismonthdelta(other)) + __le__(other) + { + if (other instanceof ul4.MonthDelta) return this._months <= other._months; ul4._unorderable("<=", this, other); - }, + } - __gt__: function __gt__(other) { - if (ul4._ismonthdelta(other)) + __gt__(other) + { + if (other instanceof ul4.MonthDelta) return this._months > other._months; ul4._unorderable(">", this, other); - }, + } - __ge__: function __ge__(other) { - if (ul4._ismonthdelta(other)) + __ge__(other) + { + if (other instanceof ul4.MonthDelta) return this._months >= other._months; ul4._unorderable(">=", this, other); - }, - - __neg__: function __neg__() { - return ul4.MonthDelta.create(-this._months); - }, - - _add: function _add(date, months) { - var year = date.getFullYear(); - var month = date.getMonth() + months; - var day = date.getDate(); - var hour = date.getHours(); - var minute = date.getMinutes(); - var second = date.getSeconds(); - var millisecond = date.getMilliseconds(); - - while (true) { + } + + __neg__() + { + return new ul4.MonthDelta(-this._months); + } + + _adddate(date, months) + { + let result = this._adddatetime(date._date, months); + return new ul4.Date(result.getFullYear(), result.getMonth()+1, result.getDate()); + } + + _adddatetime(date, months) + { + let year = date.getFullYear(); + let month = date.getMonth() + months; + let day = date.getDate(); + let hour = date.getHours(); + let minute = date.getMinutes(); + let second = date.getSeconds(); + let millisecond = date.getMilliseconds(); + + while (true) + { // As the month might be out of bounds, we have to find out, what the real target month is - var targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); - var result = new Date(year, month, day, hour, minute, second, millisecond); + let targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth(); + let result = new Date(year, month, day, hour, minute, second, millisecond); if (result.getMonth() === targetmonth) return result; --day; } - }, + } - __add__: function __add__(other) { + __add__(other) + { if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months + other._months); + return new ul4.MonthDelta(this._months + other._months); else if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, + return this._adddate(other, this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._months); + throw new ul4.ArgumentError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __radd__: function __radd__(other) { + __radd__(other) + { if (ul4._isdate(other)) - return this._add(other, this._months); - throw ul4._type(this) + " + " + ul4._type(other) + " not supported"; - }, + return this._adddate(other, this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, this._months); + throw new ul4.ArgumentError(ul4._type(this) + " + " + ul4._type(other) + " not supported"); + } - __sub__: function __sub__(other) { + __sub__(other) + { if (ul4._ismonthdelta(other)) - return ul4.MonthDelta.create(this._months - other._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, + return new ul4.MonthDelta(this._months - other._months); + throw new ul4.ArgumentError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } - __rsub__: function __rsub__(other) { + __rsub__(other) + { if (ul4._isdate(other)) - return this._add(other, -this._months); - throw ul4._type(this) + " - " + ul4._type(other) + " not supported"; - }, - - __mul__: function __mul__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __rmul__: function __rmul__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(this._months * Math.floor(other)); - throw ul4._type(this) + " * " + ul4._type(other) + " not supported"; - }, - - __floordiv__: function __floordiv__(other) { - if (typeof (other) === "number") - return ul4.MonthDelta.create(Math.floor(this._months / other)); + return this._adddate(other, -this._months); + else if (ul4._isdatetime(other)) + return this._adddatetime(other, -this._months); + throw new ul4.ArgumentError(ul4._type(this) + " - " + ul4._type(other) + " not supported"); + } + + __mul__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(this._months * Math.floor(other)); + throw new ul4.ArgumentError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __rmul__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(this._months * Math.floor(other)); + throw new ul4.ArgumentError(ul4._type(this) + " * " + ul4._type(other) + " not supported"); + } + + __floordiv__(other) + { + if (typeof(other) === "number") + return new ul4.MonthDelta(Math.floor(this._months / other)); else if (ul4._ismonthdelta(other)) return Math.floor(this._months / other._months); - throw ul4._type(this) + " // " + ul4._type(other) + " not supported"; - }, + throw new ul4.ArgumentError(ul4._type(this) + " // " + ul4._type(other) + " not supported"); + } - __truediv__: function __truediv__(other) { + __truediv__(other) + { if (ul4._ismonthdelta(other)) return this._months / other._months; - throw ul4._type(this) + " / " + ul4._type(other) + " not supported"; - }, + throw new ul4.ArgumentError(ul4._type(this) + " / " + ul4._type(other) + " not supported"); + } - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { + __getattr__(attrname) + { + let self = this; + switch (attrname) + { case "months": - return ul4.expose([], function months() { return self._months; }); + let months = function months(){ return self._months; }; + ul4.expose(months, []); + return months; default: - return undefined; + throw new ul4.AttributeError(this, attrname); } - }, + } - months: function months() { + months() + { return this._months; } - } -); - -// When we don't have a real ``Set`` type, emulate one that supports strings -ul4._Set = ul4._inherit( - ul4.Proto, - { - __type__: "ul4._Set", - - create: function create() { - var set = ul4._clone(this); - set.items = {}; - set.add.apply(set, arguments); - return set; - }, - - add: function add() { - for (var i = 0; i < arguments.length; ++i) { - this.items[arguments[i]] = true; - } - }, - - __getattr__: function __getattr__(attrname) { - var self = this; - switch (attrname) { - case "add": - return ul4.expose(["*items"], function add(items) { self.add.apply(self, items); }); - default: - return undefined; - } - }, - - __contains__: function __contains__(item) { - return this.items[item] || false; - }, - - __bool__: function __bool__() { - for (var item in this.items) { - if (!this.items.hasOwnProperty(item)) - continue; - return true; - } - return false; - }, - __repr__: function __repr__() { - var v = []; - v.push("{"); - var i = 0; - for (var item in this.items) { - if (!this.items.hasOwnProperty(item)) - continue; - if (i++) - v.push(", "); - v.push(ul4._repr(item)); - } - if (!i) - v.push("/"); - v.push("}"); - return v.join(""); - }, - - __eq__: function (other) { - // We'll check that everything in ``this`` is in ``other`` - // and if both have the same number of items they are equal - if (ul4._isset(other)) { - var count = 0; - for (var item in this.items) { - if (!other.has(item)) - return false; - // count the number of items we have - ++count; - } - return other.size == count; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in this.items) { - if (!other[item]) - return false; - // count the number of items we have - ++count; - } - // Substract the number of items that ``other`` has - for (var item in other.items) - --count; - return count == 0; - } - else - return false; - }, - - __le__: function (other) { - // check that ``this`` is a subset of ``other``, - // i.e. everything in ``this`` is also in ``other`` - if (ul4._isset(other)) { - var count = 0; - for (var item in this.items) { - if (!other.has(item)) - return false; - } - return true; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in this.items) { - if (!other.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<", this, other); - }, - - __ge__: function (other) { - // check that ``this`` is a superset of ``other``, - // i.e. everything in ``other`` is also in ``this`` - if (ul4._isset(other)) { - var result = true; - other.forEach(function (value) { - if (!this.items[value]) - result = false; - }); - return result; - } - else if (ul4._isul4set(other)) { - var count = 0; - for (var item in other.items) { - if (!this.items[item]) - return false; - } - return true; - } - else - ul4._unorderable("<=", this, other); + ul4type() + { + return "monthdelta"; } - } -); - -var classes = [ - "TextAST", - "IndentAST", - "LineEndAST", - "Tag", - "ConstAST", - "SeqItemAST", - "UnpackSeqItemAST", - "DictItemAST", - "UnpackDictItemAST", - "PosArgAST", - "KeywordArgAST", - "UnpackListArgAST", - "UnpackDictArgAST", - "ListAST", - "ListCompAST", - "DictAST", - "DictCompAST", - "SetAST", - "SetCompAST", - "GenExprAST", - "VarAST", - "NotAST", - "NegAST", - "BitNotAST", - "IfAST", - "ReturnAST", - "PrintAST", - "PrintXAST", - "ItemAST", - "IsAST", - "IsNotAST", - "EQAST", - "NEAST", - "LTAST", - "LEAST", - "GTAST", - "GEAST", - "NotContainsAST", - "ContainsAST", - "AddAST", - "SubAST", - "MulAST", - "FloorDivAST", - "TrueDivAST", - "ModAST", - "ShiftLeftAST", - "ShiftRightAST", - "BitAndAST", - "BitXOrAST", - "BitOrAST", - "AndAST", - "OrAST", - "SliceAST", - "AttrAST", - "CallAST", - "RenderAST", - "SetVarAST", - "AddVarAST", - "SubVarAST", - "MulVarAST", - "TrueDivVarAST", - "FloorDivVarAST", - "ModVarAST", - "ShiftLeftVarAST", - "ShiftRightVarAST", - "BitAndVarAST", - "BitXOrVarAST", - "BitOrVarAST", - "ForBlockAST", - "WhileBlockAST", - "BreakAST", - "ContinueAST", - "CondBlockAST", - "IfBlockAST", - "ElIfBlockAST", - "ElseBlockAST", - "SignatureAST", - "Template" -]; - -for (var i = 0; i < classes.length; ++i) { - var name = classes[i]; - var ul4onname = name; - if (ul4onname.substr(ul4onname.length - 3) === "AST") - ul4onname = ul4onname.substr(0, ul4onname.length - 3); - ul4onname = ul4onname.toLowerCase(); - var object = ul4[name]; - object.typename = name; - object.type = ul4onname; - ul4on.register("de.livinglogic.ul4." + ul4onname, object); -} + }; + + const classes = [ + ul4.TextAST, + ul4.IndentAST, + ul4.LineEndAST, + ul4.ConstAST, + ul4.SeqItemAST, + ul4.UnpackSeqItemAST, + ul4.DictItemAST, + ul4.UnpackDictItemAST, + ul4.PosArgAST, + ul4.KeywordArgAST, + ul4.UnpackListArgAST, + ul4.UnpackDictArgAST, + ul4.ListAST, + ul4.ListCompAST, + ul4.DictAST, + ul4.DictCompAST, + ul4.SetAST, + ul4.SetCompAST, + ul4.GenExprAST, + ul4.VarAST, + ul4.NotAST, + ul4.NegAST, + ul4.BitNotAST, + ul4.IfAST, + ul4.ReturnAST, + ul4.PrintAST, + ul4.PrintXAST, + ul4.ItemAST, + ul4.IsAST, + ul4.IsNotAST, + ul4.EQAST, + ul4.NEAST, + ul4.LTAST, + ul4.LEAST, + ul4.GTAST, + ul4.GEAST, + ul4.NotContainsAST, + ul4.ContainsAST, + ul4.AddAST, + ul4.SubAST, + ul4.MulAST, + ul4.FloorDivAST, + ul4.TrueDivAST, + ul4.ModAST, + ul4.ShiftLeftAST, + ul4.ShiftRightAST, + ul4.BitAndAST, + ul4.BitXOrAST, + ul4.BitOrAST, + ul4.AndAST, + ul4.OrAST, + ul4.SliceAST, + ul4.AttrAST, + ul4.CallAST, + ul4.RenderAST, + ul4.RenderXAST, + ul4.RenderBlockAST, + ul4.RenderBlocksAST, + ul4.SetVarAST, + ul4.AddVarAST, + ul4.SubVarAST, + ul4.MulVarAST, + ul4.TrueDivVarAST, + ul4.FloorDivVarAST, + ul4.ModVarAST, + ul4.ShiftLeftVarAST, + ul4.ShiftRightVarAST, + ul4.BitAndVarAST, + ul4.BitXOrVarAST, + ul4.BitOrVarAST, + ul4.ForBlockAST, + ul4.WhileBlockAST, + ul4.BreakAST, + ul4.ContinueAST, + ul4.CondBlockAST, + ul4.IfBlockAST, + ul4.ElIfBlockAST, + ul4.ElseBlockAST, + ul4.SignatureAST, + ul4.Template + ]; + + for (let i = 0; i < classes.length; ++i) + { + let constructor = classes[i]; + let ul4onname = constructor.name; + if (ul4onname.substr(ul4onname.length-3) === "AST") + ul4onname = ul4onname.substr(0, ul4onname.length-3); + ul4onname = ul4onname.toLowerCase(); + constructor.prototype.type = ul4onname; + ul4.register("de.livinglogic.ul4." + ul4onname, constructor); + } \ No newline at end of file From 8c68d0155fc48771e00052bdfe14995e0bd80292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Mon, 6 May 2019 14:12:11 +0200 Subject: [PATCH 41/43] change proto typed based ul4 to class based ul4 --- src/livingsdk.ts | 4 ++-- src/modules/livingapi.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/livingsdk.ts b/src/livingsdk.ts index 5885938..4cad096 100644 --- a/src/livingsdk.ts +++ b/src/livingsdk.ts @@ -93,7 +93,7 @@ export class LivingSDK { if (!app.controls.has(ident)) { throw new Error(`insert() got an unexpected keyword argument ${ident}`); } - + fields[ident] = app.controls.get(ident).asjson(values[ident]); } let data: any = {}; { @@ -114,7 +114,7 @@ export class LivingSDK { return { HTTPstatusCode: res.status, recordid: res.data.id, - Record: livingApi.Record.create({ + Record: new livingApi.Record({ id: res.data.id, createdat: new Date(Date.now()), updatedat: null, diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index 7c80aa1..d265716 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -336,7 +336,7 @@ la.Record = class Record extends la.Base { if (!this.fields.has(key)) throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); - fields.get(key).value = value; + this.fields.get(key).value = value; } } else if (ul4._isobject(values)) @@ -345,7 +345,7 @@ la.Record = class Record extends la.Base { if (!this.fields.has(key)) throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); - record.fields.get(key).value = values[key]; + this.fields.get(key).value = values[key]; } } else From 14fac6a24b0cff078a4bde93a2c7eae904053886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Mon, 6 May 2019 14:12:20 +0200 Subject: [PATCH 42/43] add asjson --- src/modules/livingapi.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/modules/livingapi.js b/src/modules/livingapi.js index d265716..8a4cb1f 100644 --- a/src/modules/livingapi.js +++ b/src/modules/livingapi.js @@ -154,8 +154,7 @@ la.App = class App extends la.Base { let record = this.__call__(values); this.globals.handler.save(this); - this.globals.Login._insert(this, values); - return record; + return this.globals.Login._insert(this, values); } __call__(values={}) @@ -352,6 +351,7 @@ la.Record = class Record extends la.Base throw new ul4.TypeError("values must be an object or a Map"); this.app.globals.handler.save(this); + return this.app.globals.Login._update(this, values); } search(search) @@ -431,6 +431,11 @@ la.Control = class Control extends la.Base //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); } + + asjson(value) { + return value; + } + // base implemntation, always returns ``false`` (i.e. "not found") // ``value`` is the value of the field // ``search`` is an object with information what we're searching for @@ -499,6 +504,11 @@ la.NumberControl.prototype.type = "number"; la.StringControl = class StringControl extends la.Control { + + asjson(value) { + return value; + } + search(value, search) { this._logsearch(value, search); @@ -566,6 +576,10 @@ la.DateControl = class DateControl extends la.Control return "%m/%d/%Y"; } + asjson(value) { + return value; + } + // searchvalue must be ``null``, a ``Date`` object or a string search(value, search) { @@ -782,6 +796,11 @@ la.MultipleAppLookupChoiceControl.prototype.subtype = "choice"; la.GeoControl = class GeoControl extends la.Control { + asjson (value) { + if (value instanceof la.Geo) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + } }; la.GeoControl.prototype.type = "geo"; From 9cdcc96f2b9e907f24fb8642c97ec2f001551729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schwarzinger?= Date: Mon, 6 May 2019 14:13:23 +0200 Subject: [PATCH 43/43] build --- dist/es2015/livingsdk.js | 2 +- dist/es2015/livingsdk.js.map | 2 +- dist/es2015/modules/livingapi.js | 27 +++++++++++++++++++++++---- dist/umd/livingsdk.js | 2 +- dist/umd/livingsdk.js.map | 2 +- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/dist/es2015/livingsdk.js b/dist/es2015/livingsdk.js index e4eef44..f193b30 100644 --- a/dist/es2015/livingsdk.js +++ b/dist/es2015/livingsdk.js @@ -83,7 +83,7 @@ export class LivingSDK { return { HTTPstatusCode: res.status, recordid: res.data.id, - Record: livingApi.Record.create({ + Record: new livingApi.Record({ id: res.data.id, createdat: new Date(Date.now()), updatedat: null, diff --git a/dist/es2015/livingsdk.js.map b/dist/es2015/livingsdk.js.map index 56ce0af..9bb5d3f 100644 --- a/dist/es2015/livingsdk.js.map +++ b/dist/es2015/livingsdk.js.map @@ -1 +1 @@ -{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,IAAI,QAAQ,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;AAM9D,MAAM;IAML,YAAY,UAA4B,EAAE,EAAE,QAAiB,EAAE,QAAiB;QAE/E,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,EAAE,CAAC;QAEhC,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,EAAE,CAAC;QAEhC,IAAI,CAAC,QAAQ,GAAG;YAEf,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,2BAA2B;YAE/C,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;SACjF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;QACtI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxG,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;SACnE;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAMD,KAAK;QACJ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YACjC,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SAClC;QACD,IAAI,GAAG,GAAG,WAAW,IAAI,CAAC,QAAQ,gBAAgB,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACtB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACxB,EAAE;YACD,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;gBACtC,SAAS,EAAE,MAAM;aACjB,CAAC,CAAC,CAAC,CAAC,SAAS;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;aAClC;SACD,CAAC;aACD,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,YAAqB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAkC,EAAE,EAAE;YAC/D,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,iBAAiB,KAAK,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAChI;gBACC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;oBACtC,SAAS,EAAE,MAAM;iBACjB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACd,OAAO,EAAE;oBACR,iBAAiB,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;oBAC7D,MAAM,EAAE,sBAAsB;iBAC9B;aACD,CAAC;iBACD,IAAI,CAAC,CAAC,GAAkB,EAAE,EAAE;gBAC5B,IAAI,IAAS,CAAC;gBACd,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;gBACjC,OAAkB,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAQ,EAAE,MAAW;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;YAEvC,IAAI,MAAM,GAAQ,EAAE,CAAC;YAErB,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;gBACzB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,EAAE,CAAC,CAAC;iBACxE;gBAED,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aAC9D;YACD,IAAI,IAAI,GAAQ,EAAE,CAAC;YAAC;aACnB;YACD,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,EAAE,OAAO,EAAE;gBAC7E,KAAK,EAAE,IAAI;aACX,EAAE;gBACD,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;oBACtC,SAAS,EAAE,MAAM;iBACjB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACd,OAAO,EAAE;oBACR,iBAAiB,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;iBAC7D;aACD,CAAC;iBACD,IAAI,CAAC,CAAC,GAAkB,EAAE,EAAE;gBAC5B,OAAO;oBACN,cAAc,EAAE,GAAG,CAAC,MAAM;oBAC1B,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;oBACrB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;wBAC/B,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;wBACf,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;wBAC/B,SAAS,EAAE,IAAI;wBACf,SAAS,EAAE,IAAI;wBACf,WAAW,EAAE,CAAC;qBACd,CAAC;iBACF,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IAEH,CAAC;IAED,OAAO,CAAC,MAAkB,EAAE,MAAW;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAkC,EAAE,EAAE;YAC/D,IAAI,MAAM,GAAQ,EAAE,CAAC;YACrB,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACrB,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;gBACzB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,EAAE,CAAC,CAAC;iBACxE;gBACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;aAC9B;YACD,IAAI,IAAI,GAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,EAAE,OAAO,EAAE;gBAC7E,KAAK,EAAE,IAAI;aACX,EAAE;gBACD,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;oBACtC,SAAS,EAAE,MAAM;iBACjB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACd,OAAO,EAAE;oBACR,iBAAiB,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;oBAC7D,cAAc,EAAE,kBAAkB;iBAClC;aACD,CAAC;iBACD,IAAI,CAAC,CAAC,GAAkB,EAAE,EAAE;gBAC5B,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;gBACpB,KAAK,IAAI,KAAK,IAAI,MAAM;oBACvB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,SAAS,GAAG;oBACf,cAAc,EAAE,GAAG,CAAC,MAAM;oBAC1B,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,MAAM,EAAE,MAAM;iBACd,CAAC;gBACF,OAAO,SAAS,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAkB;QACzB,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAkC,EAAE,EAAE;YAC/D,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE;gBAC5F,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;oBACtC,SAAS,EAAE,MAAM;iBACjB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACd,OAAO,EAAE;oBACR,iBAAiB,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;iBAC7D;aAED,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACH,CAAC;CACD;AAED,eAAe,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sourceRoot":"","sources":["../../src/livingsdk.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/es2015/modules/livingapi.js b/dist/es2015/modules/livingapi.js index 7c80aa1..8a4cb1f 100644 --- a/dist/es2015/modules/livingapi.js +++ b/dist/es2015/modules/livingapi.js @@ -154,8 +154,7 @@ la.App = class App extends la.Base { let record = this.__call__(values); this.globals.handler.save(this); - this.globals.Login._insert(this, values); - return record; + return this.globals.Login._insert(this, values); } __call__(values={}) @@ -336,7 +335,7 @@ la.Record = class Record extends la.Base { if (!this.fields.has(key)) throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); - fields.get(key).value = value; + this.fields.get(key).value = value; } } else if (ul4._isobject(values)) @@ -345,13 +344,14 @@ la.Record = class Record extends la.Base { if (!this.fields.has(key)) throw new ul4.ArgumentError("update() get an unexpected keyword argument " + ul4._repr(key)); - record.fields.get(key).value = values[key]; + this.fields.get(key).value = values[key]; } } else throw new ul4.TypeError("values must be an object or a Map"); this.app.globals.handler.save(this); + return this.app.globals.Login._update(this, values); } search(search) @@ -431,6 +431,11 @@ la.Control = class Control extends la.Base //console.log("Searching for " + ul4._repr(search.value) + " in " + ul4._repr(this) + " with operator " + search.operator + " in value " + ul4._repr(value)); } + + asjson(value) { + return value; + } + // base implemntation, always returns ``false`` (i.e. "not found") // ``value`` is the value of the field // ``search`` is an object with information what we're searching for @@ -499,6 +504,11 @@ la.NumberControl.prototype.type = "number"; la.StringControl = class StringControl extends la.Control { + + asjson(value) { + return value; + } + search(value, search) { this._logsearch(value, search); @@ -566,6 +576,10 @@ la.DateControl = class DateControl extends la.Control return "%m/%d/%Y"; } + asjson(value) { + return value; + } + // searchvalue must be ``null``, a ``Date`` object or a string search(value, search) { @@ -782,6 +796,11 @@ la.MultipleAppLookupChoiceControl.prototype.subtype = "choice"; la.GeoControl = class GeoControl extends la.Control { + asjson (value) { + if (value instanceof la.Geo) + value = `${value.lat}, ${value.long}, ${value.info}`; + return value; + } }; la.GeoControl.prototype.type = "geo"; diff --git a/dist/umd/livingsdk.js b/dist/umd/livingsdk.js index 9eb87a6..eb13791 100644 --- a/dist/umd/livingsdk.js +++ b/dist/umd/livingsdk.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("core-js/modules/es6.array.sort"),require("core-js/modules/es6.object.set-prototype-of"),require("core-js/modules/es6.array.find"),require("core-js/modules/es6.array.last-index-of"),require("core-js/modules/es6.regexp.split"),require("core-js/modules/es6.array.index-of"),require("core-js/modules/es6.regexp.to-string"),require("core-js/modules/es6.date.to-string"),require("core-js/modules/es6.object.create"),require("core-js/modules/es6.object.assign"),require("core-js/modules/es6.function.name"),require("core-js/modules/es6.regexp.match"),require("core-js/modules/es6.regexp.replace"),require("core-js/modules/es6.set"),require("core-js/modules/es6.array.for-each"),require("core-js/modules/web.dom.iterable"),require("core-js/modules/es6.array.iterator"),require("core-js/modules/es6.string.iterator"),require("core-js/modules/es6.map"),require("core-js/modules/es6.regexp.search"),require("core-js/modules/es6.string.starts-with"),require("core-js/modules/es7.symbol.async-iterator"),require("core-js/modules/es6.symbol"),require("core-js/modules/es6.function.bind"),require("core-js/modules/es6.date.now"),require("core-js/modules/es6.promise"),require("axios"),require("https")):"function"==typeof define&&define.amd?define(["exports","core-js/modules/es6.array.sort","core-js/modules/es6.object.set-prototype-of","core-js/modules/es6.array.find","core-js/modules/es6.array.last-index-of","core-js/modules/es6.regexp.split","core-js/modules/es6.array.index-of","core-js/modules/es6.regexp.to-string","core-js/modules/es6.date.to-string","core-js/modules/es6.object.create","core-js/modules/es6.object.assign","core-js/modules/es6.function.name","core-js/modules/es6.regexp.match","core-js/modules/es6.regexp.replace","core-js/modules/es6.set","core-js/modules/es6.array.for-each","core-js/modules/web.dom.iterable","core-js/modules/es6.array.iterator","core-js/modules/es6.string.iterator","core-js/modules/es6.map","core-js/modules/es6.regexp.search","core-js/modules/es6.string.starts-with","core-js/modules/es7.symbol.async-iterator","core-js/modules/es6.symbol","core-js/modules/es6.function.bind","core-js/modules/es6.date.now","core-js/modules/es6.promise","axios","https"],e):e(t.livingsdk={},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,t.axios,t.https)}(this,function(t,e,r,n,o,i,a,u,s,l,c,h,p,_,f,d,v,m,y,g,b,k,S,w,A,x,T,j,C){"use strict";function M(t){return(M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function E(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function D(t,e){for(var r=0;r=this.data.length)throw new R.ValueError("UL4 decoder at EOF");return this.data.charAt(this.pos++)}},{key:"readcharoreof",value:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)}},{key:"readblackchar",value:function(){for(var t=/\s/;;){if(this.pos>=this.data.length)throw new R.ValueError("UL4 decoder at EOF at position "+this.pos+" with path "+this.stack.join("/"));var e=this.data.charAt(this.pos++);if(!e.match(t))return e}}},{key:"read",value:function(t){this.pos+t>this.length&&(t=this.length-this.pos);var e=this.data.substring(this.pos,this.pos+t);return this.pos+=t,e}},{key:"backup",value:function(){--this.pos}},{key:"readnumber",value:function(){for(var t=/[-+0123456789.eE]/,e="";;){var r=this.readcharoreof();if(null===r||!r.match(t)){var n=parseFloat(e);if(isNaN(n))throw new R.ValueError("invalid number, got "+R._repr("value")+" at position "+this.pos+" with path "+this.stack.join("/"));return n}e+=r}}},{key:"_beginfakeloading",value:function(){var t=this.backrefs.length;return this.backrefs.push(null),t}},{key:"_endfakeloading",value:function(t,e){this.backrefs[t]=e}},{key:"_readescape",value:function(t,e){var r=this.read(e);if(r.length!=e)throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));var n=parseInt(r,16);if(isNaN(n))throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));return String.fromCharCode(n)}},{key:"load",value:function(){var t,e=this.readblackchar();switch(e){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===e&&this.backrefs.push(null),null;case"b":case"B":if("T"===(t=this.readchar()))t=!0;else{if("F"!==t)throw new R.ValueError("wrong value for boolean, expected 'T' or 'F', got "+R._repr(t)+" at position "+this.pos+" with path "+this.stack.join("/"));t=!1}return"B"===e&&this.backrefs.push(t),t;case"i":case"I":case"f":case"F":return t=this.readnumber(),"I"!==e&&"F"!==e||this.backrefs.push(t),t;case"s":case"S":t=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var o=this.readchar();"\\"==o?t.push("\\"):"n"==o?t.push("\n"):"r"==o?t.push("\r"):"t"==o?t.push("\t"):"f"==o?t.push("\f"):"b"==o?t.push("\b"):"a"==o?t.push(""):"'"==o?t.push("'"):'"'==o?t.push('"'):"x"==o?t.push(this._readescape("x",2)):"u"==o?t.push(this._readescape("u",4)):"U"==o?t.push(this._readescape("U",8)):t.push("\\"+o)}else t.push(n)}return t=t.join(""),"S"===e&&this.backrefs.push(t),t;case"c":case"C":return t=new R.Color,"C"===e&&this.backrefs.push(t),t._r=this.load(),t._g=this.load(),t._b=this.load(),t._a=this.load(),t;case"x":case"X":var i=this.load(),a=this.load(),u=this.load();return t=new R.Date(i,a,u),"X"===e&&this.backrefs.push(t),t;case"z":case"Z":return(t=new Date).setFullYear(this.load()),t.setDate(1),t.setMonth(this.load()-1),t.setDate(this.load()),t.setHours(this.load()),t.setMinutes(this.load()),t.setSeconds(this.load()),t.setMilliseconds(this.load()/1e3),"Z"===e&&this.backrefs.push(t),t;case"t":case"T":return(t=new R.TimeDelta)._days=this.load(),t._seconds=this.load(),t._microseconds=this.load(),"T"===e&&this.backrefs.push(t),t;case"r":case"R":return t=new R.slice,"R"===e&&this.backrefs.push(t),t.start=this.load(),t.stop=this.load(),t;case"m":case"M":return t=new R.MonthDelta,"M"===e&&this.backrefs.push(t),t._months=this.load(),t;case"l":case"L":for(this.stack.push("list"),t=[],"L"===e&&this.backrefs.push(t);"]"!==(e=this.readblackchar());)this.backup(),t.push(this.load());return this.stack.pop(),t;case"d":case"D":case"e":case"E":if(!R._havemap&&("e"==e||"E"==e))throw new R.ValueError("ordered dictionaries are not supported at position "+this.pos+" with path "+this.stack.join("/"));for(t=R._emptymap(),this.stack.push("d"===e||"D"===e?"dict":"odict"),"D"!==e&&"E"!==e||this.backrefs.push(t);"}"!==(e=this.readblackchar());){this.backup();var s=this.load(),l=this.load();R._setmap(t,s,l)}return this.stack.pop(),t;case"y":case"Y":for(this.stack.push("set"),t=R._makeset(),"Y"===e&&this.backrefs.push(t);"}"!==(e=this.readblackchar());)this.backup(),t.add(this.load());return this.stack.pop(),t;case"o":case"O":var c;"O"===e&&(c=this._beginfakeloading());var h,p=this.load();if(this.stack.push(p),null!==this.registry?void 0===(h=this.registry[p])&&(h=R._registry[p]):h=R._registry[p],void 0===h)throw new R.ValueError("can't load object of type "+R._repr(p)+" at position "+this.pos+" with path "+this.stack.join("/"));if(t=new h,"O"===e&&this._endfakeloading(c,t),t.ul4onload(this),")"!==(e=this.readblackchar()))throw new R.ValueError("object terminator ')' for object of type '"+p+"' expected, got "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"));return this.stack.pop(),t;default:throw new R.ValueError("unknown typecode "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"))}}},{key:"loadcontent",value:function(){var e=this;return{next:function(){var t=e.readblackchar();return e.backup(),")"==t?{done:!0}:{done:!1,value:e.load()}}}}}]),r}(),R._rvalidchars=/^[\],:{}\s]*$/,R._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,R._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,R._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,R._inherit=function(t,e){return Object.assign(Object.create(t),e)},R._map2object=function(t){if(R._ismap(t)){var r={};return t.forEach(function(t,e){if("string"!=typeof e)throw new R.TypeError("keys must be strings");r[e]=t}),r}return t},R._bound=function(t,e){return t<0?0:e=r.length)return 1;var u=R._cmp(t,e[a],r[a]);if(u)return u}return r.length>e.length?-1:0}}else if((R._isset(e)||R._isul4set(e))&&(R._isset(r)||R._isul4set(r))){for(var s=!1,l=!1,c=_iter(e);;){var h=c.next();if(h.done)break;if(!r.has(h.value)){s=!0;break}}for(var p=_iter(r);;){var _=p.next();if(_.done)break;if(!e.has(_.value)){l=!0;break}}return s?l?null:1:l?-1:0}return R._unorderable(t,e,r)},R._lt=function(t,e){var r=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(e);if(-1!=r.indexOf(M(t))){if(-1!=r.indexOf(M(e)))return t=e.length)return!1;if(!R._eq(t[n],e[n]))return R._lt(t[n],e[n])}return t.length=r.length)return!1;if(!R._eq(e[n],r[n]))return R._lt(e[n],r[n])}return e.length<=r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r)){if(R._isset(r))e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)});else if(R._isul4set(r))for(var a in e.forEach(function(t){r.items[t]||(o=!0)}),r.items)if(!e.has(a)){i=!0;break}}else if(R._isul4set(r)){if(R._isset(r)){for(var u in e.items)if(!r.has(u)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var s in e.items)if(!r.items[s]){o=!0;break}for(var l in r.items)if(!e.items[l]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable("<=",e,r)},R._gt=function(e,r){var t=["boolean","number"];if(e&&"function"==typeof e.__gt__)return e.__gt__(r);if(-1!=t.indexOf(M(e))){if(-1!=t.indexOf(M(r)))return rr.getTime()}else if(R._islist(e)){if(R._islist(r)){if(e===r)return!1;for(var n=0;n=r.length)return!0;if(!R._eq(e[n],r[n]))return R._gt(e[n],r[n])}return e.length>r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r))R._isset(r)?(e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)})):R._isul4set(r)&&(e.forEach(function(t){r.items[t]||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)}));else if(R._isul4set(r)){if(R._isset(r)){for(var a in e.items)if(!r.has(a)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var u in e.items)if(!r.items[u]){o=!0;break}for(var s in r.items)if(!e.items[s]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable(">",e,r)},R._ge=function(r,e){var t=["boolean","number"];if(r&&"function"==typeof r.__ge__)return r.__ge__(e);if(-1!=t.indexOf(M(r))){if(-1!=t.indexOf(M(e)))return e<=r}else if("string"==typeof r){if("string"==typeof e)return e<=r}else if(R._isdatetime(r)){if(R._isdatetime(e))return r.getTime()>=e.getTime()}else if(R._islist(r)){if(R._islist(e)){if(r===e)return!0;for(var n=0;n=e.length)return!0;if(!R._eq(r[n],e[n]))return R._gt(r[n],e[n])}return r.length>=e.length}}else if(R._isset(r)||R._isul4set(r)){var o=!1,i=!1;if(R._isset(e)){if(R._isset(e))r.forEach(function(t){e.has(t)||(o=!0)}),e.forEach(function(t){r.has(t)||(i=!0)});else if(R._isul4set(e))for(var a in r.forEach(function(t){e.items[t]||(o=!0)}),e.items)if(!r.has(a)){i=!0;break}}else if(R._isul4set(e)){if(R._isset(e)){for(var u in r.items)if(!e.has(u)){o=!0;break}e.forEach(function(t,e){r.items[t]||(i=!0)})}else if(R._isul4set(e)){for(var s in r.items)if(!e.items[s]){o=!0;break}for(var l in e.items)if(!r.items[l]){i=!0;break}}}else R._unorderable(operator,r,e);return o?i?null:1:i?-1:0}R._unorderable(">=",r,e)},R._iter=function(t){if("string"==typeof t||R._islist(t))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(R._isset(t)){var e=[];return t.forEach(function(t){e.push(t)}),{index:0,next:function(){return this.index>=e.length?{done:!0}:{value:e[this.index++],done:!1}}}}if(R._isul4set(t))return R._iter(t.items);if(R._isobject(t)){var n=[];for(var o in t)n.push(o);return{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}throw new R.TypeError(R._type(t)+" object is not iterable")},R._str_repr=function(t,e){for(var r="",n=!1,o=!1,i=0;i":"":R._isdate(t)?R._date_repr(t,e):R._isdatetime(t)?R._datetime_repr(t,e):void 0===t?"":"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._islist(t)?R._list_repr(t,e):R._ismap(t)?R._map_repr(t,e):R._isset(t)?R._set_repr(t,e):R._isobject(t)?R._object_repr(t,e):"?"},R._repr=function(t){return R._repr_internal(t,!1)},R._ascii=function(t){return R._repr_internal(t,!0)},R._date_str=function(t){var e=t._date.getFullYear(),r=t._date.getMonth()+1,n=t._date.getDate();return e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)},R._datetime_str=function(t){var e=t.getFullYear(),r=t.getMonth()+1,n=t.getDate(),o=t.getHours(),i=t.getMinutes(),a=t.getSeconds(),u=t.getMilliseconds(),s=e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)+" "+R._lpad(o.toString(),"0",2)+":"+R._lpad(i.toString(),"0",2);return(a||u)&&(s+=":"+R._lpad(a.toString(),"0",2),u&&(s+="."+R._lpad(u.toString(),"0",3)+"000")),s},R._str=function(t){return void 0===t?"":null===t?"":!1===t?"False":!0===t?"True":"string"==typeof t?t:"number"==typeof t?t.toString():R._isdate(t)?R._date_str(t):R._isdatetime(t)?R._datetime_str(t):R._islist(t)?R._list_repr(t):R._isset(t)?R._set_repr(t):R._ismap(t)?R._map_repr(t):"object"===M(t)&&"function"==typeof t.__str__?t.__str__():"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._isobject(t)?R._object_repr(t):"?"},R._bool=function(t){if(null==t||!1===t||0===t||""===t)return!1;if(M(t),"function"==typeof t.__bool__)return t.__bool__();if(R._islist(t))return 0!==t.length;if(R._ismap(t)||R._isset(t))return 0!=t.size;if(R._isobject(t)){for(var e in t)if(t.hasOwnProperty(e))return!0;return!1}return!0},R._int=function(t,e){var r;if(null!==e){if("string"!=typeof t||!R._isint(e))throw new R.TypeError("int() requires a string and an integer");if("NaN"==(r=parseInt(t,e)).toString())throw new R.TypeError("invalid literal for int()");return r}if("string"==typeof t){if("NaN"==(r=parseInt(t)).toString())throw new R.TypeError("invalid literal for int()");return r}if("number"==typeof t)return Math.floor(t);if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("int() argument must be a string or a number")},R._float=function(t){if("string"==typeof t)return parseFloat(t);if("number"==typeof t)return t;if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("float() argument must be a string or a number")},R._list=function(t){for(var e=R._iter(t),r=[];;){var n=e.next();if(n.done)return r;r.push(n.value)}},R._set=function(t){for(var e=R._iter(t),r=R._emptyset();;){var n=e.next();if(n.done)return r;r.add(n.value)}},R._len=function(t){if("string"==typeof t||R._islist(t))return t.length;if(R._ismap(t)||R._isset(t))return t.size;if(R._isobject(t)){var e=0;for(var r in t)++e;return e}throw new R.TypeError("object of type '"+R._type(t)+"' has no len()")},R._type=function(t){return null===t?"none":!1===t||!0===t?"bool":void 0===t?"undefined":"number"==typeof t?Math.round(t)==t?"int":"float":"function"==typeof t?"function":"function"==typeof t.ul4type?t.ul4type():R.Protocol.get(t).ul4type(t)},R._mod=function(t,e){var r=Math.floor(t/e),n=t-r*e;return 0!==n&&(e<0&&0=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n[1],o=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n}var h,p=t<0;switch(p&&(t=-t),l){case"b":h=t.toString(2);break;case"c":if(p||65535"==i)h=R._str_repeat(o,s-h.length)+h;else{var _=s-h.length,f=Math.floor(_/2),d=_-f;h=R._str_repeat(o,f)+h+R._str_repeat(o,d)}return h},R._format=function(t,e,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return R._isdate(t)?R._format_datetime(t._date,e,r):R._isdatetime(t)?R._format_datetime(t,e,r):R._isint(t)?R._format_int(t,e,r):!0===t?R._format_int(1,e,r):!1===t?R._format_int(0,e,r):void 0},R._lpad=function(t,e,r){for("number"==typeof t&&(t=t.toString());t.lengththis.args.length){var u=null===t?"expected":t+"() expects";throw new R.ArgumentError(u+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+e.length+" given")}}else n.push(e.slice(this.args.length));if(null===this.remkwargs){for(var s in r)if(!this.argNames[s])throw null===t?new R.ArgumentError("an argument named "+R._repr(s)+" isn't supported"):new R.ArgumentError(t+"() doesn't support an argument named "+R._repr(s))}else{var l=R._emptymap();for(var c in r)this.argNames[c]||R._setmap(l,c,r[c]);n.push(l)}return n}},{key:"bindObject",value:function(t,e,r){e=this.bindArray(t,e,r);var n,o={};for(n=0;n"}},{key:"__str__",value:function(){return this.toString()}},{key:"toString",value:function(){for(var t=[],e=0;e=c.getTime()){var h=R.SubAST.prototype._do(t,c);return[o,Math.floor(h.days()/7)+1,R.DateTimeProtocol.weekday(t)]}}}},{key:"week",value:function(t){var e=1=r.length){o="";break}if("\n"===r.charAt(t)){o="";break}--n,++t}return r.substring(e,t)+o}},{key:"line",get:function(){return null===this._line&&this._calculateLineCol(),this._line}},{key:"col",get:function(){return null===this._col&&this._calculateLineCol(),this._col}}]),n}(),R.AST.prototype._ul4onattrs=["template","pos"],R.TextAST=function(t){function r(t,e){return E(this,r),V(this,O(r).call(this,t,e))}return L(r,R.AST),P(r,[{key:"_eval",value:function(t){t.output(this.text)}},{key:"_str",value:function(t){t.push("text "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}},{key:"text",get:function(){return this.source}}]),r}(),R.IndentAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e)))._text=r,n}return L(o,R.TextAST),P(o,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"text",get:function(){return void 0!==this.template?null===this._text?this.source:this._text:null}}]),o}(),R.LineEndAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.TextAST),P(e,[{key:"_str",value:function(t){t.push("lineend "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CodeAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.AST),e}(),R.ConstAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){return this.value}}]),o}(),R.ConstAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["value"]),R.ItemArgBase=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_handle_eval_list",value:function(t,e){try{return this._eval_list(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_set",value:function(t,e){try{return this._eval_set(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_dict",value:function(t,e){try{return this._eval_dict(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_call",value:function(t,e,r){try{return this._eval_call(t,e,r)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}}]),e}(),R.SeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){var r=this.value._handle_eval(t);e.push(r)}},{key:"_eval_set",value:function(t,e){var r=this.value._handle_eval(t);e.add(r)}}]),o}(),R.SeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.UnpackSeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.push(o.value)}}},{key:"_eval_set",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.add(o.value)}}}]),o}(),R.UnpackSeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.DictItemAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).key=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,e){var r=this.key._handle_eval(t),n=this.value._handle_eval(t);R._setmap(e,r,n)}}]),i}(),R.DictItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["key","value"]),R.UnpackDictItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,r){var e=this.item._handle_eval(t);if(R._islist(e))for(var n=0;n")}},{key:"_eval_call",value:function(t,e,r){var n=this.value._handle_eval(t);e.push(n)}}]),o}(),R.PosArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.KeywordArgAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).name=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){if(r.hasOwnProperty(this.name))throw new R.ArgumentError("duplicate keyword argument "+this.name);var n=this.value._handle_eval(t);r[this.name]=n}}]),i}(),R.KeywordArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["name","value"]),R.UnpackListArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);e.push.apply(e,N(n))}}]),o}(),R.UnpackListArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["item"]),R.UnpackDictArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);if(R._islist(n))for(var o=0;o")}},{key:"_eval",value:function(t){for(var e=[],r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=[],o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptyset(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptyset(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptymap(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptymap(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){var e=this.container._handle_eval(t),a=R._iter(e),u=t.inheritvars(),s=this;return{next:function(){for(;;){var t=a.next();if(t.done)return t;for(var e=R._unpackvar(s.varname,t.value),r=0;r")}},{key:"_eval",value:function(t){return this._get(t,this.name)}},{key:"_eval_set",value:function(t,e){this._set(t,this.name,e)}},{key:"_eval_modify",value:function(t,e,r){this._modify(t,e,this.name,r)}},{key:"_get",value:function(t,e){var r=t.get(e);return void 0===r&&(r=R.functions[e]),r}},{key:"_set",value:function(t,e,r){t.set(e,r)}},{key:"_modify",value:function(t,e,r,n){var o=e._ido(t.get(r),n);t.set(r,o)}}]),o}(),R.VarAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["name"]),R.UnaryAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).obj=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj="),this.obj._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._do(e)}}]),o}(),R.UnaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj"]),R.NegAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return null!==t&&"function"==typeof t.__neg__?t.__neg__():-t}}]),e}(),R.BitNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return-t-1}}]),e}(),R.NotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return!R._bool(t)}}]),e}(),R.IfAST=function(t){function a(t,e,r,n,o){var i;return E(this,a),(i=V(this,O(a).call(this,t,e))).objif=r,i.objcond=n,i.objelse=o,i}return L(a,R.CodeAST),P(a,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(1),t.push("objif="),this.objif._repr(t),t.push(0),t.push("objcond="),this.objcond._repr(t),t.push(0),t.push("objelse="),this.objelse._repr(t),t.push(-1),t.push(">")}},{key:"_eval",value:function(t){var e=this.objcond._handle_eval(t);return R._bool(e)?this.objif._handle_eval(t):this.objelse._handle_eval(t)}}]),a}(),R.IfAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["objif","objcond","objelse"]),R.ReturnAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);throw new R.ReturnException(e)}},{key:"_str",value:function(t){t.push("return "),this.obj._str(t)}}]),e}(),R.PrintAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._str(e);t.output(r)}},{key:"_str",value:function(t){t.push("print "),this.obj._str(t)}}]),e}(),R.PrintXAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._xmlescape(e);t.output(r)}},{key:"_str",value:function(t){t.push("printx "),this.obj._str(t)}}]),e}(),R.BinaryAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj1=r,o.obj2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj1="),this.obj1._repr(t),t.push(" obj2="),this.obj2._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj1._handle_eval(t),r=this.obj2._handle_eval(t);return this._do(e,r)}}]),i}(),R.BinaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj1","obj2"]),R.ItemAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return this._get(t,e)}},{key:"_eval_set",value:function(t,e){var r=this.obj1._handle_eval(t),n=this.obj2._handle_eval(t);this._set(r,n,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj1._handle_eval(t),o=this.obj2._handle_eval(t);this._modify(e,n,o,r)}},{key:"_get",value:function(t,e){if("string"==typeof t||R._islist(t)){if(e instanceof R.slice){var r=e.start,n=e.stop;return null==r&&(r=0),null==n&&(n=t.length),t.slice(r,n)}var o=e;if(e<0&&(e+=t.length),e<0||e>=t.length)throw new R.IndexError(t,o);return t[e]}if(t&&"function"==typeof t.__getitem__)return t.__getitem__(e);if(R._ismap(t))return t.get(e);throw new R.TypeError(R._type(t)+" object is not subscriptable")}},{key:"_set",value:function(t,e,r){if(R._islist(t))if(e instanceof R.slice){var n=e.start,o=e.stop;null===n?n=0:n<0&&(n+=t.length),n<0?n=0:n>t.length&&(n=t.length),null===o?o=t.length:o<0&&(o+=t.length),o<0?o=0:o>t.length&&(o=t.length),o=t.length)throw new R.IndexError(t,u);t[e]=r}else if(t&&"function"==typeof t.__setitem__)t.__setitem__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.NotSubscriptableError(t);t[e]=r}}},{key:"_modify",value:function(t,e,r,n){this._set(e,r,t._ido(this._get(e,r),n))}}]),e}(),R.IsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t===e}}]),e}(),R.IsNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t!==e}}]),e}(),R.EQAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._eq(t,e)}}]),e}(),R.NEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ne(t,e)}}]),e}(),R.LTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._lt(t,e)}}]),e}(),R.LEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._le(t,e)}}]),e}(),R.GTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._gt(t,e)}}]),e}(),R.GEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ge(t,e)}}]),e}(),R.ContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if("string"==typeof t&&"string"==typeof e)return-1!==e.indexOf(t);if(R._islist(e))return-1!==e.indexOf(t);if(e&&"function"==typeof e.__contains__)return e.__contains__(t);if(R._ismap(e)||R._isset(e))return e.has(t);if(R._isobject(e)){for(var r in e)if(r===t)return!0;return!1}if(R._iscolor(e))return e._r===t||e._g===t||e._b===t||e._a===t;throw new R.TypeError(R._type(e)+" object is not iterable")}}]),e}(),R.NotContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return!R.ContainsAST.prototype._do(t,e)}}]),e}(),R.AddAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__add__)return t.__add__(e);if(e&&"function"==typeof e.__radd__)return e.__radd__(t);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" + "+R._type(this.obj2)+" is not supported");return R._islist(t)&&R._islist(e)?N(t).concat(N(e)):t+e}},{key:"_ido",value:function(t,e){return R._islist(t)&&R._islist(e)?(R.ListProtocol.append(t,e),t):this._do(t,e)}}]),e}(),R.SubAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__sub__)return t.__sub__(e);if(e&&"function"==typeof e.__rsub__)return e.__rsub__(t);if(R._isdate(t)&&R._isdate(e))return this._date_sub(t,e);if(R._isdatetime(t)&&R._isdatetime(e))return this._datetime_sub(t,e);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" - "+R._type(this.obj2)+" is not supported");return t-e}},{key:"_date_sub",value:function(t,e){return this._datetime_sub(t._date,e._date)}},{key:"_datetime_sub",value:function(t,e){var r=t")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._get(e,this.attrname)}},{key:"_eval_set",value:function(t,e){var r=this.obj._handle_eval(t);this._set(r,this.attrname,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj._handle_eval(t);this._modify(e,n,this.attrname,r)}},{key:"_get",value:function(e,t){var r=R.Protocol.get(e);try{return r.getattr(e,t)}catch(t){if(t instanceof R.AttributeError&&t.obj===e)return;throw t}}},{key:"_set",value:function(t,e,r){if("object"===M(t)&&"function"==typeof t.__setattr__)t.__setattr__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.TypeError(R._type(t)+" object has no writable attributes");t[e]=r}}},{key:"_modify",value:function(t,e,r,n){var o=this._get(e,r),i=t._ido(o,n);this._set(e,r,i)}}]),i}(),R.AttrAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj","attrname"]),R.CallAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj=r,o.args=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_makeargs",value:function(t){for(var e=[],r={},n=0;n")}},{key:"_str",value:function(t){t.push("render "),t.push(this.tag.code.replace(/\r?\n/g," ")),null!==this.indent&&(t.push(" with indent "),t.push(R._repr(this.indent.text)))}},{key:"_handle_eval",value:function(t){var e=t.withindent(null!==this.indent?this.indent.text:null),r=this.obj._handle_eval(e),n=this._makeargs(e);this._handle_additional_arguments(e,n);try{return R._callrender(e,r,n.args,n.kwargs)}catch(t){throw this._decorate_exception(t),t}}},{key:"_handle_additional_arguments",value:function(t,e){}}]),i}(),R.RenderAST.prototype._ul4onattrs=R.CallAST.prototype._ul4onattrs.concat(["indent"]),R.RenderAST.prototype._reprname="RenderAST",R.RenderXAST=function(t){function r(){return E(this,r),V(this,O(r).apply(this,arguments))}return L(r,R.RenderAST),P(r,[{key:"_handle_eval",value:function(t){t.escapes.push(R._xmlescape);var e=null;try{e=I(O(r.prototype),"_handle_eval",this).call(this,t)}finally{t.escapes.splice(t.escapes.length-1,1)}return e}}]),r}(),R.RenderBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){if(e.kwargs.hasOwnProperty("content"))throw new R.ArgumentError("duplicate keyword argument content");var r=new R.TemplateClosure(this.content,this.content.signature,t.vars);e.kwargs.content=r}}]),e}(),R.RenderBlockAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.RenderBlocksAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){var r=t.inheritvars();for(var n in R.BlockAST.prototype._eval.call(this,r),r.vars)if(r.vars.hasOwnProperty(n)){if(n in e.kwargs)throw new R.ArgumentError("duplicate keyword argument "+n);e.kwargs[n]=r.get(n)}}}]),e}(),R.RenderBlocksAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.slice=function(t){function n(t,e){var r;return E(this,n),(r=V(this,O(n).call(this))).start=t,r.stop=e,r}return L(n,R.Proto),P(n,[{key:"of",value:function(t){var e=this.start||0,r=null===this.stop?t.length:this.stop;return t.slice(e,r)}},{key:"__repr__",value:function(){return"slice("+R._repr(this.start)+", "+R._repr(this.stop)+", None)"}},{key:"__getattr__",value:function(t){switch(t){case"start":return this.start;case"stop":return this.stop;default:throw new R.AttributeError(this,t)}}}]),n}(),R.SliceAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).index1=r,o.index2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){var e=null!==this.index1?this.index1._handle_eval(t):null,r=null!==this.index2?this.index2._handle_eval(t):null;return new R.slice(e,r)}}]),i}(),R.SliceAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["index1","index2"]),R.SetVarAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).lvalue=r,o.value=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" lvalue="),t.push(R._repr(this.lvalue)),t.push(" value="),this.value._repr(t),t.push(">")}},{key:"_eval",value:function(t){for(var e=this.value._handle_eval(t),r=R._unpackvar(this.lvalue,e),n=0;n")}},{key:"_str_varname",value:function(t,e){if(R._islist(e)){t.push("(");for(var r=0;r")}},{key:"_str",value:function(t){t.push("while "),this.condition._repr(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_eval",value:function(t){for(;;){var e=this.condition._handle_eval(t);if(!R._bool(e))break;try{I(O(o.prototype),"_eval",this).call(this,t)}catch(t){if(t instanceof R.BreakException)break;if(!(t instanceof R.ContinueException))throw t}}}}]),o}(),R.WhileBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.BreakAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.BreakException}},{key:"_str",value:function(t){t.push("break"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.ContinueAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.ContinueException}},{key:"_str",value:function(t){t.push("continue"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CondBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"_str",value:function(t){t.push(this._strname),t.push(" "),this.condition._str(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){var e=this.condition._handle_eval(t);return R._bool(e)}}]),o}(),R.ConditionalBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.IfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.IfBlockAST.prototype._strname="if",R.ElIfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.ElIfBlockAST.prototype._strname="else if",R.ElseBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_repr",value:function(t){t.push("")}},{key:"_str",value:function(t){t.push("else:"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){return!0}}]),e}(),R.Template=function(t){function l(t,e,r,n,o,i,a,u){var s;return E(this,l),(s=V(this,O(l).call(this,t,e)))._source=r,s.name=n,s.whitespace=o,s.startdelim=i,s.enddelim=a,s.docpos=null,s.signature=u,s._asts=null,s._ul4_callsignature=u,s._ul4_rendersignature=u,s.parenttemplate=null,s}return L(l,R.BlockAST),P(l,[{key:"__getattr__",value:function(t){var r=this;switch(t){case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;default:return I(O(l.prototype),"__getattr__",this).call(this,t)}}},{key:"ul4ondump",value:function(t){var e;if(t.dump(R.version),t.dump(this.name),t.dump(this._source),t.dump(this.whitespace),t.dump(this.startdelim),t.dump(this.enddelim),t.dump(this.docpos),t.dump(this.parenttemplate),null===this.signature||this.signature instanceof R.SignatureAST)e=this.signature;else{e=[];for(var r=0;r"!==this.enddelim&&(t.push(" enddelim="),t.push(R._repr(this.enddelim))),t.push(">")}},{key:"_str",value:function(t){t.push("def "),t.push(this.name?this.name:"unnamed"),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_renderbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(!(t instanceof R.ReturnException))throw t}}},{key:"__render__",value:function(t,e){this._renderbound(t,e)}},{key:"render",value:function(t,e){this._renderbound(t,e)}},{key:"_rendersbound",value:function(t,e){var r=t.replaceoutput();return this._renderbound(r,e),r.getoutput()}},{key:"renders",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._rendersbound(e,t)}},{key:"doc",value:function(){return null!=this.docpos?this.docpos.of(this._source):null}},{key:"_callbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(t instanceof R.ReturnException)return t.result;throw t}return null}},{key:"call",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._callbound(e,t)}},{key:"__call__",value:function(t,e){return this._callbound(t,e)}},{key:"ul4type",value:function(){return"template"}}]),l}(),R.Template.prototype._ul4_callneedsobject=!0,R.Template.prototype._ul4_callneedscontext=!0,R.Template.prototype._ul4_renderneedsobject=!0,R.Template.prototype._ul4_renderneedscontext=!0,R.SignatureAST=function(t){function o(t,e){var r;return E(this,o),(r=V(this,O(o).call(this,t,e))).params=[],r}return L(o,R.CodeAST),P(o,[{key:"ul4ondump",value:function(t){I(O(o.prototype),"ul4ondump",this).call(this,t);for(var e=[],r=0;r")}}]),o}(),R.TemplateClosure=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).template=t,n.signature=e,n.vars=r,n._ul4_callsignature=e,n._ul4_rendersignature=e,n.name=t.name,n.tag=t.tag,n.endtag=t.endtag,n._source=t._source,n.startdelim=t.startdelim,n.enddelim=t.enddelim,n.docpos=t.docpos,n.content=t.content,n}return L(o,R.Proto),P(o,[{key:"__render__",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"render",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"__call__",value:function(t,e){return this.template._callbound(t,R._inherit(this.vars,e))}},{key:"_renderbound",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"_rendersbound",value:function(t,e){return this.template._rendersbound(t,R._inherit(this.vars,e))}},{key:"__getattr__",value:function(t){var r=this;switch(t){case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;case"signature":return this.signature;default:return this.template.__getattr__(t)}}},{key:"ul4type",value:function(){return"template"}}]),o}(),R.TemplateClosure.prototype._ul4_callneedsobject=!0,R.TemplateClosure.prototype._ul4_callneedscontext=!0,R.TemplateClosure.prototype._ul4_renderneedsobject=!0,R.TemplateClosure.prototype._ul4_renderneedscontext=!0,R._rgb=function(t,e,r,n){return new this.Color(255*t,255*e,255*r,255*n)},R._xmlescape=function(t){return t=(t=(t=(t=(t=(t=R._str(t)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},R._csv=function(t){return null===t?"":("string"!=typeof t&&(t=R._repr(t)),-1===t.indexOf(",")&&-1===t.indexOf('"')&&-1===t.indexOf("\n")||(t='"'+t.replace(/"/g,'""')+'"'),t)},R._chr=function(t){if("number"!=typeof t)throw new R.TypeError("chr() requires an int");return String.fromCharCode(t)},R._ord=function(t){if("string"!=typeof t||1!=t.length)throw new R.TypeError("ord() requires a string of length 1");return t.charCodeAt(0)},R._hex=function(t){if("number"!=typeof t)throw new R.TypeError("hex() requires an int");return t<0?"-0x"+t.toString(16).substr(1):"0x"+t.toString(16)},R._oct=function(t){if("number"!=typeof t)throw new R.TypeError("oct() requires an int");return t<0?"-0o"+t.toString(8).substr(1):"0o"+t.toString(8)},R._bin=function(t){if("number"!=typeof t)throw new R.TypeError("bin() requires an int");return t<0?"-0b"+t.toString(2).substr(1):"0b"+t.toString(2)},R._min=function(t){if(0==t.length)throw new R.ArgumentError("min() requires at least 1 argument, 0 given");1==t.length&&(t=t[0]);for(var e,r=R._iter(t),n=!0;;){var o=r.next();if(o.done){if(n)throw new R.ValueError("min() argument is an empty sequence!");return e}(n||o.valuee)&&(e=o.value),n=!1}},R._sum=function(t){for(var e=1",t,e)}:function(t,e){return R._cmp("<=>",t,e)},i=R._list(e);return i.sort(o),i}for(var a=[],u=0,s=R._iter(e);;++u){var l=s.next();if(l.done)break;var c=R._call(t,r,[l.value],{});a.push([c,n?-u:u,l.value])}cmp=function(t,e){var r=R._cmp("<=>",t[0],e[0]);return r||(r=R._cmp("<=>",t[1],e[1])),n?-r:r},a.sort(cmp);for(var h=[],p=0;p=a?{done:!0}:{value:e+this.index++*n,done:!1}}}},R._slice=function(t){var e,r,n,o;if(t.length<2)throw new R.ArgumentError("required slice() argument missing");if(4= 0");if(n<0)throw new R.ValueError("slice() requires a stop argument >= 0");if(o<=0)throw new R.ValueError("slice() requires a step argument > 0");var i=r,a=0,u=R._iter(e);return{next:function(){for(var t;at.length||nt.length+1&&(o=t.length+1),o}r=R._bound(r,t.length),n=R._bound(n,t.length);var i=0;if(R._islist(t)){for(var a=r;an);)++i,u+=e.length;return i},R._find=function(t,e){var r=2t._date;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.Date)return this._date>=t._date;R._unorderable(">=",this,t)}},{key:"year",value:function(){return this._date.getFullYear()}},{key:"month",value:function(){return this._date.getMonth()+1}},{key:"day",value:function(){return this._date.getDate()}},{key:"ul4type",value:function(){return"date"}}]),o}(),R.TimeDelta=function(t){function a(){var t,e=0t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>t._microseconds;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.TimeDelta)return this._days!=t._days?this._days>t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>=t._microseconds;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.TimeDelta(-this._days,-this._seconds,-this._microseconds)}},{key:"adddate",value:function(t,e){var r=t._date.getFullYear(),n=t._date.getMonth(),o=t._date.getDate()+e;return new R.Date(r,n,o)}},{key:"_adddatetime",value:function(t,e,r,n){var o=t.getFullYear(),i=t.getMonth(),a=t.getDate()+e,u=t.getHours(),s=t.getMinutes(),l=t.getSeconds()+r,c=t.getMilliseconds()+n/1e3;return new Date(o,i,a,u,s,l,c)}},{key:"__add__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days+t._days,this._seconds+t._seconds,this._microseconds+t._microseconds);if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days-t._days,this._seconds-t._seconds,this._microseconds-t._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._days);if(R._isdatetime(t))return this._adddatetime(t,-this._days,-this._seconds,-this._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days/t,this._seconds/t,this._microseconds/t);if(t instanceof R.TimeDelta){var e=this._days,r=t._days,n=this._seconds||t._seconds,o=this._microseconds||t._microseconds;return(n||o)&&(e=86400*e+this._seconds,r=86400*r+t._seconds,o&&(e=1e6*e+this._microseconds,r=1e6*r+t._microseconds)),e/r}throw new R.TypeError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"days":var r=function(){return e._days};return R.expose(r,[]),r;case"seconds":var n=function(){return e._seconds};return R.expose(n,[]),n;case"microseconds":var o=function(){return e._microseconds};return R.expose(o,[]),o;default:throw new R.AttributeError(this,t)}}},{key:"days",value:function(){return this._days}},{key:"seconds",value:function(){return this._seconds}},{key:"microseconds",value:function(){return this._microseconds}},{key:"ul4type",value:function(){return"timedelta"}}]),a}(),R.MonthDelta=function(t){function r(){var t,e=0t._months;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.MonthDelta)return this._months>=t._months;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.MonthDelta(-this._months)}},{key:"_adddate",value:function(t,e){var r=this._adddatetime(t._date,e);return new R.Date(r.getFullYear(),r.getMonth()+1,r.getDate())}},{key:"_adddatetime",value:function(t,e){for(var r=t.getFullYear(),n=t.getMonth()+e,o=t.getDate(),i=t.getHours(),a=t.getMinutes(),u=t.getSeconds(),s=t.getMilliseconds();;){var l=new Date(r,n,1,i,a,u,s).getMonth(),c=new Date(r,n,o,i,a,u,s);if(c.getMonth()===l)return c;--o}}},{key:"__add__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months+t._months);if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months-t._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._months);if(R._isdatetime(t))return this._adddatetime(t,-this._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__floordiv__",value:function(t){if("number"==typeof t)return new R.MonthDelta(Math.floor(this._months/t));if(R._ismonthdelta(t))return Math.floor(this._months/t._months);throw new R.ArgumentError(R._type(this)+" // "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if(R._ismonthdelta(t))return this._months/t._months;throw new R.ArgumentError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"months":var r=function(){return e._months};return R.expose(r,[]),r;default:throw new R.AttributeError(this,t)}}},{key:"months",value:function(){return this._months}},{key:"ul4type",value:function(){return"monthdelta"}}]),r}();for(var H=[R.TextAST,R.IndentAST,R.LineEndAST,R.ConstAST,R.SeqItemAST,R.UnpackSeqItemAST,R.DictItemAST,R.UnpackDictItemAST,R.PosArgAST,R.KeywordArgAST,R.UnpackListArgAST,R.UnpackDictArgAST,R.ListAST,R.ListCompAST,R.DictAST,R.DictCompAST,R.SetAST,R.SetCompAST,R.GenExprAST,R.VarAST,R.NotAST,R.NegAST,R.BitNotAST,R.IfAST,R.ReturnAST,R.PrintAST,R.PrintXAST,R.ItemAST,R.IsAST,R.IsNotAST,R.EQAST,R.NEAST,R.LTAST,R.LEAST,R.GTAST,R.GEAST,R.NotContainsAST,R.ContainsAST,R.AddAST,R.SubAST,R.MulAST,R.FloorDivAST,R.TrueDivAST,R.ModAST,R.ShiftLeftAST,R.ShiftRightAST,R.BitAndAST,R.BitXOrAST,R.BitOrAST,R.AndAST,R.OrAST,R.SliceAST,R.AttrAST,R.CallAST,R.RenderAST,R.RenderXAST,R.RenderBlockAST,R.RenderBlocksAST,R.SetVarAST,R.AddVarAST,R.SubVarAST,R.MulVarAST,R.TrueDivVarAST,R.FloorDivVarAST,R.ModVarAST,R.ShiftLeftVarAST,R.ShiftRightVarAST,R.BitAndVarAST,R.BitXOrVarAST,R.BitOrVarAST,R.ForBlockAST,R.WhileBlockAST,R.BreakAST,R.ContinueAST,R.CondBlockAST,R.IfBlockAST,R.ElIfBlockAST,R.ElseBlockAST,R.SignatureAST,R.Template],X=0;X"}}]),e}(),K.Handler=function(){function t(){E(this,t)}return P(t,[{key:"save",value:function(t){}},{key:"delete",value:function(t){}}]),t}(),K.Globals=function(t){function e(){var t;return E(this,e),(t=V(this,O(e).call(this))).version=null,t.platform=null,t.user=null,t.maxdbactions=null,t.maxtemplateruntime=null,t.flashmessages=null,t.handler=new K.Handler,t}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}],[{key:"geodist",value:function(t,e){var r=function(t){return(t=Math.sin(t))*t},n=function(t){return(t=Math.cos(t))*t},o=Math.PI/180,i=1/298.257223563,a=t.lat*o,u=t.long*o,s=e.lat*o,l=(a+s)/2,c=(a-s)/2,h=(u-e.long*o)/2,p=r(c)*n(h)+n(l)*r(h),_=n(c)*n(h)+r(l)*r(h),f=Math.atan(Math.sqrt(p/_)),d=2*f*6378.137,v=Math.sqrt(p*_)/f,m=(3*v+1)/(2*p);return d*(1+i*((3*v-1)/(2*_))*r(l)*n(c)-i*m*n(l)*r(c))}}]),e}(),K.Globals.prototype._ul4onattrs=["version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"],K.Globals.prototype._ul4attrs=R._makeset("version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"),K.FlashMessage=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.FlashMessage.prototype._ul4onattrs=["timestamp","type","title","message"],K.FlashMessage.prototype._ul4attrs=R._makeset("timestamp","type","title","message"),K.App=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}},{key:"insert",value:function(){var t=0"}}]),e}(),K.View.prototype._ul4onattrs=["id","name","app","order","width","height","start","end"],K.View.prototype._ul4attrs=R._makeset("id","name","app","order","width","height","start","end"),K.DataSourceData=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.DataSourceData.prototype._ul4onattrs=["id","identifier","app","apps"],K.DataSourceData.prototype._ul4attrs=R._makeset("id","identifier","app","apps"),K.Record=function(t){function r(t){var e;return E(this,r),(e=V(this,O(r).call(this))).id=null,e.app=t,e.createdat=null,e.createdby=null,e.updatedat=null,e.updatedby=null,e.updatecount=0,e._sparsevalues=new Map,e._values=null,e._fields=null,e.children=new Map,e.attachments=null,e.errors=[],e._is_deleted=!1,e}return L(r,K.Base),P(r,[{key:"__repr__",value:function(){var t=[""),t.join("")}},{key:"is_dirty",value:function(){if(null===this.id)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.is_dirty())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"has_errors",value:function(){if(0!==this.errors.length)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.has_errors())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"delete",value:function(){return this.app.globals.handler.delete(this)}},{key:"save",value:function(){this.app.globals.handler.save(this)}},{key:"update",value:function(){var t=0"}},{key:"_logsearch",value:function(t,e){}},{key:"search",value:function(t,e){return!1}}]),e}(),K.Control.prototype.type=null,K.Control.prototype.subtype=null,K.Control.prototype._ul4onattrs=["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],K.Control.prototype._ul4attrs=R._makeset("id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"),K.BoolControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.BoolControl.prototype.type="bool",K.IntControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.IntControl.prototype.type="int",K.NumberControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator?e.value===t:"range"===e.operator&&(null!==t&&((null===e.minvalue||e.minvalue<=t)&&(null===e.maxvalue||t"}},{key:"value",get:function(){return this._value},set:function(t){var e=this._value;R._ne(e,t)&&(this.record.values.set(this.control.identifier,t),this._value=t,this._dirty=!0)}}]),o}(),K.LookupItem=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.LookupItem.prototype._ul4onattrs=["key","label"],K.LookupItem.prototype._ul4attrs=R._makeset("key","label"),K.User=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.User.prototype._ul4onattrs=["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],K.User.prototype._ul4attrs=R._makeset("_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"),K.File=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.File.prototype._ul4onattrs=["id","url","filename","mimetype","width","height","internalid","createdat","size"],K.File.prototype._ul4attrs=R._makeset("id","url","filename","mimetype","width","height","size","createdat"),K.Geo=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).lat=t,n.long=e,n.info=r,n}return L(o,K.Base),P(o,[{key:"__repr__",value:function(){return""}}]),o}(),K.Geo.prototype._ul4onattrs=["lat","long","info"],K.Geo.prototype._ul4attrs=R._makeset("lat","long","info"),K.Attachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Attachment.prototype._ul4onattrs=["id","record","label","active"],K.Attachment.prototype._ul4attrs=R._makeset("id","record","label","active"),K.NoteAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.NoteAttachment.prototype.type="noteattachment",K.NoteAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.NoteAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.URLAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.URLAttachment.prototype.type="urlattachment",K.URLAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.URLAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.FileAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.FileAttachment.prototype.type="fileattachment",K.FileAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.FileAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.ImageAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.ImageAttachment.prototype.type="imageattachment",K.ImageAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["original","thumb","small","medium","large"]),K.ImageAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["original","thumb","small","medium","large"])),K.JSONAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),P(e,[{key:"_dumpUL4ONAttr",value:function(t){return"value"===t?R._asjson(this.value):this[t]}},{key:"_loadUL4ONAttr",value:function(t,e){"value"===t?this.value=R._fromjson(e):this[t]=e}}]),e}(),K.JSONAttachment.prototype.type="jsonattachment",K.JSONAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.JSONAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.Installation=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Installation.prototype._ul4onattrs=["id","name"],K.Installation.prototype._ul4attrs=R._makeset("id","name"),K.Category=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){for(var t=[],e=this;null!==e;)t.splice(0,0,e.identifier),e=e.parent;return""}}]),e}(),K.Category.prototype._ul4onattrs=["id","identifier","name","order","parent","children","apps"],K.Category.prototype._ul4attrs=R._makeset("id","identifier","name","order","parent","children","apps"),K.KeyView=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.KeyView.prototype._ul4onattrs=["id","identifier","name","key","user"],K.KeyView.prototype._ul4attrs=R._makeset("id","identifier","name","key","user"),K.AppParameter=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.AppParameter.prototype._ul4onattrs=["id","app","identifier","description","value"],K.AppParameter.prototype._ul4attrs=R._makeset("id","app","identifier","description","value");for(var W=[K.Globals,K.App,K.View,K.DataSourceData,K.Record,K.BoolControl,K.IntControl,K.NumberControl,K.TextControl,K.EmailControl,K.URLControl,K.TelControl,K.PasswordControl,K.TextAreaControl,K.DateControl,K.DatetimeMinuteControl,K.DatetimeSecondControl,K.LookupControl,K.LookupSelectControl,K.LookupRadioControl,K.LookupChoiceControl,K.AppLookupControl,K.AppLookupSelectControl,K.AppLookupRadioControl,K.AppLookupChoiceControl,K.MultipleLookupControl,K.MultipleLookupSelectControl,K.MultipleLookupCheckboxControl,K.MultipleLookupChoiceControl,K.MultipleAppLookupControl,K.MultipleAppLookupSelectControl,K.MultipleAppLookupCheckboxControl,K.MultipleAppLookupChoiceControl,K.GeoControl,K.FileControl,K.ButtonControl,K.Field,K.LookupItem,K.User,K.File,K.Geo,K.NoteAttachment,K.URLAttachment,K.FileAttachment,K.ImageAttachment,K.JSONAttachment,K.Installation,K.Category,K.KeyView,K.AppParameter],$=0;$=this.data.length)throw new R.ValueError("UL4 decoder at EOF");return this.data.charAt(this.pos++)}},{key:"readcharoreof",value:function(){return this.pos>=this.data.length?null:this.data.charAt(this.pos++)}},{key:"readblackchar",value:function(){for(var t=/\s/;;){if(this.pos>=this.data.length)throw new R.ValueError("UL4 decoder at EOF at position "+this.pos+" with path "+this.stack.join("/"));var e=this.data.charAt(this.pos++);if(!e.match(t))return e}}},{key:"read",value:function(t){this.pos+t>this.length&&(t=this.length-this.pos);var e=this.data.substring(this.pos,this.pos+t);return this.pos+=t,e}},{key:"backup",value:function(){--this.pos}},{key:"readnumber",value:function(){for(var t=/[-+0123456789.eE]/,e="";;){var r=this.readcharoreof();if(null===r||!r.match(t)){var n=parseFloat(e);if(isNaN(n))throw new R.ValueError("invalid number, got "+R._repr("value")+" at position "+this.pos+" with path "+this.stack.join("/"));return n}e+=r}}},{key:"_beginfakeloading",value:function(){var t=this.backrefs.length;return this.backrefs.push(null),t}},{key:"_endfakeloading",value:function(t,e){this.backrefs[t]=e}},{key:"_readescape",value:function(t,e){var r=this.read(e);if(r.length!=e)throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));var n=parseInt(r,16);if(isNaN(n))throw new R.ValueError("broken escape "+R._repr("\\"+t+r)+" at position "+this.pos+" with path "+this.stack.join("/"));return String.fromCharCode(n)}},{key:"load",value:function(){var t,e=this.readblackchar();switch(e){case"^":return this.backrefs[this.readnumber()];case"n":case"N":return"N"===e&&this.backrefs.push(null),null;case"b":case"B":if("T"===(t=this.readchar()))t=!0;else{if("F"!==t)throw new R.ValueError("wrong value for boolean, expected 'T' or 'F', got "+R._repr(t)+" at position "+this.pos+" with path "+this.stack.join("/"));t=!1}return"B"===e&&this.backrefs.push(t),t;case"i":case"I":case"f":case"F":return t=this.readnumber(),"I"!==e&&"F"!==e||this.backrefs.push(t),t;case"s":case"S":t=[];for(var r=this.readblackchar();;){var n=this.readchar();if(n==r)break;if("\\"==n){var o=this.readchar();"\\"==o?t.push("\\"):"n"==o?t.push("\n"):"r"==o?t.push("\r"):"t"==o?t.push("\t"):"f"==o?t.push("\f"):"b"==o?t.push("\b"):"a"==o?t.push(""):"'"==o?t.push("'"):'"'==o?t.push('"'):"x"==o?t.push(this._readescape("x",2)):"u"==o?t.push(this._readescape("u",4)):"U"==o?t.push(this._readescape("U",8)):t.push("\\"+o)}else t.push(n)}return t=t.join(""),"S"===e&&this.backrefs.push(t),t;case"c":case"C":return t=new R.Color,"C"===e&&this.backrefs.push(t),t._r=this.load(),t._g=this.load(),t._b=this.load(),t._a=this.load(),t;case"x":case"X":var i=this.load(),a=this.load(),u=this.load();return t=new R.Date(i,a,u),"X"===e&&this.backrefs.push(t),t;case"z":case"Z":return(t=new Date).setFullYear(this.load()),t.setDate(1),t.setMonth(this.load()-1),t.setDate(this.load()),t.setHours(this.load()),t.setMinutes(this.load()),t.setSeconds(this.load()),t.setMilliseconds(this.load()/1e3),"Z"===e&&this.backrefs.push(t),t;case"t":case"T":return(t=new R.TimeDelta)._days=this.load(),t._seconds=this.load(),t._microseconds=this.load(),"T"===e&&this.backrefs.push(t),t;case"r":case"R":return t=new R.slice,"R"===e&&this.backrefs.push(t),t.start=this.load(),t.stop=this.load(),t;case"m":case"M":return t=new R.MonthDelta,"M"===e&&this.backrefs.push(t),t._months=this.load(),t;case"l":case"L":for(this.stack.push("list"),t=[],"L"===e&&this.backrefs.push(t);"]"!==(e=this.readblackchar());)this.backup(),t.push(this.load());return this.stack.pop(),t;case"d":case"D":case"e":case"E":if(!R._havemap&&("e"==e||"E"==e))throw new R.ValueError("ordered dictionaries are not supported at position "+this.pos+" with path "+this.stack.join("/"));for(t=R._emptymap(),this.stack.push("d"===e||"D"===e?"dict":"odict"),"D"!==e&&"E"!==e||this.backrefs.push(t);"}"!==(e=this.readblackchar());){this.backup();var s=this.load(),l=this.load();R._setmap(t,s,l)}return this.stack.pop(),t;case"y":case"Y":for(this.stack.push("set"),t=R._makeset(),"Y"===e&&this.backrefs.push(t);"}"!==(e=this.readblackchar());)this.backup(),t.add(this.load());return this.stack.pop(),t;case"o":case"O":var c;"O"===e&&(c=this._beginfakeloading());var h,p=this.load();if(this.stack.push(p),null!==this.registry?void 0===(h=this.registry[p])&&(h=R._registry[p]):h=R._registry[p],void 0===h)throw new R.ValueError("can't load object of type "+R._repr(p)+" at position "+this.pos+" with path "+this.stack.join("/"));if(t=new h,"O"===e&&this._endfakeloading(c,t),t.ul4onload(this),")"!==(e=this.readblackchar()))throw new R.ValueError("object terminator ')' for object of type '"+p+"' expected, got "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"));return this.stack.pop(),t;default:throw new R.ValueError("unknown typecode "+R._repr(e)+" at position "+this.pos+" with path "+this.stack.join("/"))}}},{key:"loadcontent",value:function(){var e=this;return{next:function(){var t=e.readblackchar();return e.backup(),")"==t?{done:!0}:{done:!1,value:e.load()}}}}}]),r}(),R._rvalidchars=/^[\],:{}\s]*$/,R._rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,R._rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,R._rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,R._inherit=function(t,e){return Object.assign(Object.create(t),e)},R._map2object=function(t){if(R._ismap(t)){var r={};return t.forEach(function(t,e){if("string"!=typeof e)throw new R.TypeError("keys must be strings");r[e]=t}),r}return t},R._bound=function(t,e){return t<0?0:e=r.length)return 1;var u=R._cmp(t,e[a],r[a]);if(u)return u}return r.length>e.length?-1:0}}else if((R._isset(e)||R._isul4set(e))&&(R._isset(r)||R._isul4set(r))){for(var s=!1,l=!1,c=_iter(e);;){var h=c.next();if(h.done)break;if(!r.has(h.value)){s=!0;break}}for(var p=_iter(r);;){var _=p.next();if(_.done)break;if(!e.has(_.value)){l=!0;break}}return s?l?null:1:l?-1:0}return R._unorderable(t,e,r)},R._lt=function(t,e){var r=["boolean","number"];if(t&&"function"==typeof t.__lt__)return t.__lt__(e);if(-1!=r.indexOf(M(t))){if(-1!=r.indexOf(M(e)))return t=e.length)return!1;if(!R._eq(t[n],e[n]))return R._lt(t[n],e[n])}return t.length=r.length)return!1;if(!R._eq(e[n],r[n]))return R._lt(e[n],r[n])}return e.length<=r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r)){if(R._isset(r))e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)});else if(R._isul4set(r))for(var a in e.forEach(function(t){r.items[t]||(o=!0)}),r.items)if(!e.has(a)){i=!0;break}}else if(R._isul4set(r)){if(R._isset(r)){for(var u in e.items)if(!r.has(u)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var s in e.items)if(!r.items[s]){o=!0;break}for(var l in r.items)if(!e.items[l]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable("<=",e,r)},R._gt=function(e,r){var t=["boolean","number"];if(e&&"function"==typeof e.__gt__)return e.__gt__(r);if(-1!=t.indexOf(M(e))){if(-1!=t.indexOf(M(r)))return rr.getTime()}else if(R._islist(e)){if(R._islist(r)){if(e===r)return!1;for(var n=0;n=r.length)return!0;if(!R._eq(e[n],r[n]))return R._gt(e[n],r[n])}return e.length>r.length}}else if(R._isset(e)||R._isul4set(e)){var o=!1,i=!1;if(R._isset(r))R._isset(r)?(e.forEach(function(t){r.has(t)||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)})):R._isul4set(r)&&(e.forEach(function(t){r.items[t]||(o=!0)}),r.forEach(function(t){e.has(t)||(i=!0)}));else if(R._isul4set(r)){if(R._isset(r)){for(var a in e.items)if(!r.has(a)){o=!0;break}r.forEach(function(t){e.items[t]||(i=!0)})}else if(R._isul4set(r)){for(var u in e.items)if(!r.items[u]){o=!0;break}for(var s in r.items)if(!e.items[s]){i=!0;break}}}else R._unorderable(operator,e,r);return o?i?null:1:i?-1:0}R._unorderable(">",e,r)},R._ge=function(r,e){var t=["boolean","number"];if(r&&"function"==typeof r.__ge__)return r.__ge__(e);if(-1!=t.indexOf(M(r))){if(-1!=t.indexOf(M(e)))return e<=r}else if("string"==typeof r){if("string"==typeof e)return e<=r}else if(R._isdatetime(r)){if(R._isdatetime(e))return r.getTime()>=e.getTime()}else if(R._islist(r)){if(R._islist(e)){if(r===e)return!0;for(var n=0;n=e.length)return!0;if(!R._eq(r[n],e[n]))return R._gt(r[n],e[n])}return r.length>=e.length}}else if(R._isset(r)||R._isul4set(r)){var o=!1,i=!1;if(R._isset(e)){if(R._isset(e))r.forEach(function(t){e.has(t)||(o=!0)}),e.forEach(function(t){r.has(t)||(i=!0)});else if(R._isul4set(e))for(var a in r.forEach(function(t){e.items[t]||(o=!0)}),e.items)if(!r.has(a)){i=!0;break}}else if(R._isul4set(e)){if(R._isset(e)){for(var u in r.items)if(!e.has(u)){o=!0;break}e.forEach(function(t,e){r.items[t]||(i=!0)})}else if(R._isul4set(e)){for(var s in r.items)if(!e.items[s]){o=!0;break}for(var l in e.items)if(!r.items[l]){i=!0;break}}}else R._unorderable(operator,r,e);return o?i?null:1:i?-1:0}R._unorderable(">=",r,e)},R._iter=function(t){if("string"==typeof t||R._islist(t))return{index:0,next:function(){return this.index=r.length?{done:!0}:{value:r[this.index++],done:!1}}}}if(R._isset(t)){var e=[];return t.forEach(function(t){e.push(t)}),{index:0,next:function(){return this.index>=e.length?{done:!0}:{value:e[this.index++],done:!1}}}}if(R._isul4set(t))return R._iter(t.items);if(R._isobject(t)){var n=[];for(var o in t)n.push(o);return{index:0,next:function(){return this.index>=n.length?{done:!0}:{value:n[this.index++],done:!1}}}}throw new R.TypeError(R._type(t)+" object is not iterable")},R._str_repr=function(t,e){for(var r="",n=!1,o=!1,i=0;i":"":R._isdate(t)?R._date_repr(t,e):R._isdatetime(t)?R._datetime_repr(t,e):void 0===t?"":"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._islist(t)?R._list_repr(t,e):R._ismap(t)?R._map_repr(t,e):R._isset(t)?R._set_repr(t,e):R._isobject(t)?R._object_repr(t,e):"?"},R._repr=function(t){return R._repr_internal(t,!1)},R._ascii=function(t){return R._repr_internal(t,!0)},R._date_str=function(t){var e=t._date.getFullYear(),r=t._date.getMonth()+1,n=t._date.getDate();return e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)},R._datetime_str=function(t){var e=t.getFullYear(),r=t.getMonth()+1,n=t.getDate(),o=t.getHours(),i=t.getMinutes(),a=t.getSeconds(),u=t.getMilliseconds(),s=e+"-"+R._lpad(r.toString(),"0",2)+"-"+R._lpad(n.toString(),"0",2)+" "+R._lpad(o.toString(),"0",2)+":"+R._lpad(i.toString(),"0",2);return(a||u)&&(s+=":"+R._lpad(a.toString(),"0",2),u&&(s+="."+R._lpad(u.toString(),"0",3)+"000")),s},R._str=function(t){return void 0===t?"":null===t?"":!1===t?"False":!0===t?"True":"string"==typeof t?t:"number"==typeof t?t.toString():R._isdate(t)?R._date_str(t):R._isdatetime(t)?R._datetime_str(t):R._islist(t)?R._list_repr(t):R._isset(t)?R._set_repr(t):R._ismap(t)?R._map_repr(t):"object"===M(t)&&"function"==typeof t.__str__?t.__str__():"object"===M(t)&&"function"==typeof t.__repr__?t.__repr__():R._isobject(t)?R._object_repr(t):"?"},R._bool=function(t){if(null==t||!1===t||0===t||""===t)return!1;if(M(t),"function"==typeof t.__bool__)return t.__bool__();if(R._islist(t))return 0!==t.length;if(R._ismap(t)||R._isset(t))return 0!=t.size;if(R._isobject(t)){for(var e in t)if(t.hasOwnProperty(e))return!0;return!1}return!0},R._int=function(t,e){var r;if(null!==e){if("string"!=typeof t||!R._isint(e))throw new R.TypeError("int() requires a string and an integer");if("NaN"==(r=parseInt(t,e)).toString())throw new R.TypeError("invalid literal for int()");return r}if("string"==typeof t){if("NaN"==(r=parseInt(t)).toString())throw new R.TypeError("invalid literal for int()");return r}if("number"==typeof t)return Math.floor(t);if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("int() argument must be a string or a number")},R._float=function(t){if("string"==typeof t)return parseFloat(t);if("number"==typeof t)return t;if(!0===t)return 1;if(!1===t)return 0;throw new R.TypeError("float() argument must be a string or a number")},R._list=function(t){for(var e=R._iter(t),r=[];;){var n=e.next();if(n.done)return r;r.push(n.value)}},R._set=function(t){for(var e=R._iter(t),r=R._emptyset();;){var n=e.next();if(n.done)return r;r.add(n.value)}},R._len=function(t){if("string"==typeof t||R._islist(t))return t.length;if(R._ismap(t)||R._isset(t))return t.size;if(R._isobject(t)){var e=0;for(var r in t)++e;return e}throw new R.TypeError("object of type '"+R._type(t)+"' has no len()")},R._type=function(t){return null===t?"none":!1===t||!0===t?"bool":void 0===t?"undefined":"number"==typeof t?Math.round(t)==t?"int":"float":"function"==typeof t?"function":"function"==typeof t.ul4type?t.ul4type():R.Protocol.get(t).ul4type(t)},R._mod=function(t,e){var r=Math.floor(t/e),n=t-r*e;return 0!==n&&(e<0&&0=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n[1],o=n[0]}else if(1==n.length){if(!/^[<>=^]$/.test(n))throw new R.ValueError("illegal integer format string "+R._repr(e));i=n}var h,p=t<0;switch(p&&(t=-t),l){case"b":h=t.toString(2);break;case"c":if(p||65535"==i)h=R._str_repeat(o,s-h.length)+h;else{var _=s-h.length,f=Math.floor(_/2),d=_-f;h=R._str_repeat(o,f)+h+R._str_repeat(o,d)}return h},R._format=function(t,e,r){if(null==r)r="en";else{var n={de:null,en:null,fr:null,es:null,it:null,da:null,sv:null,nl:null,pt:null,cs:null,sk:null,pl:null,hr:null,sr:null,ro:null,hu:null,tr:null,ru:null,zh:null,ko:null,ja:null};void 0===n[r=r.toLowerCase()]&&void 0===n[r=r.split(/_/)[0]]&&(r="en")}return R._isdate(t)?R._format_datetime(t._date,e,r):R._isdatetime(t)?R._format_datetime(t,e,r):R._isint(t)?R._format_int(t,e,r):!0===t?R._format_int(1,e,r):!1===t?R._format_int(0,e,r):void 0},R._lpad=function(t,e,r){for("number"==typeof t&&(t=t.toString());t.lengththis.args.length){var u=null===t?"expected":t+"() expects";throw new R.ArgumentError(u+" at most "+this.args.length+" positional argument"+(1!=this.args.length?"s":"")+", "+e.length+" given")}}else n.push(e.slice(this.args.length));if(null===this.remkwargs){for(var s in r)if(!this.argNames[s])throw null===t?new R.ArgumentError("an argument named "+R._repr(s)+" isn't supported"):new R.ArgumentError(t+"() doesn't support an argument named "+R._repr(s))}else{var l=R._emptymap();for(var c in r)this.argNames[c]||R._setmap(l,c,r[c]);n.push(l)}return n}},{key:"bindObject",value:function(t,e,r){e=this.bindArray(t,e,r);var n,o={};for(n=0;n"}},{key:"__str__",value:function(){return this.toString()}},{key:"toString",value:function(){for(var t=[],e=0;e=c.getTime()){var h=R.SubAST.prototype._do(t,c);return[o,Math.floor(h.days()/7)+1,R.DateTimeProtocol.weekday(t)]}}}},{key:"week",value:function(t){var e=1=r.length){o="";break}if("\n"===r.charAt(t)){o="";break}--n,++t}return r.substring(e,t)+o}},{key:"line",get:function(){return null===this._line&&this._calculateLineCol(),this._line}},{key:"col",get:function(){return null===this._col&&this._calculateLineCol(),this._col}}]),n}(),R.AST.prototype._ul4onattrs=["template","pos"],R.TextAST=function(t){function r(t,e){return E(this,r),V(this,O(r).call(this,t,e))}return L(r,R.AST),P(r,[{key:"_eval",value:function(t){t.output(this.text)}},{key:"_str",value:function(t){t.push("text "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}},{key:"text",get:function(){return this.source}}]),r}(),R.IndentAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e)))._text=r,n}return L(o,R.TextAST),P(o,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"text",get:function(){return void 0!==this.template?null===this._text?this.source:this._text:null}}]),o}(),R.LineEndAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.TextAST),P(e,[{key:"_str",value:function(t){t.push("lineend "),t.push(R._repr(this.text))}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CodeAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.AST),e}(),R.ConstAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){return this.value}}]),o}(),R.ConstAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["value"]),R.ItemArgBase=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_handle_eval_list",value:function(t,e){try{return this._eval_list(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_set",value:function(t,e){try{return this._eval_set(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_dict",value:function(t,e){try{return this._eval_dict(t,e)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}},{key:"_handle_eval_call",value:function(t,e,r){try{return this._eval_call(t,e,r)}catch(t){throw t instanceof R.InternalException||t instanceof R.LocationError||this._decorate_exception(t),t}}}]),e}(),R.SeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){var r=this.value._handle_eval(t);e.push(r)}},{key:"_eval_set",value:function(t,e){var r=this.value._handle_eval(t);e.add(r)}}]),o}(),R.SeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.UnpackSeqItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).value=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_list",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.push(o.value)}}},{key:"_eval_set",value:function(t,e){for(var r=this.value._handle_eval(t),n=R._iter(r);;){var o=n.next();if(o.done)break;e.add(o.value)}}}]),o}(),R.UnpackSeqItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.DictItemAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).key=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,e){var r=this.key._handle_eval(t),n=this.value._handle_eval(t);R._setmap(e,r,n)}}]),i}(),R.DictItemAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["key","value"]),R.UnpackDictItemAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_dict",value:function(t,r){var e=this.item._handle_eval(t);if(R._islist(e))for(var n=0;n")}},{key:"_eval_call",value:function(t,e,r){var n=this.value._handle_eval(t);e.push(n)}}]),o}(),R.PosArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["value"]),R.KeywordArgAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).name=r,o.value=n,o}return L(i,R.ItemArgBase),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){if(r.hasOwnProperty(this.name))throw new R.ArgumentError("duplicate keyword argument "+this.name);var n=this.value._handle_eval(t);r[this.name]=n}}]),i}(),R.KeywordArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["name","value"]),R.UnpackListArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);e.push.apply(e,N(n))}}]),o}(),R.UnpackListArgAST.prototype._ul4onattrs=R.ItemArgBase.prototype._ul4onattrs.concat(["item"]),R.UnpackDictArgAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).item=r,n}return L(o,R.ItemArgBase),P(o,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval_call",value:function(t,e,r){var n=this.item._handle_eval(t);if(R._islist(n))for(var o=0;o")}},{key:"_eval",value:function(t){for(var e=[],r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=[],o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptyset(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptyset(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){for(var e=R._emptymap(),r=0;r")}},{key:"_eval",value:function(t){for(var e=this.container._handle_eval(t),r=t.inheritvars(),n=R._emptymap(),o=R._iter(e);;){var i=o.next();if(i.done)break;for(var a=R._unpackvar(this.varname,i.value),u=0;u")}},{key:"_eval",value:function(t){var e=this.container._handle_eval(t),a=R._iter(e),u=t.inheritvars(),s=this;return{next:function(){for(;;){var t=a.next();if(t.done)return t;for(var e=R._unpackvar(s.varname,t.value),r=0;r")}},{key:"_eval",value:function(t){return this._get(t,this.name)}},{key:"_eval_set",value:function(t,e){this._set(t,this.name,e)}},{key:"_eval_modify",value:function(t,e,r){this._modify(t,e,this.name,r)}},{key:"_get",value:function(t,e){var r=t.get(e);return void 0===r&&(r=R.functions[e]),r}},{key:"_set",value:function(t,e,r){t.set(e,r)}},{key:"_modify",value:function(t,e,r,n){var o=e._ido(t.get(r),n);t.set(r,o)}}]),o}(),R.VarAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["name"]),R.UnaryAST=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this,t,e))).obj=r,n}return L(o,R.CodeAST),P(o,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj="),this.obj._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._do(e)}}]),o}(),R.UnaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj"]),R.NegAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return null!==t&&"function"==typeof t.__neg__?t.__neg__():-t}}]),e}(),R.BitNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return-t-1}}]),e}(),R.NotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_do",value:function(t){return!R._bool(t)}}]),e}(),R.IfAST=function(t){function a(t,e,r,n,o){var i;return E(this,a),(i=V(this,O(a).call(this,t,e))).objif=r,i.objcond=n,i.objelse=o,i}return L(a,R.CodeAST),P(a,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(1),t.push("objif="),this.objif._repr(t),t.push(0),t.push("objcond="),this.objcond._repr(t),t.push(0),t.push("objelse="),this.objelse._repr(t),t.push(-1),t.push(">")}},{key:"_eval",value:function(t){var e=this.objcond._handle_eval(t);return R._bool(e)?this.objif._handle_eval(t):this.objelse._handle_eval(t)}}]),a}(),R.IfAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["objif","objcond","objelse"]),R.ReturnAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);throw new R.ReturnException(e)}},{key:"_str",value:function(t){t.push("return "),this.obj._str(t)}}]),e}(),R.PrintAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._str(e);t.output(r)}},{key:"_str",value:function(t){t.push("print "),this.obj._str(t)}}]),e}(),R.PrintXAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.UnaryAST),P(e,[{key:"_eval",value:function(t){var e=this.obj._handle_eval(t),r=R._xmlescape(e);t.output(r)}},{key:"_str",value:function(t){t.push("printx "),this.obj._str(t)}}]),e}(),R.BinaryAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj1=r,o.obj2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" obj1="),this.obj1._repr(t),t.push(" obj2="),this.obj2._repr(t),t.push(">")}},{key:"_eval",value:function(t){var e=this.obj1._handle_eval(t),r=this.obj2._handle_eval(t);return this._do(e,r)}}]),i}(),R.BinaryAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj1","obj2"]),R.ItemAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return this._get(t,e)}},{key:"_eval_set",value:function(t,e){var r=this.obj1._handle_eval(t),n=this.obj2._handle_eval(t);this._set(r,n,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj1._handle_eval(t),o=this.obj2._handle_eval(t);this._modify(e,n,o,r)}},{key:"_get",value:function(t,e){if("string"==typeof t||R._islist(t)){if(e instanceof R.slice){var r=e.start,n=e.stop;return null==r&&(r=0),null==n&&(n=t.length),t.slice(r,n)}var o=e;if(e<0&&(e+=t.length),e<0||e>=t.length)throw new R.IndexError(t,o);return t[e]}if(t&&"function"==typeof t.__getitem__)return t.__getitem__(e);if(R._ismap(t))return t.get(e);throw new R.TypeError(R._type(t)+" object is not subscriptable")}},{key:"_set",value:function(t,e,r){if(R._islist(t))if(e instanceof R.slice){var n=e.start,o=e.stop;null===n?n=0:n<0&&(n+=t.length),n<0?n=0:n>t.length&&(n=t.length),null===o?o=t.length:o<0&&(o+=t.length),o<0?o=0:o>t.length&&(o=t.length),o=t.length)throw new R.IndexError(t,u);t[e]=r}else if(t&&"function"==typeof t.__setitem__)t.__setitem__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.NotSubscriptableError(t);t[e]=r}}},{key:"_modify",value:function(t,e,r,n){this._set(e,r,t._ido(this._get(e,r),n))}}]),e}(),R.IsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t===e}}]),e}(),R.IsNotAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return t!==e}}]),e}(),R.EQAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._eq(t,e)}}]),e}(),R.NEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ne(t,e)}}]),e}(),R.LTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._lt(t,e)}}]),e}(),R.LEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._le(t,e)}}]),e}(),R.GTAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._gt(t,e)}}]),e}(),R.GEAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return R._ge(t,e)}}]),e}(),R.ContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if("string"==typeof t&&"string"==typeof e)return-1!==e.indexOf(t);if(R._islist(e))return-1!==e.indexOf(t);if(e&&"function"==typeof e.__contains__)return e.__contains__(t);if(R._ismap(e)||R._isset(e))return e.has(t);if(R._isobject(e)){for(var r in e)if(r===t)return!0;return!1}if(R._iscolor(e))return e._r===t||e._g===t||e._b===t||e._a===t;throw new R.TypeError(R._type(e)+" object is not iterable")}}]),e}(),R.NotContainsAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){return!R.ContainsAST.prototype._do(t,e)}}]),e}(),R.AddAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__add__)return t.__add__(e);if(e&&"function"==typeof e.__radd__)return e.__radd__(t);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" + "+R._type(this.obj2)+" is not supported");return R._islist(t)&&R._islist(e)?N(t).concat(N(e)):t+e}},{key:"_ido",value:function(t,e){return R._islist(t)&&R._islist(e)?(R.ListProtocol.append(t,e),t):this._do(t,e)}}]),e}(),R.SubAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BinaryAST),P(e,[{key:"_do",value:function(t,e){if(t&&"function"==typeof t.__sub__)return t.__sub__(e);if(e&&"function"==typeof e.__rsub__)return e.__rsub__(t);if(R._isdate(t)&&R._isdate(e))return this._date_sub(t,e);if(R._isdatetime(t)&&R._isdatetime(e))return this._datetime_sub(t,e);if(null===t||null===e)throw new R.TypeError(R._type(this.obj1)+" - "+R._type(this.obj2)+" is not supported");return t-e}},{key:"_date_sub",value:function(t,e){return this._datetime_sub(t._date,e._date)}},{key:"_datetime_sub",value:function(t,e){var r=t")}},{key:"_eval",value:function(t){var e=this.obj._handle_eval(t);return this._get(e,this.attrname)}},{key:"_eval_set",value:function(t,e){var r=this.obj._handle_eval(t);this._set(r,this.attrname,e)}},{key:"_eval_modify",value:function(t,e,r){var n=this.obj._handle_eval(t);this._modify(e,n,this.attrname,r)}},{key:"_get",value:function(e,t){var r=R.Protocol.get(e);try{return r.getattr(e,t)}catch(t){if(t instanceof R.AttributeError&&t.obj===e)return;throw t}}},{key:"_set",value:function(t,e,r){if("object"===M(t)&&"function"==typeof t.__setattr__)t.__setattr__(e,r);else if(R._ismap(t))t.set(e,r);else{if(!R._isobject(t))throw new R.TypeError(R._type(t)+" object has no writable attributes");t[e]=r}}},{key:"_modify",value:function(t,e,r,n){var o=this._get(e,r),i=t._ido(o,n);this._set(e,r,i)}}]),i}(),R.AttrAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["obj","attrname"]),R.CallAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).obj=r,o.args=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_makeargs",value:function(t){for(var e=[],r={},n=0;n")}},{key:"_str",value:function(t){t.push("render "),t.push(this.tag.code.replace(/\r?\n/g," ")),null!==this.indent&&(t.push(" with indent "),t.push(R._repr(this.indent.text)))}},{key:"_handle_eval",value:function(t){var e=t.withindent(null!==this.indent?this.indent.text:null),r=this.obj._handle_eval(e),n=this._makeargs(e);this._handle_additional_arguments(e,n);try{return R._callrender(e,r,n.args,n.kwargs)}catch(t){throw this._decorate_exception(t),t}}},{key:"_handle_additional_arguments",value:function(t,e){}}]),i}(),R.RenderAST.prototype._ul4onattrs=R.CallAST.prototype._ul4onattrs.concat(["indent"]),R.RenderAST.prototype._reprname="RenderAST",R.RenderXAST=function(t){function r(){return E(this,r),V(this,O(r).apply(this,arguments))}return L(r,R.RenderAST),P(r,[{key:"_handle_eval",value:function(t){t.escapes.push(R._xmlescape);var e=null;try{e=I(O(r.prototype),"_handle_eval",this).call(this,t)}finally{t.escapes.splice(t.escapes.length-1,1)}return e}}]),r}(),R.RenderBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){if(e.kwargs.hasOwnProperty("content"))throw new R.ArgumentError("duplicate keyword argument content");var r=new R.TemplateClosure(this.content,this.content.signature,t.vars);e.kwargs.content=r}}]),e}(),R.RenderBlockAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.RenderBlocksAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.RenderAST),P(e,[{key:"_handle_additional_arguments",value:function(t,e){var r=t.inheritvars();for(var n in R.BlockAST.prototype._eval.call(this,r),r.vars)if(r.vars.hasOwnProperty(n)){if(n in e.kwargs)throw new R.ArgumentError("duplicate keyword argument "+n);e.kwargs[n]=r.get(n)}}}]),e}(),R.RenderBlocksAST.prototype._ul4onattrs=R.RenderAST.prototype._ul4onattrs.concat(["content"]),R.slice=function(t){function n(t,e){var r;return E(this,n),(r=V(this,O(n).call(this))).start=t,r.stop=e,r}return L(n,R.Proto),P(n,[{key:"of",value:function(t){var e=this.start||0,r=null===this.stop?t.length:this.stop;return t.slice(e,r)}},{key:"__repr__",value:function(){return"slice("+R._repr(this.start)+", "+R._repr(this.stop)+", None)"}},{key:"__getattr__",value:function(t){switch(t){case"start":return this.start;case"stop":return this.stop;default:throw new R.AttributeError(this,t)}}}]),n}(),R.SliceAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).index1=r,o.index2=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("")}},{key:"_eval",value:function(t){var e=null!==this.index1?this.index1._handle_eval(t):null,r=null!==this.index2?this.index2._handle_eval(t):null;return new R.slice(e,r)}}]),i}(),R.SliceAST.prototype._ul4onattrs=R.CodeAST.prototype._ul4onattrs.concat(["index1","index2"]),R.SetVarAST=function(t){function i(t,e,r,n){var o;return E(this,i),(o=V(this,O(i).call(this,t,e))).lvalue=r,o.value=n,o}return L(i,R.CodeAST),P(i,[{key:"_repr",value:function(t){t.push("<"),t.push(this.constructor.name),t.push(" lvalue="),t.push(R._repr(this.lvalue)),t.push(" value="),this.value._repr(t),t.push(">")}},{key:"_eval",value:function(t){for(var e=this.value._handle_eval(t),r=R._unpackvar(this.lvalue,e),n=0;n")}},{key:"_str_varname",value:function(t,e){if(R._islist(e)){t.push("(");for(var r=0;r")}},{key:"_str",value:function(t){t.push("while "),this.condition._repr(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_eval",value:function(t){for(;;){var e=this.condition._handle_eval(t);if(!R._bool(e))break;try{I(O(o.prototype),"_eval",this).call(this,t)}catch(t){if(t instanceof R.BreakException)break;if(!(t instanceof R.ContinueException))throw t}}}}]),o}(),R.WhileBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.BreakAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.BreakException}},{key:"_str",value:function(t){t.push("break"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.ContinueAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.CodeAST),P(e,[{key:"_eval",value:function(t){throw new R.ContinueException}},{key:"_str",value:function(t){t.push("continue"),t.push(0)}},{key:"_repr",value:function(t){t.push("")}}]),e}(),R.CondBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_eval",value:function(t){for(var e=0;e")}},{key:"_str",value:function(t){t.push(this._strname),t.push(" "),this.condition._str(t),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){var e=this.condition._handle_eval(t);return R._bool(e)}}]),o}(),R.ConditionalBlockAST.prototype._ul4onattrs=R.BlockAST.prototype._ul4onattrs.concat(["condition"]),R.IfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.IfBlockAST.prototype._strname="if",R.ElIfBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.ConditionalBlockAST),e}(),R.ElIfBlockAST.prototype._strname="else if",R.ElseBlockAST=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,R.BlockAST),P(e,[{key:"_repr",value:function(t){t.push("")}},{key:"_str",value:function(t){t.push("else:"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_execute",value:function(t){return!0}}]),e}(),R.Template=function(t){function l(t,e,r,n,o,i,a,u){var s;return E(this,l),(s=V(this,O(l).call(this,t,e)))._source=r,s.name=n,s.whitespace=o,s.startdelim=i,s.enddelim=a,s.docpos=null,s.signature=u,s._asts=null,s._ul4_callsignature=u,s._ul4_rendersignature=u,s.parenttemplate=null,s}return L(l,R.BlockAST),P(l,[{key:"__getattr__",value:function(t){var r=this;switch(t){case"content":return this.content;case"source":return this.source;case"name":return this.name;case"whitespace":return this.whitespace;case"startdelim":return this.startdelim;case"enddelim":return this.enddelim;case"doc":return this.doc();case"signature":return this.signature;case"parenttemplate":return this.parenttemplate;case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;default:return I(O(l.prototype),"__getattr__",this).call(this,t)}}},{key:"ul4ondump",value:function(t){var e;if(t.dump(R.version),t.dump(this.name),t.dump(this._source),t.dump(this.whitespace),t.dump(this.startdelim),t.dump(this.enddelim),t.dump(this.docpos),t.dump(this.parenttemplate),null===this.signature||this.signature instanceof R.SignatureAST)e=this.signature;else{e=[];for(var r=0;r"!==this.enddelim&&(t.push(" enddelim="),t.push(R._repr(this.enddelim))),t.push(">")}},{key:"_str",value:function(t){t.push("def "),t.push(this.name?this.name:"unnamed"),t.push(":"),t.push(1),R.BlockAST.prototype._str.call(this,t),t.push(-1)}},{key:"_renderbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(!(t instanceof R.ReturnException))throw t}}},{key:"__render__",value:function(t,e){this._renderbound(t,e)}},{key:"render",value:function(t,e){this._renderbound(t,e)}},{key:"_rendersbound",value:function(t,e){var r=t.replaceoutput();return this._renderbound(r,e),r.getoutput()}},{key:"renders",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._rendersbound(e,t)}},{key:"doc",value:function(){return null!=this.docpos?this.docpos.of(this._source):null}},{key:"_callbound",value:function(t,e){var r=t.clone();r.vars=e;try{R.BlockAST.prototype._eval.call(this,r)}catch(t){if(t instanceof R.ReturnException)return t.result;throw t}return null}},{key:"call",value:function(t){t=t||{};var e=new R.Context;return null!==this.signature&&(t=this.signature.bindObject(this.name,[],t)),this._callbound(e,t)}},{key:"__call__",value:function(t,e){return this._callbound(t,e)}},{key:"ul4type",value:function(){return"template"}}]),l}(),R.Template.prototype._ul4_callneedsobject=!0,R.Template.prototype._ul4_callneedscontext=!0,R.Template.prototype._ul4_renderneedsobject=!0,R.Template.prototype._ul4_renderneedscontext=!0,R.SignatureAST=function(t){function o(t,e){var r;return E(this,o),(r=V(this,O(o).call(this,t,e))).params=[],r}return L(o,R.CodeAST),P(o,[{key:"ul4ondump",value:function(t){I(O(o.prototype),"ul4ondump",this).call(this,t);for(var e=[],r=0;r")}}]),o}(),R.TemplateClosure=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).template=t,n.signature=e,n.vars=r,n._ul4_callsignature=e,n._ul4_rendersignature=e,n.name=t.name,n.tag=t.tag,n.endtag=t.endtag,n._source=t._source,n.startdelim=t.startdelim,n.enddelim=t.enddelim,n.docpos=t.docpos,n.content=t.content,n}return L(o,R.Proto),P(o,[{key:"__render__",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"render",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"__call__",value:function(t,e){return this.template._callbound(t,R._inherit(this.vars,e))}},{key:"_renderbound",value:function(t,e){this.template._renderbound(t,R._inherit(this.vars,e))}},{key:"_rendersbound",value:function(t,e){return this.template._rendersbound(t,R._inherit(this.vars,e))}},{key:"__getattr__",value:function(t){var r=this;switch(t){case"render":var e=function(t,e){r._renderbound(t,e)};return R.expose(e,this.signature,{needscontext:!0,needsobject:!0}),e;case"renders":var n=function(t,e){return r._rendersbound(t,e)};return R.expose(n,this.signature,{needscontext:!0,needsobject:!0}),n;case"signature":return this.signature;default:return this.template.__getattr__(t)}}},{key:"ul4type",value:function(){return"template"}}]),o}(),R.TemplateClosure.prototype._ul4_callneedsobject=!0,R.TemplateClosure.prototype._ul4_callneedscontext=!0,R.TemplateClosure.prototype._ul4_renderneedsobject=!0,R.TemplateClosure.prototype._ul4_renderneedscontext=!0,R._rgb=function(t,e,r,n){return new this.Color(255*t,255*e,255*r,255*n)},R._xmlescape=function(t){return t=(t=(t=(t=(t=(t=R._str(t)).replace(/&/g,"&")).replace(//g,">")).replace(/'/g,"'")).replace(/"/g,""")},R._csv=function(t){return null===t?"":("string"!=typeof t&&(t=R._repr(t)),-1===t.indexOf(",")&&-1===t.indexOf('"')&&-1===t.indexOf("\n")||(t='"'+t.replace(/"/g,'""')+'"'),t)},R._chr=function(t){if("number"!=typeof t)throw new R.TypeError("chr() requires an int");return String.fromCharCode(t)},R._ord=function(t){if("string"!=typeof t||1!=t.length)throw new R.TypeError("ord() requires a string of length 1");return t.charCodeAt(0)},R._hex=function(t){if("number"!=typeof t)throw new R.TypeError("hex() requires an int");return t<0?"-0x"+t.toString(16).substr(1):"0x"+t.toString(16)},R._oct=function(t){if("number"!=typeof t)throw new R.TypeError("oct() requires an int");return t<0?"-0o"+t.toString(8).substr(1):"0o"+t.toString(8)},R._bin=function(t){if("number"!=typeof t)throw new R.TypeError("bin() requires an int");return t<0?"-0b"+t.toString(2).substr(1):"0b"+t.toString(2)},R._min=function(t){if(0==t.length)throw new R.ArgumentError("min() requires at least 1 argument, 0 given");1==t.length&&(t=t[0]);for(var e,r=R._iter(t),n=!0;;){var o=r.next();if(o.done){if(n)throw new R.ValueError("min() argument is an empty sequence!");return e}(n||o.valuee)&&(e=o.value),n=!1}},R._sum=function(t){for(var e=1",t,e)}:function(t,e){return R._cmp("<=>",t,e)},i=R._list(e);return i.sort(o),i}for(var a=[],u=0,s=R._iter(e);;++u){var l=s.next();if(l.done)break;var c=R._call(t,r,[l.value],{});a.push([c,n?-u:u,l.value])}cmp=function(t,e){var r=R._cmp("<=>",t[0],e[0]);return r||(r=R._cmp("<=>",t[1],e[1])),n?-r:r},a.sort(cmp);for(var h=[],p=0;p=a?{done:!0}:{value:e+this.index++*n,done:!1}}}},R._slice=function(t){var e,r,n,o;if(t.length<2)throw new R.ArgumentError("required slice() argument missing");if(4= 0");if(n<0)throw new R.ValueError("slice() requires a stop argument >= 0");if(o<=0)throw new R.ValueError("slice() requires a step argument > 0");var i=r,a=0,u=R._iter(e);return{next:function(){for(var t;at.length||nt.length+1&&(o=t.length+1),o}r=R._bound(r,t.length),n=R._bound(n,t.length);var i=0;if(R._islist(t)){for(var a=r;an);)++i,u+=e.length;return i},R._find=function(t,e){var r=2t._date;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.Date)return this._date>=t._date;R._unorderable(">=",this,t)}},{key:"year",value:function(){return this._date.getFullYear()}},{key:"month",value:function(){return this._date.getMonth()+1}},{key:"day",value:function(){return this._date.getDate()}},{key:"ul4type",value:function(){return"date"}}]),o}(),R.TimeDelta=function(t){function a(){var t,e=0t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>t._microseconds;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.TimeDelta)return this._days!=t._days?this._days>t._days:this._seconds!=t._seconds?this._seconds>t._seconds:this._microseconds>=t._microseconds;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.TimeDelta(-this._days,-this._seconds,-this._microseconds)}},{key:"adddate",value:function(t,e){var r=t._date.getFullYear(),n=t._date.getMonth(),o=t._date.getDate()+e;return new R.Date(r,n,o)}},{key:"_adddatetime",value:function(t,e,r,n){var o=t.getFullYear(),i=t.getMonth(),a=t.getDate()+e,u=t.getHours(),s=t.getMinutes(),l=t.getSeconds()+r,c=t.getMilliseconds()+n/1e3;return new Date(o,i,a,u,s,l,c)}},{key:"__add__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days+t._days,this._seconds+t._seconds,this._microseconds+t._microseconds);if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._days);if(R._isdatetime(t))return this._adddatetime(t,this._days,this._seconds,this._microseconds);throw new R.TypeError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(t instanceof R.TimeDelta)return new R.TimeDelta(this._days-t._days,this._seconds-t._seconds,this._microseconds-t._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._days);if(R._isdatetime(t))return this._adddatetime(t,-this._days,-this._seconds,-this._microseconds);throw new R.TypeError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days*t,this._seconds*t,this._microseconds*t);throw new R.TypeError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if("number"==typeof t)return new R.TimeDelta(this._days/t,this._seconds/t,this._microseconds/t);if(t instanceof R.TimeDelta){var e=this._days,r=t._days,n=this._seconds||t._seconds,o=this._microseconds||t._microseconds;return(n||o)&&(e=86400*e+this._seconds,r=86400*r+t._seconds,o&&(e=1e6*e+this._microseconds,r=1e6*r+t._microseconds)),e/r}throw new R.TypeError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"days":var r=function(){return e._days};return R.expose(r,[]),r;case"seconds":var n=function(){return e._seconds};return R.expose(n,[]),n;case"microseconds":var o=function(){return e._microseconds};return R.expose(o,[]),o;default:throw new R.AttributeError(this,t)}}},{key:"days",value:function(){return this._days}},{key:"seconds",value:function(){return this._seconds}},{key:"microseconds",value:function(){return this._microseconds}},{key:"ul4type",value:function(){return"timedelta"}}]),a}(),R.MonthDelta=function(t){function r(){var t,e=0t._months;R._unorderable(">",this,t)}},{key:"__ge__",value:function(t){if(t instanceof R.MonthDelta)return this._months>=t._months;R._unorderable(">=",this,t)}},{key:"__neg__",value:function(){return new R.MonthDelta(-this._months)}},{key:"_adddate",value:function(t,e){var r=this._adddatetime(t._date,e);return new R.Date(r.getFullYear(),r.getMonth()+1,r.getDate())}},{key:"_adddatetime",value:function(t,e){for(var r=t.getFullYear(),n=t.getMonth()+e,o=t.getDate(),i=t.getHours(),a=t.getMinutes(),u=t.getSeconds(),s=t.getMilliseconds();;){var l=new Date(r,n,1,i,a,u,s).getMonth(),c=new Date(r,n,o,i,a,u,s);if(c.getMonth()===l)return c;--o}}},{key:"__add__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months+t._months);if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__radd__",value:function(t){if(R._isdate(t))return this._adddate(t,this._months);if(R._isdatetime(t))return this._adddatetime(t,this._months);throw new R.ArgumentError(R._type(this)+" + "+R._type(t)+" not supported")}},{key:"__sub__",value:function(t){if(R._ismonthdelta(t))return new R.MonthDelta(this._months-t._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__rsub__",value:function(t){if(R._isdate(t))return this._adddate(t,-this._months);if(R._isdatetime(t))return this._adddatetime(t,-this._months);throw new R.ArgumentError(R._type(this)+" - "+R._type(t)+" not supported")}},{key:"__mul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__rmul__",value:function(t){if("number"==typeof t)return new R.MonthDelta(this._months*Math.floor(t));throw new R.ArgumentError(R._type(this)+" * "+R._type(t)+" not supported")}},{key:"__floordiv__",value:function(t){if("number"==typeof t)return new R.MonthDelta(Math.floor(this._months/t));if(R._ismonthdelta(t))return Math.floor(this._months/t._months);throw new R.ArgumentError(R._type(this)+" // "+R._type(t)+" not supported")}},{key:"__truediv__",value:function(t){if(R._ismonthdelta(t))return this._months/t._months;throw new R.ArgumentError(R._type(this)+" / "+R._type(t)+" not supported")}},{key:"__getattr__",value:function(t){var e=this;switch(t){case"months":var r=function(){return e._months};return R.expose(r,[]),r;default:throw new R.AttributeError(this,t)}}},{key:"months",value:function(){return this._months}},{key:"ul4type",value:function(){return"monthdelta"}}]),r}();for(var H=[R.TextAST,R.IndentAST,R.LineEndAST,R.ConstAST,R.SeqItemAST,R.UnpackSeqItemAST,R.DictItemAST,R.UnpackDictItemAST,R.PosArgAST,R.KeywordArgAST,R.UnpackListArgAST,R.UnpackDictArgAST,R.ListAST,R.ListCompAST,R.DictAST,R.DictCompAST,R.SetAST,R.SetCompAST,R.GenExprAST,R.VarAST,R.NotAST,R.NegAST,R.BitNotAST,R.IfAST,R.ReturnAST,R.PrintAST,R.PrintXAST,R.ItemAST,R.IsAST,R.IsNotAST,R.EQAST,R.NEAST,R.LTAST,R.LEAST,R.GTAST,R.GEAST,R.NotContainsAST,R.ContainsAST,R.AddAST,R.SubAST,R.MulAST,R.FloorDivAST,R.TrueDivAST,R.ModAST,R.ShiftLeftAST,R.ShiftRightAST,R.BitAndAST,R.BitXOrAST,R.BitOrAST,R.AndAST,R.OrAST,R.SliceAST,R.AttrAST,R.CallAST,R.RenderAST,R.RenderXAST,R.RenderBlockAST,R.RenderBlocksAST,R.SetVarAST,R.AddVarAST,R.SubVarAST,R.MulVarAST,R.TrueDivVarAST,R.FloorDivVarAST,R.ModVarAST,R.ShiftLeftVarAST,R.ShiftRightVarAST,R.BitAndVarAST,R.BitXOrVarAST,R.BitOrVarAST,R.ForBlockAST,R.WhileBlockAST,R.BreakAST,R.ContinueAST,R.CondBlockAST,R.IfBlockAST,R.ElIfBlockAST,R.ElseBlockAST,R.SignatureAST,R.Template],X=0;X"}}]),e}(),K.Handler=function(){function t(){E(this,t)}return P(t,[{key:"save",value:function(t){}},{key:"delete",value:function(t){}}]),t}(),K.Globals=function(t){function e(){var t;return E(this,e),(t=V(this,O(e).call(this))).version=null,t.platform=null,t.user=null,t.maxdbactions=null,t.maxtemplateruntime=null,t.flashmessages=null,t.handler=new K.Handler,t}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}],[{key:"geodist",value:function(t,e){var r=function(t){return(t=Math.sin(t))*t},n=function(t){return(t=Math.cos(t))*t},o=Math.PI/180,i=1/298.257223563,a=t.lat*o,u=t.long*o,s=e.lat*o,l=(a+s)/2,c=(a-s)/2,h=(u-e.long*o)/2,p=r(c)*n(h)+n(l)*r(h),_=n(c)*n(h)+r(l)*r(h),f=Math.atan(Math.sqrt(p/_)),d=2*f*6378.137,v=Math.sqrt(p*_)/f,m=(3*v+1)/(2*p);return d*(1+i*((3*v-1)/(2*_))*r(l)*n(c)-i*m*n(l)*r(c))}}]),e}(),K.Globals.prototype._ul4onattrs=["version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"],K.Globals.prototype._ul4attrs=R._makeset("version","platform","user","maxdbactions","maxtemplateruntime","flashmessages"),K.FlashMessage=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.FlashMessage.prototype._ul4onattrs=["timestamp","type","title","message"],K.FlashMessage.prototype._ul4attrs=R._makeset("timestamp","type","title","message"),K.App=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}},{key:"insert",value:function(){var t=0"}}]),e}(),K.View.prototype._ul4onattrs=["id","name","app","order","width","height","start","end"],K.View.prototype._ul4attrs=R._makeset("id","name","app","order","width","height","start","end"),K.DataSourceData=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.DataSourceData.prototype._ul4onattrs=["id","identifier","app","apps"],K.DataSourceData.prototype._ul4attrs=R._makeset("id","identifier","app","apps"),K.Record=function(t){function r(t){var e;return E(this,r),(e=V(this,O(r).call(this))).id=null,e.app=t,e.createdat=null,e.createdby=null,e.updatedat=null,e.updatedby=null,e.updatecount=0,e._sparsevalues=new Map,e._values=null,e._fields=null,e.children=new Map,e.attachments=null,e.errors=[],e._is_deleted=!1,e}return L(r,K.Base),P(r,[{key:"__repr__",value:function(){var t=[""),t.join("")}},{key:"is_dirty",value:function(){if(null===this.id)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.is_dirty())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"has_errors",value:function(){if(0!==this.errors.length)return!0;var t=!0,e=!1,r=void 0;try{for(var n,o=this.fields.values()[Symbol.iterator]();!(t=(n=o.next()).done);t=!0){if(n.value.has_errors())return!0}}catch(t){e=!0,r=t}finally{try{t||null==o.return||o.return()}finally{if(e)throw r}}return!1}},{key:"delete",value:function(){return this.app.globals.handler.delete(this)}},{key:"save",value:function(){this.app.globals.handler.save(this)}},{key:"update",value:function(){var t=0"}},{key:"_logsearch",value:function(t,e){}},{key:"asjson",value:function(t){return t}},{key:"search",value:function(t,e){return!1}}]),e}(),K.Control.prototype.type=null,K.Control.prototype.subtype=null,K.Control.prototype._ul4onattrs=["id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"],K.Control.prototype._ul4attrs=R._makeset("id","identifier","field","app","label","priority","order","default","ininsertprocedure","inupdateprocedure"),K.BoolControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.BoolControl.prototype.type="bool",K.IntControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator&&e.value===t}}]),e}(),K.IntControl.prototype.type="int",K.NumberControl=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Control),P(e,[{key:"search",value:function(t,e){return this._logsearch(t,e),"equals"===e.operator?e.value===t:"range"===e.operator&&(null!==t&&((null===e.minvalue||e.minvalue<=t)&&(null===e.maxvalue||t"}},{key:"value",get:function(){return this._value},set:function(t){var e=this._value;R._ne(e,t)&&(this.record.values.set(this.control.identifier,t),this._value=t,this._dirty=!0)}}]),o}(),K.LookupItem=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.LookupItem.prototype._ul4onattrs=["key","label"],K.LookupItem.prototype._ul4attrs=R._makeset("key","label"),K.User=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.User.prototype._ul4onattrs=["_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"],K.User.prototype._ul4attrs=R._makeset("_id","id","gender","firstname","surname","initials","email","language","avatarsmall","avatarlarge","keyviews"),K.File=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.File.prototype._ul4onattrs=["id","url","filename","mimetype","width","height","internalid","createdat","size"],K.File.prototype._ul4attrs=R._makeset("id","url","filename","mimetype","width","height","size","createdat"),K.Geo=function(t){function o(t,e,r){var n;return E(this,o),(n=V(this,O(o).call(this))).lat=t,n.long=e,n.info=r,n}return L(o,K.Base),P(o,[{key:"__repr__",value:function(){return""}}]),o}(),K.Geo.prototype._ul4onattrs=["lat","long","info"],K.Geo.prototype._ul4attrs=R._makeset("lat","long","info"),K.Attachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Attachment.prototype._ul4onattrs=["id","record","label","active"],K.Attachment.prototype._ul4attrs=R._makeset("id","record","label","active"),K.NoteAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.NoteAttachment.prototype.type="noteattachment",K.NoteAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.NoteAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.URLAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.URLAttachment.prototype.type="urlattachment",K.URLAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.URLAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.FileAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.FileAttachment.prototype.type="fileattachment",K.FileAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.FileAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.ImageAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),e}(),K.ImageAttachment.prototype.type="imageattachment",K.ImageAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["original","thumb","small","medium","large"]),K.ImageAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["original","thumb","small","medium","large"])),K.JSONAttachment=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Attachment),P(e,[{key:"_dumpUL4ONAttr",value:function(t){return"value"===t?R._asjson(this.value):this[t]}},{key:"_loadUL4ONAttr",value:function(t,e){"value"===t?this.value=R._fromjson(e):this[t]=e}}]),e}(),K.JSONAttachment.prototype.type="jsonattachment",K.JSONAttachment.prototype._ul4onattrs=K.Attachment.prototype._ul4onattrs.concat(["value"]),K.JSONAttachment.prototype._ul4attrs=R._makeset.apply(R,N(K.Attachment.prototype._ul4onattrs).concat(["value"])),K.Installation=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.Installation.prototype._ul4onattrs=["id","name"],K.Installation.prototype._ul4attrs=R._makeset("id","name"),K.Category=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){for(var t=[],e=this;null!==e;)t.splice(0,0,e.identifier),e=e.parent;return""}}]),e}(),K.Category.prototype._ul4onattrs=["id","identifier","name","order","parent","children","apps"],K.Category.prototype._ul4attrs=R._makeset("id","identifier","name","order","parent","children","apps"),K.KeyView=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.KeyView.prototype._ul4onattrs=["id","identifier","name","key","user"],K.KeyView.prototype._ul4attrs=R._makeset("id","identifier","name","key","user"),K.AppParameter=function(t){function e(){return E(this,e),V(this,O(e).apply(this,arguments))}return L(e,K.Base),P(e,[{key:"__repr__",value:function(){return""}}]),e}(),K.AppParameter.prototype._ul4onattrs=["id","app","identifier","description","value"],K.AppParameter.prototype._ul4attrs=R._makeset("id","app","identifier","description","value");for(var W=[K.Globals,K.App,K.View,K.DataSourceData,K.Record,K.BoolControl,K.IntControl,K.NumberControl,K.TextControl,K.EmailControl,K.URLControl,K.TelControl,K.PasswordControl,K.TextAreaControl,K.DateControl,K.DatetimeMinuteControl,K.DatetimeSecondControl,K.LookupControl,K.LookupSelectControl,K.LookupRadioControl,K.LookupChoiceControl,K.AppLookupControl,K.AppLookupSelectControl,K.AppLookupRadioControl,K.AppLookupChoiceControl,K.MultipleLookupControl,K.MultipleLookupSelectControl,K.MultipleLookupCheckboxControl,K.MultipleLookupChoiceControl,K.MultipleAppLookupControl,K.MultipleAppLookupSelectControl,K.MultipleAppLookupCheckboxControl,K.MultipleAppLookupChoiceControl,K.GeoControl,K.FileControl,K.ButtonControl,K.Field,K.LookupItem,K.User,K.File,K.Geo,K.NoteAttachment,K.URLAttachment,K.FileAttachment,K.ImageAttachment,K.JSONAttachment,K.Installation,K.Category,K.KeyView,K.AppParameter],$=0;$= this.data.length)\n\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF\");\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read a character from the buffer (return null on eof)\n\t\treadcharoreof()\n\t\t{\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\treturn null;\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read next not-whitespace character from the buffer\n\t\treadblackchar()\n\t\t{\n\t\t\tlet re_white = /\\s/;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tif (this.pos >= this.data.length)\n\t\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\tlet c = this.data.charAt(this.pos++);\n\t\t\t\tif (!c.match(re_white))\n\t\t\t\t\treturn c;\n\t\t\t}\n\t\t}\n\n\t\t// Read ``size`` characters from the buffer\n\t\tread(size)\n\t\t{\n\t\t\tif (this.pos+size > this.length)\n\t\t\t\tsize = this.length-this.pos;\n\t\t\tlet result = this.data.substring(this.pos, this.pos+size);\n\t\t\tthis.pos += size;\n\t\t\treturn result;\n\t\t}\n\n\t\t// \"unread\" one character\n\t\tbackup()\n\t\t{\n\t\t\t--this.pos;\n\t\t}\n\n\t\t// Read a number from the buffer\n\t\treadnumber()\n\t\t{\n\t\t\tlet re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlet c = this.readcharoreof();\n\t\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\t\tvalue += c;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = parseFloat(value);\n\t\t\t\t\tif (isNaN(result))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_beginfakeloading()\n\t\t{\n\t\t\tlet oldpos = this.backrefs.length;\n\t\t\tthis.backrefs.push(null);\n\t\t\treturn oldpos;\n\t\t}\n\n\t\t_endfakeloading(oldpos, value)\n\t\t{\n\t\t\tthis.backrefs[oldpos] = value;\n\t\t}\n\n\t\t_readescape(escapechar, length)\n\t\t{\n\t\t\tlet chars = this.read(length);\n\t\t\tif (chars.length != length)\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\tlet codepoint = parseInt(chars, 16);\n\t\t\tif (isNaN(codepoint))\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\treturn String.fromCharCode(codepoint);\n\t\t}\n\n\t\t// Load the next object from the buffer\n\t\tload()\n\t\t{\n\t\t\tlet typecode = this.readblackchar();\n\t\t\tlet result;\n\t\t\tswitch (typecode)\n\t\t\t{\n\t\t\t\tcase \"^\":\n\t\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\t\tcase \"n\":\n\t\t\t\tcase \"N\":\n\t\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\t\treturn null;\n\t\t\t\tcase \"b\":\n\t\t\t\tcase \"B\":\n\t\t\t\t\tresult = this.readchar();\n\t\t\t\t\tif (result === \"T\")\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\telse if (result === \"F\")\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"i\":\n\t\t\t\tcase \"I\":\n\t\t\t\tcase \"f\":\n\t\t\t\tcase \"F\":\n\t\t\t\t\tresult = this.readnumber();\n\t\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"s\":\n\t\t\t\tcase \"S\":\n\t\t\t\t\tresult = [];\n\t\t\t\t\tlet delimiter = this.readblackchar();\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet c = this.readchar();\n\t\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tif (c == \"\\\\\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet c2 = this.readchar();\n\t\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(c);\n\t\t\t\t\t}\n\t\t\t\t\tresult = result.join(\"\");\n\t\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"c\":\n\t\t\t\tcase \"C\":\n\t\t\t\t\tresult = new ul4.Color();\n\t\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._r = this.load();\n\t\t\t\t\tresult._g = this.load();\n\t\t\t\t\tresult._b = this.load();\n\t\t\t\t\tresult._a = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"x\":\n\t\t\t\tcase \"X\":\n\t\t\t\t{\n\t\t\t\t\tlet year = this.load();\n\t\t\t\t\tlet month = this.load();\n\t\t\t\t\tlet day = this.load();\n\t\t\t\t\tresult = new ul4.Date(year, month, day);\n\t\t\t\t\tif (typecode === \"X\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tcase \"z\":\n\t\t\t\tcase \"Z\":\n\t\t\t\t\tresult = new Date();\n\t\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\t\tresult.setDate(1);\n\t\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\t\tresult.setDate(this.load());\n\t\t\t\t\tresult.setHours(this.load());\n\t\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\t\tresult.setMilliseconds(this.load()/1000);\n\t\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"t\":\n\t\t\t\tcase \"T\":\n\t\t\t\t\tresult = new ul4.TimeDelta();\n\t\t\t\t\tresult._days = this.load();\n\t\t\t\t\tresult._seconds = this.load();\n\t\t\t\t\tresult._microseconds = this.load();\n\t\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"r\":\n\t\t\t\tcase \"R\":\n\t\t\t\t\tresult = new ul4.slice();\n\t\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult.start = this.load();\n\t\t\t\t\tresult.stop = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"m\":\n\t\t\t\tcase \"M\":\n\t\t\t\t\tresult = new ul4.MonthDelta();\n\t\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._months = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"l\":\n\t\t\t\tcase \"L\":\n\t\t\t\t\tthis.stack.push(\"list\");\n\t\t\t\t\tresult = [];\n\t\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.push(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"d\":\n\t\t\t\tcase \"D\":\n\t\t\t\tcase \"e\":\n\t\t\t\tcase \"E\":\n\t\t\t\t\tif (!ul4._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"ordered dictionaries are not supported at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = ul4._emptymap();\n\t\t\t\t\tthis.stack.push(typecode === \"d\" || typecode === \"D\" ? \"dict\" : \"odict\");\n\t\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tlet key = this.load();\n\t\t\t\t\t\tlet value = this.load();\n\t\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"y\":\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tthis.stack.push(\"set\");\n\t\t\t\t\tresult = ul4._makeset();\n\t\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.add(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"o\":\n\t\t\t\tcase \"O\":\n\t\t\t\t{\n\t\t\t\t\tlet oldpos;\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\t\tlet name = this.load();\n\t\t\t\t\tthis.stack.push(name);\n\t\t\t\t\tlet constructor;\n\t\t\t\t\tif (this.registry !== null)\n\t\t\t\t\t{\n\t\t\t\t\t\tconstructor = this.registry[name];\n\t\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"can't load object of type \" + ul4._repr(name) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = new constructor();\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\t\tresult.ul4onload(this);\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.ValueError(\"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t}\n\t\t}\n\n\t\t// Return an iterator for loading the content of a object\n\t\tloadcontent()\n\t\t{\n\t\t\tlet self = this;\n\t\t\treturn {\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\t\t// Always \"unread\" the typecode even at the end\n\t\t\t\t\t// so that at the end of a call to ul4onload()\n\t\t\t\t\t// the next input is the \"end of object\" marker\n\t\t\t\t\t// no matter whether ul4onload() uses loadcontent() or not.\n\t\t\t\t\tself.backup();\n\t\t\t\t\tif (typecode == \")\")\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: false, value: self.load()};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t//\n\t// UL4\n\t//\n\n\t// REs for parsing JSON\n\tul4._rvalidchars = /^[\\],:{}\\s]*$/;\n\tul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n\tul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n\tul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n\t/// Helper functions\n\n\t// Clone an object and extend it\n\tul4._inherit = function _inherit(baseobj, attrs)\n\t{\n\t\treturn Object.assign(Object.create(baseobj), attrs);\n\t};\n\n\t// Convert a map to an object\n\tul4._map2object = function _map2object(obj)\n\t{\n\t\tif (ul4._ismap(obj))\n\t\t{\n\t\t\tlet newobj = {};\n\t\t\tobj.forEach(function(value, key){\n\t\t\t\tif (typeof(key) !== \"string\")\n\t\t\t\t\tthrow new ul4.TypeError(\"keys must be strings\");\n\t\t\t\tnewobj[key] = value;\n\t\t\t});\n\t\t\treturn newobj;\n\t\t}\n\t\treturn obj;\n\t};\n\n\t// Clip a number to the range [0;max)\n\tul4._bound = function _bound(value, upper)\n\t{\n\t\tif (value < 0)\n\t\t\treturn 0;\n\t\telse if (value > upper)\n\t\t\treturn upper;\n\t\telse\n\t\t\treturn value;\n\t};\n\n\t// Create a pretty stacktrace from an exception\n\tul4._stacktrace = function _stacktrace(exc)\n\t{\n\t\tlet output = (exc instanceof ul4.Exception ? exc.constructor.name + \": \" : \"\") + exc.toString();\n\t\tif (exc.context)\n\t\t\toutput = ul4._stacktrace(exc.context) + \"\\n\\n\" + output;\n\t\treturn output;\n\t};\n\n\t// Call a function ``f`` with UL4 argument handling\n\tul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs)\n\t{\n\t\tlet finalargs;\n\t\tif (needsobject)\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t{\n\t\t\t\tif (args.length)\n\t\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\t\tfinalargs = [kwargs];\n\t\t\t}\n\t\t\telse\n\t\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t\t}\n\t\tif (needscontext)\n\t\t\tfinalargs.unshift(context);\n\t\treturn f.apply(functioncontext, finalargs);\n\t};\n\n\tul4._callfunction = function _callfunction(context, f, args, kwargs)\n\t{\n\t\tlet name = f._ul4_name || f.name;\n\t\tif (typeof(f._ul4_signature) === \"undefined\" || typeof(f._ul4_needsobject) === \"undefined\" || typeof(f._ul4_needscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(f) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n\t};\n\n\tul4._callobject = function _callobject(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_callsignature) === \"undefined\" || typeof(obj._ul4_callneedsobject) === \"undefined\" || typeof(obj._ul4_callneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n\t};\n\n\tul4._callrender = function _callrender(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_rendersignature) === \"undefined\" || typeof(obj._ul4_renderneedsobject) === \"undefined\" || typeof(obj._ul4_renderneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not renderable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n\t};\n\n\tul4._call = function _call(context, f, args, kwargs)\n\t{\n\t\tif (typeof(f) === \"function\")\n\t\t\treturn ul4._callfunction(context, f, args, kwargs);\n\t\telse if (f && typeof(f.__call__) === \"function\")\n\t\t\treturn ul4._callobject(context, f, args, kwargs);\n\t\telse\n\t\t\tthrow new ul4.TypeError(ul4._type(f) + \" is not callable\");\n\t};\n\n\tul4._unpackvar = function _unpackvar(lvalue, value)\n\t{\n\t\tif (!ul4._islist(lvalue))\n\t\t\treturn [[lvalue, value]];\n\t\telse\n\t\t{\n\t\t\tlet newvalue = [];\n\t\t\tlet iter = ul4._iter(value);\n\n\t\t\tfor (let i = 0;;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\n\t\t\t\tif (item.done)\n\t\t\t\t{\n\t\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newvalue;\n\t\t}\n\t};\n\n\tul4._formatsource = function _formatsource(out)\n\t{\n\t\tlet finalout = [];\n\t\tlet level = 0, needlf = false;\n\t\tfor (let i = 0; i < out.length; ++i)\n\t\t{\n\t\t\tlet part = out[i];\n\t\t\tif (typeof(part) === \"number\")\n\t\t\t{\n\t\t\t\tlevel += part;\n\t\t\t\tneedlf = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (needlf)\n\t\t\t\t{\n\t\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\t\tfor (let j = 0; j < level; ++j)\n\t\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\t\tneedlf = false;\n\t\t\t\t}\n\t\t\t\tfinalout.push(part);\n\t\t\t}\n\t\t}\n\t\tif (needlf)\n\t\t\tfinalout.push(\"\\n\");\n\t\treturn finalout.join(\"\");\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they have the same value\n\tul4._eq = function _eq(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__eq__) === \"function\")\n\t\t\treturn obj1.__eq__(obj2);\n\t\telse if (obj2 && typeof(obj2.__eq__) === \"function\")\n\t\t\treturn obj2.__eq__(obj1);\n\t\telse if (obj1 === null)\n\t\t\treturn obj2 === null;\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.length != obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isobject(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.hasOwnProperty(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.has(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tlet result = true;\n\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}, this);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._ismap(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn obj1 === obj2;\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they don't have the same value\n\tul4._ne = function _ne(obj1, obj2)\n\t{\n\t\tif (obj1 && typeof(obj1.__ne__) === \"function\")\n\t\t\treturn obj1.__ne__(obj2);\n\t\telse if (obj2 && typeof(obj2.__ne__) === \"function\")\n\t\t\treturn obj2.__ne__(obj1);\n\t\telse\n\t\t\treturn !ul4._eq(obj1, obj2);\n\t};\n\n\tul4._unorderable = function _unorderable(operator, obj1, obj2)\n\t{\n\t\tthrow new ul4.TypeError(\"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n\t};\n\n\t// Return:\n\t// -1 when ``obj1 < obj2``,\n\t// 0 when ``obj1 == obj2``,\n\t// 1 when ``obj1 > obj2``,\n\t// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n\t// raise TypeError if objects are uncomparable\n\t// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n\t// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\n\tul4._cmp = function _cmp(operator, obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t{\n\t\t\t\tlet v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t\t}\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn 0;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tlet res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\t\tif (res)\n\t\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2) || ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tlet in1only = false;\n\t\t\t\tlet in2only = false;\n\n\t\t\t\tfor (let iter = _iter(obj1);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj2.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let iter = _iter(obj2);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj1.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (in1only)\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ul4._unorderable(operator, obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 < obj2``\n\tul4._lt = function _lt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__lt__) === \"function\")\n\t\t\treturn obj1.__lt__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() < obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length < obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(obj1[key]))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(obj2[key]))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[obj1[key]])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[obj2[key]])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 <= obj2``\n\tul4._le = function _le(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__le__) === \"function\")\n\t\t\treturn obj1.__le__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length <= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<=\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 > obj2``\n\tul4._gt = function _gt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__gt__) === \"function\")\n\t\t\treturn obj1.__gt__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() > obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length > obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 >= obj2``\n\tul4._ge = function _ge(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__ge__) === \"function\")\n\t\t\treturn obj1.__ge__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length >= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">=\", obj1, obj2);\n\t};\n\n\t// Return an iterator for ``obj``\n\tul4._iter = function _iter(obj)\n\t{\n\t\tif (typeof(obj) === \"string\" || ul4._islist(obj))\n\t\t{\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\t\treturn {value: obj[this.index++], done: false};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isiter(obj))\n\t\t\treturn obj;\n\t\telse if (obj !== null && typeof(obj.__iter__) === \"function\")\n\t\t\treturn obj.__iter__();\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tkeys.push(key);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isset(obj))\n\t\t{\n\t\t\tlet values = [];\n\t\t\tobj.forEach(function(item) {\n\t\t\t\tvalues.push(item);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: values[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isul4set(obj))\n\t\t{\n\t\t\treturn ul4._iter(obj.items);\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tkeys.push(key);\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tthrow new ul4.TypeError(ul4._type(obj) + \" object is not iterable\");\n\t};\n\n\tul4._str_repr = function _str_repr(str, ascii)\n\t{\n\t\tlet result = \"\";\n\t\tlet squote = false, dquote = false;\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tif (c == '\"')\n\t\t\t{\n\t\t\t\tdquote = true;\n\t\t\t\tif (squote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (c == \"'\")\n\t\t\t{\n\t\t\t\tsquote = true;\n\t\t\t\tif (dquote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\t\tlet quote = (squote && !dquote) ? '\"' : \"'\";\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"'\":\n\t\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tlet escape;\n\t\t\t\t\tif (code < 32)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\t\tescape = 4;\n\t\t\t\t\telse\n\t\t\t\t\t\tescape = 8;\n\n\t\t\t\t\tif (escape === 0)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse if (escape === 2)\n\t\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\t\telse if (escape === 4)\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn quote + result + quote;\n\t};\n\n\tul4._date_repr = function _date_repr(obj, ascii)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \")\";\n\t\treturn result;\n\t};\n\n\tul4._datetime_repr = function _datetime_repr(obj, ascii)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\";\n\n\t\tif (hour || minute || second || ms)\n\t\t{\n\t\t\tresult += ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\t\tif (second || ms)\n\t\t\t{\n\t\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\t\tif (ms)\n\t\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\t}\n\t\t}\n\t\tresult += \")\";\n\n\t\treturn result;\n\t};\n\n\tul4._map_repr = function _map_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\n\t\tlet i = 0;\n\t\tobj.forEach(function(value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._list_repr = function _list_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"[\");\n\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t{\n\t\t\tlet item = obj[i];\n\t\t\tif (i)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(item, ascii));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._set_repr = function _set_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tif (!obj.size)\n\t\t\tv.push(\"/\");\n\t\telse\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t\t});\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._object_repr = function _object_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tlet i = 0;\n\t\tfor (let key in obj)\n\t\t{\n\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\tcontinue;\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._repr_internal = function _repr_internal(obj, ascii)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"None\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn \"\" + obj;\n\t\telse if (typeof(obj) === \"function\")\n\t\t\tif (obj._ul4_name || obj.name)\n\t\t\t\treturn \"\";\n\t\t\telse\n\t\t\t\treturn \"\";\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_repr(obj, ascii);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj, ascii);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj, ascii);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj, ascii);\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj, ascii);\n\t\treturn \"?\";\n\t};\n\n\t// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\n\tul4._repr = function _repr(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, false);\n\t};\n\n\tul4._ascii = function _ascii(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, true);\n\t};\n\n\tul4._date_str = function _date_str(obj)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\n\t\treturn year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\t};\n\n\tul4._datetime_str = function _datetime_str(obj)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\n\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\tif (second || ms)\n\t\t{\n\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t}\n\t\treturn result;\n\t};\n\n\tul4._str = function _str(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (obj === null)\n\t\t\treturn \"\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn obj;\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj.toString();\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_str(obj);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_str(obj);\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj);\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__str__) === \"function\")\n\t\t\treturn obj.__str__();\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj);\n\t\treturn \"?\";\n\t};\n\n\t// Convert ``obj`` to bool, according to its \"truth value\"\n\tul4._bool = function _bool(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\t\treturn false;\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) === \"object\", typeof(obj.__bool__) === \"function\")\n\t\t\t\treturn obj.__bool__();\n\t\t\tif (ul4._islist(obj))\n\t\t\t\treturn obj.length !== 0;\n\t\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\t\treturn obj.size != 0;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t{\n\t\t\t\tfor (let key in obj)\n\t\t\t\t{\n\t\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t};\n\n\t// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\n\tul4._int = function _int(obj, base)\n\t{\n\t\tlet result;\n\t\tif (base !== null)\n\t\t{\n\t\t\tif (typeof(obj) !== \"string\" || !ul4._isint(base))\n\t\t\t\tthrow new ul4.TypeError(\"int() requires a string and an integer\");\n\t\t\tresult = parseInt(obj, base);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t{\n\t\t\t\tresult = parseInt(obj);\n\t\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (typeof(obj) == \"number\")\n\t\t\t\treturn Math.floor(obj);\n\t\t\telse if (obj === true)\n\t\t\t\treturn 1;\n\t\t\telse if (obj === false)\n\t\t\t\treturn 0;\n\t\t\tthrow new ul4.TypeError(\"int() argument must be a string or a number\");\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a float\n\tul4._float = function _float(obj)\n\t{\n\t\tif (typeof(obj) === \"string\")\n\t\t\treturn parseFloat(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj;\n\t\telse if (obj === true)\n\t\t\treturn 1.0;\n\t\telse if (obj === false)\n\t\t\treturn 0.0;\n\t\tthrow new ul4.TypeError(\"float() argument must be a string or a number\");\n\t};\n\n\t// Convert ``obj`` to a list\n\tul4._list = function _list(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = [];\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.push(value.value);\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a set\n\tul4._set = function _set(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = ul4._emptyset();\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.add(value.value);\n\t\t}\n\t};\n\n\t// Return the length of ``sequence``\n\tul4._len = function _len(sequence)\n\t{\n\t\tif (typeof(sequence) == \"string\" || ul4._islist(sequence))\n\t\t\treturn sequence.length;\n\t\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\t\treturn sequence.size;\n\t\telse if (ul4._isobject(sequence))\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tfor (let key in sequence)\n\t\t\t\t++i;\n\t\t\treturn i;\n\t\t}\n\t\tthrow new ul4.TypeError(\"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n\t};\n\n\tul4._type = function _type(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"none\";\n\t\telse if (obj === false || obj === true)\n\t\t\treturn \"bool\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\t\telse if (typeof(obj) === \"function\")\n\t\t\treturn \"function\";\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj.ul4type) === \"function\")\n\t\t\t\treturn obj.ul4type();\n\t\t\telse\n\t\t\t\treturn ul4.Protocol.get(obj).ul4type(obj);\n\t\t}\n\t};\n\n\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\tul4._mod = function _mod(obj1, obj2)\n\t{\n\t\tlet div = Math.floor(obj1 / obj2);\n\t\tlet mod = obj1 - div * obj2;\n\n\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0)))\n\t\t{\n\t\t\tmod += obj2;\n\t\t\t--div;\n\t\t}\n\t\treturn obj1 - div * obj2;\n\t},\n\n\t// Return the attribute with the name ``attrname`` of the object ``obj``\n\t// If ``obj`` doesn't have such an attribute, return ``default_``\n\tul4._getattr = function _getattr(obj, attrname, default_=null)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\ttry\n\t\t{\n\t\t\treturn proto.getattr(obj, attrname);\n\t\t}\n\t\tcatch (exc)\n\t\t{\n\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === obj)\n\t\t\t\treturn default_;\n\t\t\telse\n\t\t\t\tthrow exc;\n\t\t}\n\t};\n\n\t// Return wether the object ``obj`` has an attribute with the name ``attrname``\n\tul4._hasattr = function _hasattr(obj, attrname)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.hasattr(obj, attrname);\n\t};\n\n\t// Return the names of the attributes of the object ``obj`` as a set.\n\tul4._dir = function _dir(obj)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.dir();\n\t};\n\n\t// Return whether any of the items in ``iterable`` are true\n\tul4._any = function _any(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn false;\n\t\t\t\tif (ul4._bool(item.value))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Return whether all of the items in ``iterable`` are true\n\tul4._all = function _all(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn true;\n\t\t\t\tif (!ul4._bool(item.value))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Check if ``obj`` is undefined\n\tul4._isundefined = function _isundefined(obj)\n\t{\n\t\treturn typeof(obj) === \"undefined\";\n\t};\n\n\n\t// Check if ``obj`` is *not* undefined\n\tul4._isdefined = function _isdefined(obj)\n\t{\n\t\treturn typeof(obj) !== \"undefined\";\n\t};\n\n\t// Check if ``obj`` is ``None``\n\tul4._isnone = function _isnone(obj)\n\t{\n\t\treturn obj === null;\n\t};\n\n\t// Check if ``obj`` is a boolean\n\tul4._isbool = function _isbool(obj)\n\t{\n\t\treturn typeof(obj) == \"boolean\";\n\t};\n\n\t// Check if ``obj`` is a int\n\tul4._isint = function _isint(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) == obj;\n\t};\n\n\t// Check if ``obj`` is a float\n\tul4._isfloat = function _isfloat(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) != obj;\n\t};\n\n\t// Check if ``obj`` is a string\n\tul4._isstr = function _isstr(obj)\n\t{\n\t\treturn typeof(obj) == \"string\";\n\t};\n\n\t// Check if ``obj`` is a datetime\n\tul4._isdatetime = function _isdate(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n\t};\n\n\tul4._isdate = function _isdate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Date);\n\t};\n\n\t// Check if ``obj`` is a color\n\tul4._iscolor = function _iscolor(obj)\n\t{\n\t\treturn (obj instanceof ul4.Color);\n\t};\n\n\t// Check if ``obj`` is a timedelta object\n\tul4._istimedelta = function _istimedelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.TimeDelta);\n\t};\n\n\t// Check if ``obj`` is a monthdelta object\n\tul4._ismonthdelta = function _ismonthdelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.MonthDelta);\n\t};\n\n\t// Check if ``obj`` is a template\n\tul4._istemplate = function _istemplate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure);\n\t};\n\n\t// Check if ``obj`` is a function\n\tul4._isfunction = function _isfunction(obj)\n\t{\n\t\treturn typeof(obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure));\n\t};\n\n\t// Check if ``obj`` is a list\n\tul4._islist = function _islist(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n\t};\n\n\t// Check if ``obj`` is a set\n\tul4._isset = function _isset(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n\t};\n\n\t// Check if ``obj`` is an exception (at least a UL4 exception)\n\tul4._isexception = function _isexception(obj)\n\t{\n\t\treturn (obj instanceof ul4.Exception);\n\t};\n\n\tul4._isul4set = function _isul4set(obj)\n\t{\n\t\treturn (obj instanceof ul4._Set);\n\t};\n\n\tul4._isanyset = function _isanyset(obj)\n\t{\n\t\treturn (ul4._isset(obj) || ul4._isul4set(obj));\n\t};\n\n\t// Check if ``obj`` is an iterator\n\tul4._isiter = function _isiter(obj)\n\t{\n\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.next) === \"function\";\n\t};\n\n\t// Check if ``obj`` is a JS object\n\tul4._isobject = function _isobject(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof(obj.__type__) === \"undefined\" && !(obj instanceof ul4.Proto);\n\t};\n\n\tif (ul4._havemap)\n\t{\n\t\t// Check if ``obj`` is a ``Map``\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\t\t};\n\n\t\t// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj) || ul4._ismap(obj);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn false;\n\t\t};\n\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj);\n\t\t};\n\t}\n\n\t// Repeat string ``str`` ``rep`` times\n\tul4._str_repeat = function _str_repeat(str, rep)\n\t{\n\t\tlet result = \"\";\n\t\tfor (; rep>0; --rep)\n\t\t\tresult += str;\n\t\treturn result;\n\t};\n\n\tul4._list_repeat = function _list_repeat(list, rep)\n\t{\n\t\tlet result = [];\n\t\tfor (; rep>0; --rep)\n\t\t\tfor (let i = 0; i < list.length; ++i)\n\t\t\t\tresult.push(list[i]);\n\t\treturn result;\n\t};\n\n\tul4._str_json = function _str_json(str)\n\t{\n\t\tlet result = \"\";\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += '\\\\\"';\n\t\t\t\t\tbreak;\n\t\t\t\tcase '<':\n\t\t\t\t\tresult += '\\\\u003c';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn '\"' + result + '\"';\n\t};\n\n\t// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\n\tul4._asjson = function _asjson(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"null\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (obj === false)\n\t\t\treturn \"false\";\n\t\telse if (obj === true)\n\t\t\treturn \"true\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_json(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t{\n\t\t\treturn \"\" + obj;\n\t\t}\n\t\telse if (ul4._islist(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"[\");\n\t\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t\t{\n\t\t\t\tif (i != 0)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t\t}\n\t\t\tv.push(\"]\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(value));\n\t\t\t});\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let key in obj)\n\t\t\t{\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t\t}\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isdate(obj))\n\t\t{\n\t\t\treturn \"new ul4.Date(\" + obj._date.getFullYear() + \", \" + (obj._date.getMonth()+1) + \", \" + obj._date.getDate() + \")\";\n\t\t}\n\t\telse if (ul4._isdatetime(obj))\n\t\t{\n\t\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t\t}\n\t\telse if (ul4._istimedelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.TimeDelta(\" + obj._days + \", \" + obj._seconds + \", \" + obj._microseconds + \")\";\n\t\t}\n\t\telse if (ul4._ismonthdelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.MonthDelta(\" + obj._months + \")\";\n\t\t}\n\t\telse if (ul4._iscolor(obj))\n\t\t{\n\t\t\treturn \"new ul4.Color(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t\t}\n\t\telse if (ul4._istemplate(obj))\n\t\t{\n\t\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t\t}\n\t\tthrow new ul4.TypeError(\"asjson() requires a serializable object\");\n\t};\n\n\t// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\n\tul4._fromjson = function _fromjson(string)\n\t{\n\t\t// The following is from jQuery's parseJSON function\n\t\tstring = ul4.StrProtocol.strip(string);\n\t\tif (root.JSON && root.JSON.parse)\n\t\t\treturn root.JSON.parse(string);\n\t\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\t\treturn (new Function(\"return \" + string))();\n\t\tthrow new ul4.TypeError(\"invalid JSON\");\n\t};\n\n\t// Encodes ``obj`` in the UL4 Object Notation format\n\tul4._asul4on = function _asul4on(obj)\n\t{\n\t\treturn ul4.dumps(obj);\n\t};\n\n\t// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\n\tul4._fromul4on = function _fromul4on(string)\n\t{\n\t\treturn ul4.loads(string);\n\t};\n\n\tul4._format_datetime = function _format_datetime(obj, fmt, lang)\n\t{\n\t\tlet translations = {\n\t\t\tde: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\ten: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\t\txf: \"%m/%d/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p\"\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tes: {\n\t\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\t\txf: \"%d/%m/%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tit: {\n\t\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tda: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsv: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t\t},\n\t\t\tnl: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\t\txf: \"%d-%m-%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tpt: {\n\t\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tcs: {\n\t\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tsk: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tpl: {\n\t\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t\t},\n\t\t\thr: {\n\t\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsr: {\n\t\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y.\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t\t},\n\t\t\tro: {\n\t\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\thu: {\n\t\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t\t},\n\t\t\ttr: {\n\t\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tru: {\n\t\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tzh: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t\t},\n\t\t\tko: {\n\t\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t\t},\n\t\t\tja: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t\t}\n\t\t};\n\n\t\tlet translation = translations[lang];\n\n\t\tlet result = [];\n\t\tlet inspec = false;\n\t\tfor (let i = 0; i < fmt.length; ++i)\n\t\t{\n\t\t\tlet c = fmt[i];\n\t\t\tif (inspec)\n\t\t\t{\n\t\t\t\tswitch (c)\n\t\t\t\t{\n\t\t\t\t\tcase \"a\":\n\t\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"A\":\n\t\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"b\":\n\t\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"B\":\n\t\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"c\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"H\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"I\":\n\t\t\t\t\t\tc = ul4._lpad(((obj.getHours()-1) % 12)+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"j\":\n\t\t\t\t\t\tc = ul4._lpad(ul4.DateTimeProtocol.yearday(obj), \"0\", 3);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMonth()+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"p\":\n\t\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"S\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"U\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 6), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"w\":\n\t\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"W\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 0), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"X\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Y\":\n\t\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"z\":\n\t\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Z\":\n\t\t\t\t\t\t// Time zone name\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(c);\n\t\t\t\tinspec = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (c == \"%\")\n\t\t\t\t\tinspec = true;\n\t\t\t\telse\n\t\t\t\t\tresult.push(c);\n\t\t\t}\n\t\t}\n\t\treturn result.join(\"\");\n\t};\n\n\tul4._format_int = function _format_int(obj, fmt, lang)\n\t{\n\t\tlet work = fmt;\n\n\t\t// Defaults\n\t\tlet fill = ' ';\n\t\tlet align = '>'; // '<', '>', '=' or '^'\n\t\tlet sign = '-'; // '+', '-' or ' '\n\t\tlet alternate = false;\n\t\tlet minimumwidth = 0;\n\t\tlet type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t\t// Determine output type\n\t\tif (/[bcdoxXn]$/.test(work))\n\t\t{\n\t\t\ttype = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract minimum width\n\t\tif (/\\d+$/.test(work))\n\t\t{\n\t\t\tlet minimumwidthStr = /\\d+$/.exec(work);\n\t\t\twork = work.replace(/\\d+$/, \"\");\n\t\t\tif (/^0/.test(minimumwidthStr))\n\t\t\t{\n\t\t\t\talign = '=';\n\t\t\t\tfill = '0';\n\t\t\t}\n\t\t\tminimumwidth = parseInt(minimumwidthStr);\n\t\t}\n\n\t\t// Alternate form?\n\t\tif (/#$/.test(work))\n\t\t{\n\t\t\talternate = true;\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Determine sign\n\t\tif (/[+ -]$/.test(work))\n\t\t{\n\t\t\tif (type == 'c')\n\t\t\t\tthrow new ul4.ValueError(\"sign not allowed for integer format type 'c'\");\n\t\t\tsign = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract fill and align char\n\t\tif (work.length >= 3)\n\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\telse if (work.length == 2)\n\t\t{\n\t\t\tif (/[<>=^]$/.test(work))\n\t\t\t{\n\t\t\t\talign = work[1];\n\t\t\t\tfill = work[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\t\telse if (work.length == 1)\n\t\t{\n\t\t\tif (/^[<>=^]$/.test(work))\n\t\t\t\talign = work;\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\n\t\t// Basic number formatting\n\t\tlet neg = obj < 0;\n\n\t\tif (neg)\n\t\t\tobj = -obj;\n\n\t\tlet output;\n\t\tswitch (type)\n\t\t{\n\t\t\tcase 'b':\n\t\t\t\toutput = obj.toString(2);\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tif (neg || obj > 65535)\n\t\t\t\t\tthrow new ul4.ValueError(\"value out of bounds for c format\");\n\t\t\t\toutput = String.fromCharCode(obj);\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\toutput = obj.toString(8);\n\t\t\t\tbreak;\n\t\t\tcase 'x':\n\t\t\t\toutput = obj.toString(16);\n\t\t\t\tbreak;\n\t\t\tcase 'X':\n\t\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\t// FIXME: locale formatting\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// The rest of the formatting\n\t\tif (align === '=')\n\t\t{\n\t\t\tif (neg || sign !== '-')\n\t\t\t\t--minimumwidth;\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\tminimumwidth -= 2;\n\n\t\t\tif (output.length < minimumwidth)\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t\tif (output.length < minimumwidth)\n\t\t\t{\n\t\t\t\tif (align == '<')\n\t\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth-output.length);\n\t\t\t\telse if (align == '>')\n\t\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\t\t\t\telse // if (align == '^')\n\t\t\t\t{\n\t\t\t\t\tlet pad = minimumwidth - output.length;\n\t\t\t\t\tlet padBefore = Math.floor(pad/2);\n\t\t\t\t\tlet padAfter = pad-padBefore;\n\t\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// Format ``obj`` using the format string ``fmt`` in the language ``lang``\n\tul4._format = function _format(obj, fmt, lang)\n\t{\n\t\tif (typeof(lang) === \"undefined\" || lang === null)\n\t\t\tlang = \"en\";\n\t\telse\n\t\t{\n\t\t\tlet translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null};\n\t\t\tlang = lang.toLowerCase();\n\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t{\n\t\t\t\tlang = lang.split(/_/)[0];\n\t\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t\t\tlang = \"en\";\n\t\t\t}\n\t\t}\n\t\tif (ul4._isdate(obj))\n\t\t\treturn ul4._format_datetime(obj._date, fmt, lang);\n\t\tif (ul4._isdatetime(obj))\n\t\t\treturn ul4._format_datetime(obj, fmt, lang);\n\t\telse if (ul4._isint(obj))\n\t\t\treturn ul4._format_int(obj, fmt, lang);\n\t\telse if (obj === true)\n\t\t\treturn ul4._format_int(1, fmt, lang);\n\t\telse if (obj === false)\n\t\t\treturn ul4._format_int(0, fmt, lang);\n\t};\n\n\tul4._lpad = function _lpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = pad + string;\n\t\treturn string;\n\t};\n\n\tul4._rpad = function _rpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = string + pad;\n\t\treturn string;\n\t};\n\n\t// This is outside of ``Proto`` on purpose\n\t// This way reactive frameworks like ``Vue.js`` don't get to see it\n\t// and complain about mutating render functions when those create new objects.\n\tlet _nextid = 1;\n\n\tul4.Proto = class Proto\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tthis.__id__ = _nextid++;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\t// equality comparison of objects defaults to identity comparison\n\t\t__eq__(other)\n\t\t{\n\t\t\treturn this === other;\n\t\t}\n\n\t\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t\t// ``__ne__`` will be synthesized from that\n\t\t__ne__(other)\n\t\t{\n\t\t\treturn !this.__eq__(other);\n\t\t}\n\n\t\t// For other comparison operators, each method has to be implemented:\n\t\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t\t// ``>=`` calls ``__ge__``\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Signature = class Signature extends ul4.Proto\n\t{\n\t\tconstructor(...args)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.args = [];\n\t\t\tthis.argNames = {};\n\t\t\tthis.remargs = null;\n\t\t\tthis.remkwargs = null;\n\n\t\t\tlet nextDefault = false;\n\t\t\tlet lastArgname = null;\n\t\t\tfor (let i = 0; i < args.length; ++i)\n\t\t\t{\n\t\t\t\tlet argName = args[i];\n\t\t\t\tif (nextDefault)\n\t\t\t\t{\n\t\t\t\t\tthis.args.push({name: lastArgname, defaultValue: argName});\n\t\t\t\t\tthis.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (argName.substr(argName.length-1) === \"=\")\n\t\t\t\t\t{\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length-1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tthis.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tthis.remargs = argName.substr(1);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.args.push({name: argName});\n\t\t\t\t\t\tthis.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray(name, args, kwargs)\n\t\t{\n\t\t\tlet finalargs = [];\n\t\t\tlet decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (i < args.length)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null)\n\t\t\t{\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length)\n\t\t\t\t{\n\t\t\t\t\tlet prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow new ul4.ArgumentError(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null)\n\t\t\t{\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tlet remkwargs = ul4._emptymap();\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tul4._setmap(remkwargs, key, kwargs[key]);\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t}\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject(name, args, kwargs)\n\t\t{\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tlet argObject = {};\n\t\t\tlet i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn this.toString();\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t};\n\n\t// When we don't have a real ``Set`` type, emulate one that supports strings\n\tul4._Set = class _Set\n\t{\n\t\tconstructor(...items)\n\t\t{\n\t\t\tthis.items = {};\n\t\t\tthis.add(...items);\n\t\t}\n\n\t\tadd(...items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tthis.items[items[i]] = true;\n\t\t}\n\n\t\tclear()\n\t\t{\n\t\t\tthis.items = {};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose(function add(items){ self.add(...items); }, [\"*items\"]);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__contains__(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\thas(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Subtract the number of items that ``other`` has\n\t\t\t\tfor (let item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let key in other.items)\n\t\t\t\t{\n\t\t\t\t\tif (!this.items[key])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t};\n\n\tul4._Set.prototype.__type__ = \"set\";\n\n\t// Adds name and signature to a function/method and makes the method callable in templates\n\tul4.expose = function expose(f, signature, options)\n\t{\n\t\toptions = options || {};\n\t\tif (options.name)\n\t\t\tf._ul4_name = options.name;\n\t\tif (ul4._islist(signature))\n\t\t\tsignature = new ul4.Signature(...signature);\n\t\tf._ul4_signature = signature;\n\t\tf._ul4_needsobject = options.needsobject || false;\n\t\tf._ul4_needscontext = options.needscontext || false;\n\t};\n\n\t// Protocol objects for all builtin types\n\t// These objects are singleton, so we replace the constructor with the prototype object afterwards\n\tul4.Protocol = class Protocol\n\t{\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\tdir()\n\t\t{\n\t\t\treturn this.attrs;\n\t\t}\n\n\t\tget(obj)\n\t\t{\n\t\t\tif (ul4._isstr(obj))\n\t\t\t\treturn ul4.StrProtocol;\n\t\t\telse if (ul4._islist(obj))\n\t\t\t\treturn ul4.ListProtocol;\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\treturn ul4.DateProtocol;\n\t\t\telse if (ul4._isset(obj))\n\t\t\t\treturn ul4.SetProtocol;\n\t\t\telse if (ul4._ismap(obj))\n\t\t\t\treturn ul4.MapProtocol;\n\t\t\telse if (ul4._isdatetime(obj))\n\t\t\t\treturn ul4.DateTimeProtocol;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t\treturn ul4.ObjectProtocol;\n\t\t\telse\n\t\t\t\treturn ul4.Protocol;\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t\treturn obj.__getattr__(attrname);\n\t\t\telse if (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t}\n\n\t\thasattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tobj.__getattr__(attrname);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this.attrs.has(attrname);\n\t\t}\n\t};\n\n\tul4.Protocol = ul4.Protocol.prototype;\n\tul4.Protocol.attrs = ul4._emptyset();\n\n\tul4.StrProtocol = class StrProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"str\";\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\n\t\treplace(obj, old, new_, count=null)\n\t\t{\n\t\t\tif (count === null)\n\t\t\t\tcount = obj.length;\n\n\t\t\tlet result = [];\n\t\t\twhile (obj.length)\n\t\t\t{\n\t\t\t\tlet pos = obj.indexOf(old);\n\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t{\n\t\t\t\t\tresult.push(obj);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\tresult.push(new_);\n\t\t\t\tobj = obj.substr(pos + old.length);\n\t\t\t}\n\t\t\treturn result.join(\"\");\n\t\t}\n\n\t\tstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"strip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tlstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"lstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\treturn obj;\n\t\t}\n\n\t\trstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"split() requires a string\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.indexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\t\t\tobj = obj.substr(pos + sep.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.lstrip(obj, null);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.push(part);\n\t\t\t\t\t\tobj = obj.substr(part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rsplit() requires a string as second argument\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.lastIndexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.unshift(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.unshift(obj.substr(pos+sep.length));\n\t\t\t\t\t\tobj = obj.substr(0, pos);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.rstrip(obj);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\t\t\tpart = part[part.length-1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.unshift(part);\n\t\t\t\t\t\tobj = obj.substr(0, obj.length-part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsplitlines(obj, keepends=false)\n\t\t{\n\t\t\tlet pos = 0;\n\t\t\tlet lookingAtLineEnd = function lookingAtLineEnd()\n\t\t\t{\n\t\t\t\tlet c = obj[pos];\n\t\t\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\t\t\treturn 1;\n\t\t\t\tif (c === '\\r')\n\t\t\t\t{\n\t\t\t\t\tif (pos == length-1)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tif (obj[pos+1] === '\\n')\n\t\t\t\t\t\treturn 2;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\tlet result = [], length = obj.length;\n\n\t\t\tfor (pos = 0, startpos = 0;;)\n\t\t\t{\n\t\t\t\tif (pos >= length)\n\t\t\t\t{\n\t\t\t\t\tif (startpos != pos)\n\t\t\t\t\t\tresult.push(obj.substring(startpos));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tlet lineendlen = lookingAtLineEnd();\n\t\t\t\tif (!lineendlen)\n\t\t\t\t\t++pos;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet endpos = pos + (keepends ? lineendlen : 0);\n\t\t\t\t\tresult.push(obj.substring(startpos, endpos));\n\t\t\t\t\tpos += lineendlen;\n\t\t\t\t\tstartpos = pos;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlower(obj)\n\t\t{\n\t\t\treturn obj.toLowerCase();\n\t\t}\n\n\t\tupper(obj)\n\t\t{\n\t\t\treturn obj.toUpperCase();\n\t\t}\n\n\t\tcapitalize(obj)\n\t\t{\n\t\t\tif (obj.length)\n\t\t\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\t\t\treturn obj;\n\t\t}\n\n\t\tjoin(obj, iterable)\n\t\t{\n\t\t\tlet resultlist = [];\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresultlist.push(item.value);\n\t\t\t}\n\t\t\treturn resultlist.join(obj);\n\t\t}\n\n\t\tstartswith(obj, prefix)\n\t\t{\n\t\t\tif (typeof(prefix) === \"string\")\n\t\t\t\treturn obj.substr(0, prefix.length) === prefix;\n\t\t\telse if (ul4._islist(prefix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < prefix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlepre = prefix[i];\n\t\t\t\t\tif (obj.substr(0, singlepre.length) === singlepre)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"startswith() argument must be string\");\n\t\t}\n\n\t\tendswith(obj, suffix)\n\t\t{\n\t\t\tif (typeof(suffix) === \"string\")\n\t\t\t\treturn obj.substr(obj.length-suffix.length) === suffix;\n\t\t\telse if (ul4._islist(suffix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < suffix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlesuf = suffix[i];\n\t\t\t\t\tif (obj.substr(obj.length-singlesuf.length) === singlesuf)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"endswith() argument must be string or list of strings\");\n\t\t}\n\t};\n\n\tul4.StrProtocol = ul4.StrProtocol.prototype;\n\tul4.StrProtocol.attrs = ul4._makeset(\n\t\t\"split\",\n\t\t\"rsplit\",\n\t\t\"splitlines\",\n\t\t\"strip\",\n\t\t\"lstrip\",\n\t\t\"rstrip\",\n\t\t\"upper\",\n\t\t\"lower\",\n\t\t\"capitalize\",\n\t\t\"startswith\",\n\t\t\"endswith\",\n\t\t\"replace\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\",\n\t\t\"join\"\n\t);\n\n\tul4.expose(ul4.StrProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.replace, [\"old\", \"new\", \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.strip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.lstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.rstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.split, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.rsplit, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.splitlines, [\"keepends=\", false]);\n\tul4.expose(ul4.StrProtocol.lower, []);\n\tul4.expose(ul4.StrProtocol.upper, []);\n\tul4.expose(ul4.StrProtocol.capitalize, []);\n\tul4.expose(ul4.StrProtocol.join, [\"iterable\"]);\n\tul4.expose(ul4.StrProtocol.startswith, [\"prefix\"]);\n\tul4.expose(ul4.StrProtocol.endswith, [\"suffix\"]);\n\n\tul4.ListProtocol = class ListProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"list\";\n\t\t}\n\n\t\tappend(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.push(items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tinsert(obj, pos, items)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.splice(pos++, 0, items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tpop(obj, pos)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tlet result = obj[pos];\n\t\t\tobj.splice(pos, 1);\n\t\t\treturn result;\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\t};\n\n\tul4.ListProtocol = ul4.ListProtocol.prototype;\n\tul4.ListProtocol.attrs = ul4._makeset(\n\t\t\"append\",\n\t\t\"insert\",\n\t\t\"pop\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\"\n\t);\n\n\tul4.expose(ul4.ListProtocol.append, [\"*items\"]);\n\tul4.expose(ul4.ListProtocol.insert, [\"pos\", \"*items\"]);\n\tul4.expose(ul4.ListProtocol.pop, [\"pos=\", -1]);\n\tul4.expose(ul4.ListProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\n\tul4.MapProtocol = class MapProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj.get(attrname);\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tif (obj.has(key))\n\t\t\t\treturn obj.get(key);\n\t\t\treturn default_;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push([key, value]);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push(value);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tupdate(obj, other, kwargs)\n\t\t{\n\t\t\treturn ul4._update(obj, other, kwargs);\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.MapProtocol = ul4.MapProtocol.prototype;\n\tul4.MapProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.MapProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.MapProtocol.items, []);\n\tul4.expose(ul4.MapProtocol.values, []);\n\tul4.expose(ul4.MapProtocol.update, [\"*other\", \"**kwargs\"]);\n\tul4.expose(ul4.MapProtocol.clear, []);\n\n\tul4.SetProtocol = class SetProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"set\";\n\t\t}\n\n\t\tadd(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tobj.add(items[i]);\n\t\t\t}\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.SetProtocol = ul4.SetProtocol.prototype;\n\tul4.SetProtocol.attrs = ul4._makeset(\"add\", \"clear\");\n\n\tul4.expose(ul4.SetProtocol.add, [\"*items\"]);\n\tul4.expose(ul4.SetProtocol.clear, []);\n\n\tul4.DateProtocol = class DateProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.weekday(obj._date);\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj._date, firstweekday, mindaysinfirstweek);\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj._date.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj._date.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj._date.getFullYear();\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t\t\tlet d = obj._date;\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(d)] + \", \" + ul4._lpad(d.getDate(), \"0\", 2) + \" \" + monthname[d.getMonth()] + \" \" + d.getFullYear();\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet d = obj._date;\n\t\t\treturn d.getFullYear() + \"-\" + ul4._lpad((d.getMonth()+1).toString(), \"0\", 2) + \"-\" + ul4._lpad(d.getDate().toString(), \"0\", 2);\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.yearday(obj._date);\n\t\t}\n\t};\n\n\tul4.DateProtocol = ul4.DateProtocol.prototype;\n\tul4.DateProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateProtocol.weekday, []);\n\tul4.expose(ul4.DateProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.day, []);\n\tul4.expose(ul4.DateProtocol.month, []);\n\tul4.expose(ul4.DateProtocol.year, []);\n\tul4.expose(ul4.DateProtocol.mimeformat, []);\n\tul4.expose(ul4.DateProtocol.isoformat, []);\n\tul4.expose(ul4.DateProtocol.yearday, []);\n\n\tul4.DateTimeProtocol = class DatetimeProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"datetime\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\tlet d = obj.getDay();\n\t\t\treturn d ? d-1 : 6;\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\t// Normalize parameters\n\t\t\tfirstweekday = ul4._mod(firstweekday, 7);\n\t\t\tif (mindaysinfirstweek < 1)\n\t\t\t\tmindaysinfirstweek = 1;\n\t\t\telse if (mindaysinfirstweek > 7)\n\t\t\t\tmindaysinfirstweek = 7;\n\n\t\t\t// ``obj`` might be in the first week of the next year, or last week of\n\t\t\t// the previous year, so we might have to try those too.\n\t\t\tfor (let offset = +1; offset >= -1; --offset)\n\t\t\t{\n\t\t\t\tlet year = obj.getFullYear() + offset;\n\t\t\t\t// ``refdate`` will always be in week 1\n\t\t\t\tlet refDate = new Date(year, 0, mindaysinfirstweek);\n\t\t\t\t// Go back to the start of ``refdate``s week (i.e. day 1 of week 1)\n\t\t\t\tlet weekDayDiff = ul4._mod(ul4.DateTimeProtocol.weekday(refDate) - firstweekday, 7);\n\t\t\t\tlet weekStartYear = refDate.getFullYear();\n\t\t\t\tlet weekStartMonth = refDate.getMonth();\n\t\t\t\tlet weekStartDay = refDate.getDate() - weekDayDiff;\n\t\t\t\tlet weekStart = new Date(weekStartYear, weekStartMonth, weekStartDay);\n\t\t\t\t// Is our date ``obj`` at or after day 1 of week 1?\n\t\t\t\tif (obj.getTime() >= weekStart.getTime())\n\t\t\t\t{\n\t\t\t\t\tlet diff = ul4.SubAST.prototype._do(obj, weekStart);\n\t\t\t\t\t// Add 1, because the first week is week 1, not week 0\n\t\t\t\t\tlet week = Math.floor(diff.days()/7) + 1;\n\t\t\t\t\treturn [year, week, ul4.DateTimeProtocol.weekday(obj)];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj.getFullYear();\n\t\t}\n\n\t\thour(obj)\n\t\t{\n\t\t\treturn obj.getHours();\n\t\t}\n\n\t\tminute(obj)\n\t\t{\n\t\t\treturn obj.getMinutes();\n\t\t}\n\n\t\tsecond(obj)\n\t\t{\n\t\t\treturn obj.getSeconds();\n\t\t}\n\n\t\tmicrosecond(obj)\n\t\t{\n\t\t\treturn obj.getMilliseconds() * 1000;\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet year = obj.getFullYear();\n\t\t\tlet month = obj.getMonth()+1;\n\t\t\tlet day = obj.getDate();\n\t\t\tlet hour = obj.getHours();\n\t\t\tlet minute = obj.getMinutes();\n\t\t\tlet second = obj.getSeconds();\n\t\t\tlet ms = obj.getMilliseconds();\n\t\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\treturn result;\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\tlet leap = ul4._isleap(obj) ? 1 : 0;\n\t\t\tlet day = obj.getDate();\n\t\t\tswitch (obj.getMonth())\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn day;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn 31 + day;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn 31 + 28 + leap + day;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\t\t\tcase 4:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\t\t\tcase 5:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\t\t\tcase 6:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\t\t\tcase 7:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\t\t\tcase 8:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\t\t\tcase 9:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\t\t\tcase 10:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\t\t\tcase 11:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.DateTimeProtocol = ul4.DateTimeProtocol.prototype;\n\tul4.DateTimeProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"hour\", \"minute\", \"second\", \"microsecond\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateTimeProtocol.weekday, []);\n\tul4.expose(ul4.DateTimeProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.day, []);\n\tul4.expose(ul4.DateTimeProtocol.month, []);\n\tul4.expose(ul4.DateTimeProtocol.year, []);\n\tul4.expose(ul4.DateTimeProtocol.hour, []);\n\tul4.expose(ul4.DateTimeProtocol.minute, []);\n\tul4.expose(ul4.DateTimeProtocol.second, []);\n\tul4.expose(ul4.DateTimeProtocol.microsecond, []);\n\tul4.expose(ul4.DateTimeProtocol.mimeformat, []);\n\tul4.expose(ul4.DateTimeProtocol.isoformat, []);\n\tul4.expose(ul4.DateTimeProtocol.yearday, []);\n\n\tul4.ObjectProtocol = class ObjectProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tlet result;\n\t\t\tif (obj && typeof(obj.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\tresult = obj.__getattr__(attrname);\n\t\t\telse\n\t\t\t\tresult = obj[attrname];\n\t\t\tif (typeof(result) !== \"function\")\n\t\t\t\treturn result;\n\t\t\tlet realresult = function(...args) {\n\t\t\t\t// We can use ``apply`` here, as we know that ``obj`` is a real object.\n\t\t\t\treturn result.apply(obj, args);\n\t\t\t};\n\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\treturn realresult;\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tlet result = obj[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn default_;\n\t\t\treturn result;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push([key, obj[key]]);\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push(obj[key]);\n\t\t\treturn result;\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tfor (let key in obj)\n\t\t\t\tdelete obj[key];\n\t\t}\n\t};\n\n\tul4.ObjectProtocol = ul4.ObjectProtocol.prototype;\n\tul4.ObjectProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.ObjectProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.ObjectProtocol.items, []);\n\tul4.expose(ul4.ObjectProtocol.values, []);\n\tul4.expose(ul4.ObjectProtocol.clear, []);\n\n\tul4.Context = class Context\n\t{\n\t\tconstructor(vars)\n\t\t{\n\t\t\tif (vars === null || typeof(vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tthis.vars = vars;\n\t\t\tthis.indents = [];\n\t\t\tthis.escapes = [];\n\t\t\tthis._output = [];\n\t\t}\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext.vars = Object.create(this.vars);\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent(indent)\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tif (indent !== null)\n\t\t\t{\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t}\n\n\t\tclone(vars)\n\t\t{\n\t\t\treturn Object.create(this);\n\t\t}\n\n\t\toutput(value)\n\t\t{\n\t\t\tfor (let i = 0; i < this.escapes.length; ++i)\n\t\t\t{\n\t\t\t\tlet escape = this.escapes[i];\n\t\t\t\tvalue = escape(value);\n\t\t\t}\n\t\t\tthis._output.push(value);\n\t\t}\n\n\t\tgetoutput()\n\t\t{\n\t\t\treturn this._output.join(\"\");\n\t\t}\n\n\t\tget(name)\n\t\t{\n\t\t\treturn this.vars[name];\n\t\t}\n\n\t\tset(name, value)\n\t\t{\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t};\n\n\t/// Exceptions\n\n\t// Note that extending ``Error`` doesn't work, so we do it the \"classic\" way\n\tul4.Exception = function Exception(message, fileName, lineNumber)\n\t{\n\t\tlet instance = new Error(message, fileName, lineNumber);\n\t\tObject.setPrototypeOf(instance, Object.getPrototypeOf(this));\n\t\tinstance.__id__ = _nextid++;\n\t\tinstance.context = null;\n\t\treturn instance;\n\t};\n\n\tul4.Exception.prototype = Object.create(Error.prototype, {\n\t\tconstructor: {\n\t\t\tvalue: Error,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tconfigurable: true\n\t\t}\n\t});\n\n\tif (Object.setPrototypeOf)\n\t\tObject.setPrototypeOf(ul4.Exception, Error);\n\telse\n\t\tul4.Exception.__proto__ = Error;\n\n\tul4.Exception.prototype.__getattr__ = function __getattr__(attrname)\n\t{\n\t\tswitch (attrname)\n\t\t{\n\t\t\tcase \"context\":\n\t\t\t\treturn this.context;\n\t\t\tdefault:\n\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\t};\n\n\t// Exceptions used internally by UL4 for flow control\n\tul4.InternalException = class InternalException extends ul4.Exception\n\t{\n\t};\n\n\t// Control flow exceptions\n\tul4.ReturnException = class ReturnException extends ul4.InternalException\n\t{\n\t\tconstructor(result)\n\t\t{\n\t\t\tsuper(\"return\");\n\t\t\tthis.result = result;\n\t\t}\n\t};\n\n\tul4.BreakException = class BreakException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"break\");\n\t\t}\n\t};\n\n\tul4.ContinueException = class ContinueException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"continue\");\n\t\t}\n\t};\n\n\t// Real exceptions raised by various parts of UL4\n\tul4.SyntaxError = class SyntaxError extends ul4.Exception\n\t{\n\t};\n\n\tul4.LValueRequiredError = class LValueRequiredError extends ul4.SyntaxError\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"lvalue required\");\n\t\t}\n\t};\n\n\tul4.TypeError = class TypeError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ValueError = class ValueError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ArgumentError = class ArgumentError extends ul4.Exception\n\t{\n\t};\n\n\tul4.NotSubscriptableError = class NotSubscriptableError extends ul4.Exception\n\t{\n\t\tconstructor(obj)\n\t\t{\n\t\t\tsuper(\"Object of type \" + _type(obj) + \" is not subscriptable\");\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"Object of type \" + _type(this.obj) + \" is not subscriptable\";\n\t\t}\n\t};\n\n\tul4.ZeroDivisionError = class ZeroDivisionError extends ul4.Exception\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"division by zero\");\n\t\t}\n\t};\n\n\tul4.IndexError = class IndexError extends ul4.Exception\n\t{\n\t\tconstructor(obj, index)\n\t\t{\n\t\t\tsuper(\"index \" + ul4._repr(index) + \" out of range\");\n\t\t\tthis.obj = obj;\n\t\t\tthis.index = index;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"index \" + this.index + \" out of range for \" + ul4._type(this.obj);\n\t\t}\n\t};\n\n\tul4.AttributeError = class AttributeError extends ul4.Exception\n\t{\n\t\tconstructor(obj, attrname)\n\t\t{\n\t\t\tsuper(\"object of type \" + ul4._type(obj) + \" has no attribute \" + ul4._repr(attrname));\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\t};\n\n\t/// Exception that wraps other exceptions while they bubble up the stack\n\tul4.LocationError = class LocationError extends ul4.Exception\n\t{\n\t\tconstructor(location)\n\t\t{\n\t\t\tsuper(\"nested exception in \" + ul4._repr(location));\n\t\t\tthis.location = location;\n\t\t}\n\n\t\t_templateprefix()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tlet first = true;\n\t\t\twhile (template != null)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet templateprefix = this._templateprefix();\n\n\t\t\tlet prefix = this.location.sourceprefix;\n\t\t\tlet code = this.location.source;\n\t\t\tlet suffix = this.location.sourcesuffix;\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\n\t\t\tlet text = prefix + code + suffix;\n\t\t\tlet underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\tlet pos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + this.location.line + \"; col \" + this.location.col;\n\n\t\t\tlet message = templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t\treturn message;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"context\":\n\t\t\t\t\treturn this.context;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\t/// Classes for the syntax tree\n\tul4.AST = class AST extends ul4.Proto\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.pos = pos;\n\t\t\tthis._line = null;\n\t\t\tthis._col = null;\n\t\t}\n\n\t\tget fullsource()\n\t\t{\n\t\t\treturn this.template._source;\n\t\t}\n\n\t\tget source()\n\t\t{\n\t\t\treturn this.pos.of(this.template._source);\n\t\t}\n\n\t\tget sourceprefix()\n\t\t{\n\t\t\tlet outerstartpos = this.pos.start;\n\t\t\tlet innerstartpos = outerstartpos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxprefix = 40;\n\t\t\tlet preprefix = \"\\u2026\";\n\t\t\twhile (maxprefix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the start of the source code\n\t\t\t\tif (outerstartpos === 0)\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the start of the line\n\t\t\t\tif (source.charAt(outerstartpos-1) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxprefix;\n\t\t\t\t--outerstartpos;\n\t\t\t}\n\t\t\treturn preprefix + source.substring(outerstartpos, innerstartpos);\n\t\t}\n\n\t\tget sourcesuffix()\n\t\t{\n\t\t\tlet outerstoppos = this.pos.stop;\n\t\t\tlet innerstoppos = outerstoppos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxsuffix = 40;\n\t\t\tlet postsuffix = \"\\u2026\";\n\t\t\twhile (maxsuffix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the ed of the source code\n\t\t\t\tif (outerstoppos >= source.length)\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the end of the line\n\t\t\t\tif (source.charAt(outerstoppos) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxsuffix;\n\t\t\t\t++outerstoppos;\n\t\t\t}\n\t\t\treturn source.substring(innerstoppos, outerstoppos) + postsuffix;\n\t\t}\n\n\t\tget line()\n\t\t{\n\t\t\tif (this._line === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._line;\n\t\t}\n\n\t\tget col()\n\t\t{\n\t\t\tif (this._col === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._col;\n\t\t}\n\n\t\t_calculateLineCol()\n\t\t{\n\t\t\tthis._line = 1\n\t\t\tthis._col = 1;\n\t\t\tlet stop = this.pos.start;\n\t\t\tfor (let i = 0; i < stop; ++i)\n\t\t\t{\n\t\t\t\tif (this.template.source[i] === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\t++this._line;\n\t\t\t\t\tthis._col = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++this._col;\n\t\t\t}\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tif (attrname === \"type\" || attrname === \"fullsource\" || attrname === \"source\" || attrname === \"sourceprefix\" || attrname === \"sourcesuffix\" || attrname === \"line\" || attrname === \"col\")\n\t\t\t\treturn this[attrname];\n\t\t\telse if (this._ul4onattrs.indexOf(attrname) >= 0)\n\t\t\t\treturn this[attrname];\n\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\n\t\t__setitem__(attrname, value)\n\t\t{\n\t\t\tthrow new ul4.TypeError(\"object is immutable\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t_decorate_exception(exc)\n\t\t{\n\t\t\twhile (exc.context !== undefined && exc.context !== null)\n\t\t\t\texc = exc.context;\n\t\t\texc.context = new ul4.LocationError(this);\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_handle_eval_modify(context, operator, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this.source.replace(/\\r?\\n/g, ' '));\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tencoder.dump(this[attrname]);\n\t\t\t}\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tthis[attrname] = decoder.load();\n\t\t\t}\n\t\t}\n\t};\n\n\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\tul4.AST.prototype._ul4onattrs = [\"template\", \"pos\"];\n\n\tul4.TextAST = class TextAST extends ul4.AST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\treturn this.source;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.IndentAST = class IndentAST extends ul4.TextAST\n\t{\n\t\tconstructor(template, pos, text)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._text = text;\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\tif (typeof(this.template) !== \"undefined\")\n\t\t\t\treturn this._text === null ? this.source : this._text;\n\t\t\telse\n\t\t\t\treturn null;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < context.indents.length; ++i)\n\t\t\t{\n\t\t\t\tlet indent = context.indents[i];\n\t\t\t\tcontext.output(indent);\n\t\t\t}\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tif (this._text === this.source)\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this._text);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tthis._text = decoder.load();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.LineEndAST = class LineEndAST extends ul4.TextAST\n\t{\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CodeAST = class CodeAST extends ul4.AST\n\t{\n\t};\n\n\tul4.ConstAST = class ConstAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this.value;\n\t\t}\n\t};\n\n\tul4.ConstAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.ItemArgBase = class ItemArgBase extends ul4.CodeAST\n\t{\n\t\t_handle_eval_list(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_dict(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_call(context, args, kwargs)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SeqItemAST = class SeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t};\n\n\tul4.SeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.UnpackSeqItemAST = class UnpackSeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackSeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.DictItemAST = class DictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, key, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet key = this.key._handle_eval(context);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tul4._setmap(result, key, value);\n\t\t}\n\t};\n\n\tul4.DictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"key\", \"value\"]),\n\n\tul4.UnpackDictItemAST = class UnpackDictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(result, subitem[0], subitem[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t\tul4._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.PosArgAST = class PosArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t};\n\n\tul4.PosArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.KeywordArgAST = class KeywordArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, name, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + this.name);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t};\n\n\tul4.KeywordArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"name\", \"value\"]);\n\n\tul4.UnpackListArgAST = class UnpackListArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\targs.push(...item);\n\t\t}\n\t};\n\n\tul4.UnpackListArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.UnpackDictArgAST = class UnpackDictArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tlet [key, value] = subitem;\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.ListAST = class ListAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_list(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.ListCompAST = class ListCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = [];\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.SetAST = class SetAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptyset();\n\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_set(context, result);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.SetCompAST = class SetCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"item\":\n\t\t\t\t\treturn this.item;\n\t\t\t\tcase \"varname\":\n\t\t\t\t\treturn this.varname;\n\t\t\t\tcase \"container\":\n\t\t\t\t\treturn this.container;\n\t\t\t\tcase \"condition\":\n\t\t\t\t\treturn this.condition;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptyset();\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.DictAST = class DictAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn this.items;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptymap();\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_dict(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.DictCompAST = class DictCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, key, value, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptymap();\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t{\n\t\t\t\t\tlet key = this.key._handle_eval(localcontext);\n\t\t\t\t\tlet value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.GenExprAST = class GenExprAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\t\t\tlet iter = ul4._iter(container);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet self = this;\n\n\t\t\tlet result = {\n\t\t\t\tnext: function(){\n\t\t\t\t\twhile (true)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tlet varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn {value: value, done: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.GenExprAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.VarAST = class VarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, name)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this._get(context, this.name);\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthis._set(context, this.name, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t}\n\n\t\t_get(context, name)\n\t\t{\n\t\t\tlet result = context.get(name);\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t}\n\n\t\t_set(context, name, value)\n\t\t{\n\t\t\tcontext.set(name, value);\n\t\t}\n\n\t\t_modify(context, operator, name, value)\n\t\t{\n\t\t\tlet newvalue = operator._ido(context.get(name), value);\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t};\n\n\tul4.VarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"name\"]);\n\n\tul4.UnaryAST = class UnaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t};\n\n\tul4.UnaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\"]);\n\n\t// Negation\n\tul4.NegAST = class NegAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\tif (obj !== null && typeof(obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t};\n\n\t// Bitwise not\n\tul4.BitNotAST = class BitNotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn -obj-1;\n\t\t}\n\t};\n\n\t// Not\n\tul4.NotAST = class NotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t};\n\n\t// If expression\n\tul4.IfAST = class IfAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, objif, objcond, objelse)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.objif = objif;\n\t\t\tthis.objcond = objcond;\n\t\t\tthis.objelse = objelse;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result;\n\t\t\tlet condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.IfAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]);\n\n\tul4.ReturnAST = class ReturnAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = this.obj._handle_eval(context);\n\t\t\tthrow new ul4.ReturnException(result);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintAST = class PrintAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintXAST = class PrintXAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.BinaryAST = class BinaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj1, obj2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj1 = obj1;\n\t\t\tthis.obj2 = obj2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.BinaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj1\", \"obj2\"]);\n\n\t// Item access and assignment: dict[key], list[index], string[index], color[index]\n\tul4.ItemAST = class ItemAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tlet result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t}\n\n\t\t_get(container, key)\n\t\t{\n\t\t\tif (typeof(container) === \"string\" || ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof(start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof(stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__getitem__) === \"function\") // objects without ``_getitem__`` don't support item access\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not subscriptable\");\n\t\t}\n\n\t\t_set(container, key, value)\n\t\t{\n\t\t\tif (ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop-start); // Remove old element\n\t\t\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.NotSubscriptableError(container);\n\t\t}\n\n\t\t_modify(operator, container, key, value)\n\t\t{\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t};\n\n\t// Identifty test operator ``is``\n\tul4.IsAST = class IsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t};\n\n\t// Inverted identity test operator ``is not``\n\tul4.IsNotAST = class IsNotAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t};\n\n\t// Comparison operator ==\n\tul4.EQAST = class EQAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator !=\n\tul4.NEAST = class NEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <\n\tul4.LTAST = class LTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <=\n\tul4.LEAST = class LEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >\n\tul4.GTAST = class GTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >=\n\tul4.GEAST = class GEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t};\n\n\t// Containment test: string in string, obj in list, key in dict, value in rgb\n\tul4.ContainsAST = class ContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\tif (typeof(obj) === \"string\" && typeof(container) === \"string\")\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container))\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof(container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t{\n\t\t\t\tfor (let key in container)\n\t\t\t\t{\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container))\n\t\t\t{\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t};\n\n\t// Inverted containment test\n\tul4.NotContainsAST = class NotContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\treturn !ul4.ContainsAST.prototype._do(obj, container);\n\t\t}\n\t};\n\n\t// Addition: num + num, string + string\n\tul4.AddAST = class AddAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t\treturn [...obj1, ...obj2];\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tul4.ListProtocol.append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Substraction: num - num\n\tul4.SubAST = class SubAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\telse if (ul4._isdatetime(obj1) && ul4._isdatetime(obj2))\n\t\t\t\treturn this._datetime_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t}\n\n\t\t_date_sub(obj1, obj2)\n\t\t{\n\t\t\treturn this._datetime_sub(obj1._date, obj2._date);\n\t\t}\n\n\t\t_datetime_sub(obj1, obj2)\n\t\t{\n\t\t\tlet swap = (obj2 > obj1);\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tlet t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tlet year1 = obj1.getFullYear();\n\t\t\tlet yearday1 = ul4.DateTimeProtocol.yearday(obj1);\n\t\t\tlet year2 = obj2.getFullYear();\n\t\t\tlet yearday2 = ul4.DateTimeProtocol.yearday(obj2);\n\n\t\t\tlet diffdays = 0;\n\n\t\t\twhile (year1 > year2)\n\t\t\t{\n\t\t\t\tdiffdays += ul4.DateProtocol.yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tlet hours1 = obj1.getHours();\n\t\t\tlet minutes1 = obj1.getMinutes();\n\t\t\tlet seconds1 = obj1.getSeconds();\n\t\t\tlet hours2 = obj2.getHours();\n\t\t\tlet minutes2 = obj2.getMinutes();\n\t\t\tlet seconds2 = obj2.getSeconds();\n\n\t\t\tlet diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tlet diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn new ul4.TimeDelta(diffdays, diffseconds, 1000*diffmilliseconds);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\n\t// Multiplication: num * num, int * str, str * int, int * list, list * int\n\tul4.MulAST = class MulAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1))\n\t\t\t{\n\t\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2))\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2))\n\t\t\t{\n\t\t\t\tif (typeof(obj1) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1))\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2))\n\t\t\t{\n\t\t\t\tif (obj2 > 0)\n\t\t\t\t{\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\tlet targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Truncating division\n\tul4.FloorDivAST = class FloorDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// \"Real\" division\n\tul4.TrueDivAST = class TrueDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn obj1 / obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Modulo\n\tul4.ModAST = class ModAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._mod(obj1, obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise left shift\n\tul4.ShiftLeftAST = class ShiftLeftAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise right shift\n\tul4.ShiftRightAST = class ShiftRightAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise and\n\tul4.BitAndAST = class BitAndAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise exclusive or\n\tul4.BitXOrAST = class BitXOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise or\n\tul4.BitOrAST = class BitOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.AndAST = class AndAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.OrAST = class OrAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.AttrAST = class AttrAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, attrname)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t}\n\n\t\t_get(object, attrname)\n\t\t{\n\t\t\tlet proto = ul4.Protocol.get(object);\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn proto.getattr(object, attrname);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\treturn undefined;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_set(object, attrname, value)\n\t\t{\n\t\t\tif (typeof(object) === \"object\" && typeof(object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value);\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(object) + \" object has no writable attributes\");\n\t\t}\n\n\t\t_modify(operator, object, attrname, value)\n\t\t{\n\t\t\tlet oldvalue = this._get(object, attrname);\n\t\t\tlet newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t};\n\n\tul4.AttrAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"attrname\"]);\n\n\tul4.CallAST = class CallAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.args = args;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_makeargs(context)\n\t\t{\n\t\t\tlet args = [], kwargs = {};\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\targ._handle_eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\treturn {args: args, kwargs: kwargs};\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet args = this._makeargs(context);\n\t\t\tlet result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.CallAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"args\"]);\n\n\tul4.RenderAST = class RenderAST extends ul4.CallAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos, obj, args);\n\t\t\tthis.indent = null;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this._reprname);\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.code.replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null)\n\t\t\t{\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent.text));\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tlet localcontext = context.withindent(this.indent !== null ? this.indent.text : null);\n\t\t\tlet obj = this.obj._handle_eval(localcontext);\n\t\t\tlet args = this._makeargs(localcontext);\n\t\t\tthis._handle_additional_arguments(localcontext, args);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlet result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t}\n\t};\n\n\tul4.RenderAST.prototype._ul4onattrs = ul4.CallAST.prototype._ul4onattrs.concat([\"indent\"]);\n\tul4.RenderAST.prototype._reprname = \"RenderAST\";\n\n\tul4.RenderXAST = class RenderXAST extends ul4.RenderAST\n\t{\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tcontext.escapes.push(ul4._xmlescape);\n\n\t\t\tlet result = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresult = super._handle_eval(context);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcontext.escapes.splice(context.escapes.length-1, 1);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST = class RenderBlockAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tif (args.kwargs.hasOwnProperty(\"content\"))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument content\");\n\t\t\tlet closure = new ul4.TemplateClosure(this.content, this.content.signature, context.vars);\n\t\t\targs.kwargs.content = closure;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.RenderBlocksAST = class RenderBlocksAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tlet localcontext = context.inheritvars();\n\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\n\t\t\tfor (let key in localcontext.vars)\n\t\t\t{\n\t\t\t\tif (localcontext.vars.hasOwnProperty(key))\n\t\t\t\t{\n\t\t\t\t\tif (key in args.kwargs)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\targs.kwargs[key] = localcontext.get(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.RenderBlocksAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\t// Slice object\n\tul4.slice = class slice extends ul4.Proto\n\t{\n\t\tconstructor(start, stop)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.start = start;\n\t\t\tthis.stop = stop;\n\t\t}\n\n\t\tof(string)\n\t\t{\n\t\t\tlet start = this.start || 0;\n\t\t\tlet stop = this.stop === null ? string.length : this.stop;\n\t\t\treturn string.slice(start, stop);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \", None)\";\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"start\":\n\t\t\t\t\treturn this.start;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\treturn this.stop;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\n\t// List/String slice\n\tul4.SliceAST = class SliceAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, index1, index2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.index1 = index1;\n\t\t\tthis.index2 = index2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tlet index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn new ul4.slice(index1, index2);\n\t\t}\n\t};\n\n\tul4.SliceAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"index1\", \"index2\"]);\n\n\tul4.SetVarAST = class SetVarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, lvalue, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.lvalue = lvalue;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SetVarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"lvalue\", \"value\"]);\n\n\tul4.ModifyVarAST = class ModifyVarAST extends ul4.SetVarAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_modify(context, this._operator, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.AddVarAST = class AddVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.AddVarAST.prototype._operator = ul4.AddAST.prototype;\n\n\tul4.SubVarAST = class SubVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.SubVarAST.prototype._operator = ul4.SubAST.prototype;\n\n\tul4.MulVarAST = class MulVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.MulVarAST.prototype._operator = ul4.MulAST.prototype;\n\n\tul4.TrueDivVarAST = class TrueDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.TrueDivVarAST.prototype._operator = ul4.TrueDivAST.prototype;\n\n\tul4.FloorDivVarAST = class FloorDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.FloorDivVarAST.prototype._operator = ul4.FloorDivAST.prototype;\n\n\tul4.ModVarAST = class ModVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ModVarAST.prototype._operator = ul4.ModAST.prototype;\n\n\tul4.ShiftLeftVarAST = class ShiftLeftVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftLeftVarAST.prototype._operator = ul4.ShiftLeftAST.prototype;\n\n\tul4.ShiftRightVarAST = class ShiftRightVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftRightVarAST.prototype._operator = ul4.ShiftRightAST.prototype;\n\n\tul4.BitAndVarAST = class BitAndVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitAndVarAST.prototype._operator = ul4.BitAndAST.prototype;\n\n\tul4.BitXOrVarAST = class BitXOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitXOrVarAST.prototype._operator = ul4.BitXOrAST.prototype;\n\n\tul4.BitOrVarAST = class BitOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitOrVarAST.prototype._operator = ul4.BitOrAST.prototype;\n\n\tul4.BlockAST = class BlockAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.content = [];\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.content[i];\n\t\t\t\titem._handle_eval(context);\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tif (this.content.length)\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = this.content[i];\n\t\t\t\t\titem._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.BlockAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.ForBlockAST = class ForBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, varname, container)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str_varname(out, varname)\n\t\t{\n\t\t\tif (ul4._islist(varname))\n\t\t\t{\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (let i = 0; i < varname.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t\t}\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t};\n\n\tul4.ForBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"varname\", \"container\"]);\n\n\tul4.WhileBlockAST = class WhileBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"while \");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping the original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.WhileBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.BreakAST = class BreakAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.BreakException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.ContinueAST = class ContinueAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.ContinueException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CondBlockAST = class CondBlockAST extends ul4.BlockAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet block = this.content[i];\n\t\t\t\tlet execute = block._execute(context);\n\t\t\t\tif (execute)\n\t\t\t\t{\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST = class ConditionalBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\tlet result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.IfBlockAST = class IfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.IfBlockAST.prototype._strname = \"if\";\n\n\tul4.ElIfBlockAST = class ElIfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.ElIfBlockAST.prototype._strname = \"else if\";\n\n\tul4.ElseBlockAST = class ElseBlockAST extends ul4.BlockAST\n\t{\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Template = class Template extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, source, name, whitespace, startdelim, enddelim, signature)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._source = source;\n\t\t\tthis.name = name;\n\t\t\tthis.whitespace = whitespace;\n\t\t\tthis.startdelim = startdelim;\n\t\t\tthis.enddelim = enddelim;\n\t\t\tthis.docpos = null;\n\t\t\tthis.signature = signature;\n\t\t\tthis._asts = null;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tthis.parenttemplate = null;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tlet signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this._source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || this.signature instanceof ul4.SignatureAST)\n\t\t\t\tsignature = this.signature;\n\t\t\telse\n\t\t\t{\n\t\t\t\tsignature = [];\n\t\t\t\tfor (let i = 0; i < this.signature.args.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet arg = this.signature.args[i];\n\t\t\t\t\tif (typeof(arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name+\"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tsuper.ul4ondump(encoder);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tlet version = decoder.load();\n\t\t\tlet signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow new ul4.ValueError(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow new ul4.ValueError(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\n\t\t\tthis.name = decoder.load();\n\t\t\tthis._source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = new ul4.Signature(...signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tsuper.ul4onload(decoder);\n\t\t}\n\n\t\tloads(string)\n\t\t{\n\t\t\treturn ul4.loads(string);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tlet closure = new ul4.TemplateClosure(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\")\n\t\t\t{\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.ReturnException))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t}\n\n\t\trenders(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t}\n\n\t\tdoc()\n\t\t{\n\t\t\treturn this.docpos != null ? this.docpos.of(this._source) : null;\n\t\t}\n\n\t\t_callbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.ReturnException)\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tcall(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.Template.prototype._ul4_callneedsobject = true;\n\tul4.Template.prototype._ul4_callneedscontext = true;\n\tul4.Template.prototype._ul4_renderneedsobject = true;\n\tul4.Template.prototype._ul4_renderneedscontext = true;\n\n\tul4.SignatureAST = class SignatureAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.params = [];\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tlet dump = [];\n\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tlet dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (let i = 0; i < dump.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = dump[i];\n\t\t\t\tif (typeof(param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet args = [];\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new ul4.Signature(...args);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t};\n\n\tul4.TemplateClosure = class TemplateClosure extends ul4.Proto\n\t{\n\t\tconstructor(template, signature, vars)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.signature = signature;\n\t\t\tthis.vars = vars;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tthis.name = template.name;\n\t\t\tthis.tag = template.tag;\n\t\t\tthis.endtag = template.endtag;\n\t\t\tthis._source = template._source;\n\t\t\tthis.startdelim = template.startdelim;\n\t\t\tthis.enddelim = template.enddelim;\n\t\t\tthis.docpos = template.docpos;\n\t\t\tthis.content = template.content;\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this.template._callbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\treturn this.template._rendersbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.TemplateClosure.prototype._ul4_callneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_callneedscontext = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedscontext = true;\n\n\t// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\n\tul4._rgb = function _rgb(r, g, b, a)\n\t{\n\t\treturn new this.Color(255*r, 255*g, 255*b, 255*a);\n\t};\n\n\t// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\n\tul4._xmlescape = function _xmlescape(obj)\n\t{\n\t\tobj = ul4._str(obj);\n\t\tobj = obj.replace(/&/g, \"&\");\n\t\tobj = obj.replace(//g, \">\");\n\t\tobj = obj.replace(/'/g, \"'\");\n\t\tobj = obj.replace(/\"/g, \""\");\n\t\treturn obj;\n\t};\n\n\t// Convert ``obj`` to a string suitable for output into a CSV file\n\tul4._csv = function _csv(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) !== \"string\")\n\t\t\tobj = ul4._repr(obj);\n\t\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\t\treturn obj;\n\t};\n\n\t// Return a string containing one character with the codepoint ``i``\n\tul4._chr = function _chr(i)\n\t{\n\t\tif (typeof(i) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"chr() requires an int\");\n\t\treturn String.fromCharCode(i);\n\t};\n\n\t// Return the codepoint for the one and only character in the string ``c``\n\tul4._ord = function _ord(c)\n\t{\n\t\tif (typeof(c) != \"string\" || c.length != 1)\n\t\t\tthrow new ul4.TypeError(\"ord() requires a string of length 1\");\n\t\treturn c.charCodeAt(0);\n\t};\n\n\t// Convert an integer to a hexadecimal string\n\tul4._hex = function _hex(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"hex() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0x\" + number.toString(16).substr(1);\n\t\telse\n\t\t\treturn \"0x\" + number.toString(16);\n\t};\n\n\t// Convert an integer to a octal string\n\tul4._oct = function _oct(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"oct() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0o\" + number.toString(8).substr(1);\n\t\telse\n\t\t\treturn \"0o\" + number.toString(8);\n\t};\n\n\t// Convert an integer to a binary string\n\tul4._bin = function _bin(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"bin() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0b\" + number.toString(2).substr(1);\n\t\telse\n\t\t\treturn \"0b\" + number.toString(2);\n\t};\n\n\t// Return the minimum value\n\tul4._min = function _min(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"min() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"min() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value < result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the maximum value\n\tul4._max = function _max(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"max() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"max() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value > result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the of the values from the iterable starting with ``start`` (default ``0``)\n\tul4._sum = function _sum(iterable, start=0)\n\t{\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tstart += item.value;\n\t\t}\n\t\treturn start;\n\t};\n\n\t// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._first = function _first(iterable, defaultValue=null)\n\t{\n\t\tlet item = ul4._iter(iterable).next();\n\t\treturn item.done ? defaultValue : item.value;\n\t};\n\n\t// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._last = function _last(iterable, defaultValue=null)\n\t{\n\t\tlet value = defaultValue;\n\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvalue = item.value;\n\t\t}\n\t\treturn value;\n\t};\n\n\t// Return a sorted version of ``iterable``\n\tul4._sorted = function _sorted(context, iterable, key=null, reverse=false)\n\t{\n\t\tif (key === null)\n\t\t{\n\t\t\t// FIXME: stability\n\t\t\tlet cmp = reverse ? function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t} : function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t};\n\t\t\tlet result = ul4._list(iterable);\n\t\t\tresult.sort(cmp);\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet sort = [];\n\n\t\t\tfor (let i = 0, iter = ul4._iter(iterable);;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\t\t// For a stable sorting we have to use the nagative index if\n\t\t\t\t// reverse sorting is specified\n\t\t\t\tsort.push([keyvalue, reverse ? -i : i, item.value]);\n\t\t\t}\n\t\t\tcmp = function cmp(s1, s2)\n\t\t\t{\n\t\t\t\tlet res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn reverse ? -res : res;\n\t\t\t\tres = ul4._cmp(\"<=>\", s1[1], s2[1]);\n\t\t\t\treturn reverse ? -res : res;\n\t\t\t};\n\n\t\t\tsort.sort(cmp);\n\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < sort.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = sort[i];\n\t\t\t\tresult.push(item[2]);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\t// Return a iterable object iterating from ``start`` up to (but not including) ``stop`` with a step size of ``step``\n\tul4._range = function _range(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required range() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet lower, higher;\n\t\tif (step === 0)\n\t\t\tthrow new ul4.ValueError(\"range() requires a step argument != 0\");\n\t\telse if (step > 0)\n\t\t{\n\t\t\tlower = start;\n\t\t\thigher = stop;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlower = stop;\n\t\t\thigher = start;\n\t\t}\n\t\tlet length = (lower < higher) ? Math.floor((higher - lower - 1)/Math.abs(step)) + 1 : 0;\n\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function()\n\t\t\t{\n\t\t\t\tif (this.index >= length)\n\t\t\t\t\treturn {done: true};\n\t\t\t\treturn {value: start + (this.index++) * step, done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return a iterable object returning a slice from the argument\n\tul4._slice = function _slice(args)\n\t{\n\t\tlet iterable, start, stop, step;\n\t\tif (args.length < 2)\n\t\t\tthrow new ul4.ArgumentError(\"required slice() argument missing\");\n\t\telse if (args.length > 4)\n\t\t\tthrow new ul4.ArgumentError(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = 0;\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 4)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = args[3] !== null ? args[3] : 1;\n\t\t}\n\t\tif (start < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a start argument >= 0\");\n\t\tif (stop < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a stop argument >= 0\");\n\t\tif (step <= 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a step argument > 0\");\n\n\t\tlet next = start, count = 0;\n\t\tlet iter = ul4._iter(iterable);\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet result;\n\t\t\t\twhile (count < next)\n\t\t\t\t{\n\t\t\t\t\tresult = iter.next();\n\t\t\t\t\tif (result.done)\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\tif (stop !== null && count >= stop)\n\t\t\t\t\treturn {done: true};\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t\tnext += step;\n\t\t\t\tif (stop !== null && next > stop)\n\t\t\t\t\tnext = stop;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// ``%`` escape unsafe characters in the string ``string``\n\tul4._urlquote = function _urlquote(string)\n\t{\n\t\treturn encodeURIComponent(string);\n\t};\n\n\t// The inverse function of ``urlquote``\n\tul4._urlunquote = function _urlunquote(string)\n\t{\n\t\treturn decodeURIComponent(string);\n\t};\n\n\t// Return a reverse iterator over ``sequence``\n\tul4._reversed = function _reversed(sequence)\n\t{\n\t\tif (typeof(sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn {\n\t\t\tindex: sequence.length-1,\n\t\t\tnext: function() {\n\t\t\t\treturn this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Returns a random number in the interval ``[0;1[``\n\tul4._random = function _random()\n\t{\n\t\treturn Math.random();\n\t};\n\n\t// Return a randomly select item from ``range(start, stop, step)``\n\tul4._randrange = function _randrange(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required randrange() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet width = stop-start;\n\n\t\tlet value = Math.random();\n\n\t\tlet n;\n\t\tif (step > 0)\n\t\t\tn = Math.floor((width + step - 1) / step);\n\t\telse if (step < 0)\n\t\t\tn = Math.floor((width + step + 1) / step);\n\t\telse\n\t\t\tthrow new ul4.ValueError(\"randrange() requires a step argument != 0\");\n\t\treturn start + step*Math.floor(value * n);\n\t};\n\n\t// Return a random item/char from the list/string ``sequence``\n\tul4._randchoice = function _randchoice(sequence)\n\t{\n\t\tlet iscolor = ul4._iscolor(sequence);\n\t\tif (typeof(sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\t\tthrow new ul4.TypeError(\"randchoice() requires a string or list\");\n\t\tif (iscolor)\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn sequence[Math.floor(Math.random() * sequence.length)];\n\t};\n\n\t// Round a number ``x`` to ``digits`` decimal places (may be negative)\n\tul4._round = function _round(x, digits=0)\n\t{\n\t\tif (digits)\n\t\t{\n\t\t\tlet threshold = Math.pow(10, digits);\n\t\t\treturn Math.round(x*threshold)/threshold;\n\t\t}\n\t\telse\n\t\t\treturn Math.round(x);\n\t};\n\n\t// Return a hex-encode MD5 hash of the argument\n\t// This uses the md5 function from https://github.com/blueimp/JavaScript-MD5\n\tif (iscommon)\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\tlet md5 = require('blueimp-md5');\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\n\t// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\n\tul4._enumerate = function _enumerate(iterable, start=0)\n\t{\n\t\treturn {\n\t\t\titer: ul4._iter(iterable),\n\t\t\tindex: start,\n\t\t\tnext: function() {\n\t\t\t\tlet item = this.iter.next();\n\t\t\t\treturn item.done ? item : {value: [this.index++, item.value], done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\n\tul4._isfirst = function _isfirst(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = item.done ? item : {value: [isfirst, item.value], done: false};\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\n\tul4._islast = function _islast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._isfirstlast = function _isfirstlast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._enumfl = function _enumfl(iterable, start=0)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet i = start;\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [i++, isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\n\tul4._zip = function _zip(iterables)\n\t{\n\t\tlet result;\n\t\tif (iterables.length)\n\t\t{\n\t\t\tlet iters = [];\n\t\t\tfor (let i = 0; i < iterables.length; ++i)\n\t\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\tlet items = [];\n\t\t\t\t\tfor (let i = 0; i < iters.length; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iters[i].next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\titems.push(item.value);\n\t\t\t\t\t}\n\t\t\t\t\treturn {value: items, done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t// Return the absolute value for the number ``number``\n\tul4._abs = function _abs(number)\n\t{\n\t\tif (number !== null && typeof(number.__abs__) === \"function\")\n\t\t\treturn number.__abs__();\n\t\treturn Math.abs(number);\n\t};\n\n\t// Return a ``Date`` object from the arguments passed in\n\tul4._date = function _date(year, month, day)\n\t{\n\t\treturn new ul4.Date(year, month, day);\n\t};\n\n\tul4._datetime = function _datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)\n\t{\n\t\treturn new Date(year, month-1, day, hour, minute, second, microsecond/1000);\n\t};\n\n\t// Return a ``TimeDelta`` object from the arguments passed in\n\tul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0)\n\t{\n\t\treturn new this.TimeDelta(days, seconds, microseconds);\n\t};\n\n\t// Return a ``MonthDelta`` object from the arguments passed in\n\tul4._monthdelta = function _monthdelta(months=0)\n\t{\n\t\treturn new this.MonthDelta(months);\n\t};\n\n\t// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\n\tul4._hls = function _hls(h, l, s, a)\n\t{\n\t\tlet _v = function(m1, m2, hue)\n\t\t{\n\t\t\thue = hue % 1.0;\n\t\t\tif (hue < 1/6)\n\t\t\t\treturn m1 + (m2-m1)*hue*6.0;\n\t\t\telse if (hue < 0.5)\n\t\t\t\treturn m2;\n\t\t\telse if (hue < 2/3)\n\t\t\t\treturn m1 + (m2-m1)*(2/3-hue)*6.0;\n\t\t\treturn m1;\n\t\t};\n\n\t\tlet m1, m2;\n\t\tif (typeof(a) === \"undefined\")\n\t\t\ta = 1;\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(l, l, l, a);\n\t\tif (l <= 0.5)\n\t\t\tm2 = l * (1.0+s);\n\t\telse\n\t\t\tm2 = l+s-(l*s);\n\t\tm1 = 2.0*l - m2;\n\t\treturn ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a);\n\t};\n\n\t// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\n\tul4._hsv = function _hsv(h, s, v, a)\n\t{\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(v, v, v, a);\n\t\tlet i = Math.floor(h*6.0);\n\t\tlet f = (h*6.0) - i;\n\t\tlet p = v*(1.0 - s);\n\t\tlet q = v*(1.0 - s*f);\n\t\tlet t = v*(1.0 - s*(1.0-f));\n\t\tswitch (i%6)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\treturn ul4._rgb(v, t, p, a);\n\t\t\tcase 1:\n\t\t\t\treturn ul4._rgb(q, v, p, a);\n\t\t\tcase 2:\n\t\t\t\treturn ul4._rgb(p, v, t, a);\n\t\t\tcase 3:\n\t\t\t\treturn ul4._rgb(p, q, v, a);\n\t\t\tcase 4:\n\t\t\t\treturn ul4._rgb(t, p, v, a);\n\t\t\tcase 5:\n\t\t\t\treturn ul4._rgb(v, p, q, a);\n\t\t}\n\t};\n\n\t// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\n\tul4._get = function _get(container, key, defaultvalue)\n\t{\n\t\tif (ul4._ismap(container))\n\t\t{\n\t\t\tif (container.has(key))\n\t\t\t\treturn container.get(key);\n\t\t\treturn defaultvalue;\n\t\t}\n\t\telse if (ul4._isobject(container))\n\t\t{\n\t\t\tlet result = container[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn defaultvalue;\n\t\t\treturn result;\n\t\t}\n\t\tthrow new ul4.TypeError(\"get() requires a dict\");\n\t};\n\n\t// Return a ``Date`` object for the current time\n\tul4.now = function now()\n\t{\n\t\treturn new Date();\n\t};\n\n\t// Return a ``Date`` object for the current time in UTC\n\tul4.utcnow = function utcnow()\n\t{\n\t\tlet now = new Date();\n\t\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\t\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n\t};\n\n\t// Return an ``ul4.Date`` object for today\n\tul4.today = function today()\n\t{\n\t\tlet now = new Date();\n\t\treturn new ul4.Date(now.getFullYear(), now.getMonth()+1, now.getDate());\n\t};\n\n\tul4.functions = {\n\t\trepr: ul4._repr,\n\t\tascii: ul4._ascii,\n\t\tstr: ul4._str,\n\t\tint: ul4._int,\n\t\tfloat: ul4._float,\n\t\tlist: ul4._list,\n\t\tset: ul4._set,\n\t\tbool: ul4._bool,\n\t\tlen: ul4._len,\n\t\ttype: ul4._type,\n\t\tformat: ul4._format,\n\t\tany: ul4._any,\n\t\tall: ul4._all,\n\t\tzip: ul4._zip,\n\t\tgetattr: ul4._getattr,\n\t\thasattr: ul4._hasattr,\n\t\tdir: ul4._dir,\n\t\tisundefined: ul4._isundefined,\n\t\tisdefined: ul4._isdefined,\n\t\tisnone: ul4._isnone,\n\t\tisbool: ul4._isbool,\n\t\tisint: ul4._isint,\n\t\tisfloat: ul4._isfloat,\n\t\tisstr: ul4._isstr,\n\t\tisdate: ul4._isdate,\n\t\tisdatetime: ul4._isdatetime,\n\t\tiscolor: ul4._iscolor,\n\t\tistimedelta: ul4._istimedelta,\n\t\tismonthdelta: ul4._ismonthdelta,\n\t\tistemplate: ul4._istemplate,\n\t\tisfunction: ul4._isfunction,\n\t\tislist: ul4._islist,\n\t\tisset: ul4._isanyset,\n\t\tisdict: ul4._isdict,\n\t\tisexception: ul4._isexception,\n\t\tasjson: ul4._asjson,\n\t\tfromjson: ul4._fromjson,\n\t\tasul4on: ul4._asul4on,\n\t\tfromul4on: ul4._fromul4on,\n\t\tnow: ul4.now,\n\t\tutcnow: ul4.utcnow,\n\t\ttoday: ul4.today,\n\t\tenumerate: ul4._enumerate,\n\t\tisfirst: ul4._isfirst,\n\t\tislast: ul4._islast,\n\t\tisfirstlast: ul4._isfirstlast,\n\t\tenumfl: ul4._enumfl,\n\t\tabs: ul4._abs,\n\t\tdate: ul4._date,\n\t\tdatetime: ul4._datetime,\n\t\ttimedelta: ul4._timedelta,\n\t\tmonthdelta: ul4._monthdelta,\n\t\trgb: ul4._rgb,\n\t\thls: ul4._hls,\n\t\thsv: ul4._hsv,\n\t\txmlescape: ul4._xmlescape,\n\t\tcsv: ul4._csv,\n\t\tchr: ul4._chr,\n\t\tord: ul4._ord,\n\t\thex: ul4._hex,\n\t\toct: ul4._oct,\n\t\tbin: ul4._bin,\n\t\tmin: ul4._min,\n\t\tmax: ul4._max,\n\t\tsum: ul4._sum,\n\t\tfirst: ul4._first,\n\t\tlast: ul4._last,\n\t\tsorted: ul4._sorted,\n\t\trange: ul4._range,\n\t\tslice: ul4._slice,\n\t\turlquote: ul4._urlquote,\n\t\turlunquote: ul4._urlunquote,\n\t\treversed: ul4._reversed,\n\t\trandom: ul4._random,\n\t\trandrange: ul4._randrange,\n\t\trandchoice: ul4._randchoice,\n\t\tround: ul4._round,\n\t\tmd5: ul4._md5\n\t};\n\n\tul4.expose(ul4._repr, [\"obj\"], {name: \"repr\"});\n\tul4.expose(ul4._ascii, [\"obj\"], {name: \"ascii\"});\n\tul4.expose(ul4._str, [\"obj=\", \"\"], {name: \"str\"});\n\tul4.expose(ul4._int, [\"obj=\", 0, \"base=\", null], {name: \"int\"});\n\tul4.expose(ul4._float, [\"obj=\", 0.0], {name: \"float\"});\n\tul4.expose(ul4._list, [\"iterable=\", []], {name: \"list\"});\n\tul4.expose(ul4._set, [\"iterable=\", []], {name: \"set\"});\n\tul4.expose(ul4._bool, [\"obj=\", false], {name: \"bool\"});\n\tul4.expose(ul4._len, [\"sequence\"], {name: \"len\"});\n\tul4.expose(ul4._type, [\"obj\"], {name: \"type\"});\n\tul4.expose(ul4._format, [\"obj\", \"fmt\", \"lang=\", null], {name: \"format\"});\n\tul4.expose(ul4._any, [\"iterable\"], {name: \"any\"});\n\tul4.expose(ul4._all, [\"iterable\"], {name: \"all\"});\n\tul4.expose(ul4._zip, [\"*iterables\"], {name: \"zip\"});\n\tul4.expose(ul4._getattr, [\"obj\", \"attrname\", \"default=\", null], {name: \"getattr\"});\n\tul4.expose(ul4._hasattr, [\"obj\", \"attrname\"], {name: \"hasattr\"});\n\tul4.expose(ul4._dir, [\"obj\"], {name: \"dir\"});\n\tul4.expose(ul4._isundefined, [\"obj\"], {name: \"isundefined\"});\n\tul4.expose(ul4._isdefined, [\"obj\"], {name: \"isdefined\"});\n\tul4.expose(ul4._isnone, [\"obj\"], {name: \"isnone\"});\n\tul4.expose(ul4._isbool, [\"obj\"], {name: \"isbool\"});\n\tul4.expose(ul4._isint, [\"obj\"], {name: \"isint\"});\n\tul4.expose(ul4._isfloat, [\"obj\"], {name: \"isfloat\"});\n\tul4.expose(ul4._isstr, [\"obj\"], {name: \"isstr\"});\n\tul4.expose(ul4._isdate, [\"obj\"], {name: \"isdate\"});\n\tul4.expose(ul4._isdatetime, [\"obj\"], {name: \"isdatetime\"});\n\tul4.expose(ul4._iscolor, [\"obj\"], {name: \"iscolor\"});\n\tul4.expose(ul4._istimedelta, [\"obj\"], {name: \"istimedelta\"});\n\tul4.expose(ul4._ismonthdelta, [\"obj\"], {name: \"ismonthdelta\"});\n\tul4.expose(ul4._istemplate, [\"obj\"], {name: \"istemplate\"});\n\tul4.expose(ul4._isfunction, [\"obj\"], {name: \"isfunction\"});\n\tul4.expose(ul4._islist, [\"obj\"], {name: \"islist\"});\n\tul4.expose(ul4._isanyset, [\"obj\"], {name: \"isset\"});\n\tul4.expose(ul4._isdict, [\"obj\"], {name: \"isdict\"});\n\tul4.expose(ul4._isexception, [\"obj\"], {name: \"isexception\"});\n\tul4.expose(ul4._asjson, [\"obj\"], {name: \"asjson\"});\n\tul4.expose(ul4._fromjson, [\"string\"], {name: \"fromjson\"});\n\tul4.expose(ul4._asul4on, [\"obj\"], {name: \"asul4on\"});\n\tul4.expose(ul4._fromul4on, [\"string\"], {name: \"fromul4on\"});\n\tul4.expose(ul4.now, []);\n\tul4.expose(ul4.utcnow, []);\n\tul4.expose(ul4.today, []);\n\tul4.expose(ul4._enumerate, [\"iterable\", \"start=\", 0], {name: \"enumerate\"});\n\tul4.expose(ul4._isfirst, [\"iterable\"], {name: \"isfirst\"});\n\tul4.expose(ul4._islast, [\"iterable\"], {name: \"islast\"});\n\tul4.expose(ul4._isfirstlast, [\"iterable\"], {name: \"isfirstlast\"});\n\tul4.expose(ul4._enumfl, [\"iterable\", \"start=\", 0], {name: \"enumfl\"});\n\tul4.expose(ul4._abs, [\"number\"], {name: \"abs\"});\n\tul4.expose(ul4._date, [\"year\", \"month\", \"day\"], {name: \"date\"});\n\tul4.expose(ul4._datetime, [\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], {name: \"datetime\"});\n\tul4.expose(ul4._timedelta, [\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], {name: \"timedelta\"});\n\tul4.expose(ul4._monthdelta, [\"months=\", 0], {name: \"monthdelta\"});\n\tul4.expose(ul4._rgb, [\"r\", \"g\", \"b\", \"a=\", 1.0], {name: \"rgb\"});\n\tul4.expose(ul4._hls, [\"h\", \"l\", \"s\", \"a=\", 1.0], {name: \"hls\"});\n\tul4.expose(ul4._hsv, [\"h\", \"s\", \"v\", \"a=\", 1.0], {name: \"hsv\"});\n\tul4.expose(ul4._xmlescape, [\"obj\"], {name: \"xmlescape\"});\n\tul4.expose(ul4._csv, [\"obj\"], {name: \"csv\"});\n\tul4.expose(ul4._chr, [\"i\"], {name: \"chr\"});\n\tul4.expose(ul4._ord, [\"c\"], {name: \"ord\"});\n\tul4.expose(ul4._hex, [\"number\"], {name: \"hex\"});\n\tul4.expose(ul4._oct, [\"number\"], {name: \"oct\"});\n\tul4.expose(ul4._bin, [\"number\"], {name: \"bin\"});\n\tul4.expose(ul4._min, [\"*obj\"], {name: \"min\"});\n\tul4.expose(ul4._max, [\"*obj\"], {name: \"max\"});\n\tul4.expose(ul4._sum, [\"iterable\", \"start=\", 0], {name: \"sum\"});\n\tul4.expose(ul4._first, [\"iterable\", \"default=\", null], {name: \"first\"});\n\tul4.expose(ul4._last, [\"iterable\", \"default=\", null], {name: \"last\"});\n\tul4.expose(ul4._sorted, [\"iterable\", \"key=\", null, \"reverse=\", false], {name: \"sorted\", needscontext: true});\n\tul4.expose(ul4._range, [\"*args\"], {name: \"range\"});\n\tul4.expose(ul4._slice, [\"*args\"], {name: \"slice\"});\n\tul4.expose(ul4._urlquote, [\"string\"], {name: \"urlquote\"});\n\tul4.expose(ul4._urlunquote, [\"string\"], {name: \"urlunquote\"});\n\tul4.expose(ul4._reversed, [\"sequence\"], {name: \"reversed\"});\n\tul4.expose(ul4._random, [], {name: \"random\"});\n\tul4.expose(ul4._randrange, [\"*args\"], {name: \"randrange\"});\n\tul4.expose(ul4._randchoice, [\"sequence\"], {name: \"randchoice\"});\n\tul4.expose(ul4._round, [\"x\", \"digit=\", 0], {name: \"round\"});\n\tul4.expose(ul4._md5, [\"string\"], {name: \"md5\"});\n\n\t// Functions implementing UL4 methods\n\tul4._count = function _count(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\n\t\tlet isstr = ul4._isstr(obj);\n\n\t\tif (isstr && !sub.length)\n\t\t{\n\t\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\t\treturn 0;\n\t\t\tlet result = end - start + 1;\n\t\t\tif (result > obj.length + 1)\n\t\t\t\tresult = obj.length + 1;\n\t\t\treturn result;\n\t\t}\n\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tlet count = 0;\n\t\tif (ul4._islist(obj))\n\t\t{\n\t\t\tfor (let i = start; i < end; ++i)\n\t\t\t{\n\t\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t\t++count;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t\telse // string\n\t\t{\n\t\t\tlet lastIndex = start;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\t\tif (lastIndex == -1)\n\t\t\t\t\tbreak;\n\t\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\t\tbreak;\n\t\t\t\t++count;\n\t\t\t\tlastIndex += sub.length;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t};\n\n\tul4._find = function _find(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.indexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._rfind = function _rfind(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.lastIndexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._week4format = function _week(obj, firstweekday=null)\n\t{\n\t\tif (firstweekday === null)\n\t\t\tfirstweekday = 0;\n\t\telse\n\t\t\tfirstweekday %= 7;\n\n\t\tlet yearday = ul4.DateTimeProtocol.yearday(obj)+6;\n\t\tlet jan1 = new Date(obj.getFullYear(), 0, 1);\n\t\tlet jan1weekday = jan1.getDay();\n\t\tif (--jan1weekday < 0)\n\t\t\tjan1weekday = 6;\n\n\t\twhile (jan1weekday != firstweekday)\n\t\t{\n\t\t\t--yearday;\n\t\t\tif (++jan1weekday == 7)\n\t\t\t\tjan1weekday = 0;\n\t\t}\n\t\treturn Math.floor(yearday/7);\n\t};\n\n\tul4._isleap = function _isleap(obj)\n\t{\n\t\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n\t};\n\n\tul4._update = function _update(obj, others, kwargs)\n\t{\n\t\tif (!ul4._isdict(obj))\n\t\t\tthrow new ul4.TypeError(\"update() requires a dict\");\n\t\tfor (let i = 0; i < others.length; ++i)\n\t\t{\n\t\t\tlet other = others[i];\n\t\t\tif (ul4._ismap(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(obj, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(other))\n\t\t\t{\n\t\t\t\tfor (let key in other)\n\t\t\t\t\tul4._setmap(obj, key, other[key]);\n\t\t\t}\n\t\t\telse if (ul4._islist(other))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < other.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = other[i];\n\t\t\t\t\tif (!ul4._islist(item) || (item.length != 2))\n\t\t\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(obj, item[0], item[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t}\n\t\tkwargs.forEach(function(value, key) {\n\t\t\tul4._setmap(obj, key, value);\n\t\t});\n\t\treturn null;\n\t};\n\n\tul4.Color = class Color extends ul4.Proto\n\t{\n\t\tconstructor(r=0, g=0, b=0, a=255)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._r = r;\n\t\t\tthis._g = g;\n\t\t\tthis._b = b;\n\t\t\tthis._a = a;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tlet a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a/255) + \")\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__iter__()\n\t\t{\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function() {\n\t\t\t\t\tif (this.index == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._r, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._g, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._b, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._a, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"r\":\n\t\t\t\t\tlet r = function r(){ return self._r; };\n\t\t\t\t\tul4.expose(r, []);\n\t\t\t\t\treturn r;\n\t\t\t\tcase \"g\":\n\t\t\t\t\tlet g = function g(){ return self._g; };\n\t\t\t\t\tul4.expose(g, []);\n\t\t\t\t\treturn g;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tlet b = function b(){ return self._b; };\n\t\t\t\t\tul4.expose(b, []);\n\t\t\t\t\treturn b;\n\t\t\t\tcase \"a\":\n\t\t\t\t\tlet a = function a(){ return self._a; };\n\t\t\t\t\tul4.expose(a, []);\n\t\t\t\t\treturn a;\n\t\t\t\tcase \"lum\":\n\t\t\t\t\tlet lum = function lum(){ return self.lum(); };\n\t\t\t\t\tul4.expose(lum, []);\n\t\t\t\t\treturn lum;\n\t\t\t\tcase \"hls\":\n\t\t\t\t\tlet hls = function hls(){ return self.hls(); };\n\t\t\t\t\tul4.expose(hls, []);\n\t\t\t\t\treturn hls;\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\tlet hlsa = function hlsa(){ return self.hlsa(); };\n\t\t\t\t\tul4.expose(hlsa, []);\n\t\t\t\t\treturn hlsa;\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\tlet hsv = function hsv(){ return self.hsv(); };\n\t\t\t\t\tul4.expose(hsv, []);\n\t\t\t\t\treturn hsv;\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\tlet hsva = function hsva(){ return self.hsva(); };\n\t\t\t\t\tul4.expose(hsva, []);\n\t\t\t\t\treturn hsva;\n\t\t\t\tcase \"witha\":\n\t\t\t\t\tlet witha = function witha(a){ return self.witha(a); };\n\t\t\t\t\tul4.expose(witha, [\"a\"]);\n\t\t\t\t\treturn witha;\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\tlet withlum = function withlum(lum){ return self.withlum(lum); };\n\t\t\t\t\tul4.expose(withlum, [\"lum\"]);\n\t\t\t\t\treturn withlum;\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\tlet abslum = function abslum(lum){ return self.abslum(lum); };\n\t\t\t\t\tul4.expose(abslum, [\"lum\"]);\n\t\t\t\t\treturn abslum;\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\tlet rellum = function rellum(lum){ return self.rellum(lum); };\n\t\t\t\t\tul4.expose(rellum, [\"lum\"]);\n\t\t\t\t\treturn rellum;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__getitem__(key)\n\t\t{\n\t\t\tlet orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.IndexError(this, orgkey);\n\t\t\t}\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Color)\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t}\n\n\t\tr()\n\t\t{\n\t\t\t\treturn this._r;\n\t\t}\n\n\t\tg()\n\t\t{\n\t\t\treturn this._g;\n\t\t}\n\n\t\tb()\n\t\t{\n\t\t\treturn this._b;\n\t\t}\n\n\t\ta()\n\t\t{\n\t\t\treturn this._a;\n\t\t}\n\n\t\tlum()\n\t\t{\n\t\t\treturn this.hls()[1];\n\t\t}\n\n\t\thls()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet h, l, s;\n\t\t\tlet rc, gc, bc;\n\n\t\t\tl = (minc+maxc)/2.0;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, l, 0.0];\n\t\t\tif (l <= 0.5)\n\t\t\t\ts = (maxc-minc) / (maxc+minc);\n\t\t\telse\n\t\t\t\ts = (maxc-minc) / (2.0-maxc-minc);\n\t\t\trc = (maxc-r) / (maxc-minc);\n\t\t\tgc = (maxc-g) / (maxc-minc);\n\t\t\tbc = (maxc-b) / (maxc-minc);\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, l, s];\n\t\t}\n\n\t\thlsa()\n\t\t{\n\t\t\tlet hls = this.hls();\n\t\t\treturn hls.concat(this._a/255.0);\n\t\t}\n\n\t\thsv()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet v = maxc;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, 0.0, v];\n\t\t\tlet s = (maxc-minc) / maxc;\n\t\t\tlet rc = (maxc-r) / (maxc-minc);\n\t\t\tlet gc = (maxc-g) / (maxc-minc);\n\t\t\tlet bc = (maxc-b) / (maxc-minc);\n\t\t\tlet h;\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, s, v];\n\t\t}\n\n\t\thsva()\n\t\t{\n\t\t\tlet hsv = this.hsv();\n\t\t\treturn hsv.concat(this._a/255.0);\n\t\t}\n\n\t\twitha(a)\n\t\t{\n\t\t\tif (typeof(a) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\treturn new ul4.Color(this._r, this._g, this._b, a);\n\t\t}\n\n\t\twithlum(lum)\n\t\t{\n\t\t\tif (typeof(lum) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\tlet hlsa = this.hlsa();\n\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"color\";\n\t\t}\n\t};\n\n\tul4.expose(ul4.Color.prototype.r, []);\n\tul4.expose(ul4.Color.prototype.g, []);\n\tul4.expose(ul4.Color.prototype.b, []);\n\tul4.expose(ul4.Color.prototype.a, []);\n\tul4.expose(ul4.Color.prototype.lum, []);\n\tul4.expose(ul4.Color.prototype.hls, []);\n\tul4.expose(ul4.Color.prototype.hlsa, []);\n\tul4.expose(ul4.Color.prototype.hsv, []);\n\tul4.expose(ul4.Color.prototype.hsva, []);\n\tul4.expose(ul4.Color.prototype.witha, [\"a\"]);\n\tul4.expose(ul4.Color.prototype.withlum, [\"lum\"]);\n\n\tconst _js_Date = Date;\n\n\tul4.Date = class Date extends ul4.Proto\n\t{\n\t\tconstructor(year, month, day)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._date = new _js_Date(year, month-1, day);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn '@(' + this.__str__() + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn ul4._lpad(this._date.getFullYear(), \"0\", 4) + \"-\" + ul4._lpad(this._date.getMonth()+1, \"0\", 2) + \"-\" + ul4._lpad(this._date.getDate(), \"0\", 2);\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date.getTime() === other._date.getTime();\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date < other._date;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date <= other._date;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date > other._date;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date >= other._date;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\tyear()\n\t\t{\n\t\t\treturn this._date.getFullYear();\n\t\t}\n\n\t\tmonth()\n\t\t{\n\t\t\treturn this._date.getMonth()+1;\n\t\t}\n\n\t\tday()\n\t\t{\n\t\t\treturn this._date.getDate();\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\t};\n\n\n\tul4.TimeDelta = class TimeDelta extends ul4.Proto\n\t{\n\t\tconstructor(days=0, seconds=0, microseconds=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tlet total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST.prototype._do(total_microseconds, 1000000);\n\t\t\tlet total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST.prototype._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0)\n\t\t\t{\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\tthis._microseconds = microseconds;\n\t\t\tthis._seconds = seconds;\n\t\t\tthis._days = days;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [], first = true;\n\t\t\tv.push(\"timedelta(\");\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(\"days=\" + this._days);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._seconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"seconds=\" + this._seconds);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"microseconds=\" + this._microseconds);\n\t\t\t}\n\t\t\tv.push(\")\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tlet seconds = this._seconds % 60;\n\t\t\tlet minutes = Math.floor(this._seconds / 60);\n\t\t\tlet hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._days < 0 ? new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds);\n\t\t}\n\n\t\tadddate(date, days)\n\t\t{\n\t\t\tlet year = date._date.getFullYear();\n\t\t\tlet month = date._date.getMonth();\n\t\t\tlet day = date._date.getDate() + days;\n\t\t\treturn new ul4.Date(year, month, day);\n\t\t}\n\n\t\t_adddatetime(date, days, seconds, microseconds)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth();\n\t\t\tlet day = date.getDate() + days;\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds() + seconds;\n\t\t\tlet millisecond = date.getMilliseconds() + microseconds/1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t{\n\t\t\t\treturn new ul4.TimeDelta(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tlet myValue = this._days;\n\t\t\t\tlet otherValue = other._days;\n\t\t\t\tlet hasSeconds = this._seconds || other._seconds;\n\t\t\t\tlet hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds)\n\t\t\t\t{\n\t\t\t\t\tmyValue = myValue*86400+this._seconds;\n\t\t\t\t\totherValue = otherValue*86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds)\n\t\t\t\t\t{\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue/otherValue;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"days\":\n\t\t\t\t\tlet days = function days(){ return self._days; };\n\t\t\t\t\tul4.expose(days, []);\n\t\t\t\t\treturn days;\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\tlet seconds = function seconds(){ return self._seconds; };\n\t\t\t\t\tul4.expose(seconds, []);\n\t\t\t\t\treturn seconds;\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\tlet microseconds = function microseconds(){ return self._microseconds; };\n\t\t\t\t\tul4.expose(microseconds, []);\n\t\t\t\t\treturn microseconds;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tdays()\n\t\t{\n\t\t\treturn this._days;\n\t\t}\n\n\t\tseconds()\n\t\t{\n\t\t\treturn this._seconds;\n\t\t}\n\n\t\tmicroseconds()\n\t\t{\n\t\t\treturn this._microseconds;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"timedelta\";\n\t\t}\n\t};\n\n\n\tul4.MonthDelta = class MonthDelta extends ul4.Proto\n\t{\n\t\tconstructor(months=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._months = months;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._months)\n\t\t\t{\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn this.__str__();\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._months !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._months < 0 ? new ul4.MonthDelta(-this._months) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof MonthDelta)\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.MonthDelta(-this._months);\n\t\t}\n\n\t\t_adddate(date, months)\n\t\t{\n\t\t\tlet result = this._adddatetime(date._date, months);\n\t\t\treturn new ul4.Date(result.getFullYear(), result.getMonth()+1, result.getDate());\n\t\t}\n\n\t\t_adddatetime(date, months)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth() + months;\n\t\t\tlet day = date.getDate();\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds();\n\t\t\tlet millisecond = date.getMilliseconds();\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tlet targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tlet result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months - other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__floordiv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"months\":\n\t\t\t\t\tlet months = function months(){ return self._months; };\n\t\t\t\t\tul4.expose(months, []);\n\t\t\t\t\treturn months;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tmonths()\n\t\t{\n\t\t\treturn this._months;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"monthdelta\";\n\t\t}\n\t};\n\n\tconst classes = [\n\t\tul4.TextAST,\n\t\tul4.IndentAST,\n\t\tul4.LineEndAST,\n\t\tul4.ConstAST,\n\t\tul4.SeqItemAST,\n\t\tul4.UnpackSeqItemAST,\n\t\tul4.DictItemAST,\n\t\tul4.UnpackDictItemAST,\n\t\tul4.PosArgAST,\n\t\tul4.KeywordArgAST,\n\t\tul4.UnpackListArgAST,\n\t\tul4.UnpackDictArgAST,\n\t\tul4.ListAST,\n\t\tul4.ListCompAST,\n\t\tul4.DictAST,\n\t\tul4.DictCompAST,\n\t\tul4.SetAST,\n\t\tul4.SetCompAST,\n\t\tul4.GenExprAST,\n\t\tul4.VarAST,\n\t\tul4.NotAST,\n\t\tul4.NegAST,\n\t\tul4.BitNotAST,\n\t\tul4.IfAST,\n\t\tul4.ReturnAST,\n\t\tul4.PrintAST,\n\t\tul4.PrintXAST,\n\t\tul4.ItemAST,\n\t\tul4.IsAST,\n\t\tul4.IsNotAST,\n\t\tul4.EQAST,\n\t\tul4.NEAST,\n\t\tul4.LTAST,\n\t\tul4.LEAST,\n\t\tul4.GTAST,\n\t\tul4.GEAST,\n\t\tul4.NotContainsAST,\n\t\tul4.ContainsAST,\n\t\tul4.AddAST,\n\t\tul4.SubAST,\n\t\tul4.MulAST,\n\t\tul4.FloorDivAST,\n\t\tul4.TrueDivAST,\n\t\tul4.ModAST,\n\t\tul4.ShiftLeftAST,\n\t\tul4.ShiftRightAST,\n\t\tul4.BitAndAST,\n\t\tul4.BitXOrAST,\n\t\tul4.BitOrAST,\n\t\tul4.AndAST,\n\t\tul4.OrAST,\n\t\tul4.SliceAST,\n\t\tul4.AttrAST,\n\t\tul4.CallAST,\n\t\tul4.RenderAST,\n\t\tul4.RenderXAST,\n\t\tul4.RenderBlockAST,\n\t\tul4.RenderBlocksAST,\n\t\tul4.SetVarAST,\n\t\tul4.AddVarAST,\n\t\tul4.SubVarAST,\n\t\tul4.MulVarAST,\n\t\tul4.TrueDivVarAST,\n\t\tul4.FloorDivVarAST,\n\t\tul4.ModVarAST,\n\t\tul4.ShiftLeftVarAST,\n\t\tul4.ShiftRightVarAST,\n\t\tul4.BitAndVarAST,\n\t\tul4.BitXOrVarAST,\n\t\tul4.BitOrVarAST,\n\t\tul4.ForBlockAST,\n\t\tul4.WhileBlockAST,\n\t\tul4.BreakAST,\n\t\tul4.ContinueAST,\n\t\tul4.CondBlockAST,\n\t\tul4.IfBlockAST,\n\t\tul4.ElIfBlockAST,\n\t\tul4.ElseBlockAST,\n\t\tul4.SignatureAST,\n\t\tul4.Template\n\t];\n\n\tfor (let i = 0; i < classes.length; ++i)\n\t{\n\t\tlet constructor = classes[i];\n\t\tlet ul4onname = constructor.name;\n\t\tif (ul4onname.substr(ul4onname.length-3) === \"AST\")\n\t\t\tul4onname = ul4onname.substr(0, ul4onname.length-3);\n\t\tul4onname = ul4onname.toLowerCase();\n\t\tconstructor.prototype.type = ul4onname;\n\t\tul4.register(\"de.livinglogic.ul4.\" + ul4onname, constructor);\n\t}","import { ul4 } from './ul4';\n\nlet la = {};\n\n\nla.Base = class Base extends ul4.Proto\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tul4ondump(encoder)\n\t{\n\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\treturn this[name];\n\t}\n\n\tul4onload(decoder)\n\t{\n\t\tlet i = 0;\n\t\tfor (let iter = decoder.loadcontent(); ; ++i)\n\t\t{\n\t\t\tlet iteritem = iter.next();\n\t\t\tif (iteritem.done)\n\t\t\t\tbreak;\n\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t}\n\t\tfor (; i < this._ul4onattrs.length; ++i)\n\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tthis[name] = value;\n\t}\n\n\t_setDefaultUL4ONAttr(name)\n\t{\n\t\tthis[name] = null;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (this._ul4attrs.has(name))\n\t\t{\n\t\t\tlet value = this[name];\n\t\t\tif (typeof(value) === \"function\")\n\t\t\t{\n\t\t\t\tlet realvalue = value.bind(this);\n\t\t\t\trealvalue._ul4_name = value._ul4_name || value.name;\n\t\t\t\trealvalue._ul4_signature = value._ul4_signature;\n\t\t\t\trealvalue._ul4_needsobject = value._ul4_needsobject;\n\t\t\t\trealvalue._ul4_needscontext = value._ul4_needscontext;\n\t\t\t\treturn realvalue;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tthrow new ul4.AttributeError(this, name);\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Handler = class Handler\n{\n\tsave(record)\n\t{\n\t}\n\n\tdelete(record)\n\t{\n\t}\n};\n\nla.Globals = class Globals extends la.Base\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis.version = null;\n\t\tthis.platform = null;\n\t\tthis.user = null;\n\t\tthis.maxdbactions = null;\n\t\tthis.maxtemplateruntime = null;\n\t\tthis.flashmessages = null;\n\t\tthis.handler = new la.Handler();\n\t}\n\n\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\tstatic geodist(geo1, geo2)\n\t{\n\t\tlet sqsin = function sqsin(x) {x = Math.sin(x); return x*x};\n\t\tlet sqcos = function sqsos(x) {x = Math.cos(x); return x*x};\n\t\tconst deg2rad = Math.PI/180; // Conversion factor degree -> radians\n\t\tconst radius = 6378.137; // Equatorial radius of earth in km\n\t\tconst flat = 1/298.257223563; // Earth flattening\n\n\t\tconst lat1 = geo1.lat * deg2rad;\n\t\tconst long1 = geo1.long * deg2rad;\n\t\tconst lat2 = geo2.lat * deg2rad;\n\t\tconst long2 = geo2.long * deg2rad;\n\t\tconst F = (lat1 + lat2)/2;\n\t\tconst G = (lat1 - lat2)/2;\n\t\tconst l = (long1 - long2)/2;\n\t\tconst S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\tconst C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\tconst w = Math.atan(Math.sqrt(S/C));\n\t\tconst D = 2 * w * radius;\n\t\tconst T = Math.sqrt(S*C)/w;\n\t\tconst H1 = (3*T-1)/(2*C);\n\t\tconst H2 = (3*T+1)/(2*S);\n\t\tconst s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\treturn s;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Globals.prototype._ul4onattrs = [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"];\nla.Globals.prototype._ul4attrs = ul4._makeset(\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\");\n\nla.FlashMessage = class FlashMessage extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.FlashMessage.prototype._ul4onattrs = [\"timestamp\", \"type\", \"title\", \"message\"];\nla.FlashMessage.prototype._ul4attrs = ul4._makeset(\"timestamp\", \"type\", \"title\", \"message\");\n\nla.App = class App extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\tinsert(values={})\n\t{\n\t\tlet record = this.__call__(values);\n\t\tthis.globals.handler.save(this);\n\t\tthis.globals.Login._insert(this, values);\n\t\treturn record;\n\t}\n\n\t__call__(values={})\n\t{\n\t\tlet record = new la.Record(this);\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\t\treturn record;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t{\n\t\t\tif (!this.controls.has(name.substr(2)))\n\t\t\t\tthrow new ul4.AttributeError(this, name);\n\t\t\treturn this.controls.get(name.substr(2));\n\t\t}\n\t\telse\n\t\t\treturn super.__getattr__(name);\n\t}\n};\n\nla.App.prototype._ul4onattrs = [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"basetable\", \"primarykey\", \"insertprocedure\", \"updateprocedure\", \"deleteprocedure\", \"templates\", \"createdat\", \"updatedat\", \"updatedby\"];\nla.App.prototype._ul4attrs = ul4._makeset(\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"insert\");\nul4.expose(la.App.prototype.__call__, [\"**values\"], {\"needsobject\": true});\nul4.expose(la.App.prototype.insert, [\"**values\"], {\"needsobject\": true});\n\nla.View = class View extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.View.prototype._ul4onattrs = [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"];\nla.View.prototype._ul4attrs = ul4._makeset(\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\");\n\nla.DataSourceData = class DataSourceData extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.DataSourceData.prototype._ul4onattrs = [\"id\", \"identifier\", \"app\", \"apps\"];\nla.DataSourceData.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"app\", \"apps\");\n\nla.Record = class Record extends la.Base\n{\n\tconstructor(app)\n\t{\n\t\tsuper();\n\t\tthis.id = null;\n\t\tthis.app = app;\n\t\tthis.createdat = null;\n\t\tthis.createdby = null;\n\t\tthis.updatedat = null;\n\t\tthis.updatedby = null;\n\t\tthis.updatecount = 0;\n\t\tthis._sparsevalues = new Map();\n\t\tthis._values = null;\n\t\tthis._fields = null;\n\t\tthis.children = new Map();\n\t\tthis.attachments = null;\n\t\tthis.errors = [];\n\t\tthis._is_deleted = false;\n\t}\n\n\t\n\n\t__repr__()\n\t{\n\t\tlet v = [\"\")\n\t\treturn v.join(\"\");\n\t}\n\n\tget values()\n\t{\n\t\tif (this._values === null)\n\t\t{\n\t\t\tthis._values = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, control] of this.app.controls.entries())\n\t\t\t{\n\t\t\t\tlet fieldvalue = this._sparsevalues.get(identifier);\n\t\t\t\tif (typeof(fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tthis._values.set(identifier, fieldvalue);\n\t\t\t}\n\t\t}\n\t\treturn this._values;\n\t}\n\n\tget fields()\n\t{\n\t\tif (this._fields === null)\n\t\t{\n\t\t\tthis._fields = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, value] of this.values.entries())\n\t\t\t{\n\t\t\t\tlet field = new la.Field(this.app.controls.get(identifier), this, value);\n\t\t\t\tthis._fields.set(identifier, field);\n\t\t\t}\n\t\t}\n\t\treturn this._fields;\n\t}\n\n\tis_dirty()\n\t{\n\t\tif (this.id === null)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.is_dirty())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\thas_errors()\n\t{\n\t\tif (this.errors.length !== 0)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.has_errors())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdelete()\n\t{\n\t\treturn this.app.globals.handler.delete(this);\n\t}\n\n\tsave()\n\t{\n\t\tthis.app.globals.handler.save(this);\n\t}\n\n\tupdate(values={})\n\t{\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\tfields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\n\t\tthis.app.globals.handler.save(this);\n\t}\n\n\tsearch(search)\n\t{\n\t\tfor (let identifier in search)\n\t\t{\n\t\t\tlet fieldsearch = search[identifier];\n\t\t\tif (ul4._bool(fieldsearch))\n\t\t\t{\n\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"values\")\n\t\t\treturn this._sparsevalues;\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"values\")\n\t\t{\n\t\t\tthis._sparsevalues = value;\n\t\t\tthis._values = null;\n\t\t\tthis._fields = null;\n\t\t}\n\t\telse\n\t\t\tthis[name] = value;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\treturn this.children.get(name.substr(2))\n\t\telse if (name.startsWith(\"f_\"))\n\t\t\treturn this.fields.get(name.substr(2))\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\treturn this.values.get(name.substr(2))\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t__setattr__(name, value)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\tthis.children[name.substr(2)] = value;\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\tthis.fields.get(name.substr(2)).value = value;\n\t\telse\n\t\t\tthrow new ul4.AttributeError(this, name);\n\t}\n};\n\nla.Record.prototype._ul4onattrs = [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"];\nla.Record.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\");\nul4.expose(la.Record.prototype.is_dirty, []);\nul4.expose(la.Record.prototype.has_errors, []);\nul4.expose(la.Record.prototype.delete, []);\nul4.expose(la.Record.prototype.save, []);\nul4.expose(la.Record.prototype.update, [\"**values\"], {\"needsobject\": true});\n\nla.Control = class Control extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\t_logsearch(value, search)\n\t{\n\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t}\n\n\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t// ``value`` is the value of the field\n\t// ``search`` is an object with information what we're searching for\n\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\tsearch(value, search)\n\t{\n\t\treturn false;\n\t}\n};\n\nla.Control.prototype.type = null;\nla.Control.prototype.subtype = null;\nla.Control.prototype._ul4onattrs = [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"];\nla.Control.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\");\n\nla.BoolControl = class BoolControl extends la.Control\n{\n\t// ``search`` must by ``null``, ``false`` or ``true``\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.BoolControl.prototype.type = \"bool\";\n\nla.IntControl = class IntControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.IntControl.prototype.type = \"int\";\n\nla.NumberControl = class NumberControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"range\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn false;\n\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.NumberControl.prototype.type = \"number\";\n\nla.StringControl = class StringControl extends la.Control\n{\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (search.value === null || value === null)\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t}\n\t}\n};\n\nla.StringControl.prototype.type = \"string\";\n\nla.TextControl = class TextControl extends la.StringControl\n{\n};\n\nla.TextControl.prototype.subtype = \"text\";\n\nla.EmailControl = class EmailControl extends la.StringControl\n{\n};\n\nla.EmailControl.prototype.subtype = \"email\";\n\nla.URLControl = class URLControl extends la.StringControl\n{\n};\n\nla.URLControl.prototype.subtype = \"url\";\n\nla.TelControl = class TelControl extends la.StringControl\n{\n};\n\nla.TelControl.prototype.subtype = \"tel\";\n\nla.PasswordControl = class PasswordControl extends la.StringControl\n{\n};\n\nla.PasswordControl.prototype.subtype = \"password\";\n\nla.TextAreaControl = class TextAreaControl extends la.StringControl\n{\n};\n\nla.TextAreaControl.prototype.subtype = \"textarea\";\nla.TextAreaControl.prototype._ul4onattrs = la.StringControl.prototype._ul4onattrs.concat([\"encrypted\"]);\nla.TextAreaControl.prototype._ul4attrs = ul4._makeset(...la.StringControl.prototype._ul4attrs, \"encrypted\");\n\nla.DateControl = class DateControl extends la.Control\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y\";\n\t}\n\n\t// searchvalue must be ``null``, a ``Date`` object or a string\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\n\t\tlet searchvalue = search.value;\n\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\tif (value !== null)\n\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\tif (search.operator === \"equals\")\n\t\t\treturn searchvalue === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (searchvalue === null || value === null)\n\t\t\t\treturn searchvalue === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.DateControl.prototype.type = \"date\";\nla.DateControl.prototype.subtype = \"date\";\n\nla.DatetimeMinuteControl = class DatetimeMinuteControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t}\n};\n\nla.DatetimeMinuteControl.prototype.subtype = \"datetimeminute\";\n\nla.DatetimeSecondControl = class DatetimeSecondControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t}\n};\n\nla.DatetimeSecondControl.prototype.subtype = \"datetimesecond\";\n\nla.LookupControl = class LookupControl extends la.Control\n{\n\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn search.value === null;\n\t\t\telse\n\t\t\t\treturn value.key === search.value;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.LookupControl.prototype.type = \"lookup\";\nla.LookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupdata\"]);\nla.LookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupdata\");\n\nla.LookupSelectControl = class LookupSelectControl extends la.LookupControl\n{\n};\n\nla.LookupSelectControl.prototype.subtype = \"select\";\n\nla.LookupRadioControl = class LookupRadioControl extends la.LookupControl\n{\n};\n\nla.LookupRadioControl.prototype.subtype = \"radio\";\n\nla.LookupChoiceControl = class LookupChoiceControl extends la.LookupControl\n{\n};\n\nla.LookupChoiceControl.prototype.subtype = \"choice\";\n\nla.AppLookupControl = class AppLookupControl extends la.Control\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (value === null || search.value === null)\n\t\t\treturn value === search.value;\n\t\telse\n\t\t\treturn value.search(search);\n\t}\n};\n\nla.AppLookupControl.prototype.type = \"applookup\";\nla.AppLookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]);\nla.AppLookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupapp\", \"lookupcontrols\");\n\nla.AppLookupSelectControl = class AppLookupSelectControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupSelectControl.prototype.subtype = \"select\";\n\nla.AppLookupRadioControl = class AppLookupRadioControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupRadioControl.prototype.subtype = \"radio\";\n\nla.AppLookupChoiceControl = class AppLookupChoiceControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleLookupControl = class MultipleLookupControl extends la.LookupControl\n{\n\t// search.value must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tfor (let item of value)\n\t\t\t{\n\t\t\t\tif (item.key === search.value)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleLookupControl.prototype.subtype = \"multiplelookup\";\n\nla.MultipleLookupSelectControl = class MultipleLookupSelectControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleLookupCheckboxControl = class MultipleLookupCheckboxControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleLookupChoiceControl = class MultipleLookupChoiceControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleAppLookupControl = class MultipleAppLookupControl extends la.AppLookupControl\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (search.value === null)\n\t\t\t\treturn value.length === 0;\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (let item of value)\n\t\t\t\t{\n\t\t\t\t\tif (item.search(search.value))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleAppLookupControl.prototype.type = \"multipleapplookup\";\n\nla.MultipleAppLookupSelectControl = class MultipleAppLookupSelectControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleAppLookupCheckboxControl = class MultipleAppLookupCheckboxControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleAppLookupChoiceControl = class MultipleAppLookupChoiceControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.GeoControl = class GeoControl extends la.Control\n{\n};\n\nla.GeoControl.prototype.type = \"geo\";\n\nla.FileControl = class FileControl extends la.Control\n{\n};\n\nla.FileControl.prototype.type = \"file\";\n\nla.ButtonControl = class ButtonControl extends la.Control\n{\n};\n\nla.ButtonControl.prototype.type = \"button\";\n\nla.Field = class Field extends la.Base\n{\n\tconstructor(control, record, value)\n\t{\n\t\tsuper();\n\t\tthis.control = control;\n\t\tthis.record = record;\n\t\tthis._value = value;\n\t\tthis._dirty = false;\n\t\tthis.errors = [];\n\t}\n\n\tget value()\n\t{\n\t\treturn this._value;\n\t}\n\n\tset value(value)\n\t{\n\t\tlet oldvalue = this._value;\n\n\t\tif (ul4._ne(oldvalue, value))\n\t\t{\n\t\t\tthis.record.values.set(this.control.identifier, value);\n\t\t\tthis._value = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t}\n\n\tis_empty()\n\t{\n\t\treturn this._value === null || (ul4._islist(this._value) && this._value.length === 0);\n\t}\n\n\tis_dirty()\n\t{\n\t\treturn this._dirty;\n\t}\n\n\thas_errors()\n\t{\n\t\treturn this.errors.length !== 0;\n\t}\n\n\tsearch(searchvalue)\n\t{\n\t\treturn this.control.search(this.value, searchvalue);\n\t}\n\n\t__repr__()\n\t{\n\t\tlet s = \"\"\n\t\treturn s;\n\t}\n};\n\nla.LookupItem = class LookupItem extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.LookupItem.prototype._ul4onattrs = [\"key\", \"label\"];\nla.LookupItem.prototype._ul4attrs = ul4._makeset(\"key\", \"label\");\n\nla.User = class User extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.User.prototype._ul4onattrs = [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"];\nla.User.prototype._ul4attrs = ul4._makeset(\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\");\n\nla.File = class File extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.File.prototype._ul4onattrs = [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"internalid\", \"createdat\", \"size\"];\nla.File.prototype._ul4attrs = ul4._makeset(\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"size\", \"createdat\");\n\nla.Geo = class Geo extends la.Base\n{\n\tconstructor(lat, long, info)\n\t{\n\t\tsuper();\n\t\tthis.lat = lat;\n\t\tthis.long = long;\n\t\tthis.info = info;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Geo.prototype._ul4onattrs = [\"lat\", \"long\", \"info\"];\nla.Geo.prototype._ul4attrs = ul4._makeset(\"lat\", \"long\", \"info\");\n\nla.Attachment = class Attachment extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Attachment.prototype._ul4onattrs = [\"id\", \"record\", \"label\", \"active\"];\nla.Attachment.prototype._ul4attrs = ul4._makeset(\"id\", \"record\", \"label\", \"active\");\n\nla.NoteAttachment = class NoteAttachment extends la.Attachment\n{\n};\n\nla.NoteAttachment.prototype.type = \"noteattachment\";\nla.NoteAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.NoteAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.URLAttachment = class URLAttachment extends la.Attachment\n{\n};\n\nla.URLAttachment.prototype.type = \"urlattachment\";\nla.URLAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.URLAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.FileAttachment = class FileAttachment extends la.Attachment\n{\n};\n\nla.FileAttachment.prototype.type = \"fileattachment\";\nla.FileAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.FileAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.ImageAttachment = class ImageAttachment extends la.Attachment\n{\n};\n\nla.ImageAttachment.prototype.type = \"imageattachment\";\nla.ImageAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"]);\nla.ImageAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"original\", \"thumb\", \"small\", \"medium\", \"large\");\n\nla.JSONAttachment = class JSONAttachment extends la.Attachment\n{\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"value\")\n\t\t\treturn ul4._asjson(this.value);\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"value\")\n\t\t\tthis.value = ul4._fromjson(value);\n\t\telse\n\t\t\tthis[name] = value\n\t}\n};\n\nla.JSONAttachment.prototype.type = \"jsonattachment\";\nla.JSONAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.JSONAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.Installation = class Installation extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Installation.prototype._ul4onattrs = [\"id\", \"name\"];\nla.Installation.prototype._ul4attrs = ul4._makeset(\"id\", \"name\");\n\nla.Category = class Category extends la.Base\n{\n\t__repr__()\n\t{\n\t\tlet v = [];\n\t\tlet category = this;\n\t\twhile (category !== null)\n\t\t{\n\t\t\tv.splice(0, 0, category.identifier);\n\t\t\tcategory = category.parent;\n\t\t}\n\t\treturn \"\";\n\t}\n};\n\nla.Category.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"];\nla.Category.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\");\n\nla.KeyView = class KeyView extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.KeyView.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"key\", \"user\"];\nla.KeyView.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"key\", \"user\");\n\nla.AppParameter = class AppParameter extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.AppParameter.prototype._ul4onattrs = [\"id\", \"app\", \"identifier\", \"description\", \"value\"];\nla.AppParameter.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"identifier\", \"description\", \"value\");\n\nlet classes = [\n\tla.Globals,\n\tla.App,\n\tla.View,\n\tla.DataSourceData,\n\tla.Record,\n\tla.BoolControl,\n\tla.IntControl,\n\tla.NumberControl,\n\tla.TextControl,\n\tla.EmailControl,\n\tla.URLControl,\n\tla.TelControl,\n\tla.PasswordControl,\n\tla.TextAreaControl,\n\tla.DateControl,\n\tla.DatetimeMinuteControl,\n\tla.DatetimeSecondControl,\n\tla.LookupControl,\n\tla.LookupSelectControl,\n\tla.LookupRadioControl,\n\tla.LookupChoiceControl,\n\tla.AppLookupControl,\n\tla.AppLookupSelectControl,\n\tla.AppLookupRadioControl,\n\tla.AppLookupChoiceControl,\n\tla.MultipleLookupControl,\n\tla.MultipleLookupSelectControl,\n\tla.MultipleLookupCheckboxControl,\n\tla.MultipleLookupChoiceControl,\n\tla.MultipleAppLookupControl,\n\tla.MultipleAppLookupSelectControl,\n\tla.MultipleAppLookupCheckboxControl,\n\tla.MultipleAppLookupChoiceControl,\n\tla.GeoControl,\n\tla.FileControl,\n\tla.ButtonControl,\n\tla.Field,\n\tla.LookupItem,\n\tla.User,\n\tla.File,\n\tla.Geo,\n\tla.NoteAttachment,\n\tla.URLAttachment,\n\tla.FileAttachment,\n\tla.ImageAttachment,\n\tla.JSONAttachment,\n\tla.Installation,\n\tla.Category,\n\tla.KeyView,\n\tla.AppParameter\n];\n\nfor (let constructor of classes)\n{\n\t// Register under the old name\n\tul4.register(\"de.livingapps.appdd.\" + constructor.name.toLowerCase(), constructor);\n\t// Register under the new name\n\tul4.register(\"de.livinglogic.livingapi.\" + constructor.name.toLowerCase(), constructor);\n}\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4 } from './modules/ul4';\nimport * as https from 'https';\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: livingApi.Record.create({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["ul4","iscommon","module","exports","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","key","value","set","_setmap","__proto__","_emptymap","_getmap","get","_emptyset","_Set","_makeset","add","register","name","f","ul4onname","dumps","obj","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_level","_strings2index","_ids2index","_backrefs","line","this","push","oldindent","join","_line","type","Math","round","index","_str_repr","replace","_iscolor","r","g","b","a","_isdate","year","month","day","_isdatetime","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","ValueError","_repr","pos","backrefs","stack","charAt","re_white","c","match","result","substring","re_digits","readcharoreof","parseFloat","isNaN","oldpos","escapechar","chars","read","codepoint","parseInt","String","fromCharCode","typecode","readblackchar","readnumber","readchar","delimiter","c2","_readescape","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","backup","pop","_beginfakeloading","constructor","_endfakeloading","ul4onload","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_inherit","baseobj","attrs","Object","assign","create","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","Exception","toString","context","_internal_call","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_type","_unpackvar","lvalue","newvalue","iter","_iter","item","concat","_formatsource","out","finalout","level","needlf","part","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","_lt","__lt__","items","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","code","charCodeAt","escape","test","_lpad","_date_repr","_date","_datetime_repr","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","_typeof","__repr__","_ascii","_date_str","_datetime_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","ul4type","Protocol","_mod","div","mod","_getattr","attrname","default_","proto","getattr","AttributeError","_hasattr","hasattr","_dir","dir","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","call","_istemplate","Template","TemplateClosure","_isfunction","_isexception","_isanyset","__type__","Proto","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","StrProtocol","strip","root","JSON","parse","Function","_asul4on","_fromul4on","_format_datetime","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","DateTimeProtocol","yearday","_week4format","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","_nextid","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","_this","decname","arg","prefix","argObject","expose","count","options","ListProtocol","DateProtocol","SetProtocol","MapProtocol","ObjectProtocol","__getattr__","attr","realattr","object","sub","end","_count","_find","_rfind","old","new_","sep","splice","lstrip","lastIndexOf","rstrip","keepends","startpos","lineendlen","endpos","resultlist","singlepre","suffix","singlesuf","find","rfind","rsplit","splitlines","lower","capitalize","startswith","endswith","append","insert","_update","clear","update","weekday","firstweekday","mindaysinfirstweek","calendar","d","week","mimeformat","isoformat","offset","refDate","weekDayDiff","weekStartYear","weekStartMonth","weekStartDay","weekStart","diff","SubAST","_do","leap","_isleap","microsecond","realresult","Context","vars","indents","escapes","_output","message","fileName","lineNumber","instance","Error","setPrototypeOf","getPrototypeOf","enumerable","writable","configurable","InternalException","ReturnException","BreakException","ContinueException","SyntaxError","LValueRequiredError","NotSubscriptableError","ZeroDivisionError","IndexError","LocationError","location","template","parenttemplate","first","templateprefix","_templateprefix","sourceprefix","source","sourcesuffix","text","underline","col","AST","_col","_ul4onattrs","undefined","_eval","_decorate_exception","_eval_set","_eval_modify","decoder","_source","of","outerstartpos","innerstartpos","fullsource","maxprefix","preprefix","outerstoppos","innerstoppos","maxsuffix","postsuffix","_calculateLineCol","TextAST","IndentAST","_text","LineEndAST","CodeAST","ConstAST","ItemArgBase","_eval_list","_eval_dict","_eval_call","SeqItemAST","_handle_eval","UnpackSeqItemAST","DictItemAST","UnpackDictItemAST","subitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","_handle_eval_list","ListCompAST","varname","container","condition","localcontext","inheritvars","varitems","_handle_eval_set","SetAST","SetCompAST","DictAST","_handle_eval_dict","DictCompAST","GenExprAST","VarAST","_get","_modify","functions","_ido","UnaryAST","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","ItemAST","orgkey","__getitem__","__setitem__","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","__sub__","__rsub__","_date_sub","_datetime_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","__setattr__","oldvalue","CallAST","_handle_eval_call","_makeargs","RenderAST","_reprname","tag","withindent","_handle_additional_arguments","RenderXAST","RenderBlockAST","closure","content","RenderBlocksAST","BlockAST","SliceAST","index1","index2","SetVarAST","ModifyVarAST","_handle_eval_modify","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","ForBlockAST","_str_varname","WhileBlockAST","cond","BreakAST","ContinueAST","CondBlockAST","block","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","whitespace","startdelim","enddelim","docpos","_asts","doc","render","_renderbound","renders","_rendersbound","SignatureAST","clone","replaceoutput","getoutput","_callbound","params","param","endtag","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","higher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshold","pow","_md5","require","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","_datetime","_timedelta","_monthdelta","_hls","h","l","s","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","today","repr","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","isdatetime","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","datetime","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","lastIndex","jan1weekday","others","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","_js_Date","total_microseconds","total_seconds","minutes","hours","millisecond","_adddate","_adddatetime","myValue","otherValue","hasSeconds","hasMicroseconds","targetmonth","classes","la","Base","_dumpUL4ONAttr","loadcontent","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","_ul4attrs","realvalue","bind","Handler","record","Globals","platform","user","maxdbactions","maxtemplateruntime","flashmessages","handler","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","F","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","id","globals","save","Login","_insert","Record","entries","fields","startsWith","controls","View","DataSourceData","identifier","app","createdat","createdby","updatedat","updatedby","updatecount","_sparsevalues","_values","_fields","children","attachments","errors","_is_deleted","field","control","priority","is_dirty","has_errors","delete","search","fieldsearch","fieldvalue","Field","Control","subtype","BoolControl","_logsearch","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","language","searchvalue","formatstring","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleLookupChoiceControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","MultipleAppLookupChoiceControl","GeoControl","FileControl","ButtonControl","_value","_dirty","LookupItem","label","User","firstname","surname","email","File","url","filename","Geo","info","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","username","loginRequired","_userName","ecdhCurve","commonjs","ident","httpsAgent"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"livingsdk.js","sources":["../es2015/modules/ul4.js","../es2015/modules/livingapi.js","../../src/livingsdk.ts"],"sourcesContent":["/*!\n * UL4/UL4ON JavaScript Library\n * http://www.livinglogic.de/Python/ul4c/\n * http://www.livinglogic.de/Python/ul4on/\n *\n * Copyright 2011-2018 by LivingLogic AG, Bayreuth/Germany\n * Copyright 2011-2018 by Walter Dörwald\n *\n * All Rights Reserved\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*jslint vars: true */\nexport let ul4 = {};\n\nlet iscommon = (typeof module === 'object' && module.exports);\n\n\tul4.version = \"46\";\n\n\t//\n\t// UL4ON\n\t//\n\n\tul4._registry = {};\n\n\tul4._havemap = (typeof(Map) === \"function\" && typeof(Map.prototype.forEach) === \"function\");\n\n\tul4._havemapconstructor = (function ()\n\t{\n\t\tif (ul4._havemap)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (new Map([[1, 2]]).size == 1)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t})();\n\n\tul4._haveset = (typeof(Set) === \"function\" && typeof(Set.prototype.forEach) === \"function\");\n\n\tul4._havesetconstructor = (function ()\n\t{\n\t\tif (ul4._haveset)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (new Set([1, 2]).size == 2)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t})();\n\n\t// helper functions that work with Maps and objects\n\tif (ul4._havemap)\n\t{\n\t\tul4._makemap = function _makemap(...items)\n\t\t{\n\t\t\tlet map = new Map();\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [key, value] = items[i];\n\t\t\t\tmap.set(key, value);\n\t\t\t}\n\t\t\treturn map;\n\t\t};\n\n\t\tul4._setmap = function _setmap(map, key, value)\n\t\t{\n\t\t\tif (map.__proto__ === Map.prototype)\n\t\t\t\tmap.set(key, value);\n\t\t\telse\n\t\t\t\tmap[key] = value;\n\t\t};\n\n\t\tul4._emptymap = function _emptymap()\n\t\t{\n\t\t\treturn new Map();\n\t\t};\n\n\t\tul4._getmap = function _getmap(map, key, value)\n\t\t{\n\t\t\tif (map.__proto__ === Map.prototype)\n\t\t\t\treturn map.get(key);\n\t\t\telse\n\t\t\t\treturn map[key];\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._makemap = function _makemap(...items)\n\t\t{\n\t\t\tlet map = {};\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [key, value] = items[i];\n\t\t\t\tmap[key] = value;\n\t\t\t}\n\t\t\treturn map;\n\t\t};\n\n\t\tul4._setmap = function _setmap(map, key, value)\n\t\t{\n\t\t\tmap[key] = value;\n\t\t};\n\n\t\tul4._emptymap = function _emptymap()\n\t\t{\n\t\t\treturn {};\n\t\t};\n\n\t\tul4._getmap = function _getmap(map, key, value)\n\t\t{\n\t\t\treturn map[key];\n\t\t};\n\t}\n\n\t// Function used for making sets, when the Set constructor doesn't work (or we don't have sets)\n\tif (ul4._haveset)\n\t{\n\t\tul4._emptyset = function _emptyset()\n\t\t{\n\t\t\treturn new Set();\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._emptyset = function _emptyset()\n\t\t{\n\t\t\treturn new ul4._Set();\n\t\t};\n\t}\n\n\tul4._makeset = function _makeset(...items)\n\t{\n\t\tlet set = ul4._emptyset();\n\n\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\tset.add(items[i]);\n\t\treturn set;\n\t};\n\n\t// Register the constructor function ``f`` under the name ``name`` with the UL4ON machinery\n\tul4.register = function register(name, f)\n\t{\n\t\tf.prototype.ul4onname = name;\n\t\tul4._registry[name] = f;\n\t};\n\n\t// Return a string that contains the object ``obj`` in the UL4ON serialization format\n\tul4.dumps = function dumps(obj, indent)\n\t{\n\t\tlet encoder = new ul4.Encoder(indent);\n\t\tencoder.dump(obj);\n\t\treturn encoder.finish();\n\t};\n\n\t// Load an object from the string ``data``.\n\t// ``data`` must contain the object in the UL4ON serialization format\n\t// ``registry`` may be null or a dictionary mapping type names to constructor functions\n\tul4.loads = function loads(data, registry)\n\t{\n\t\tlet decoder = new ul4.Decoder(data, registry);\n\t\treturn decoder.load();\n\t};\n\n\t// Helper class for encoding\n\tul4.Encoder = class Encoder\n\t{\n\t\t// Create a new Encoder object\n\t\tconstructor(indent=null)\n\t\t{\n\t\t\tthis.indent = indent;\n\t\t\tthis.data = [];\n\t\t\tthis._level = 0;\n\t\t\tthis._strings2index = {};\n\t\t\tthis._ids2index = {};\n\t\t\tthis._backrefs = 0;\n\t\t}\n\n\t\t_line(line, ...args)\n\t\t{\n\t\t\tif (this.indent !== null)\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < this._level; ++i)\n\t\t\t\t\tthis.data.push(this.indent);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (this.data.length)\n\t\t\t\t\tthis.data.push(\" \");\n\t\t\t}\n\t\t\tthis.data.push(line);\n\n\t\t\tif (args.length)\n\t\t\t{\n\t\t\t\tlet oldindent = this.indent;\n\t\t\t\tthis.indent = null;\n\t\t\t\tfor (let i = 0; i < args.length; ++i)\n\t\t\t\t\tthis.dump(args[i]);\n\t\t\t\tthis.indent = oldindent;\n\t\t\t}\n\n\t\t\tif (this.indent !== null)\n\t\t\t\tthis.data.push(\"\\n\");\n\t\t}\n\n\t\t// Return the complete string written to the buffer\n\t\tfinish()\n\t\t{\n\t\t\treturn this.data.join(\"\");\n\t\t}\n\n\t\tdump(obj)\n\t\t{\n\t\t\tif (obj === null)\n\t\t\t\tthis._line(\"n\");\n\t\t\telse if (typeof(obj) == \"boolean\")\n\t\t\t\tthis._line(obj ? \"bT\" : \"bF\");\n\t\t\telse if (typeof(obj) == \"number\")\n\t\t\t{\n\t\t\t\tlet type = (Math.round(obj) == obj) ? \"i\" : \"f\";\n\t\t\t\tthis._line(type + obj);\n\t\t\t}\n\t\t\telse if (typeof(obj) == \"string\")\n\t\t\t{\n\t\t\t\tlet index = this._strings2index[obj];\n\t\t\t\tif (typeof(index) !== \"undefined\")\n\t\t\t\t{\n\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._strings2index[obj] = this._backrefs++;\n\t\t\t\t\tlet dump = ul4._str_repr(obj).replace(\"<\", \"\\\\x3c\");\n\t\t\t\t\tthis._line(\"S\" + dump);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._iscolor(obj))\n\t\t\t\tthis._line(\"c\", obj.r(), obj.g(), obj.b(), obj.a());\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\tthis._line(\"x\", obj.year(), obj.month(), obj.day());\n\t\t\telse if (ul4._isdatetime(obj))\n\t\t\t\tthis._line(\"z\", obj.getFullYear(), obj.getMonth()+1, obj.getDate(), obj.getHours(), obj.getMinutes(), obj.getSeconds(), obj.getMilliseconds() * 1000);\n\t\t\telse if (ul4._istimedelta(obj))\n\t\t\t\tthis._line(\"t\", obj.days(), obj.seconds(), obj.microseconds());\n\t\t\telse if (ul4._ismonthdelta(obj))\n\t\t\t\tthis._line(\"m\", obj.months());\n\t\t\telse if (obj instanceof ul4.slice)\n\t\t\t\tthis._line(\"r\", obj.start, obj.stop);\n\t\t\telse if (obj.ul4onname && obj.ul4ondump)\n\t\t\t{\n\t\t\t\tif (obj.__id__)\n\t\t\t\t{\n\t\t\t\t\tlet index = this._ids2index[obj.__id__];\n\t\t\t\t\tif (typeof(index) != \"undefined\")\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._line(\"^\" + index);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis._ids2index[obj.__id__] = this._backrefs++;\n\t\t\t\t}\n\t\t\t\tthis._line(\"O\", obj.ul4onname);\n\t\t\t\t++this._level;\n\t\t\t\tobj.ul4ondump(this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\")\");\n\t\t\t}\n\t\t\telse if (ul4._islist(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"l\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t\t\t\tthis.dump(obj[i]);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"]\");\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"e\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function(value, key) {\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isdict(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"d\");\n\t\t\t\t++this._level;\n\t\t\t\tfor (let key in obj)\n\t\t\t\t{\n\t\t\t\t\tthis.dump(key);\n\t\t\t\t\tthis.dump(obj[key]);\n\t\t\t\t}\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse if (ul4._isset(obj))\n\t\t\t{\n\t\t\t\tthis._line(\"y\");\n\t\t\t\t++this._level;\n\t\t\t\tobj.forEach(function(value) {\n\t\t\t\t\tthis.dump(value);\n\t\t\t\t}, this);\n\t\t\t\t--this._level;\n\t\t\t\tthis._line(\"}\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"can't create UL4ON dump of object \" + ul4._repr(obj));\n\t\t}\n\t};\n\n\t// Helper class for decoding\n\tul4.Decoder = class Decoder\n\t{\n\t\t// Creates a new decoder for reading from the string ``data``\n\t\tconstructor(data, registry)\n\t\t{\n\t\t\tthis.data = data;\n\t\t\tthis.pos = 0;\n\t\t\tthis.backrefs = [];\n\t\t\tthis.registry = typeof(registry) === \"undefined\" ? null : registry;\n\t\t\tthis.stack = []; // Use for informative error messages\n\t\t}\n\n\t\t// Read a character from the buffer\n\t\treadchar()\n\t\t{\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF\");\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read a character from the buffer (return null on eof)\n\t\treadcharoreof()\n\t\t{\n\t\t\tif (this.pos >= this.data.length)\n\t\t\t\treturn null;\n\t\t\treturn this.data.charAt(this.pos++);\n\t\t}\n\n\t\t// Read next not-whitespace character from the buffer\n\t\treadblackchar()\n\t\t{\n\t\t\tlet re_white = /\\s/;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tif (this.pos >= this.data.length)\n\t\t\t\t\tthrow new ul4.ValueError(\"UL4 decoder at EOF at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\tlet c = this.data.charAt(this.pos++);\n\t\t\t\tif (!c.match(re_white))\n\t\t\t\t\treturn c;\n\t\t\t}\n\t\t}\n\n\t\t// Read ``size`` characters from the buffer\n\t\tread(size)\n\t\t{\n\t\t\tif (this.pos+size > this.length)\n\t\t\t\tsize = this.length-this.pos;\n\t\t\tlet result = this.data.substring(this.pos, this.pos+size);\n\t\t\tthis.pos += size;\n\t\t\treturn result;\n\t\t}\n\n\t\t// \"unread\" one character\n\t\tbackup()\n\t\t{\n\t\t\t--this.pos;\n\t\t}\n\n\t\t// Read a number from the buffer\n\t\treadnumber()\n\t\t{\n\t\t\tlet re_digits = /[-+0123456789.eE]/, value = \"\";\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlet c = this.readcharoreof();\n\t\t\t\tif (c !== null && c.match(re_digits))\n\t\t\t\t\tvalue += c;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = parseFloat(value);\n\t\t\t\t\tif (isNaN(result))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"invalid number, got \" + ul4._repr(\"value\") + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_beginfakeloading()\n\t\t{\n\t\t\tlet oldpos = this.backrefs.length;\n\t\t\tthis.backrefs.push(null);\n\t\t\treturn oldpos;\n\t\t}\n\n\t\t_endfakeloading(oldpos, value)\n\t\t{\n\t\t\tthis.backrefs[oldpos] = value;\n\t\t}\n\n\t\t_readescape(escapechar, length)\n\t\t{\n\t\t\tlet chars = this.read(length);\n\t\t\tif (chars.length != length)\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\tlet codepoint = parseInt(chars, 16);\n\t\t\tif (isNaN(codepoint))\n\t\t\t\tthrow new ul4.ValueError(\"broken escape \" + ul4._repr(\"\\\\\" + escapechar + chars) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\treturn String.fromCharCode(codepoint);\n\t\t}\n\n\t\t// Load the next object from the buffer\n\t\tload()\n\t\t{\n\t\t\tlet typecode = this.readblackchar();\n\t\t\tlet result;\n\t\t\tswitch (typecode)\n\t\t\t{\n\t\t\t\tcase \"^\":\n\t\t\t\t\treturn this.backrefs[this.readnumber()];\n\t\t\t\tcase \"n\":\n\t\t\t\tcase \"N\":\n\t\t\t\t\tif (typecode === \"N\")\n\t\t\t\t\t\tthis.backrefs.push(null);\n\t\t\t\t\treturn null;\n\t\t\t\tcase \"b\":\n\t\t\t\tcase \"B\":\n\t\t\t\t\tresult = this.readchar();\n\t\t\t\t\tif (result === \"T\")\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\telse if (result === \"F\")\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"wrong value for boolean, expected 'T' or 'F', got \" + ul4._repr(result) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tif (typecode === \"B\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"i\":\n\t\t\t\tcase \"I\":\n\t\t\t\tcase \"f\":\n\t\t\t\tcase \"F\":\n\t\t\t\t\tresult = this.readnumber();\n\t\t\t\t\tif (typecode === \"I\" || typecode === \"F\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"s\":\n\t\t\t\tcase \"S\":\n\t\t\t\t\tresult = [];\n\t\t\t\t\tlet delimiter = this.readblackchar();\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet c = this.readchar();\n\t\t\t\t\t\tif (c == delimiter)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tif (c == \"\\\\\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet c2 = this.readchar();\n\t\t\t\t\t\t\tif (c2 == \"\\\\\")\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\");\n\t\t\t\t\t\t\telse if (c2 == \"n\")\n\t\t\t\t\t\t\t\tresult.push(\"\\n\");\n\t\t\t\t\t\t\telse if (c2 == \"r\")\n\t\t\t\t\t\t\t\tresult.push(\"\\r\");\n\t\t\t\t\t\t\telse if (c2 == \"t\")\n\t\t\t\t\t\t\t\tresult.push(\"\\t\");\n\t\t\t\t\t\t\telse if (c2 == \"f\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u000c\");\n\t\t\t\t\t\t\telse if (c2 == \"b\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0008\");\n\t\t\t\t\t\t\telse if (c2 == \"a\")\n\t\t\t\t\t\t\t\tresult.push(\"\\u0007\");\n\t\t\t\t\t\t\telse if (c2 == \"'\")\n\t\t\t\t\t\t\t\tresult.push(\"'\");\n\t\t\t\t\t\t\telse if (c2 == '\"')\n\t\t\t\t\t\t\t\tresult.push('\"');\n\t\t\t\t\t\t\telse if (c2 == \"x\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"x\", 2));\n\t\t\t\t\t\t\telse if (c2 == \"u\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"u\", 4));\n\t\t\t\t\t\t\telse if (c2 == \"U\")\n\t\t\t\t\t\t\t\tresult.push(this._readescape(\"U\", 8));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tresult.push(\"\\\\\" + c2);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tresult.push(c);\n\t\t\t\t\t}\n\t\t\t\t\tresult = result.join(\"\");\n\t\t\t\t\tif (typecode === \"S\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"c\":\n\t\t\t\tcase \"C\":\n\t\t\t\t\tresult = new ul4.Color();\n\t\t\t\t\tif (typecode === \"C\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._r = this.load();\n\t\t\t\t\tresult._g = this.load();\n\t\t\t\t\tresult._b = this.load();\n\t\t\t\t\tresult._a = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"x\":\n\t\t\t\tcase \"X\":\n\t\t\t\t{\n\t\t\t\t\tlet year = this.load();\n\t\t\t\t\tlet month = this.load();\n\t\t\t\t\tlet day = this.load();\n\t\t\t\t\tresult = new ul4.Date(year, month, day);\n\t\t\t\t\tif (typecode === \"X\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tcase \"z\":\n\t\t\t\tcase \"Z\":\n\t\t\t\t\tresult = new Date();\n\t\t\t\t\tresult.setFullYear(this.load());\n\t\t\t\t\tresult.setDate(1);\n\t\t\t\t\tresult.setMonth(this.load() - 1);\n\t\t\t\t\tresult.setDate(this.load());\n\t\t\t\t\tresult.setHours(this.load());\n\t\t\t\t\tresult.setMinutes(this.load());\n\t\t\t\t\tresult.setSeconds(this.load());\n\t\t\t\t\tresult.setMilliseconds(this.load()/1000);\n\t\t\t\t\tif (typecode === \"Z\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"t\":\n\t\t\t\tcase \"T\":\n\t\t\t\t\tresult = new ul4.TimeDelta();\n\t\t\t\t\tresult._days = this.load();\n\t\t\t\t\tresult._seconds = this.load();\n\t\t\t\t\tresult._microseconds = this.load();\n\t\t\t\t\tif (typecode === \"T\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"r\":\n\t\t\t\tcase \"R\":\n\t\t\t\t\tresult = new ul4.slice();\n\t\t\t\t\tif (typecode === \"R\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult.start = this.load();\n\t\t\t\t\tresult.stop = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"m\":\n\t\t\t\tcase \"M\":\n\t\t\t\t\tresult = new ul4.MonthDelta();\n\t\t\t\t\tif (typecode === \"M\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tresult._months = this.load();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"l\":\n\t\t\t\tcase \"L\":\n\t\t\t\t\tthis.stack.push(\"list\");\n\t\t\t\t\tresult = [];\n\t\t\t\t\tif (typecode === \"L\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"]\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.push(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"d\":\n\t\t\t\tcase \"D\":\n\t\t\t\tcase \"e\":\n\t\t\t\tcase \"E\":\n\t\t\t\t\tif (!ul4._havemap && (typecode == \"e\" || typecode == \"E\"))\n\t\t\t\t\t\tthrow new ul4.ValueError(\"ordered dictionaries are not supported at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = ul4._emptymap();\n\t\t\t\t\tthis.stack.push(typecode === \"d\" || typecode === \"D\" ? \"dict\" : \"odict\");\n\t\t\t\t\tif (typecode === \"D\" || typecode === \"E\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tlet key = this.load();\n\t\t\t\t\t\tlet value = this.load();\n\t\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"y\":\n\t\t\t\tcase \"Y\":\n\t\t\t\t\tthis.stack.push(\"set\");\n\t\t\t\t\tresult = ul4._makeset();\n\t\t\t\t\tif (typecode === \"Y\")\n\t\t\t\t\t\tthis.backrefs.push(result);\n\t\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\t\tif (typecode === \"}\")\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tthis.backup();\n\t\t\t\t\t\tresult.add(this.load());\n\t\t\t\t\t}\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\tcase \"o\":\n\t\t\t\tcase \"O\":\n\t\t\t\t{\n\t\t\t\t\tlet oldpos;\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\toldpos = this._beginfakeloading();\n\t\t\t\t\tlet name = this.load();\n\t\t\t\t\tthis.stack.push(name);\n\t\t\t\t\tlet constructor;\n\t\t\t\t\tif (this.registry !== null)\n\t\t\t\t\t{\n\t\t\t\t\t\tconstructor = this.registry[name];\n\t\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tconstructor = ul4._registry[name];\n\t\t\t\t\tif (typeof(constructor) === \"undefined\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"can't load object of type \" + ul4._repr(name) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tresult = new constructor();\n\t\t\t\t\tif (typecode === \"O\")\n\t\t\t\t\t\tthis._endfakeloading(oldpos, result);\n\t\t\t\t\tresult.ul4onload(this);\n\t\t\t\t\ttypecode = this.readblackchar();\n\t\t\t\t\tif (typecode !== \")\")\n\t\t\t\t\t\tthrow new ul4.ValueError(\"object terminator ')' for object of type '\" + name + \"' expected, got \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t\t\tthis.stack.pop();\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.ValueError(\"unknown typecode \" + ul4._repr(typecode) + \" at position \" + this.pos + \" with path \" + this.stack.join(\"/\"));\n\t\t\t}\n\t\t}\n\n\t\t// Return an iterator for loading the content of a object\n\t\tloadcontent()\n\t\t{\n\t\t\tlet self = this;\n\t\t\treturn {\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tlet typecode = self.readblackchar();\n\t\t\t\t\t// Always \"unread\" the typecode even at the end\n\t\t\t\t\t// so that at the end of a call to ul4onload()\n\t\t\t\t\t// the next input is the \"end of object\" marker\n\t\t\t\t\t// no matter whether ul4onload() uses loadcontent() or not.\n\t\t\t\t\tself.backup();\n\t\t\t\t\tif (typecode == \")\")\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: false, value: self.load()};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t//\n\t// UL4\n\t//\n\n\t// REs for parsing JSON\n\tul4._rvalidchars = /^[\\],:{}\\s]*$/;\n\tul4._rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n\tul4._rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n\tul4._rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\n\n\t/// Helper functions\n\n\t// Clone an object and extend it\n\tul4._inherit = function _inherit(baseobj, attrs)\n\t{\n\t\treturn Object.assign(Object.create(baseobj), attrs);\n\t};\n\n\t// Convert a map to an object\n\tul4._map2object = function _map2object(obj)\n\t{\n\t\tif (ul4._ismap(obj))\n\t\t{\n\t\t\tlet newobj = {};\n\t\t\tobj.forEach(function(value, key){\n\t\t\t\tif (typeof(key) !== \"string\")\n\t\t\t\t\tthrow new ul4.TypeError(\"keys must be strings\");\n\t\t\t\tnewobj[key] = value;\n\t\t\t});\n\t\t\treturn newobj;\n\t\t}\n\t\treturn obj;\n\t};\n\n\t// Clip a number to the range [0;max)\n\tul4._bound = function _bound(value, upper)\n\t{\n\t\tif (value < 0)\n\t\t\treturn 0;\n\t\telse if (value > upper)\n\t\t\treturn upper;\n\t\telse\n\t\t\treturn value;\n\t};\n\n\t// Create a pretty stacktrace from an exception\n\tul4._stacktrace = function _stacktrace(exc)\n\t{\n\t\tlet output = (exc instanceof ul4.Exception ? exc.constructor.name + \": \" : \"\") + exc.toString();\n\t\tif (exc.context)\n\t\t\toutput = ul4._stacktrace(exc.context) + \"\\n\\n\" + output;\n\t\treturn output;\n\t};\n\n\t// Call a function ``f`` with UL4 argument handling\n\tul4._internal_call = function _internal_call(context, f, name, functioncontext, signature, needscontext, needsobject, args, kwargs)\n\t{\n\t\tlet finalargs;\n\t\tif (needsobject)\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t{\n\t\t\t\tif (args.length)\n\t\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\t\tfinalargs = [kwargs];\n\t\t\t}\n\t\t\telse\n\t\t\t\tfinalargs = [signature.bindObject(name, args, kwargs)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (signature === null)\n\t\t\t\tthrow new ul4.ArgumentError(ul4._repr(f) + \" doesn't support positional arguments!\");\n\t\t\tfinalargs = signature.bindArray(name, args, kwargs);\n\t\t}\n\t\tif (needscontext)\n\t\t\tfinalargs.unshift(context);\n\t\treturn f.apply(functioncontext, finalargs);\n\t};\n\n\tul4._callfunction = function _callfunction(context, f, args, kwargs)\n\t{\n\t\tlet name = f._ul4_name || f.name;\n\t\tif (typeof(f._ul4_signature) === \"undefined\" || typeof(f._ul4_needsobject) === \"undefined\" || typeof(f._ul4_needscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(f) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, f, name, ul4, f._ul4_signature, f._ul4_needscontext, f._ul4_needsobject, args, kwargs);\n\t};\n\n\tul4._callobject = function _callobject(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_callsignature) === \"undefined\" || typeof(obj._ul4_callneedsobject) === \"undefined\" || typeof(obj._ul4_callneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not callable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__call__, obj.name, obj, obj._ul4_callsignature, obj._ul4_callneedscontext, obj._ul4_callneedsobject, args, kwargs);\n\t};\n\n\tul4._callrender = function _callrender(context, obj, args, kwargs)\n\t{\n\t\tif (typeof(obj._ul4_rendersignature) === \"undefined\" || typeof(obj._ul4_renderneedsobject) === \"undefined\" || typeof(obj._ul4_renderneedscontext) === \"undefined\")\n\t\t\tthrow new ul4.TypeError(ul4._repr(obj) + \" is not renderable by UL4\");\n\t\treturn ul4._internal_call(context, obj.__render__, obj.name, obj, obj._ul4_rendersignature, obj._ul4_renderneedscontext, obj._ul4_renderneedsobject, args, kwargs);\n\t};\n\n\tul4._call = function _call(context, f, args, kwargs)\n\t{\n\t\tif (typeof(f) === \"function\")\n\t\t\treturn ul4._callfunction(context, f, args, kwargs);\n\t\telse if (f && typeof(f.__call__) === \"function\")\n\t\t\treturn ul4._callobject(context, f, args, kwargs);\n\t\telse\n\t\t\tthrow new ul4.TypeError(ul4._type(f) + \" is not callable\");\n\t};\n\n\tul4._unpackvar = function _unpackvar(lvalue, value)\n\t{\n\t\tif (!ul4._islist(lvalue))\n\t\t\treturn [[lvalue, value]];\n\t\telse\n\t\t{\n\t\t\tlet newvalue = [];\n\t\t\tlet iter = ul4._iter(value);\n\n\t\t\tfor (let i = 0;;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\n\t\t\t\tif (item.done)\n\t\t\t\t{\n\t\t\t\t\tif (i === lvalue.length)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"need \" + lvalue.length + \" value\" + (lvalue.length === 1 ? \"\" : \"s\") + \" to unpack, got \" + i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (i < lvalue.length)\n\t\t\t\t\t\tnewvalue = newvalue.concat(ul4._unpackvar(lvalue[i], item.value));\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ul4.ValueError(\"too many values to unpack (expected \" + lvalue.length + \")\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newvalue;\n\t\t}\n\t};\n\n\tul4._formatsource = function _formatsource(out)\n\t{\n\t\tlet finalout = [];\n\t\tlet level = 0, needlf = false;\n\t\tfor (let i = 0; i < out.length; ++i)\n\t\t{\n\t\t\tlet part = out[i];\n\t\t\tif (typeof(part) === \"number\")\n\t\t\t{\n\t\t\t\tlevel += part;\n\t\t\t\tneedlf = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (needlf)\n\t\t\t\t{\n\t\t\t\t\tfinalout.push(\"\\n\");\n\t\t\t\t\tfor (let j = 0; j < level; ++j)\n\t\t\t\t\t\tfinalout.push(\"\\t\");\n\t\t\t\t\tneedlf = false;\n\t\t\t\t}\n\t\t\t\tfinalout.push(part);\n\t\t\t}\n\t\t}\n\t\tif (needlf)\n\t\t\tfinalout.push(\"\\n\");\n\t\treturn finalout.join(\"\");\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they have the same value\n\tul4._eq = function _eq(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__eq__) === \"function\")\n\t\t\treturn obj1.__eq__(obj2);\n\t\telse if (obj2 && typeof(obj2.__eq__) === \"function\")\n\t\t\treturn obj2.__eq__(obj1);\n\t\telse if (obj1 === null)\n\t\t\treturn obj2 === null;\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 == obj2;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() == obj2.getTime();\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.length != obj2.length)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (!ul4._eq(obj1[i], obj2[i])) // This might lead to infinite recursion and a stackoverflow, but it does in all implementations\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isobject(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.hasOwnProperty(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2[key]))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tfor (let key in obj1)\n\t\t\t\t{\n\t\t\t\t\tif (obj2.has(key))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!ul4._eq(obj1[key], obj2.get(key)))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tlet result = true;\n\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\tif (!obj1.hasOwnProperty(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t}, this);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._ismap(obj1))\n\t\t{\n\t\t\tif (ul4._isobject(obj2))\n\t\t\t{\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.hasOwnProperty(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2[key]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\t// Test that each attribute of ``obj2`` is also in ``obj1`` (the value has been tested before)\n\t\t\t\tfor (let key in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (!obj1.has(key))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._ismap(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\t// Test that each attribute of ``obj1`` can also be found in ``obj2`` and has the same value\n\t\t\t\tobj1.forEach(function(value, key) {\n\t\t\t\t\tif (!obj2.has(key))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t\telse if (!ul4._eq(obj1.get(key), obj2.get(key)))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\t// We don't have to test for ``ul4._Set`` as ``ul4._Set`` implements ``__eq__``\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\t// Shortcut, if it's the same object\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tif (obj1.size != obj2.size)\n\t\t\t\t\treturn false;\n\t\t\t\tlet result = true;\n\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\tresult = false;\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn obj1 === obj2;\n\t};\n\n\t// Compare ``obj1`` and ``obj2`` if they don't have the same value\n\tul4._ne = function _ne(obj1, obj2)\n\t{\n\t\tif (obj1 && typeof(obj1.__ne__) === \"function\")\n\t\t\treturn obj1.__ne__(obj2);\n\t\telse if (obj2 && typeof(obj2.__ne__) === \"function\")\n\t\t\treturn obj2.__ne__(obj1);\n\t\telse\n\t\t\treturn !ul4._eq(obj1, obj2);\n\t};\n\n\tul4._unorderable = function _unorderable(operator, obj1, obj2)\n\t{\n\t\tthrow new ul4.TypeError(\"unorderable types: \" + ul4._type(obj1) + \" \" + operator + \" \" + ul4._type(obj2));\n\t};\n\n\t// Return:\n\t// -1 when ``obj1 < obj2``,\n\t// 0 when ``obj1 == obj2``,\n\t// 1 when ``obj1 > obj2``,\n\t// null when ``obj1`` and ``obj2`` are comparable, but neither of the previous cases holds (only for sets)\n\t// raise TypeError if objects are uncomparable\n\t// This the purpose of ``_cmp`` is to support implementation of <, <=, > and >=\n\t// and dicts/maps are not comparable with the operator ``_cmp`` does not support dicts/maps\n\n\tul4._cmp = function _cmp(operator, obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn (obj1 > obj2) - (obj1 < obj2);\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t{\n\t\t\t\tlet v1 = obj1.getTime(), v2 = obj2.getTime();\n\t\t\t\treturn (v1 > v2) - (v1 < v2);\n\t\t\t}\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn 0;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tlet res = ul4._cmp(operator, obj1[i], obj2[i]);\n\t\t\t\t\tif (res)\n\t\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn obj2.length > obj1.length ? -1 : 0;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2) || ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tlet in1only = false;\n\t\t\t\tlet in2only = false;\n\n\t\t\t\tfor (let iter = _iter(obj1);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj2.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let iter = _iter(obj2);;)\n\t\t\t\t{\n\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\tif (item.done)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (!obj1.has(item.value))\n\t\t\t\t\t{\n\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (in1only)\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (in2only)\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ul4._unorderable(operator, obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 < obj2``\n\tul4._lt = function _lt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__lt__) === \"function\")\n\t\t\treturn obj1.__lt__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 < obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() < obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length < obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1))\n\t\t{\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(obj1[key]))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(obj2[key]))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let key in obj1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[obj1[key]])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let key in obj2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[obj2[key]])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 <= obj2``\n\tul4._le = function _le(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__le__) === \"function\")\n\t\t\treturn obj1.__le__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 <= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() <= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._lt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length <= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\"<=\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 > obj2``\n\tul4._gt = function _gt(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__gt__) === \"function\")\n\t\t\treturn obj1.__gt__(obj2);\n\t\tif (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 > obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() > obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn false;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length > obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">\", obj1, obj2);\n\t};\n\n\t// Return whether ``obj1 >= obj2``\n\tul4._ge = function _ge(obj1, obj2)\n\t{\n\t\tlet numbertypes = [\"boolean\", \"number\"];\n\n\t\tif (obj1 && typeof(obj1.__ge__) === \"function\")\n\t\t\treturn obj1.__ge__(obj2);\n\t\telse if (numbertypes.indexOf(typeof(obj1)) != -1)\n\t\t{\n\t\t\tif (numbertypes.indexOf(typeof(obj2)) != -1)\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (typeof(obj1) === \"string\")\n\t\t{\n\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\treturn obj1 >= obj2;\n\t\t}\n\t\telse if (ul4._isdatetime(obj1))\n\t\t{\n\t\t\tif (ul4._isdatetime(obj2))\n\t\t\t\treturn obj1.getTime() >= obj2.getTime();\n\t\t}\n\t\telse if (ul4._islist(obj1))\n\t\t{\n\t\t\tif (ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tif (obj1 === obj2)\n\t\t\t\t\treturn true;\n\t\t\t\tfor (let i = 0; i < obj1.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i >= obj2.length)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet eq = ul4._eq(obj1[i], obj2[i]);\n\t\t\t\t\tif (!eq)\n\t\t\t\t\t\treturn ul4._gt(obj1[i], obj2[i]);\n\t\t\t\t}\n\t\t\t\treturn obj1.length >= obj2.length;\n\t\t\t}\n\t\t}\n\t\t// FIXME: Set comparison\n\t\telse if (ul4._isset(obj1) || ul4._isul4set(obj1))\n\t\t{\n\t\t\tlet in1only = false;\n\t\t\tlet in2only = false;\n\n\t\t\tif (ul4._isset(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tobj2.forEach(function(value) {\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tobj1.forEach(function(value) {\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t});\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t{\n\t\t\t\tif (ul4._isset(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.has(value))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobj2.forEach(function(value, key) {\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (ul4._isul4set(obj2))\n\t\t\t\t{\n\t\t\t\t\tfor (let value in obj1.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj2.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin1only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let value in obj2.items)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!obj1.items[value])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tin2only = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(operator, obj1, obj2);\n\n\t\t\tif (in1only)\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn null;\n\t\t\t\telse\n\t\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (in2only)\n\t\t\t\t\treturn -1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tul4._unorderable(\">=\", obj1, obj2);\n\t};\n\n\t// Return an iterator for ``obj``\n\tul4._iter = function _iter(obj)\n\t{\n\t\tif (typeof(obj) === \"string\" || ul4._islist(obj))\n\t\t{\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index < obj.length)\n\t\t\t\t\t\treturn {value: obj[this.index++], done: false};\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isiter(obj))\n\t\t\treturn obj;\n\t\telse if (obj !== null && typeof(obj.__iter__) === \"function\")\n\t\t\treturn obj.__iter__();\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tkeys.push(key);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isset(obj))\n\t\t{\n\t\t\tlet values = [];\n\t\t\tobj.forEach(function(item) {\n\t\t\t\tvalues.push(item);\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= values.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: values[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse if (ul4._isul4set(obj))\n\t\t{\n\t\t\treturn ul4._iter(obj.items);\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tkeys.push(key);\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function()\n\t\t\t\t{\n\t\t\t\t\tif (this.index >= keys.length)\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\treturn {value: keys[this.index++], done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tthrow new ul4.TypeError(ul4._type(obj) + \" object is not iterable\");\n\t};\n\n\tul4._str_repr = function _str_repr(str, ascii)\n\t{\n\t\tlet result = \"\";\n\t\tlet squote = false, dquote = false;\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tif (c == '\"')\n\t\t\t{\n\t\t\t\tdquote = true;\n\t\t\t\tif (squote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (c == \"'\")\n\t\t\t{\n\t\t\t\tsquote = true;\n\t\t\t\tif (dquote)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Prefer single quotes: Only use double quotes if the string contains single quotes, but no double quotes\n\t\tlet quote = (squote && !dquote) ? '\"' : \"'\";\n\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += (quote == c) ? '\\\\\"' : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"'\":\n\t\t\t\t\tresult += (quote == c) ? \"\\\\'\" : c;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tlet escape;\n\t\t\t\t\tif (code < 32)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code < 0x7f)\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (!ascii && !/[\\u007f-\\u00a0\\u00ad\\u0378-\\u0379\\u0380-\\u0383\\u038b\\u038d\\u03a2\\u0530\\u0557-\\u0558\\u0560\\u0588\\u058b-\\u058c\\u0590\\u05c8-\\u05cf\\u05eb-\\u05ef\\u05f5-\\u0605\\u061c-\\u061d\\u06dd\\u070e-\\u070f\\u074b-\\u074c\\u07b2-\\u07bf\\u07fb-\\u07ff\\u082e-\\u082f\\u083f\\u085c-\\u085d\\u085f-\\u089f\\u08b5-\\u08e2\\u0984\\u098d-\\u098e\\u0991-\\u0992\\u09a9\\u09b1\\u09b3-\\u09b5\\u09ba-\\u09bb\\u09c5-\\u09c6\\u09c9-\\u09ca\\u09cf-\\u09d6\\u09d8-\\u09db\\u09de\\u09e4-\\u09e5\\u09fc-\\u0a00\\u0a04\\u0a0b-\\u0a0e\\u0a11-\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a-\\u0a3b\\u0a3d\\u0a43-\\u0a46\\u0a49-\\u0a4a\\u0a4e-\\u0a50\\u0a52-\\u0a58\\u0a5d\\u0a5f-\\u0a65\\u0a76-\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba-\\u0abb\\u0ac6\\u0aca\\u0ace-\\u0acf\\u0ad1-\\u0adf\\u0ae4-\\u0ae5\\u0af2-\\u0af8\\u0afa-\\u0b00\\u0b04\\u0b0d-\\u0b0e\\u0b11-\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a-\\u0b3b\\u0b45-\\u0b46\\u0b49-\\u0b4a\\u0b4e-\\u0b55\\u0b58-\\u0b5b\\u0b5e\\u0b64-\\u0b65\\u0b78-\\u0b81\\u0b84\\u0b8b-\\u0b8d\\u0b91\\u0b96-\\u0b98\\u0b9b\\u0b9d\\u0ba0-\\u0ba2\\u0ba5-\\u0ba7\\u0bab-\\u0bad\\u0bba-\\u0bbd\\u0bc3-\\u0bc5\\u0bc9\\u0bce-\\u0bcf\\u0bd1-\\u0bd6\\u0bd8-\\u0be5\\u0bfb-\\u0bff\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c3a-\\u0c3c\\u0c45\\u0c49\\u0c4e-\\u0c54\\u0c57\\u0c5b-\\u0c5f\\u0c64-\\u0c65\\u0c70-\\u0c77\\u0c80\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba-\\u0cbb\\u0cc5\\u0cc9\\u0cce-\\u0cd4\\u0cd7-\\u0cdd\\u0cdf\\u0ce4-\\u0ce5\\u0cf0\\u0cf3-\\u0d00\\u0d04\\u0d0d\\u0d11\\u0d3b-\\u0d3c\\u0d45\\u0d49\\u0d4f-\\u0d56\\u0d58-\\u0d5e\\u0d64-\\u0d65\\u0d76-\\u0d78\\u0d80-\\u0d81\\u0d84\\u0d97-\\u0d99\\u0db2\\u0dbc\\u0dbe-\\u0dbf\\u0dc7-\\u0dc9\\u0dcb-\\u0dce\\u0dd5\\u0dd7\\u0de0-\\u0de5\\u0df0-\\u0df1\\u0df5-\\u0e00\\u0e3b-\\u0e3e\\u0e5c-\\u0e80\\u0e83\\u0e85-\\u0e86\\u0e89\\u0e8b-\\u0e8c\\u0e8e-\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8-\\u0ea9\\u0eac\\u0eba\\u0ebe-\\u0ebf\\u0ec5\\u0ec7\\u0ece-\\u0ecf\\u0eda-\\u0edb\\u0ee0-\\u0eff\\u0f48\\u0f6d-\\u0f70\\u0f98\\u0fbd\\u0fcd\\u0fdb-\\u0fff\\u10c6\\u10c8-\\u10cc\\u10ce-\\u10cf\\u1249\\u124e-\\u124f\\u1257\\u1259\\u125e-\\u125f\\u1289\\u128e-\\u128f\\u12b1\\u12b6-\\u12b7\\u12bf\\u12c1\\u12c6-\\u12c7\\u12d7\\u1311\\u1316-\\u1317\\u135b-\\u135c\\u137d-\\u137f\\u139a-\\u139f\\u13f6-\\u13f7\\u13fe-\\u13ff\\u1680\\u169d-\\u169f\\u16f9-\\u16ff\\u170d\\u1715-\\u171f\\u1737-\\u173f\\u1754-\\u175f\\u176d\\u1771\\u1774-\\u177f\\u17de-\\u17df\\u17ea-\\u17ef\\u17fa-\\u17ff\\u180e-\\u180f\\u181a-\\u181f\\u1878-\\u187f\\u18ab-\\u18af\\u18f6-\\u18ff\\u191f\\u192c-\\u192f\\u193c-\\u193f\\u1941-\\u1943\\u196e-\\u196f\\u1975-\\u197f\\u19ac-\\u19af\\u19ca-\\u19cf\\u19db-\\u19dd\\u1a1c-\\u1a1d\\u1a5f\\u1a7d-\\u1a7e\\u1a8a-\\u1a8f\\u1a9a-\\u1a9f\\u1aae-\\u1aaf\\u1abf-\\u1aff\\u1b4c-\\u1b4f\\u1b7d-\\u1b7f\\u1bf4-\\u1bfb\\u1c38-\\u1c3a\\u1c4a-\\u1c4c\\u1c80-\\u1cbf\\u1cc8-\\u1ccf\\u1cf7\\u1cfa-\\u1cff\\u1df6-\\u1dfb\\u1f16-\\u1f17\\u1f1e-\\u1f1f\\u1f46-\\u1f47\\u1f4e-\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e-\\u1f7f\\u1fb5\\u1fc5\\u1fd4-\\u1fd5\\u1fdc\\u1ff0-\\u1ff1\\u1ff5\\u1fff-\\u200f\\u2028-\\u202f\\u205f-\\u206f\\u2072-\\u2073\\u208f\\u209d-\\u209f\\u20bf-\\u20cf\\u20f1-\\u20ff\\u218c-\\u218f\\u23fb-\\u23ff\\u2427-\\u243f\\u244b-\\u245f\\u2b74-\\u2b75\\u2b96-\\u2b97\\u2bba-\\u2bbc\\u2bc9\\u2bd2-\\u2beb\\u2bf0-\\u2bff\\u2c2f\\u2c5f\\u2cf4-\\u2cf8\\u2d26\\u2d28-\\u2d2c\\u2d2e-\\u2d2f\\u2d68-\\u2d6e\\u2d71-\\u2d7e\\u2d97-\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2e43-\\u2e7f\\u2e9a\\u2ef4-\\u2eff\\u2fd6-\\u2fef\\u2ffc-\\u3000\\u3040\\u3097-\\u3098\\u3100-\\u3104\\u312e-\\u3130\\u318f\\u31bb-\\u31bf\\u31e4-\\u31ef\\u321f\\u32ff\\u4db6-\\u4dbf\\u9fd6-\\u9fff\\ua48d-\\ua48f\\ua4c7-\\ua4cf\\ua62c-\\ua63f\\ua6f8-\\ua6ff\\ua7ae-\\ua7af\\ua7b8-\\ua7f6\\ua82c-\\ua82f\\ua83a-\\ua83f\\ua878-\\ua87f\\ua8c5-\\ua8cd\\ua8da-\\ua8df\\ua8fe-\\ua8ff\\ua954-\\ua95e\\ua97d-\\ua97f\\ua9ce\\ua9da-\\ua9dd\\ua9ff\\uaa37-\\uaa3f\\uaa4e-\\uaa4f\\uaa5a-\\uaa5b\\uaac3-\\uaada\\uaaf7-\\uab00\\uab07-\\uab08\\uab0f-\\uab10\\uab17-\\uab1f\\uab27\\uab2f\\uab66-\\uab6f\\uabee-\\uabef\\uabfa-\\uabff\\ud7a4-\\ud7af\\ud7c7-\\ud7ca\\ud7fc-\\uf8ff\\ufa6e-\\ufa6f\\ufada-\\ufaff\\ufb07-\\ufb12\\ufb18-\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbc2-\\ufbd2\\ufd40-\\ufd4f\\ufd90-\\ufd91\\ufdc8-\\ufdef\\ufdfe-\\ufdff\\ufe1a-\\ufe1f\\ufe53\\ufe67\\ufe6c-\\ufe6f\\ufe75\\ufefd-\\uff00\\uffbf-\\uffc1\\uffc8-\\uffc9\\uffd0-\\uffd1\\uffd8-\\uffd9\\uffdd-\\uffdf\\uffe7\\uffef-\\ufffb\\ufffe-\\uffff]/.test(c))\n\t\t\t\t\t\tescape = 0;\n\t\t\t\t\telse if (code <= 0xff)\n\t\t\t\t\t\tescape = 2;\n\t\t\t\t\telse if (code <= 0xffff)\n\t\t\t\t\t\tescape = 4;\n\t\t\t\t\telse\n\t\t\t\t\t\tescape = 8;\n\n\t\t\t\t\tif (escape === 0)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse if (escape === 2)\n\t\t\t\t\t\tresult += \"\\\\x\" + ul4._lpad(code.toString(16), \"0\", 2);\n\t\t\t\t\telse if (escape === 4)\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\U\" + ul4._lpad(code.toString(16), \"0\", 8);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn quote + result + quote;\n\t};\n\n\tul4._date_repr = function _date_repr(obj, ascii)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \")\";\n\t\treturn result;\n\t};\n\n\tul4._datetime_repr = function _datetime_repr(obj, ascii)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\t\tlet result = \"@(\" + year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\";\n\n\t\tif (hour || minute || second || ms)\n\t\t{\n\t\t\tresult += ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\t\tif (second || ms)\n\t\t\t{\n\t\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\t\tif (ms)\n\t\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\t}\n\t\t}\n\t\tresult += \")\";\n\n\t\treturn result;\n\t};\n\n\tul4._map_repr = function _map_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\n\t\tlet i = 0;\n\t\tobj.forEach(function(value, key) {\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t});\n\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._list_repr = function _list_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"[\");\n\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t{\n\t\t\tlet item = obj[i];\n\t\t\tif (i)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(item, ascii));\n\t\t}\n\t\tv.push(\"]\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._set_repr = function _set_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tif (!obj.size)\n\t\t\tv.push(\"/\");\n\t\telse\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr_internal(value, ascii));\n\t\t\t});\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._object_repr = function _object_repr(obj, ascii)\n\t{\n\t\tlet v = [];\n\t\tv.push(\"{\");\n\t\tlet i = 0;\n\t\tfor (let key in obj)\n\t\t{\n\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\tcontinue;\n\t\t\tif (i++)\n\t\t\t\tv.push(\", \");\n\t\t\tv.push(ul4._repr_internal(key, ascii));\n\t\t\tv.push(\": \");\n\t\t\tv.push(ul4._repr_internal(obj[key], ascii));\n\t\t}\n\t\tv.push(\"}\");\n\t\treturn v.join(\"\");\n\t};\n\n\tul4._repr_internal = function _repr_internal(obj, ascii)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"None\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn \"\" + obj;\n\t\telse if (typeof(obj) === \"function\")\n\t\t\tif (obj._ul4_name || obj.name)\n\t\t\t\treturn \"\";\n\t\t\telse\n\t\t\t\treturn \"\";\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_repr(obj, ascii);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_repr(obj, ascii);\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj, ascii);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj, ascii);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj, ascii);\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj, ascii);\n\t\treturn \"?\";\n\t};\n\n\t// Return a string representation of ``obj``: If possible this should be an object literal supported by UL4, otherwise the output should be bracketed with ``<`` and ``>``\n\tul4._repr = function _repr(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, false);\n\t};\n\n\tul4._ascii = function _ascii(obj)\n\t{\n\t\treturn ul4._repr_internal(obj, true);\n\t};\n\n\tul4._date_str = function _date_str(obj)\n\t{\n\t\tlet year = obj._date.getFullYear();\n\t\tlet month = obj._date.getMonth()+1;\n\t\tlet day = obj._date.getDate();\n\n\t\treturn year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2);\n\t};\n\n\tul4._datetime_str = function _datetime_str(obj)\n\t{\n\t\tlet year = obj.getFullYear();\n\t\tlet month = obj.getMonth()+1;\n\t\tlet day = obj.getDate();\n\t\tlet hour = obj.getHours();\n\t\tlet minute = obj.getMinutes();\n\t\tlet second = obj.getSeconds();\n\t\tlet ms = obj.getMilliseconds();\n\n\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \" \" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2);\n\t\tif (second || ms)\n\t\t{\n\t\t\tresult += \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t}\n\t\treturn result;\n\t};\n\n\tul4._str = function _str(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\")\n\t\t\treturn \"\";\n\t\telse if (obj === null)\n\t\t\treturn \"\";\n\t\telse if (obj === false)\n\t\t\treturn \"False\";\n\t\telse if (obj === true)\n\t\t\treturn \"True\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn obj;\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj.toString();\n\t\telse if (ul4._isdate(obj))\n\t\t\treturn ul4._date_str(obj);\n\t\telse if (ul4._isdatetime(obj))\n\t\t\treturn ul4._datetime_str(obj);\n\t\telse if (ul4._islist(obj))\n\t\t\treturn ul4._list_repr(obj);\n\t\telse if (ul4._isset(obj))\n\t\t\treturn ul4._set_repr(obj);\n\t\telse if (ul4._ismap(obj))\n\t\t\treturn ul4._map_repr(obj);\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__str__) === \"function\")\n\t\t\treturn obj.__str__();\n\t\telse if (typeof(obj) === \"object\" && typeof(obj.__repr__) === \"function\")\n\t\t\treturn obj.__repr__();\n\t\telse if (ul4._isobject(obj))\n\t\t\treturn ul4._object_repr(obj);\n\t\treturn \"?\";\n\t};\n\n\t// Convert ``obj`` to bool, according to its \"truth value\"\n\tul4._bool = function _bool(obj)\n\t{\n\t\tif (typeof(obj) === \"undefined\" || obj === null || obj === false || obj === 0 || obj === \"\")\n\t\t\treturn false;\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) === \"object\", typeof(obj.__bool__) === \"function\")\n\t\t\t\treturn obj.__bool__();\n\t\t\tif (ul4._islist(obj))\n\t\t\t\treturn obj.length !== 0;\n\t\t\telse if (ul4._ismap(obj) || ul4._isset(obj))\n\t\t\t\treturn obj.size != 0;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t{\n\t\t\t\tfor (let key in obj)\n\t\t\t\t{\n\t\t\t\t\tif (!obj.hasOwnProperty(key))\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t};\n\n\t// Convert ``obj`` to an integer (if ``base`` is given ``obj`` must be a string and ``base`` is the base for the conversion (default is 10))\n\tul4._int = function _int(obj, base)\n\t{\n\t\tlet result;\n\t\tif (base !== null)\n\t\t{\n\t\t\tif (typeof(obj) !== \"string\" || !ul4._isint(base))\n\t\t\t\tthrow new ul4.TypeError(\"int() requires a string and an integer\");\n\t\t\tresult = parseInt(obj, base);\n\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t{\n\t\t\t\tresult = parseInt(obj);\n\t\t\t\tif (result.toString() == \"NaN\")\n\t\t\t\tthrow new ul4.TypeError(\"invalid literal for int()\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse if (typeof(obj) == \"number\")\n\t\t\t\treturn Math.floor(obj);\n\t\t\telse if (obj === true)\n\t\t\t\treturn 1;\n\t\t\telse if (obj === false)\n\t\t\t\treturn 0;\n\t\t\tthrow new ul4.TypeError(\"int() argument must be a string or a number\");\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a float\n\tul4._float = function _float(obj)\n\t{\n\t\tif (typeof(obj) === \"string\")\n\t\t\treturn parseFloat(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn obj;\n\t\telse if (obj === true)\n\t\t\treturn 1.0;\n\t\telse if (obj === false)\n\t\t\treturn 0.0;\n\t\tthrow new ul4.TypeError(\"float() argument must be a string or a number\");\n\t};\n\n\t// Convert ``obj`` to a list\n\tul4._list = function _list(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = [];\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.push(value.value);\n\t\t}\n\t};\n\n\t// Convert ``obj`` to a set\n\tul4._set = function _set(obj)\n\t{\n\t\tlet iter = ul4._iter(obj);\n\n\t\tlet result = ul4._emptyset();\n\t\tfor (;;)\n\t\t{\n\t\t\tlet value = iter.next();\n\t\t\tif (value.done)\n\t\t\t\treturn result;\n\t\t\tresult.add(value.value);\n\t\t}\n\t};\n\n\t// Return the length of ``sequence``\n\tul4._len = function _len(sequence)\n\t{\n\t\tif (typeof(sequence) == \"string\" || ul4._islist(sequence))\n\t\t\treturn sequence.length;\n\t\telse if (ul4._ismap(sequence) || ul4._isset(sequence))\n\t\t\treturn sequence.size;\n\t\telse if (ul4._isobject(sequence))\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tfor (let key in sequence)\n\t\t\t\t++i;\n\t\t\treturn i;\n\t\t}\n\t\tthrow new ul4.TypeError(\"object of type '\" + ul4._type(sequence) + \"' has no len()\");\n\t};\n\n\tul4._type = function _type(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"none\";\n\t\telse if (obj === false || obj === true)\n\t\t\treturn \"bool\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (typeof(obj) === \"number\")\n\t\t\treturn Math.round(obj) == obj ? \"int\" : \"float\";\n\t\telse if (typeof(obj) === \"function\")\n\t\t\treturn \"function\";\n\t\telse\n\t\t{\n\t\t\tif (typeof(obj.ul4type) === \"function\")\n\t\t\t\treturn obj.ul4type();\n\t\t\telse\n\t\t\t\treturn ul4.Protocol.get(obj).ul4type(obj);\n\t\t}\n\t};\n\n\t// (this is non-trivial, because it follows the Python semantic of ``-5 % 2`` being ``1``)\n\tul4._mod = function _mod(obj1, obj2)\n\t{\n\t\tlet div = Math.floor(obj1 / obj2);\n\t\tlet mod = obj1 - div * obj2;\n\n\t\tif (mod !== 0 && ((obj2 < 0 && mod > 0) || (obj2 > 0 && mod < 0)))\n\t\t{\n\t\t\tmod += obj2;\n\t\t\t--div;\n\t\t}\n\t\treturn obj1 - div * obj2;\n\t},\n\n\t// Return the attribute with the name ``attrname`` of the object ``obj``\n\t// If ``obj`` doesn't have such an attribute, return ``default_``\n\tul4._getattr = function _getattr(obj, attrname, default_=null)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\ttry\n\t\t{\n\t\t\treturn proto.getattr(obj, attrname);\n\t\t}\n\t\tcatch (exc)\n\t\t{\n\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === obj)\n\t\t\t\treturn default_;\n\t\t\telse\n\t\t\t\tthrow exc;\n\t\t}\n\t};\n\n\t// Return wether the object ``obj`` has an attribute with the name ``attrname``\n\tul4._hasattr = function _hasattr(obj, attrname)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.hasattr(obj, attrname);\n\t};\n\n\t// Return the names of the attributes of the object ``obj`` as a set.\n\tul4._dir = function _dir(obj)\n\t{\n\t\tlet proto = ul4.Protocol.get(obj);\n\t\treturn proto.dir();\n\t};\n\n\t// Return whether any of the items in ``iterable`` are true\n\tul4._any = function _any(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] !== '\\x00')\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn false;\n\t\t\t\tif (ul4._bool(item.value))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Return whether all of the items in ``iterable`` are true\n\tul4._all = function _all(iterable)\n\t{\n\t\tif (typeof(iterable) == \"string\")\n\t\t{\n\t\t\tfor (let i = 0; i < iterable.length; ++i)\n\t\t\t{\n\t\t\t\tif (iterable[i] === '\\x00')\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\treturn true;\n\t\t\t\tif (!ul4._bool(item.value))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Check if ``obj`` is undefined\n\tul4._isundefined = function _isundefined(obj)\n\t{\n\t\treturn typeof(obj) === \"undefined\";\n\t};\n\n\n\t// Check if ``obj`` is *not* undefined\n\tul4._isdefined = function _isdefined(obj)\n\t{\n\t\treturn typeof(obj) !== \"undefined\";\n\t};\n\n\t// Check if ``obj`` is ``None``\n\tul4._isnone = function _isnone(obj)\n\t{\n\t\treturn obj === null;\n\t};\n\n\t// Check if ``obj`` is a boolean\n\tul4._isbool = function _isbool(obj)\n\t{\n\t\treturn typeof(obj) == \"boolean\";\n\t};\n\n\t// Check if ``obj`` is a int\n\tul4._isint = function _isint(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) == obj;\n\t};\n\n\t// Check if ``obj`` is a float\n\tul4._isfloat = function _isfloat(obj)\n\t{\n\t\treturn (typeof(obj) == \"number\") && Math.round(obj) != obj;\n\t};\n\n\t// Check if ``obj`` is a string\n\tul4._isstr = function _isstr(obj)\n\t{\n\t\treturn typeof(obj) == \"string\";\n\t};\n\n\t// Check if ``obj`` is a datetime\n\tul4._isdatetime = function _isdate(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Date]\";\n\t};\n\n\tul4._isdate = function _isdate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Date);\n\t};\n\n\t// Check if ``obj`` is a color\n\tul4._iscolor = function _iscolor(obj)\n\t{\n\t\treturn (obj instanceof ul4.Color);\n\t};\n\n\t// Check if ``obj`` is a timedelta object\n\tul4._istimedelta = function _istimedelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.TimeDelta);\n\t};\n\n\t// Check if ``obj`` is a monthdelta object\n\tul4._ismonthdelta = function _ismonthdelta(obj)\n\t{\n\t\treturn (obj instanceof ul4.MonthDelta);\n\t};\n\n\t// Check if ``obj`` is a template\n\tul4._istemplate = function _istemplate(obj)\n\t{\n\t\treturn (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure);\n\t};\n\n\t// Check if ``obj`` is a function\n\tul4._isfunction = function _isfunction(obj)\n\t{\n\t\treturn typeof(obj) === \"function\" || (Object.prototype.toString.call(obj) == \"[object Object]\" && (obj instanceof ul4.Template || obj instanceof ul4.TemplateClosure));\n\t};\n\n\t// Check if ``obj`` is a list\n\tul4._islist = function _islist(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Array]\";\n\t};\n\n\t// Check if ``obj`` is a set\n\tul4._isset = function _isset(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Set]\";\n\t};\n\n\t// Check if ``obj`` is an exception (at least a UL4 exception)\n\tul4._isexception = function _isexception(obj)\n\t{\n\t\treturn (obj instanceof ul4.Exception);\n\t};\n\n\tul4._isul4set = function _isul4set(obj)\n\t{\n\t\treturn (obj instanceof ul4._Set);\n\t};\n\n\tul4._isanyset = function _isanyset(obj)\n\t{\n\t\treturn (ul4._isset(obj) || ul4._isul4set(obj));\n\t};\n\n\t// Check if ``obj`` is an iterator\n\tul4._isiter = function _isiter(obj)\n\t{\n\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.next) === \"function\";\n\t};\n\n\t// Check if ``obj`` is a JS object\n\tul4._isobject = function _isobject(obj)\n\t{\n\t\treturn Object.prototype.toString.call(obj) == \"[object Object]\" && typeof(obj.__type__) === \"undefined\" && !(obj instanceof ul4.Proto);\n\t};\n\n\tif (ul4._havemap)\n\t{\n\t\t// Check if ``obj`` is a ``Map``\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn obj !== null && typeof(obj) === \"object\" && typeof(obj.__proto__) === \"object\" && obj.__proto__ === Map.prototype;\n\t\t};\n\n\t\t// Check if ``obj`` is a dict (i.e. a normal Javascript object or a ``Map``)\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj) || ul4._ismap(obj);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._ismap = function _ismap(obj)\n\t\t{\n\t\t\treturn false;\n\t\t};\n\n\t\tul4._isdict = function _isdict(obj)\n\t\t{\n\t\t\treturn ul4._isobject(obj);\n\t\t};\n\t}\n\n\t// Repeat string ``str`` ``rep`` times\n\tul4._str_repeat = function _str_repeat(str, rep)\n\t{\n\t\tlet result = \"\";\n\t\tfor (; rep>0; --rep)\n\t\t\tresult += str;\n\t\treturn result;\n\t};\n\n\tul4._list_repeat = function _list_repeat(list, rep)\n\t{\n\t\tlet result = [];\n\t\tfor (; rep>0; --rep)\n\t\t\tfor (let i = 0; i < list.length; ++i)\n\t\t\t\tresult.push(list[i]);\n\t\treturn result;\n\t};\n\n\tul4._str_json = function _str_json(str)\n\t{\n\t\tlet result = \"\";\n\t\tfor (let i = 0; i < str.length; ++i)\n\t\t{\n\t\t\tlet c = str[i];\n\t\t\tswitch (c)\n\t\t\t{\n\t\t\t\tcase \"\\r\":\n\t\t\t\t\tresult += \"\\\\r\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\n\":\n\t\t\t\t\tresult += \"\\\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\t\":\n\t\t\t\t\tresult += \"\\\\t\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tresult += \"\\\\\\\\\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\"':\n\t\t\t\t\tresult += '\\\\\"';\n\t\t\t\t\tbreak;\n\t\t\t\tcase '<':\n\t\t\t\t\tresult += '\\\\u003c';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet code = c.charCodeAt(0);\n\t\t\t\t\tif (code >= 32 && code < 128)\n\t\t\t\t\t\tresult += c;\n\t\t\t\t\telse\n\t\t\t\t\t\tresult += \"\\\\u\" + ul4._lpad(code.toString(16), \"0\", 4);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn '\"' + result + '\"';\n\t};\n\n\t// Encodes ``obj`` in the Javascript Object Notation (see http://json.org/; with support for dates, colors and templates)\n\tul4._asjson = function _asjson(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"null\";\n\t\telse if (typeof(obj) === \"undefined\")\n\t\t\treturn \"undefined\";\n\t\telse if (obj === false)\n\t\t\treturn \"false\";\n\t\telse if (obj === true)\n\t\t\treturn \"true\";\n\t\telse if (typeof(obj) === \"string\")\n\t\t\treturn ul4._str_json(obj);\n\t\telse if (typeof(obj) === \"number\")\n\t\t{\n\t\t\treturn \"\" + obj;\n\t\t}\n\t\telse if (ul4._islist(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"[\");\n\t\t\tfor (let i = 0; i < obj.length; ++i)\n\t\t\t{\n\t\t\t\tif (i != 0)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(obj[i]));\n\t\t\t}\n\t\t\tv.push(\"]\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._ismap(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(value));\n\t\t\t});\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isobject(obj))\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let key in obj)\n\t\t\t{\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._asjson(key));\n\t\t\t\tv.push(\": \");\n\t\t\t\tv.push(ul4._asjson(obj[key]));\n\t\t\t}\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\t\telse if (ul4._isdate(obj))\n\t\t{\n\t\t\treturn \"new ul4.Date(\" + obj._date.getFullYear() + \", \" + (obj._date.getMonth()+1) + \", \" + obj._date.getDate() + \")\";\n\t\t}\n\t\telse if (ul4._isdatetime(obj))\n\t\t{\n\t\t\treturn \"new Date(\" + obj.getFullYear() + \", \" + obj.getMonth() + \", \" + obj.getDate() + \", \" + obj.getHours() + \", \" + obj.getMinutes() + \", \" + obj.getSeconds() + \", \" + obj.getMilliseconds() + \")\";\n\t\t}\n\t\telse if (ul4._istimedelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.TimeDelta(\" + obj._days + \", \" + obj._seconds + \", \" + obj._microseconds + \")\";\n\t\t}\n\t\telse if (ul4._ismonthdelta(obj))\n\t\t{\n\t\t\treturn \"new ul4.MonthDelta(\" + obj._months + \")\";\n\t\t}\n\t\telse if (ul4._iscolor(obj))\n\t\t{\n\t\t\treturn \"new ul4.Color(\" + obj._r + \", \" + obj._g + \", \" + obj._b + \", \" + obj._a + \")\";\n\t\t}\n\t\telse if (ul4._istemplate(obj))\n\t\t{\n\t\t\treturn \"ul4.Template.loads(\" + ul4._repr(obj.dumps()) + \")\";\n\t\t}\n\t\tthrow new ul4.TypeError(\"asjson() requires a serializable object\");\n\t};\n\n\t// Decodes the string ``string`` from the Javascript Object Notation (see http://json.org/) and returns the resulting object\n\tul4._fromjson = function _fromjson(string)\n\t{\n\t\t// The following is from jQuery's parseJSON function\n\t\tstring = ul4.StrProtocol.strip(string);\n\t\tif (root.JSON && root.JSON.parse)\n\t\t\treturn root.JSON.parse(string);\n\t\tif (ul4._rvalidchars.test(string.replace(ul4._rvalidescape, \"@\").replace(ul4._rvalidtokens, \"]\").replace(ul4._rvalidbraces, \"\")))\n\t\t\treturn (new Function(\"return \" + string))();\n\t\tthrow new ul4.TypeError(\"invalid JSON\");\n\t};\n\n\t// Encodes ``obj`` in the UL4 Object Notation format\n\tul4._asul4on = function _asul4on(obj)\n\t{\n\t\treturn ul4.dumps(obj);\n\t};\n\n\t// Decodes the string ``string`` from the UL4 Object Notation format and returns the resulting decoded object\n\tul4._fromul4on = function _fromul4on(string)\n\t{\n\t\treturn ul4.loads(string);\n\t};\n\n\tul4._format_datetime = function _format_datetime(obj, fmt, lang)\n\t{\n\t\tlet translations = {\n\t\t\tde: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"M\\u00e4r\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Januar\", \"Februar\", \"M\\u00e4rz\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\t\t\tws: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n\t\t\t\twl: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\ten: {\n\t\t\t\tms: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\t\tml: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\t\tws: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t\t\t\twl: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\t\t\txf: \"%m/%d/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %I:%M:%S %p\"\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\tms: [\"janv.\", \"f\\u00e9vr.\", \"mars\", \"avril\", \"mai\", \"juin\", \"juil.\", \"ao\\u00fbt\", \"sept.\", \"oct.\", \"nov.\", \"d\\u00e9c.\"],\n\t\t\t\tml: [\"janvier\", \"f\\u00e9vrier\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"ao\\u00fbt\", \"septembre\", \"octobre\", \"novembre\", \"d\\u00e9cembre\"],\n\t\t\t\tws: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\t\t\t\twl: [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tes: {\n\t\t\t\tms: [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mi\\u00e9\", \"jue\", \"vie\", \"s\\u00e1b\"],\n\t\t\t\twl: [\"domingo\", \"lunes\", \"martes\", \"mi\\u00e9rcoles\", \"jueves\", \"viernes\", \"s\\u00e1bado\"],\n\t\t\t\txf: \"%d/%m/%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tit: {\n\t\t\t\tms: [\"gen\", \"feb\", \"mar\", \"apr\", \"mag\", \"giu\", \"lug\", \"ago\", \"set\", \"ott\", \"nov\", \"dic\"],\n\t\t\t\tml: [\"gennaio\", \"febbraio\", \"marzo\", \"aprile\", \"maggio\", \"giugno\", \"luglio\", \"agosto\", \"settembre\", \"ottobre\", \"novembre\", \"dicembre\"],\n\t\t\t\tws: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n\t\t\t\twl: [\"domenica\", \"luned\\u00ec\", \"marted\\u00ec\", \"mercoled\\u00ec\", \"gioved\\u00ec\", \"venerd\\u00ec\", \"sabato\"],\n\t\t\t\txf: \"%d/%m/%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tda: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f8n\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"l\\u00f8r\"],\n\t\t\t\twl: [\"s\\u00f8ndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f8rdag\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsv: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"mars\", \"april\", \"maj\", \"juni\", \"juli\", \"augusti\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"s\\u00f6n\", \"m\\u00e5n\", \"tis\", \"ons\", \"tor\", \"fre\", \"l\\u00f6r\"],\n\t\t\t\twl: [\"s\\u00f6ndag\", \"m\\u00e5ndag\", \"tisdag\", \"onsdag\", \"torsdag\", \"fredag\", \"l\\u00f6rdag\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H.%M.%S\"\n\t\t\t},\n\t\t\tnl: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n\t\t\t\tws: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n\t\t\t\twl: [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n\t\t\t\txf: \"%d-%m-%y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tpt: {\n\t\t\t\tms: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\t\t\tml: [\"Janeiro\", \"Fevereiro\", \"Mar\\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\t\t\tws: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\\u00e1b\"],\n\t\t\t\twl: [\"Domingo\", \"Segunda\", \"Ter\\u00e7a\", \"Quarta\", \"Quinta\", \"Sexta\", \"S\\u00e1bado\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tcs: {\n\t\t\t\tms: [\"led\", \"\\u00fano\", \"b\\u0159e\", \"dub\", \"kv\\u011b\", \"\\u010den\", \"\\u010dec\", \"srp\", \"z\\u00e1\\u0159\", \"\\u0159\\u00edj\", \"lis\", \"pro\"],\n\t\t\t\tml: [\"leden\", \"\\u00fanor\", \"b\\u0159ezen\", \"duben\", \"kv\\u011bten\", \"\\u010derven\", \"\\u010dervenec\", \"srpen\", \"z\\u00e1\\u0159\\u00ed\", \"\\u0159\\u00edjen\", \"listopad\", \"prosinec\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"\\u00dat\", \"St\", \"\\u010ct\", \"P\\u00e1\", \"So\"],\n\t\t\t\twl: [\"Ned\\u011ble\", \"Pond\\u011bl\\u00ed\", \"\\u00dater\\u00fd\", \"St\\u0159eda\", \"\\u010ctvrtek\", \"P\\u00e1tek\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tsk: {\n\t\t\t\tms: [\"jan\", \"feb\", \"mar\", \"apr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"marec\", \"apr\\u00edl\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"august\", \"september\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"Ne\", \"Po\", \"Ut\", \"St\", \"\\u0160t\", \"Pi\", \"So\"],\n\t\t\t\twl: [\"Nede\\u013ea\", \"Pondelok\", \"Utorok\", \"Streda\", \"\\u0160tvrtok\", \"Piatok\", \"Sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a\\u00a0%d.\\u00a0%B\\u00a0%Y,\\u00a0%H:%M:%S\"\n\t\t\t},\n\t\t\tpl: {\n\t\t\t\tms: [\"sty\", \"lut\", \"mar\", \"kwi\", \"maj\", \"cze\", \"lip\", \"sie\", \"wrz\", \"pa\\u017a\", \"lis\", \"gru\"],\n\t\t\t\tml: [\"stycze\\u0144\", \"luty\", \"marzec\", \"kwiecie\\u0144\", \"maj\", \"czerwiec\", \"lipiec\", \"sierpie\\u0144\", \"wrzesie\\u0144\", \"pa\\u017adziernik\", \"listopad\", \"grudzie\\u0144\"],\n\t\t\t\tws: [\"nie\", \"pon\", \"wto\", \"\\u015bro\", \"czw\", \"pi\\u0105\", \"sob\"],\n\t\t\t\twl: [\"niedziela\", \"poniedzia\\u0142ek\", \"wtorek\", \"\\u015broda\", \"czwartek\", \"pi\\u0105tek\", \"sobota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a, %d %b %Y, %H:%M:%S\"\n\t\t\t},\n\t\t\thr: {\n\t\t\t\tms: [\"Sij\", \"Vel\", \"O\\u017eu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"],\n\t\t\t\tml: [\"Sije\\u010danj\", \"Velja\\u010da\", \"O\\u017eujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n\t\t\t\tws: [\"Ned\", \"Pon\", \"Uto\", \"Sri\", \"\\u010cet\", \"Pet\", \"Sub\"],\n\t\t\t\twl: [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"\\u010cetvrtak\", \"Petak\", \"Subota\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tsr: {\n\t\t\t\tms: [\"\\u0458\\u0430\\u043d\", \"\\u0444\\u0435\\u0431\", \"\\u043c\\u0430\\u0440\", \"\\u0430\\u043f\\u0440\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\", \"\\u0441\\u0435\\u043f\", \"\\u043e\\u043a\\u0442\", \"\\u043d\\u043e\\u0432\", \"\\u0434\\u0435\\u0446\"],\n\t\t\t\tml: [\"\\u0458\\u0430\\u043d\\u0443\\u0430\\u0440\", \"\\u0444\\u0435\\u0431\\u0440\\u0443\\u0430\\u0440\", \"\\u043c\\u0430\\u0440\\u0442\", \"\\u0430\\u043f\\u0440\\u0438\\u043b\", \"\\u043c\\u0430\\u0458\", \"\\u0458\\u0443\\u043d\", \"\\u0458\\u0443\\u043b\", \"\\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0441\\u0435\\u043f\\u0442\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u043e\\u043a\\u0442\\u043e\\u0431\\u0430\\u0440\", \"\\u043d\\u043e\\u0432\\u0435\\u043c\\u0431\\u0430\\u0440\", \"\\u0434\\u0435\\u0446\\u0435\\u043c\\u0431\\u0430\\u0440\"],\n\t\t\t\tws: [\"\\u043d\\u0435\\u0434\", \"\\u043f\\u043e\\u043d\", \"\\u0443\\u0442\\u043e\", \"\\u0441\\u0440\\u0435\", \"\\u0447\\u0435\\u0442\", \"\\u043f\\u0435\\u0442\", \"\\u0441\\u0443\\u0431\"],\n\t\t\t\twl: [\"\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\", \"\\u043f\\u043e\\u043d\\u0435\\u0434\\u0435\\u0459\\u0430\\u043a\", \"\\u0443\\u0442\\u043e\\u0440\\u0430\\u043a\", \"\\u0441\\u0440\\u0435\\u0434\\u0430\", \"\\u0447\\u0435\\u0442\\u0432\\u0440\\u0442\\u0430\\u043a\", \"\\u043f\\u0435\\u0442\\u0430\\u043a\", \"\\u0441\\u0443\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y.\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%A, %d. %B %Y. %H:%M:%S\"\n\t\t\t},\n\t\t\tro: {\n\t\t\t\tms: [\"ian\", \"feb\", \"mar\", \"apr\", \"mai\", \"iun\", \"iul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"ianuarie\", \"februarie\", \"martie\", \"aprilie\", \"mai\", \"iunie\", \"iulie\", \"august\", \"septembrie\", \"octombrie\", \"noiembrie\", \"decembrie\"],\n\t\t\t\tws: [\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sb\"],\n\t\t\t\twl: [\"duminic\\u0103\", \"luni\", \"mar\\u0163i\", \"miercuri\", \"joi\", \"vineri\", \"s\\u00e2mb\\u0103t\\u0103\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\thu: {\n\t\t\t\tms: [\"jan\", \"febr\", \"m\\u00e1rc\", \"\\u00e1pr\", \"m\\u00e1j\", \"j\\u00fan\", \"j\\u00fal\", \"aug\", \"szept\", \"okt\", \"nov\", \"dec\"],\n\t\t\t\tml: [\"janu\\u00e1r\", \"febru\\u00e1r\", \"m\\u00e1rcius\", \"\\u00e1prilis\", \"m\\u00e1jus\", \"j\\u00fanius\", \"j\\u00falius\", \"augusztus\", \"szeptember\", \"okt\\u00f3ber\", \"november\", \"december\"],\n\t\t\t\tws: [\"v\", \"h\", \"k\", \"sze\", \"cs\", \"p\", \"szo\"],\n\t\t\t\twl: [\"vas\\u00e1rnap\", \"h\\u00e9tf\\u0151\", \"kedd\", \"szerda\", \"cs\\u00fct\\u00f6rt\\u00f6k\", \"p\\u00e9ntek\", \"szombat\"],\n\t\t\t\txf: \"%Y-%m-%d\",\n\t\t\t\tXf: \"%H.%M.%S\",\n\t\t\t\tcf: \"%Y. %b. %d., %A, %H.%M.%S\"\n\t\t\t},\n\t\t\ttr: {\n\t\t\t\tms: [\"Oca\", \"\\u015eub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"A\\u011fu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\t\t\tml: [\"Ocak\", \"\\u015eubat\", \"Mart\", \"Nisan\", \"May\\u0131s\", \"Haziran\", \"Temmuz\", \"A\\u011fustos\", \"Eyl\\u00fcl\", \"Ekim\", \"Kas\\u0131m\", \"Aral\\u0131k\"],\n\t\t\t\tws: [\"Paz\", \"Pzt\", \"Sal\", \"\\u00c7r\\u015f\", \"Pr\\u015f\", \"Cum\", \"Cts\"],\n\t\t\t\twl: [\"Pazar\", \"Pazartesi\", \"Sal\\u0131\", \"\\u00c7ar\\u015famba\", \"Per\\u015fembe\", \"Cuma\", \"Cumartesi\"],\n\t\t\t\txf: \"%d-%m-%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tru: {\n\t\t\t\tms: [\"\\u042f\\u043d\\u0432\", \"\\u0424\\u0435\\u0432\", \"\\u041c\\u0430\\u0440\", \"\\u0410\\u043f\\u0440\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\", \"\\u0418\\u044e\\u043b\", \"\\u0410\\u0432\\u0433\", \"\\u0421\\u0435\\u043d\", \"\\u041e\\u043a\\u0442\", \"\\u041d\\u043e\\u044f\", \"\\u0414\\u0435\\u043a\"],\n\t\t\t\tml: [\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c\", \"\\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c\", \"\\u041c\\u0430\\u0440\\u0442\", \"\\u0410\\u043f\\u0440\\u0435\\u043b\\u044c\", \"\\u041c\\u0430\\u0439\", \"\\u0418\\u044e\\u043d\\u044c\", \"\\u0418\\u044e\\u043b\\u044c\", \"\\u0410\\u0432\\u0433\\u0443\\u0441\\u0442\", \"\\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c\", \"\\u041d\\u043e\\u044f\\u0431\\u0440\\u044c\", \"\\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\"],\n\t\t\t\tws: [\"\\u0412\\u0441\\u043a\", \"\\u041f\\u043d\\u0434\", \"\\u0412\\u0442\\u0440\", \"\\u0421\\u0440\\u0434\", \"\\u0427\\u0442\\u0432\", \"\\u041f\\u0442\\u043d\", \"\\u0421\\u0431\\u0442\"],\n\t\t\t\twl: [\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435\", \"\\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a\", \"\\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a\", \"\\u0421\\u0440\\u0435\\u0434\\u0430\", \"\\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433\", \"\\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430\", \"\\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\"],\n\t\t\t\txf: \"%d.%m.%Y\",\n\t\t\t\tXf: \"%H:%M:%S\",\n\t\t\t\tcf: \"%a %d %b %Y %H:%M:%S\"\n\t\t\t},\n\t\t\tzh: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"\\u4e00\\u6708\", \"\\u4e8c\\u6708\", \"\\u4e09\\u6708\", \"\\u56db\\u6708\", \"\\u4e94\\u6708\", \"\\u516d\\u6708\", \"\\u4e03\\u6708\", \"\\u516b\\u6708\", \"\\u4e5d\\u6708\", \"\\u5341\\u6708\", \"\\u5341\\u4e00\\u6708\", \"\\u5341\\u4e8c\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u4e00\", \"\\u4e8c\", \"\\u4e09\", \"\\u56db\", \"\\u4e94\", \"\\u516d\"],\n\t\t\t\twl: [\"\\u661f\\u671f\\u65e5\", \"\\u661f\\u671f\\u4e00\", \"\\u661f\\u671f\\u4e8c\", \"\\u661f\\u671f\\u4e09\", \"\\u661f\\u671f\\u56db\", \"\\u661f\\u671f\\u4e94\", \"\\u661f\\u671f\\u516d\"],\n\t\t\t\txf: \"%Y\\u5e74%b%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u65f6%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%b%d\\u65e5 %A %H\\u65f6%M\\u5206%S\\u79d2\"\n\t\t\t},\n\t\t\tko: {\n\t\t\t\tms: [\" 1\\uc6d4\", \" 2\\uc6d4\", \" 3\\uc6d4\", \" 4\\uc6d4\", \" 5\\uc6d4\", \" 6\\uc6d4\", \" 7\\uc6d4\", \" 8\\uc6d4\", \" 9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tml: [\"1\\uc6d4\", \"2\\uc6d4\", \"3\\uc6d4\", \"4\\uc6d4\", \"5\\uc6d4\", \"6\\uc6d4\", \"7\\uc6d4\", \"8\\uc6d4\", \"9\\uc6d4\", \"10\\uc6d4\", \"11\\uc6d4\", \"12\\uc6d4\"],\n\t\t\t\tws: [\"\\uc77c\", \"\\uc6d4\", \"\\ud654\", \"\\uc218\", \"\\ubaa9\", \"\\uae08\", \"\\ud1a0\"],\n\t\t\t\twl: [\"\\uc77c\\uc694\\uc77c\", \"\\uc6d4\\uc694\\uc77c\", \"\\ud654\\uc694\\uc77c\", \"\\uc218\\uc694\\uc77c\", \"\\ubaa9\\uc694\\uc77c\", \"\\uae08\\uc694\\uc77c\", \"\\ud1a0\\uc694\\uc77c\"],\n\t\t\t\txf: \"%Y\\ub144 %B %d\\uc77c\",\n\t\t\t\tXf: \"%H\\uc2dc %M\\ubd84 %S\\ucd08\",\n\t\t\t\tcf: \"%Y\\ub144 %B %d\\uc77c (%a) %p %I\\uc2dc %M\\ubd84 %S\\ucd08\"\n\t\t\t},\n\t\t\tja: {\n\t\t\t\tms: [\" 1\\u6708\", \" 2\\u6708\", \" 3\\u6708\", \" 4\\u6708\", \" 5\\u6708\", \" 6\\u6708\", \" 7\\u6708\", \" 8\\u6708\", \" 9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tml: [\"1\\u6708\", \"2\\u6708\", \"3\\u6708\", \"4\\u6708\", \"5\\u6708\", \"6\\u6708\", \"7\\u6708\", \"8\\u6708\", \"9\\u6708\", \"10\\u6708\", \"11\\u6708\", \"12\\u6708\"],\n\t\t\t\tws: [\"\\u65e5\", \"\\u6708\", \"\\u706b\", \"\\u6c34\", \"\\u6728\", \"\\u91d1\", \"\\u571f\"],\n\t\t\t\twl: [\"\\u65e5\\u66dc\\u65e5\", \"\\u6708\\u66dc\\u65e5\", \"\\u706b\\u66dc\\u65e5\", \"\\u6c34\\u66dc\\u65e5\", \"\\u6728\\u66dc\\u65e5\", \"\\u91d1\\u66dc\\u65e5\", \"\\u571f\\u66dc\\u65e5\"],\n\t\t\t\txf: \"%Y\\u5e74%B%d\\u65e5\",\n\t\t\t\tXf: \"%H\\u6642%M\\u5206%S\\u79d2\",\n\t\t\t\tcf: \"%Y\\u5e74%B%d\\u65e5 %H\\u6642%M\\u5206%S\\u79d2\"\n\t\t\t}\n\t\t};\n\n\t\tlet translation = translations[lang];\n\n\t\tlet result = [];\n\t\tlet inspec = false;\n\t\tfor (let i = 0; i < fmt.length; ++i)\n\t\t{\n\t\t\tlet c = fmt[i];\n\t\t\tif (inspec)\n\t\t\t{\n\t\t\t\tswitch (c)\n\t\t\t\t{\n\t\t\t\t\tcase \"a\":\n\t\t\t\t\t\tc = translation.ws[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"A\":\n\t\t\t\t\t\tc = translation.wl[obj.getDay()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"b\":\n\t\t\t\t\t\tc = translation.ms[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"B\":\n\t\t\t\t\t\tc = translation.ml[obj.getMonth()];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"c\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.cf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getDate(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMilliseconds(), \"0\", 3) + \"000\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"H\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getHours(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"I\":\n\t\t\t\t\t\tc = ul4._lpad(((obj.getHours()-1) % 12)+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"j\":\n\t\t\t\t\t\tc = ul4._lpad(ul4.DateTimeProtocol.yearday(obj), \"0\", 3);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMonth()+1, \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getMinutes(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"p\":\n\t\t\t\t\t\tc = obj.getHours() < 12 ? \"AM\" : \"PM\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"S\":\n\t\t\t\t\t\tc = ul4._lpad(obj.getSeconds(), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"U\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 6), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"w\":\n\t\t\t\t\t\tc = obj.getDay();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"W\":\n\t\t\t\t\t\tc = ul4._lpad(ul4._week4format(obj, 0), \"0\", 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"X\":\n\t\t\t\t\t\tc = ul4._format(obj, translation.Xf, lang);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tc = (obj.getFullYear() % 100).toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Y\":\n\t\t\t\t\t\tc = obj.getFullYear().toString();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"z\":\n\t\t\t\t\t\t// UTC offset in the form +HHMM or -HHMM\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"Z\":\n\t\t\t\t\t\t// Time zone name\n\t\t\t\t\t\tc = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(c);\n\t\t\t\tinspec = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (c == \"%\")\n\t\t\t\t\tinspec = true;\n\t\t\t\telse\n\t\t\t\t\tresult.push(c);\n\t\t\t}\n\t\t}\n\t\treturn result.join(\"\");\n\t};\n\n\tul4._format_int = function _format_int(obj, fmt, lang)\n\t{\n\t\tlet work = fmt;\n\n\t\t// Defaults\n\t\tlet fill = ' ';\n\t\tlet align = '>'; // '<', '>', '=' or '^'\n\t\tlet sign = '-'; // '+', '-' or ' '\n\t\tlet alternate = false;\n\t\tlet minimumwidth = 0;\n\t\tlet type = 'd'; // 'b', 'c', 'd', 'o', 'x', 'X' or 'n'\n\n\t\t// Determine output type\n\t\tif (/[bcdoxXn]$/.test(work))\n\t\t{\n\t\t\ttype = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract minimum width\n\t\tif (/\\d+$/.test(work))\n\t\t{\n\t\t\tlet minimumwidthStr = /\\d+$/.exec(work);\n\t\t\twork = work.replace(/\\d+$/, \"\");\n\t\t\tif (/^0/.test(minimumwidthStr))\n\t\t\t{\n\t\t\t\talign = '=';\n\t\t\t\tfill = '0';\n\t\t\t}\n\t\t\tminimumwidth = parseInt(minimumwidthStr);\n\t\t}\n\n\t\t// Alternate form?\n\t\tif (/#$/.test(work))\n\t\t{\n\t\t\talternate = true;\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Determine sign\n\t\tif (/[+ -]$/.test(work))\n\t\t{\n\t\t\tif (type == 'c')\n\t\t\t\tthrow new ul4.ValueError(\"sign not allowed for integer format type 'c'\");\n\t\t\tsign = work.substring(work.length-1);\n\t\t\twork = work.substring(0, work.length-1);\n\t\t}\n\n\t\t// Extract fill and align char\n\t\tif (work.length >= 3)\n\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\telse if (work.length == 2)\n\t\t{\n\t\t\tif (/[<>=^]$/.test(work))\n\t\t\t{\n\t\t\t\talign = work[1];\n\t\t\t\tfill = work[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\t\telse if (work.length == 1)\n\t\t{\n\t\t\tif (/^[<>=^]$/.test(work))\n\t\t\t\talign = work;\n\t\t\telse\n\t\t\t\tthrow new ul4.ValueError(\"illegal integer format string \" + ul4._repr(fmt));\n\t\t}\n\n\t\t// Basic number formatting\n\t\tlet neg = obj < 0;\n\n\t\tif (neg)\n\t\t\tobj = -obj;\n\n\t\tlet output;\n\t\tswitch (type)\n\t\t{\n\t\t\tcase 'b':\n\t\t\t\toutput = obj.toString(2);\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tif (neg || obj > 65535)\n\t\t\t\t\tthrow new ul4.ValueError(\"value out of bounds for c format\");\n\t\t\t\toutput = String.fromCharCode(obj);\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\toutput = obj.toString(8);\n\t\t\t\tbreak;\n\t\t\tcase 'x':\n\t\t\t\toutput = obj.toString(16);\n\t\t\t\tbreak;\n\t\t\tcase 'X':\n\t\t\t\toutput = obj.toString(16).toUpperCase();\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\t// FIXME: locale formatting\n\t\t\t\toutput = obj.toString();\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// The rest of the formatting\n\t\tif (align === '=')\n\t\t{\n\t\t\tif (neg || sign !== '-')\n\t\t\t\t--minimumwidth;\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\tminimumwidth -= 2;\n\n\t\t\tif (output.length < minimumwidth)\n\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\n\t\t\tif (alternate && (type === 'b' || type === 'o' || type === 'x' || type === 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (alternate && (type == 'b' || type == 'o' || type == 'x' || type == 'X'))\n\t\t\t\toutput = \"0\" + type + output;\n\t\t\tif (neg)\n\t\t\t\toutput = \"-\" + output;\n\t\t\telse if (sign != '-')\n\t\t\t\toutput = sign + output;\n\t\t\tif (output.length < minimumwidth)\n\t\t\t{\n\t\t\t\tif (align == '<')\n\t\t\t\t\toutput = output + ul4._str_repeat(fill, minimumwidth-output.length);\n\t\t\t\telse if (align == '>')\n\t\t\t\t\toutput = ul4._str_repeat(fill, minimumwidth-output.length) + output;\n\t\t\t\telse // if (align == '^')\n\t\t\t\t{\n\t\t\t\t\tlet pad = minimumwidth - output.length;\n\t\t\t\t\tlet padBefore = Math.floor(pad/2);\n\t\t\t\t\tlet padAfter = pad-padBefore;\n\t\t\t\t\toutput = ul4._str_repeat(fill, padBefore) + output + ul4._str_repeat(fill, padAfter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// Format ``obj`` using the format string ``fmt`` in the language ``lang``\n\tul4._format = function _format(obj, fmt, lang)\n\t{\n\t\tif (typeof(lang) === \"undefined\" || lang === null)\n\t\t\tlang = \"en\";\n\t\telse\n\t\t{\n\t\t\tlet translations = {de: null, en: null, fr: null, es: null, it: null, da: null, sv: null, nl: null, pt: null, cs: null, sk: null, pl: null, hr: null, sr: null, ro: null, hu: null, tr: null, ru: null, zh: null, ko: null, ja: null};\n\t\t\tlang = lang.toLowerCase();\n\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t{\n\t\t\t\tlang = lang.split(/_/)[0];\n\t\t\t\tif (typeof(translations[lang]) === \"undefined\")\n\t\t\t\t\tlang = \"en\";\n\t\t\t}\n\t\t}\n\t\tif (ul4._isdate(obj))\n\t\t\treturn ul4._format_datetime(obj._date, fmt, lang);\n\t\tif (ul4._isdatetime(obj))\n\t\t\treturn ul4._format_datetime(obj, fmt, lang);\n\t\telse if (ul4._isint(obj))\n\t\t\treturn ul4._format_int(obj, fmt, lang);\n\t\telse if (obj === true)\n\t\t\treturn ul4._format_int(1, fmt, lang);\n\t\telse if (obj === false)\n\t\t\treturn ul4._format_int(0, fmt, lang);\n\t};\n\n\tul4._lpad = function _lpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = pad + string;\n\t\treturn string;\n\t};\n\n\tul4._rpad = function _rpad(string, pad, len)\n\t{\n\t\tif (typeof(string) === \"number\")\n\t\t\tstring = string.toString();\n\t\twhile (string.length < len)\n\t\t\tstring = string + pad;\n\t\treturn string;\n\t};\n\n\t// This is outside of ``Proto`` on purpose\n\t// This way reactive frameworks like ``Vue.js`` don't get to see it\n\t// and complain about mutating render functions when those create new objects.\n\tlet _nextid = 1;\n\n\tul4.Proto = class Proto\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tthis.__id__ = _nextid++;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\t// equality comparison of objects defaults to identity comparison\n\t\t__eq__(other)\n\t\t{\n\t\t\treturn this === other;\n\t\t}\n\n\t\t// To overwrite equality comparison, you only have to overwrite ``__eq__``,\n\t\t// ``__ne__`` will be synthesized from that\n\t\t__ne__(other)\n\t\t{\n\t\t\treturn !this.__eq__(other);\n\t\t}\n\n\t\t// For other comparison operators, each method has to be implemented:\n\t\t// ``<`` calls ``__lt__``, ``<=`` calls ``__le__``, ``>`` calls ``__gt__`` and\n\t\t// ``>=`` calls ``__ge__``\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Signature = class Signature extends ul4.Proto\n\t{\n\t\tconstructor(...args)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.args = [];\n\t\t\tthis.argNames = {};\n\t\t\tthis.remargs = null;\n\t\t\tthis.remkwargs = null;\n\n\t\t\tlet nextDefault = false;\n\t\t\tlet lastArgname = null;\n\t\t\tfor (let i = 0; i < args.length; ++i)\n\t\t\t{\n\t\t\t\tlet argName = args[i];\n\t\t\t\tif (nextDefault)\n\t\t\t\t{\n\t\t\t\t\tthis.args.push({name: lastArgname, defaultValue: argName});\n\t\t\t\t\tthis.argNames[lastArgname] = true;\n\t\t\t\t\tnextDefault = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (argName.substr(argName.length-1) === \"=\")\n\t\t\t\t\t{\n\t\t\t\t\t\tlastArgname = argName.substr(0, argName.length-1);\n\t\t\t\t\t\tnextDefault = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (argName.substr(0, 2) === \"**\")\n\t\t\t\t\t\tthis.remkwargs = argName.substr(2);\n\t\t\t\t\telse if (argName.substr(0, 1) === \"*\")\n\t\t\t\t\t\tthis.remargs = argName.substr(1);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.args.push({name: argName});\n\t\t\t\t\t\tthis.argNames[argName] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Create the argument array for calling a function with this signature with the arguments available from ``args``\n\t\tbindArray(name, args, kwargs)\n\t\t{\n\t\t\tlet finalargs = [];\n\t\t\tlet decname = name !== null ? name + \"() \" : \"\";\n\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (i < args.length)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") specified multiple times\");\n\t\t\t\t\tfinalargs.push(args[i]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(arg.name))\n\t\t\t\t\t\tfinalargs.push(kwargs[arg.name]);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\t\t\tfinalargs.push(arg.defaultValue);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"required \" + decname + \"argument \" + ul4._repr(arg.name) + \" (position \" + i + \") missing\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do we accept additional positional arguments?\n\t\t\tif (this.remargs === null)\n\t\t\t{\n\t\t\t\t// No, but we have them -> complain\n\t\t\t\tif (args.length > this.args.length)\n\t\t\t\t{\n\t\t\t\t\tlet prefix = name === null ? \"expected\" : name + \"() expects\";\n\t\t\t\t\tthrow new ul4.ArgumentError(prefix + \" at most \" + this.args.length + \" positional argument\" + (this.args.length != 1 ? \"s\" : \"\") + \", \" + args.length + \" given\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Put additional positional arguments in the call into the ``*`` argument (if there are none, this pushes an empty list)\n\t\t\t\tfinalargs.push(args.slice(this.args.length));\n\t\t\t}\n\n\t\t\t// Do we accept arbitrary keyword arguments?\n\t\t\tif (this.remkwargs === null)\n\t\t\t{\n\t\t\t\t// No => complain about unknown ones\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (name === null)\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(\"an argument named \" + ul4._repr(key) + \" isn't supported\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ul4.ArgumentError(name + \"() doesn't support an argument named \" + ul4._repr(key));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Yes => Put the unknown ones into an object and add that to the arguments array\n\t\t\t\tlet remkwargs = ul4._emptymap();\n\t\t\t\tfor (let key in kwargs)\n\t\t\t\t{\n\t\t\t\t\tif (!this.argNames[key])\n\t\t\t\t\t\tul4._setmap(remkwargs, key, kwargs[key]);\n\t\t\t\t}\n\t\t\t\tfinalargs.push(remkwargs);\n\t\t\t}\n\n\t\t\treturn finalargs;\n\t\t}\n\n\t\t// Create the argument object for calling a function with this signature with the arguments available from ``args``\n\t\tbindObject(name, args, kwargs)\n\t\t{\n\t\t\targs = this.bindArray(name, args, kwargs);\n\t\t\tlet argObject = {};\n\t\t\tlet i;\n\t\t\tfor (i = 0; i < this.args.length; ++i)\n\t\t\t\targObject[this.args[i].name] = args[i];\n\t\t\tif (this.remargs !== null)\n\t\t\t\targObject[this.remargs] = args[i++];\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\targObject[this.remkwargs] = args[i++];\n\t\t\treturn argObject;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn this.toString();\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\tif (arg.hasOwnProperty(\"defaultValue\"))\n\t\t\t\t\tv.push(arg.name + \"=\" + ul4._repr(arg.defaultValue));\n\t\t\t\telse\n\t\t\t\t\tv.push(arg.name);\n\t\t\t}\n\t\t\tif (this.remargs !== null)\n\t\t\t\tv.push(\"*\" + this.remargs);\n\t\t\tif (this.remkwargs !== null)\n\t\t\t\tv.push(\"**\" + this.remkwargs);\n\t\t\treturn \"(\" + v.join(\", \") + \")\";\n\t\t}\n\t};\n\n\t// When we don't have a real ``Set`` type, emulate one that supports strings\n\tul4._Set = class _Set\n\t{\n\t\tconstructor(...items)\n\t\t{\n\t\t\tthis.items = {};\n\t\t\tthis.add(...items);\n\t\t}\n\n\t\tadd(...items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tthis.items[items[i]] = true;\n\t\t}\n\n\t\tclear()\n\t\t{\n\t\t\tthis.items = {};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"add\":\n\t\t\t\t\treturn ul4.expose(function add(items){ self.add(...items); }, [\"*items\"]);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__contains__(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\thas(item)\n\t\t{\n\t\t\treturn this.items[item] || false;\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tv.push(\"{\");\n\t\t\tlet i = 0;\n\t\t\tfor (let item in this.items)\n\t\t\t{\n\t\t\t\tif (!this.items.hasOwnProperty(item))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (i++)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(ul4._repr(item));\n\t\t\t}\n\t\t\tif (!i)\n\t\t\t\tv.push(\"/\");\n\t\t\tv.push(\"}\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\t// We'll check that everything in ``this`` is in ``other``\n\t\t\t// and if both have the same number of items they are equal\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\treturn other.size == count;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t// count the number of items we have\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\t// Subtract the number of items that ``other`` has\n\t\t\t\tfor (let item in other.items)\n\t\t\t\t\t--count;\n\t\t\t\treturn count == 0;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\t// check that ``this`` is a subset of ``other``,\n\t\t\t// i.e. everything in ``this`` is also in ``other``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.has(item))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let item in this.items)\n\t\t\t\t{\n\t\t\t\t\tif (!other.items[item])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\t// check that ``this`` is a superset of ``other``,\n\t\t\t// i.e. everything in ``other`` is also in ``this``\n\t\t\tif (ul4._isset(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value) {\n\t\t\t\t\tif (!this.items[value])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}, this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (ul4._isul4set(other))\n\t\t\t{\n\t\t\t\tlet count = 0;\n\t\t\t\tfor (let key in other.items)\n\t\t\t\t{\n\t\t\t\t\tif (!this.items[key])\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\t};\n\n\tul4._Set.prototype.__type__ = \"set\";\n\n\t// Adds name and signature to a function/method and makes the method callable in templates\n\tul4.expose = function expose(f, signature, options)\n\t{\n\t\toptions = options || {};\n\t\tif (options.name)\n\t\t\tf._ul4_name = options.name;\n\t\tif (ul4._islist(signature))\n\t\t\tsignature = new ul4.Signature(...signature);\n\t\tf._ul4_signature = signature;\n\t\tf._ul4_needsobject = options.needsobject || false;\n\t\tf._ul4_needscontext = options.needscontext || false;\n\t};\n\n\t// Protocol objects for all builtin types\n\t// These objects are singleton, so we replace the constructor with the prototype object afterwards\n\tul4.Protocol = class Protocol\n\t{\n\t\tul4type()\n\t\t{\n\t\t\treturn this.constructor.name;\n\t\t}\n\n\t\tdir()\n\t\t{\n\t\t\treturn this.attrs;\n\t\t}\n\n\t\tget(obj)\n\t\t{\n\t\t\tif (ul4._isstr(obj))\n\t\t\t\treturn ul4.StrProtocol;\n\t\t\telse if (ul4._islist(obj))\n\t\t\t\treturn ul4.ListProtocol;\n\t\t\telse if (ul4._isdate(obj))\n\t\t\t\treturn ul4.DateProtocol;\n\t\t\telse if (ul4._isset(obj))\n\t\t\t\treturn ul4.SetProtocol;\n\t\t\telse if (ul4._ismap(obj))\n\t\t\t\treturn ul4.MapProtocol;\n\t\t\telse if (ul4._isdatetime(obj))\n\t\t\t\treturn ul4.DateTimeProtocol;\n\t\t\telse if (ul4._isobject(obj))\n\t\t\t\treturn ul4.ObjectProtocol;\n\t\t\telse\n\t\t\t\treturn ul4.Protocol;\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t\treturn obj.__getattr__(attrname);\n\t\t\telse if (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.AttributeError(obj, attrname);\n\t\t}\n\n\t\thasattr(obj, attrname)\n\t\t{\n\t\t\tif (obj === null || typeof(obj) === \"undefined\")\n\t\t\t\treturn false;\n\t\t\telse if (typeof(obj.__getattr__) === \"function\")\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tobj.__getattr__(attrname);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this.attrs.has(attrname);\n\t\t}\n\t};\n\n\tul4.Protocol = ul4.Protocol.prototype;\n\tul4.Protocol.attrs = ul4._emptyset();\n\n\tul4.StrProtocol = class StrProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"str\";\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\n\t\treplace(obj, old, new_, count=null)\n\t\t{\n\t\t\tif (count === null)\n\t\t\t\tcount = obj.length;\n\n\t\t\tlet result = [];\n\t\t\twhile (obj.length)\n\t\t\t{\n\t\t\t\tlet pos = obj.indexOf(old);\n\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t{\n\t\t\t\t\tresult.push(obj);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\tresult.push(new_);\n\t\t\t\tobj = obj.substr(pos + old.length);\n\t\t\t}\n\t\t\treturn result.join(\"\");\n\t\t}\n\n\t\tstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"strip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tlstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"lstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[0]) >= 0)\n\t\t\t\tobj = obj.substr(1);\n\t\t\treturn obj;\n\t\t}\n\n\t\trstrip(obj, chars=null)\n\t\t{\n\t\t\tchars = chars || \" \\r\\n\\t\";\n\t\t\tif (typeof(chars) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rstrip() requires a string argument\");\n\n\t\t\twhile (obj && chars.indexOf(obj[obj.length-1]) >= 0)\n\t\t\t\tobj = obj.substr(0, obj.length-1);\n\t\t\treturn obj;\n\t\t}\n\n\t\tsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"split() requires a string\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.indexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.push(obj.substr(0, pos));\n\t\t\t\t\t\tobj = obj.substr(pos + sep.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.lstrip(obj, null);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/, 1)[0];\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.push(part);\n\t\t\t\t\t\tobj = obj.substr(part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trsplit(obj, sep=null, count=null)\n\t\t{\n\t\t\tif (sep !== null && typeof(sep) !== \"string\")\n\t\t\t\tthrow new ul4.TypeError(\"rsplit() requires a string as second argument\");\n\n\t\t\tif (count === null)\n\t\t\t{\n\t\t\t\tlet result = obj.split(sep !== null ? sep : /[ \\n\\r\\t]+/);\n\t\t\t\tif (sep === null)\n\t\t\t\t{\n\t\t\t\t\tif (result.length && !result[0].length)\n\t\t\t\t\t\tresult.splice(0, 1);\n\t\t\t\t\tif (result.length && !result[result.length-1].length)\n\t\t\t\t\t\tresult.splice(-1);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (sep !== null)\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet pos = obj.lastIndexOf(sep);\n\t\t\t\t\t\tif (pos === -1 || !count--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.unshift(obj);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.unshift(obj.substr(pos+sep.length));\n\t\t\t\t\t\tobj = obj.substr(0, pos);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\twhile (obj.length)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj = ul4.StrProtocol.rstrip(obj);\n\t\t\t\t\t\tlet part;\n\t\t\t\t\t\tif (!count--)\n\t\t\t\t\t\t\t part = obj; // Take the rest of the string\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart = obj.split(/[ \\n\\r\\t]+/);\n\t\t\t\t\t\t\tpart = part[part.length-1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (part.length)\n\t\t\t\t\t\t\tresult.unshift(part);\n\t\t\t\t\t\tobj = obj.substr(0, obj.length-part.length);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsplitlines(obj, keepends=false)\n\t\t{\n\t\t\tlet pos = 0;\n\t\t\tlet lookingAtLineEnd = function lookingAtLineEnd()\n\t\t\t{\n\t\t\t\tlet c = obj[pos];\n\t\t\t\tif (c === '\\n' || c == '\\u000B' || c == '\\u000C' || c == '\\u001C' || c == '\\u001D' || c == '\\u001E' || c == '\\u0085' || c == '\\u2028' || c == '\\u2029')\n\t\t\t\t\treturn 1;\n\t\t\t\tif (c === '\\r')\n\t\t\t\t{\n\t\t\t\t\tif (pos == length-1)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\tif (obj[pos+1] === '\\n')\n\t\t\t\t\t\treturn 2;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\tlet result = [], length = obj.length;\n\n\t\t\tfor (pos = 0, startpos = 0;;)\n\t\t\t{\n\t\t\t\tif (pos >= length)\n\t\t\t\t{\n\t\t\t\t\tif (startpos != pos)\n\t\t\t\t\t\tresult.push(obj.substring(startpos));\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tlet lineendlen = lookingAtLineEnd();\n\t\t\t\tif (!lineendlen)\n\t\t\t\t\t++pos;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet endpos = pos + (keepends ? lineendlen : 0);\n\t\t\t\t\tresult.push(obj.substring(startpos, endpos));\n\t\t\t\t\tpos += lineendlen;\n\t\t\t\t\tstartpos = pos;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlower(obj)\n\t\t{\n\t\t\treturn obj.toLowerCase();\n\t\t}\n\n\t\tupper(obj)\n\t\t{\n\t\t\treturn obj.toUpperCase();\n\t\t}\n\n\t\tcapitalize(obj)\n\t\t{\n\t\t\tif (obj.length)\n\t\t\t\tobj = obj[0].toUpperCase() + obj.slice(1).toLowerCase();\n\t\t\treturn obj;\n\t\t}\n\n\t\tjoin(obj, iterable)\n\t\t{\n\t\t\tlet resultlist = [];\n\t\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresultlist.push(item.value);\n\t\t\t}\n\t\t\treturn resultlist.join(obj);\n\t\t}\n\n\t\tstartswith(obj, prefix)\n\t\t{\n\t\t\tif (typeof(prefix) === \"string\")\n\t\t\t\treturn obj.substr(0, prefix.length) === prefix;\n\t\t\telse if (ul4._islist(prefix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < prefix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlepre = prefix[i];\n\t\t\t\t\tif (obj.substr(0, singlepre.length) === singlepre)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"startswith() argument must be string\");\n\t\t}\n\n\t\tendswith(obj, suffix)\n\t\t{\n\t\t\tif (typeof(suffix) === \"string\")\n\t\t\t\treturn obj.substr(obj.length-suffix.length) === suffix;\n\t\t\telse if (ul4._islist(suffix))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < suffix.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet singlesuf = suffix[i];\n\t\t\t\t\tif (obj.substr(obj.length-singlesuf.length) === singlesuf)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"endswith() argument must be string or list of strings\");\n\t\t}\n\t};\n\n\tul4.StrProtocol = ul4.StrProtocol.prototype;\n\tul4.StrProtocol.attrs = ul4._makeset(\n\t\t\"split\",\n\t\t\"rsplit\",\n\t\t\"splitlines\",\n\t\t\"strip\",\n\t\t\"lstrip\",\n\t\t\"rstrip\",\n\t\t\"upper\",\n\t\t\"lower\",\n\t\t\"capitalize\",\n\t\t\"startswith\",\n\t\t\"endswith\",\n\t\t\"replace\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\",\n\t\t\"join\"\n\t);\n\n\tul4.expose(ul4.StrProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.StrProtocol.replace, [\"old\", \"new\", \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.strip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.lstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.rstrip, [\"chars=\", null]);\n\tul4.expose(ul4.StrProtocol.split, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.rsplit, [\"sep=\", null, \"count=\", null]);\n\tul4.expose(ul4.StrProtocol.splitlines, [\"keepends=\", false]);\n\tul4.expose(ul4.StrProtocol.lower, []);\n\tul4.expose(ul4.StrProtocol.upper, []);\n\tul4.expose(ul4.StrProtocol.capitalize, []);\n\tul4.expose(ul4.StrProtocol.join, [\"iterable\"]);\n\tul4.expose(ul4.StrProtocol.startswith, [\"prefix\"]);\n\tul4.expose(ul4.StrProtocol.endswith, [\"suffix\"]);\n\n\tul4.ListProtocol = class ListProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"list\";\n\t\t}\n\n\t\tappend(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.push(items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tinsert(obj, pos, items)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t\tobj.splice(pos++, 0, items[i]);\n\t\t\treturn null;\n\t\t}\n\n\t\tpop(obj, pos)\n\t\t{\n\t\t\tif (pos < 0)\n\t\t\t\tpos += obj.length;\n\n\t\t\tlet result = obj[pos];\n\t\t\tobj.splice(pos, 1);\n\t\t\treturn result;\n\t\t}\n\n\t\tcount(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._count(obj, sub, start, end);\n\t\t}\n\n\t\tfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._find(obj, sub, start, end);\n\t\t}\n\n\t\trfind(obj, sub, start=null, end=null)\n\t\t{\n\t\t\treturn ul4._rfind(obj, sub, start, end);\n\t\t}\n\t};\n\n\tul4.ListProtocol = ul4.ListProtocol.prototype;\n\tul4.ListProtocol.attrs = ul4._makeset(\n\t\t\"append\",\n\t\t\"insert\",\n\t\t\"pop\",\n\t\t\"count\",\n\t\t\"find\",\n\t\t\"rfind\"\n\t);\n\n\tul4.expose(ul4.ListProtocol.append, [\"*items\"]);\n\tul4.expose(ul4.ListProtocol.insert, [\"pos\", \"*items\"]);\n\tul4.expose(ul4.ListProtocol.pop, [\"pos=\", -1]);\n\tul4.expose(ul4.ListProtocol.count, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.find, [\"sub\", \"start=\", null, \"end=\", null]);\n\tul4.expose(ul4.ListProtocol.rfind, [\"sub\", \"start=\", null, \"end=\", null]);\n\n\tul4.MapProtocol = class MapProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tif (this.attrs.has(attrname))\n\t\t\t{\n\t\t\t\tlet attr = this[attrname];\n\t\t\t\tlet realattr = function realattr(...args) {\n\t\t\t\t\treturn attr.apply(this, [obj, ...args]);\n\t\t\t\t};\n\t\t\t\trealattr.name = attr.name;\n\t\t\t\trealattr._ul4_name = attr._ul4_name || attr.name;\n\t\t\t\trealattr._ul4_signature = attr._ul4_signature;\n\t\t\t\trealattr._ul4_needsobject = attr._ul4_needsobject;\n\t\t\t\trealattr._ul4_needscontext = attr._ul4_needscontext;\n\t\t\t\treturn realattr;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn obj.get(attrname);\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tif (obj.has(key))\n\t\t\t\treturn obj.get(key);\n\t\t\treturn default_;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push([key, value]);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tobj.forEach(function(value, key) {\n\t\t\t\tresult.push(value);\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\tupdate(obj, other, kwargs)\n\t\t{\n\t\t\treturn ul4._update(obj, other, kwargs);\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.MapProtocol = ul4.MapProtocol.prototype;\n\tul4.MapProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.MapProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.MapProtocol.items, []);\n\tul4.expose(ul4.MapProtocol.values, []);\n\tul4.expose(ul4.MapProtocol.update, [\"*other\", \"**kwargs\"]);\n\tul4.expose(ul4.MapProtocol.clear, []);\n\n\tul4.SetProtocol = class SetProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"set\";\n\t\t}\n\n\t\tadd(obj, items)\n\t\t{\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tobj.add(items[i]);\n\t\t\t}\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tobj.clear();\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tul4.SetProtocol = ul4.SetProtocol.prototype;\n\tul4.SetProtocol.attrs = ul4._makeset(\"add\", \"clear\");\n\n\tul4.expose(ul4.SetProtocol.add, [\"*items\"]);\n\tul4.expose(ul4.SetProtocol.clear, []);\n\n\tul4.DateProtocol = class DateProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.weekday(obj._date);\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj._date, firstweekday, mindaysinfirstweek);\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj._date.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj._date.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj._date.getFullYear();\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t\t\tlet d = obj._date;\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(d)] + \", \" + ul4._lpad(d.getDate(), \"0\", 2) + \" \" + monthname[d.getMonth()] + \" \" + d.getFullYear();\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet d = obj._date;\n\t\t\treturn d.getFullYear() + \"-\" + ul4._lpad((d.getMonth()+1).toString(), \"0\", 2) + \"-\" + ul4._lpad(d.getDate().toString(), \"0\", 2);\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.yearday(obj._date);\n\t\t}\n\t};\n\n\tul4.DateProtocol = ul4.DateProtocol.prototype;\n\tul4.DateProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateProtocol.weekday, []);\n\tul4.expose(ul4.DateProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateProtocol.day, []);\n\tul4.expose(ul4.DateProtocol.month, []);\n\tul4.expose(ul4.DateProtocol.year, []);\n\tul4.expose(ul4.DateProtocol.mimeformat, []);\n\tul4.expose(ul4.DateProtocol.isoformat, []);\n\tul4.expose(ul4.DateProtocol.yearday, []);\n\n\tul4.DateTimeProtocol = class DatetimeProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"datetime\";\n\t\t}\n\n\t\tweekday(obj)\n\t\t{\n\t\t\tlet d = obj.getDay();\n\t\t\treturn d ? d-1 : 6;\n\t\t}\n\n\t\tcalendar(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\t// Normalize parameters\n\t\t\tfirstweekday = ul4._mod(firstweekday, 7);\n\t\t\tif (mindaysinfirstweek < 1)\n\t\t\t\tmindaysinfirstweek = 1;\n\t\t\telse if (mindaysinfirstweek > 7)\n\t\t\t\tmindaysinfirstweek = 7;\n\n\t\t\t// ``obj`` might be in the first week of the next year, or last week of\n\t\t\t// the previous year, so we might have to try those too.\n\t\t\tfor (let offset = +1; offset >= -1; --offset)\n\t\t\t{\n\t\t\t\tlet year = obj.getFullYear() + offset;\n\t\t\t\t// ``refdate`` will always be in week 1\n\t\t\t\tlet refDate = new Date(year, 0, mindaysinfirstweek);\n\t\t\t\t// Go back to the start of ``refdate``s week (i.e. day 1 of week 1)\n\t\t\t\tlet weekDayDiff = ul4._mod(ul4.DateTimeProtocol.weekday(refDate) - firstweekday, 7);\n\t\t\t\tlet weekStartYear = refDate.getFullYear();\n\t\t\t\tlet weekStartMonth = refDate.getMonth();\n\t\t\t\tlet weekStartDay = refDate.getDate() - weekDayDiff;\n\t\t\t\tlet weekStart = new Date(weekStartYear, weekStartMonth, weekStartDay);\n\t\t\t\t// Is our date ``obj`` at or after day 1 of week 1?\n\t\t\t\tif (obj.getTime() >= weekStart.getTime())\n\t\t\t\t{\n\t\t\t\t\tlet diff = ul4.SubAST.prototype._do(obj, weekStart);\n\t\t\t\t\t// Add 1, because the first week is week 1, not week 0\n\t\t\t\t\tlet week = Math.floor(diff.days()/7) + 1;\n\t\t\t\t\treturn [year, week, ul4.DateTimeProtocol.weekday(obj)];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tweek(obj, firstweekday=0, mindaysinfirstweek=4)\n\t\t{\n\t\t\treturn ul4.DateTimeProtocol.calendar(obj, firstweekday, mindaysinfirstweek)[1];\n\t\t}\n\n\t\tday(obj)\n\t\t{\n\t\t\treturn obj.getDate();\n\t\t}\n\n\t\tmonth(obj)\n\t\t{\n\t\t\treturn obj.getMonth()+1;\n\t\t}\n\n\t\tyear(obj)\n\t\t{\n\t\t\treturn obj.getFullYear();\n\t\t}\n\n\t\thour(obj)\n\t\t{\n\t\t\treturn obj.getHours();\n\t\t}\n\n\t\tminute(obj)\n\t\t{\n\t\t\treturn obj.getMinutes();\n\t\t}\n\n\t\tsecond(obj)\n\t\t{\n\t\t\treturn obj.getSeconds();\n\t\t}\n\n\t\tmicrosecond(obj)\n\t\t{\n\t\t\treturn obj.getMilliseconds() * 1000;\n\t\t}\n\n\t\tmimeformat(obj)\n\t\t{\n\t\t\tlet weekdayname = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\t\t\tlet monthname = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\t\t\treturn weekdayname[ul4.DateTimeProtocol.weekday(obj)] + \", \" + ul4._lpad(obj.getDate(), \"0\", 2) + \" \" + monthname[obj.getMonth()] + \" \" + obj.getFullYear() + \" \" + ul4._lpad(obj.getHours(), \"0\", 2) + \":\" + ul4._lpad(obj.getMinutes(), \"0\", 2) + \":\" + ul4._lpad(obj.getSeconds(), \"0\", 2) + \" GMT\";\n\t\t}\n\n\t\tisoformat(obj)\n\t\t{\n\t\t\tlet year = obj.getFullYear();\n\t\t\tlet month = obj.getMonth()+1;\n\t\t\tlet day = obj.getDate();\n\t\t\tlet hour = obj.getHours();\n\t\t\tlet minute = obj.getMinutes();\n\t\t\tlet second = obj.getSeconds();\n\t\t\tlet ms = obj.getMilliseconds();\n\t\t\tlet result = year + \"-\" + ul4._lpad(month.toString(), \"0\", 2) + \"-\" + ul4._lpad(day.toString(), \"0\", 2) + \"T\" + ul4._lpad(hour.toString(), \"0\", 2) + \":\" + ul4._lpad(minute.toString(), \"0\", 2) + \":\" + ul4._lpad(second.toString(), \"0\", 2);\n\t\t\tif (ms)\n\t\t\t\tresult += \".\" + ul4._lpad(ms.toString(), \"0\", 3) + \"000\";\n\t\t\treturn result;\n\t\t}\n\n\t\tyearday(obj)\n\t\t{\n\t\t\tlet leap = ul4._isleap(obj) ? 1 : 0;\n\t\t\tlet day = obj.getDate();\n\t\t\tswitch (obj.getMonth())\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn day;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn 31 + day;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn 31 + 28 + leap + day;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + day;\n\t\t\t\tcase 4:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + day;\n\t\t\t\tcase 5:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + day;\n\t\t\t\tcase 6:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + day;\n\t\t\t\tcase 7:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + day;\n\t\t\t\tcase 8:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + day;\n\t\t\t\tcase 9:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;\n\t\t\t\tcase 10:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;\n\t\t\t\tcase 11:\n\t\t\t\t\treturn 31 + 28 + leap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.DateTimeProtocol = ul4.DateTimeProtocol.prototype;\n\tul4.DateTimeProtocol.attrs = ul4._makeset(\"weekday\", \"week\", \"calendar\", \"day\", \"month\", \"year\", \"hour\", \"minute\", \"second\", \"microsecond\", \"mimeformat\", \"isoformat\", \"yearday\");\n\n\tul4.expose(ul4.DateTimeProtocol.weekday, []);\n\tul4.expose(ul4.DateTimeProtocol.calendar, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.week, [\"firstweekday=\", 0, \"mindaysinfirstweek=\", 4]);\n\tul4.expose(ul4.DateTimeProtocol.day, []);\n\tul4.expose(ul4.DateTimeProtocol.month, []);\n\tul4.expose(ul4.DateTimeProtocol.year, []);\n\tul4.expose(ul4.DateTimeProtocol.hour, []);\n\tul4.expose(ul4.DateTimeProtocol.minute, []);\n\tul4.expose(ul4.DateTimeProtocol.second, []);\n\tul4.expose(ul4.DateTimeProtocol.microsecond, []);\n\tul4.expose(ul4.DateTimeProtocol.mimeformat, []);\n\tul4.expose(ul4.DateTimeProtocol.isoformat, []);\n\tul4.expose(ul4.DateTimeProtocol.yearday, []);\n\n\tul4.ObjectProtocol = class ObjectProtocol extends ul4.Protocol.constructor\n\t{\n\t\tul4type(obj)\n\t\t{\n\t\t\treturn \"dict\";\n\t\t}\n\n\t\tgetattr(obj, attrname)\n\t\t{\n\t\t\tlet result;\n\t\t\tif (obj && typeof(obj.__getattr__) === \"function\") // test this before the generic object test\n\t\t\t\tresult = obj.__getattr__(attrname);\n\t\t\telse\n\t\t\t\tresult = obj[attrname];\n\t\t\tif (typeof(result) !== \"function\")\n\t\t\t\treturn result;\n\t\t\tlet realresult = function(...args) {\n\t\t\t\t// We can use ``apply`` here, as we know that ``obj`` is a real object.\n\t\t\t\treturn result.apply(obj, args);\n\t\t\t};\n\t\t\trealresult._ul4_name = result._ul4_name || result.name;\n\t\t\trealresult._ul4_signature = result._ul4_signature;\n\t\t\trealresult._ul4_needsobject = result._ul4_needsobject;\n\t\t\trealresult._ul4_needscontext = result._ul4_needscontext;\n\t\t\treturn realresult;\n\t\t}\n\n\t\tget(obj, key, default_=null)\n\t\t{\n\t\t\tlet result = obj[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn default_;\n\t\t\treturn result;\n\t\t}\n\n\t\titems(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push([key, obj[key]]);\n\t\t\treturn result;\n\t\t}\n\n\t\tvalues(obj)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let key in obj)\n\t\t\t\tresult.push(obj[key]);\n\t\t\treturn result;\n\t\t}\n\n\t\tclear(obj)\n\t\t{\n\t\t\tfor (let key in obj)\n\t\t\t\tdelete obj[key];\n\t\t}\n\t};\n\n\tul4.ObjectProtocol = ul4.ObjectProtocol.prototype;\n\tul4.ObjectProtocol.attrs = ul4._makeset(\"get\", \"items\", \"values\", \"update\", \"clear\");\n\n\tul4.expose(ul4.ObjectProtocol.get, [\"key\", \"default=\", null]);\n\tul4.expose(ul4.ObjectProtocol.items, []);\n\tul4.expose(ul4.ObjectProtocol.values, []);\n\tul4.expose(ul4.ObjectProtocol.clear, []);\n\n\tul4.Context = class Context\n\t{\n\t\tconstructor(vars)\n\t\t{\n\t\t\tif (vars === null || typeof(vars) === \"undefined\")\n\t\t\t\tvars = {};\n\t\t\tthis.vars = vars;\n\t\t\tthis.indents = [];\n\t\t\tthis.escapes = [];\n\t\t\tthis._output = [];\n\t\t}\n\n\t\t/* Return a clone of the ``Context``, but with a fresh empty ``vars`` objects that inherits from the previous one.\n\t\t * This is used by the various comprehensions to avoid leaking loop variables.\n\t\t */\n\t\tinheritvars()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext.vars = Object.create(this.vars);\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with one additional indentation (this is used by ``RenderAST``) */\n\t\twithindent(indent)\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tif (indent !== null)\n\t\t\t{\n\t\t\t\tcontext.indents = this.indents.slice();\n\t\t\t\tcontext.indents.push(indent);\n\t\t\t}\n\t\t\treturn context;\n\t\t}\n\n\t\t/* Return a clone of the ``Context`` with the output buffer replaced (this is used by ``renders`` to collect the output in a separate buffer) */\n\t\treplaceoutput()\n\t\t{\n\t\t\tlet context = Object.create(this);\n\t\t\tcontext._output = [];\n\t\t\treturn context;\n\t\t}\n\n\t\tclone(vars)\n\t\t{\n\t\t\treturn Object.create(this);\n\t\t}\n\n\t\toutput(value)\n\t\t{\n\t\t\tfor (let i = 0; i < this.escapes.length; ++i)\n\t\t\t{\n\t\t\t\tlet escape = this.escapes[i];\n\t\t\t\tvalue = escape(value);\n\t\t\t}\n\t\t\tthis._output.push(value);\n\t\t}\n\n\t\tgetoutput()\n\t\t{\n\t\t\treturn this._output.join(\"\");\n\t\t}\n\n\t\tget(name)\n\t\t{\n\t\t\treturn this.vars[name];\n\t\t}\n\n\t\tset(name, value)\n\t\t{\n\t\t\tthis.vars[name] = value;\n\t\t}\n\t};\n\n\t/// Exceptions\n\n\t// Note that extending ``Error`` doesn't work, so we do it the \"classic\" way\n\tul4.Exception = function Exception(message, fileName, lineNumber)\n\t{\n\t\tlet instance = new Error(message, fileName, lineNumber);\n\t\tObject.setPrototypeOf(instance, Object.getPrototypeOf(this));\n\t\tinstance.__id__ = _nextid++;\n\t\tinstance.context = null;\n\t\treturn instance;\n\t};\n\n\tul4.Exception.prototype = Object.create(Error.prototype, {\n\t\tconstructor: {\n\t\t\tvalue: Error,\n\t\t\tenumerable: false,\n\t\t\twritable: true,\n\t\t\tconfigurable: true\n\t\t}\n\t});\n\n\tif (Object.setPrototypeOf)\n\t\tObject.setPrototypeOf(ul4.Exception, Error);\n\telse\n\t\tul4.Exception.__proto__ = Error;\n\n\tul4.Exception.prototype.__getattr__ = function __getattr__(attrname)\n\t{\n\t\tswitch (attrname)\n\t\t{\n\t\t\tcase \"context\":\n\t\t\t\treturn this.context;\n\t\t\tdefault:\n\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\t};\n\n\t// Exceptions used internally by UL4 for flow control\n\tul4.InternalException = class InternalException extends ul4.Exception\n\t{\n\t};\n\n\t// Control flow exceptions\n\tul4.ReturnException = class ReturnException extends ul4.InternalException\n\t{\n\t\tconstructor(result)\n\t\t{\n\t\t\tsuper(\"return\");\n\t\t\tthis.result = result;\n\t\t}\n\t};\n\n\tul4.BreakException = class BreakException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"break\");\n\t\t}\n\t};\n\n\tul4.ContinueException = class ContinueException extends ul4.InternalException\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"continue\");\n\t\t}\n\t};\n\n\t// Real exceptions raised by various parts of UL4\n\tul4.SyntaxError = class SyntaxError extends ul4.Exception\n\t{\n\t};\n\n\tul4.LValueRequiredError = class LValueRequiredError extends ul4.SyntaxError\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"lvalue required\");\n\t\t}\n\t};\n\n\tul4.TypeError = class TypeError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ValueError = class ValueError extends ul4.Exception\n\t{\n\t};\n\n\tul4.ArgumentError = class ArgumentError extends ul4.Exception\n\t{\n\t};\n\n\tul4.NotSubscriptableError = class NotSubscriptableError extends ul4.Exception\n\t{\n\t\tconstructor(obj)\n\t\t{\n\t\t\tsuper(\"Object of type \" + _type(obj) + \" is not subscriptable\");\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"Object of type \" + _type(this.obj) + \" is not subscriptable\";\n\t\t}\n\t};\n\n\tul4.ZeroDivisionError = class ZeroDivisionError extends ul4.Exception\n\t{\n\t\tconstructor()\n\t\t{\n\t\t\tsuper(\"division by zero\");\n\t\t}\n\t};\n\n\tul4.IndexError = class IndexError extends ul4.Exception\n\t{\n\t\tconstructor(obj, index)\n\t\t{\n\t\t\tsuper(\"index \" + ul4._repr(index) + \" out of range\");\n\t\t\tthis.obj = obj;\n\t\t\tthis.index = index;\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn \"index \" + this.index + \" out of range for \" + ul4._type(this.obj);\n\t\t}\n\t};\n\n\tul4.AttributeError = class AttributeError extends ul4.Exception\n\t{\n\t\tconstructor(obj, attrname)\n\t\t{\n\t\t\tsuper(\"object of type \" + ul4._type(obj) + \" has no attribute \" + ul4._repr(attrname));\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\t};\n\n\t/// Exception that wraps other exceptions while they bubble up the stack\n\tul4.LocationError = class LocationError extends ul4.Exception\n\t{\n\t\tconstructor(location)\n\t\t{\n\t\t\tsuper(\"nested exception in \" + ul4._repr(location));\n\t\t\tthis.location = location;\n\t\t}\n\n\t\t_templateprefix()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet out = [];\n\t\t\tif (template.parenttemplate !== null)\n\t\t\t\tout.push(\"in local template \");\n\t\t\telse\n\t\t\t\tout.push(\"in template \");\n\t\t\tlet first = true;\n\t\t\twhile (template != null)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tfirst = false;\n\t\t\t\telse\n\t\t\t\t\tout.push(\" in \");\n\t\t\t\tout.push(template.name ? ul4._repr(template.name) : \"(unnamed)\");\n\t\t\t\ttemplate = template.parenttemplate;\n\t\t\t}\n\t\t\treturn out.join(\"\");\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\tlet template = this.location.template;\n\t\t\tlet templateprefix = this._templateprefix();\n\n\t\t\tlet prefix = this.location.sourceprefix;\n\t\t\tlet code = this.location.source;\n\t\t\tlet suffix = this.location.sourcesuffix;\n\t\t\tprefix = ul4._repr(prefix).slice(1, -1);\n\t\t\tcode = ul4._repr(code).slice(1, -1);\n\t\t\tsuffix = ul4._repr(suffix).slice(1, -1);\n\n\t\t\tlet text = prefix + code + suffix;\n\t\t\tlet underline = ul4._str_repeat(\"\\u00a0\", prefix.length) + ul4._str_repeat(\"~\", code.length);\n\n\t\t\tlet pos = \"offset \" + this.location.pos.start + \":\" + this.location.pos.stop + \"; line \" + this.location.line + \"; col \" + this.location.col;\n\n\t\t\tlet message = templateprefix + \": \" + pos + \"\\n\" + text + \"\\n\" + underline;\n\t\t\treturn message;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"context\":\n\t\t\t\t\treturn this.context;\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.location;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\t/// Classes for the syntax tree\n\tul4.AST = class AST extends ul4.Proto\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.pos = pos;\n\t\t\tthis._line = null;\n\t\t\tthis._col = null;\n\t\t}\n\n\t\tget fullsource()\n\t\t{\n\t\t\treturn this.template._source;\n\t\t}\n\n\t\tget source()\n\t\t{\n\t\t\treturn this.pos.of(this.template._source);\n\t\t}\n\n\t\tget sourceprefix()\n\t\t{\n\t\t\tlet outerstartpos = this.pos.start;\n\t\t\tlet innerstartpos = outerstartpos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxprefix = 40;\n\t\t\tlet preprefix = \"\\u2026\";\n\t\t\twhile (maxprefix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the start of the source code\n\t\t\t\tif (outerstartpos === 0)\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the start of the line\n\t\t\t\tif (source.charAt(outerstartpos-1) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpreprefix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxprefix;\n\t\t\t\t--outerstartpos;\n\t\t\t}\n\t\t\treturn preprefix + source.substring(outerstartpos, innerstartpos);\n\t\t}\n\n\t\tget sourcesuffix()\n\t\t{\n\t\t\tlet outerstoppos = this.pos.stop;\n\t\t\tlet innerstoppos = outerstoppos;\n\t\t\tlet source = this.fullsource;\n\n\t\t\tlet maxsuffix = 40;\n\t\t\tlet postsuffix = \"\\u2026\";\n\t\t\twhile (maxsuffix > 0)\n\t\t\t{\n\t\t\t\t// We arrived at the ed of the source code\n\t\t\t\tif (outerstoppos >= source.length)\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// We arrived at the end of the line\n\t\t\t\tif (source.charAt(outerstoppos) === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\tpostsuffix = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t--maxsuffix;\n\t\t\t\t++outerstoppos;\n\t\t\t}\n\t\t\treturn source.substring(innerstoppos, outerstoppos) + postsuffix;\n\t\t}\n\n\t\tget line()\n\t\t{\n\t\t\tif (this._line === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._line;\n\t\t}\n\n\t\tget col()\n\t\t{\n\t\t\tif (this._col === null)\n\t\t\t\tthis._calculateLineCol();\n\t\t\treturn this._col;\n\t\t}\n\n\t\t_calculateLineCol()\n\t\t{\n\t\t\tthis._line = 1\n\t\t\tthis._col = 1;\n\t\t\tlet stop = this.pos.start;\n\t\t\tfor (let i = 0; i < stop; ++i)\n\t\t\t{\n\t\t\t\tif (this.template.source[i] === \"\\n\")\n\t\t\t\t{\n\t\t\t\t\t++this._line;\n\t\t\t\t\tthis._col = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t++this._col;\n\t\t\t}\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tif (attrname === \"type\" || attrname === \"fullsource\" || attrname === \"source\" || attrname === \"sourceprefix\" || attrname === \"sourcesuffix\" || attrname === \"line\" || attrname === \"col\")\n\t\t\t\treturn this[attrname];\n\t\t\telse if (this._ul4onattrs.indexOf(attrname) >= 0)\n\t\t\t\treturn this[attrname];\n\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t}\n\n\t\t__setitem__(attrname, value)\n\t\t{\n\t\t\tthrow new ul4.TypeError(\"object is immutable\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._str(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet out = [];\n\t\t\tthis._repr(out);\n\t\t\treturn ul4._formatsource(out);\n\t\t}\n\n\t\t_decorate_exception(exc)\n\t\t{\n\t\t\twhile (exc.context !== undefined && exc.context !== null)\n\t\t\t\texc = exc.context;\n\t\t\texc.context = new ul4.LocationError(this);\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_handle_eval_modify(context, operator, value)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_modify(context, operator, value);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthrow new ul4.LValueRequiredError();\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this.source.replace(/\\r?\\n/g, ' '));\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tencoder.dump(this[attrname]);\n\t\t\t}\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\t{\n\t\t\t\tlet attrname = this._ul4onattrs[i];\n\t\t\t\tthis[attrname] = decoder.load();\n\t\t\t}\n\t\t}\n\t};\n\n\t// used in ul4ondump/ul4ondump to automatically dump these attributes\n\tul4.AST.prototype._ul4onattrs = [\"template\", \"pos\"];\n\n\tul4.TextAST = class TextAST extends ul4.AST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\treturn this.source;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"text \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.IndentAST = class IndentAST extends ul4.TextAST\n\t{\n\t\tconstructor(template, pos, text)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._text = text;\n\t\t}\n\n\t\tget text()\n\t\t{\n\t\t\tif (typeof(this.template) !== \"undefined\")\n\t\t\t\treturn this._text === null ? this.source : this._text;\n\t\t\telse\n\t\t\t\treturn null;\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < context.indents.length; ++i)\n\t\t\t{\n\t\t\t\tlet indent = context.indents[i];\n\t\t\t\tcontext.output(indent);\n\t\t\t}\n\t\t\tcontext.output(this.text);\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tif (this._text === this.source)\n\t\t\t\tencoder.dump(null);\n\t\t\telse\n\t\t\t\tencoder.dump(this._text);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tthis._text = decoder.load();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"indent \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.LineEndAST = class LineEndAST extends ul4.TextAST\n\t{\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"lineend \");\n\t\t\tout.push(ul4._repr(this.text));\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CodeAST = class CodeAST extends ul4.AST\n\t{\n\t};\n\n\tul4.ConstAST = class ConstAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this.value;\n\t\t}\n\t};\n\n\tul4.ConstAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.ItemArgBase = class ItemArgBase extends ul4.CodeAST\n\t{\n\t\t_handle_eval_list(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_list(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_set(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_set(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_dict(context, result)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_dict(context, result);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval_call(context, args, kwargs)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.InternalException) && !(exc instanceof ul4.LocationError))\n\t\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SeqItemAST = class SeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.push(value);\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tresult.add(value);\n\t\t}\n\t};\n\n\tul4.SeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.UnpackSeqItemAST = class UnpackSeqItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_list(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.push(item.value);\n\t\t\t}\n\t\t}\n\n\t\t_eval_set(context, result)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tresult.add(item.value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackSeqItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.DictItemAST = class DictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, key, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet key = this.key._handle_eval(context);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tul4._setmap(result, key, value);\n\t\t}\n\t};\n\n\tul4.DictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"key\", \"value\"]),\n\n\tul4.UnpackDictItemAST = class UnpackDictItemAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_dict(context, result)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(result, subitem[0], subitem[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t\tul4._setmap(result, key, item[key]);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictItemAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.PosArgAST = class PosArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\targs.push(value);\n\t\t}\n\t};\n\n\tul4.PosArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"value\"]);\n\n\tul4.KeywordArgAST = class KeywordArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, name, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tif (kwargs.hasOwnProperty(this.name))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + this.name);\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tkwargs[this.name] = value;\n\t\t}\n\t};\n\n\tul4.KeywordArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"name\", \"value\"]);\n\n\tul4.UnpackListArgAST = class UnpackListArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\targs.push(...item);\n\t\t}\n\t};\n\n\tul4.UnpackListArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.UnpackDictArgAST = class UnpackDictArgAST extends ul4.ItemArgBase\n\t{\n\t\tconstructor(template, pos, item)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval_call(context, args, kwargs)\n\t\t{\n\t\t\tlet item = this.item._handle_eval(context);\n\t\t\tif (ul4._islist(item))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < item.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet subitem = item[i];\n\t\t\t\t\tif (!ul4._islist(subitem) || subitem.length != 2)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"** requires a list of (key, value) pairs\");\n\t\t\t\t\tlet [key, value] = subitem;\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._ismap(item))\n\t\t\t{\n\t\t\t\titem.forEach(function(value, key) {\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = value;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(item))\n\t\t\t{\n\t\t\t\tfor (let key in item)\n\t\t\t\t{\n\t\t\t\t\tif (kwargs.hasOwnProperty(key))\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\tkwargs[key] = item[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.UnpackDictArgAST.prototype._ul4onattrs = ul4.ItemArgBase.prototype._ul4onattrs.concat([\"item\"]);\n\n\tul4.ListAST = class ListAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_list(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.ListCompAST = class ListCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = [];\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.push(this.item._handle_eval(localcontext));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ListCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.SetAST = class SetAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptyset();\n\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_set(context, result);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.SetCompAST = class SetCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"item\":\n\t\t\t\t\treturn this.item;\n\t\t\t\tcase \"varname\":\n\t\t\t\t\treturn this.varname;\n\t\t\t\tcase \"container\":\n\t\t\t\t\treturn this.container;\n\t\t\t\tcase \"condition\":\n\t\t\t\t\treturn this.condition;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptyset();\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t\tresult.add(this.item._handle_eval(localcontext));\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.SetCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.DictAST = class DictAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.items = [];\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn this.items;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = ul4._emptymap();\n\t\t\tfor (let i = 0; i < this.items.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.items[i];\n\t\t\t\titem._handle_eval_dict(context, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"items\"]);\n\n\tul4.DictCompAST = class DictCompAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, key, value, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.key = key;\n\t\t\tthis.value = value;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet result = ul4._emptymap();\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, item.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t}\n\t\t\t\tif (this.condition === null || ul4._bool(this.condition._handle_eval(localcontext)))\n\t\t\t\t{\n\t\t\t\t\tlet key = this.key._handle_eval(localcontext);\n\t\t\t\t\tlet value = this.value._handle_eval(localcontext);\n\t\t\t\t\tul4._setmap(result, key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.DictCompAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"key\", \"value\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.GenExprAST = class GenExprAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, item, varname, container, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.item = item;\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\t\t\tlet iter = ul4._iter(container);\n\n\t\t\tlet localcontext = context.inheritvars();\n\n\t\t\tlet self = this;\n\n\t\t\tlet result = {\n\t\t\t\tnext: function(){\n\t\t\t\t\twhile (true)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\tlet varitems = ul4._unpackvar(self.varname, item.value);\n\t\t\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\t\t\tlvalue._handle_eval_set(localcontext, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (self.condition === null || ul4._bool(self.condition._handle_eval(localcontext)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet value = self.item._handle_eval(localcontext);\n\t\t\t\t\t\t\treturn {value: value, done: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.GenExprAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"item\", \"varname\", \"container\", \"condition\"]);\n\n\tul4.VarAST = class VarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, name)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.name = name;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\treturn this._get(context, this.name);\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tthis._set(context, this.name, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tthis._modify(context, operator, this.name, value);\n\t\t}\n\n\t\t_get(context, name)\n\t\t{\n\t\t\tlet result = context.get(name);\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\tresult = ul4.functions[name];\n\t\t\treturn result;\n\t\t}\n\n\t\t_set(context, name, value)\n\t\t{\n\t\t\tcontext.set(name, value);\n\t\t}\n\n\t\t_modify(context, operator, name, value)\n\t\t{\n\t\t\tlet newvalue = operator._ido(context.get(name), value);\n\t\t\tcontext.set(name, newvalue);\n\t\t}\n\t};\n\n\tul4.VarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"name\"]);\n\n\tul4.UnaryAST = class UnaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj=\");\n\t\t\tthis.obj._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\treturn this._do(obj);\n\t\t}\n\t};\n\n\tul4.UnaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\"]);\n\n\t// Negation\n\tul4.NegAST = class NegAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\tif (obj !== null && typeof(obj.__neg__) === \"function\")\n\t\t\t\treturn obj.__neg__();\n\t\t\treturn -obj;\n\t\t}\n\t};\n\n\t// Bitwise not\n\tul4.BitNotAST = class BitNotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn -obj-1;\n\t\t}\n\t};\n\n\t// Not\n\tul4.NotAST = class NotAST extends ul4.UnaryAST\n\t{\n\t\t_do(obj)\n\t\t{\n\t\t\treturn !ul4._bool(obj);\n\t\t}\n\t};\n\n\t// If expression\n\tul4.IfAST = class IfAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, objif, objcond, objelse)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.objif = objif;\n\t\t\tthis.objcond = objcond;\n\t\t\tthis.objelse = objelse;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(+1);\n\t\t\tout.push(\"objif=\");\n\t\t\tthis.objif._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objcond=\");\n\t\t\tthis.objcond._repr(out);\n\t\t\tout.push(0);\n\t\t\tout.push(\"objelse=\");\n\t\t\tthis.objelse._repr(out);\n\t\t\tout.push(-1);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result;\n\t\t\tlet condvalue = this.objcond._handle_eval(context);\n\t\t\tif (ul4._bool(condvalue))\n\t\t\t\tresult = this.objif._handle_eval(context);\n\t\t\telse\n\t\t\t\tresult = this.objelse._handle_eval(context);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.IfAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"objif\", \"objcond\", \"objelse\"]);\n\n\tul4.ReturnAST = class ReturnAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet result = this.obj._handle_eval(context);\n\t\t\tthrow new ul4.ReturnException(result);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"return \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintAST = class PrintAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._str(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"print \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.PrintXAST = class PrintXAST extends ul4.UnaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet output = ul4._xmlescape(obj);\n\t\t\tcontext.output(output);\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"printx \");\n\t\t\tthis.obj._str(out);\n\t\t}\n\t};\n\n\tul4.BinaryAST = class BinaryAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj1, obj2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj1 = obj1;\n\t\t\tthis.obj2 = obj2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" obj1=\");\n\t\t\tthis.obj1._repr(out);\n\t\t\tout.push(\" obj2=\");\n\t\t\tthis.obj2._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.BinaryAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj1\", \"obj2\"]);\n\n\t// Item access and assignment: dict[key], list[index], string[index], color[index]\n\tul4.ItemAST = class ItemAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tlet result = this._get(obj1, obj2);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._set(obj1, obj2, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\tthis._modify(operator, obj1, obj2, value);\n\t\t}\n\n\t\t_get(container, key)\n\t\t{\n\t\t\tif (typeof(container) === \"string\" || ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (typeof(start) === \"undefined\" || start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\tif (typeof(stop) === \"undefined\" || stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\treturn container.slice(start, stop);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\treturn container[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__getitem__) === \"function\") // objects without ``_getitem__`` don't support item access\n\t\t\t\treturn container.__getitem__(key);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\treturn container.get(key);\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not subscriptable\");\n\t\t}\n\n\t\t_set(container, key, value)\n\t\t{\n\t\t\tif (ul4._islist(container))\n\t\t\t{\n\t\t\t\tif (key instanceof ul4.slice)\n\t\t\t\t{\n\t\t\t\t\tlet start = key.start, stop = key.stop;\n\t\t\t\t\tif (start === null)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start < 0)\n\t\t\t\t\t\tstart += container.length;\n\t\t\t\t\tif (start < 0)\n\t\t\t\t\t\tstart = 0;\n\t\t\t\t\telse if (start > container.length)\n\t\t\t\t\t\tstart = container.length;\n\t\t\t\t\tif (stop === null)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\telse if (stop < 0)\n\t\t\t\t\t\tstop += container.length;\n\t\t\t\t\tif (stop < 0)\n\t\t\t\t\t\tstop = 0;\n\t\t\t\t\telse if (stop > container.length)\n\t\t\t\t\t\tstop = container.length;\n\t\t\t\t\tif (stop < start)\n\t\t\t\t\t\tstop = start;\n\t\t\t\t\tcontainer.splice(start, stop-start); // Remove old element\n\t\t\t\t\tfor (let iter = ul4._iter(value);;)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iter.next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcontainer.splice(start++, 0, item.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet orgkey = key;\n\t\t\t\t\tif (key < 0)\n\t\t\t\t\t\tkey += container.length;\n\t\t\t\t\tif (key < 0 || key >= container.length)\n\t\t\t\t\t\tthrow new ul4.IndexError(container, orgkey);\n\t\t\t\t\tcontainer[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (container && typeof(container.__setitem__) === \"function\") // test this before the generic object test\n\t\t\t\tcontainer.__setitem__(key, value);\n\t\t\telse if (ul4._ismap(container))\n\t\t\t\tcontainer.set(key, value);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t\tcontainer[key] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.NotSubscriptableError(container);\n\t\t}\n\n\t\t_modify(operator, container, key, value)\n\t\t{\n\t\t\tthis._set(container, key, operator._ido(this._get(container, key), value));\n\t\t}\n\t};\n\n\t// Identifty test operator ``is``\n\tul4.IsAST = class IsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 === obj2;\n\t\t}\n\t};\n\n\t// Inverted identity test operator ``is not``\n\tul4.IsNotAST = class IsNotAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn obj1 !== obj2;\n\t\t}\n\t};\n\n\t// Comparison operator ==\n\tul4.EQAST = class EQAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._eq(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator !=\n\tul4.NEAST = class NEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ne(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <\n\tul4.LTAST = class LTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._lt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator <=\n\tul4.LEAST = class LEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._le(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >\n\tul4.GTAST = class GTAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._gt(obj1, obj2);\n\t\t}\n\t};\n\n\t// Comparison operator >=\n\tul4.GEAST = class GEAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._ge(obj1, obj2);\n\t\t}\n\t};\n\n\t// Containment test: string in string, obj in list, key in dict, value in rgb\n\tul4.ContainsAST = class ContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\tif (typeof(obj) === \"string\" && typeof(container) === \"string\")\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (ul4._islist(container))\n\t\t\t{\n\t\t\t\treturn container.indexOf(obj) !== -1;\n\t\t\t}\n\t\t\telse if (container && typeof(container.__contains__) === \"function\") // test this before the generic object test\n\t\t\t\treturn container.__contains__(obj);\n\t\t\telse if (ul4._ismap(container) || ul4._isset(container))\n\t\t\t\treturn container.has(obj);\n\t\t\telse if (ul4._isobject(container))\n\t\t\t{\n\t\t\t\tfor (let key in container)\n\t\t\t\t{\n\t\t\t\t\tif (key === obj)\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (ul4._iscolor(container))\n\t\t\t{\n\t\t\t\treturn container._r === obj || container._g === obj || container._b === obj || container._a === obj;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(container) + \" object is not iterable\");\n\t\t}\n\t};\n\n\t// Inverted containment test\n\tul4.NotContainsAST = class NotContainsAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj, container)\n\t\t{\n\t\t\treturn !ul4.ContainsAST.prototype._do(obj, container);\n\t\t}\n\t};\n\n\t// Addition: num + num, string + string\n\tul4.AddAST = class AddAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__add__) === \"function\")\n\t\t\t\treturn obj1.__add__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__radd__) === \"function\")\n\t\t\t\treturn obj2.__radd__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" + \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t\treturn [...obj1, ...obj2];\n\t\t\telse\n\t\t\t\treturn obj1 + obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._islist(obj2))\n\t\t\t{\n\t\t\t\tul4.ListProtocol.append(obj1, obj2);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Substraction: num - num\n\tul4.SubAST = class SubAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__sub__) === \"function\")\n\t\t\t\treturn obj1.__sub__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rsub__) === \"function\")\n\t\t\t\treturn obj2.__rsub__(obj1);\n\t\t\telse if (ul4._isdate(obj1) && ul4._isdate(obj2))\n\t\t\t\treturn this._date_sub(obj1, obj2);\n\t\t\telse if (ul4._isdatetime(obj1) && ul4._isdatetime(obj2))\n\t\t\t\treturn this._datetime_sub(obj1, obj2);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(this.obj1) + \" - \" + ul4._type(this.obj2) + \" is not supported\");\n\t\t\treturn obj1 - obj2;\n\t\t}\n\n\t\t_date_sub(obj1, obj2)\n\t\t{\n\t\t\treturn this._datetime_sub(obj1._date, obj2._date);\n\t\t}\n\n\t\t_datetime_sub(obj1, obj2)\n\t\t{\n\t\t\tlet swap = (obj2 > obj1);\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tlet t = obj1;\n\t\t\t\tobj1 = obj2;\n\t\t\t\tobj2 = t;\n\t\t\t}\n\t\t\t// From now on obj1 is > than obj2\n\n\t\t\tlet year1 = obj1.getFullYear();\n\t\t\tlet yearday1 = ul4.DateTimeProtocol.yearday(obj1);\n\t\t\tlet year2 = obj2.getFullYear();\n\t\t\tlet yearday2 = ul4.DateTimeProtocol.yearday(obj2);\n\n\t\t\tlet diffdays = 0;\n\n\t\t\twhile (year1 > year2)\n\t\t\t{\n\t\t\t\tdiffdays += ul4.DateProtocol.yearday(ul4._date(year2, 12, 31));\n\t\t\t\t++year2;\n\t\t\t}\n\t\t\tdiffdays += yearday1 - yearday2;\n\n\t\t\tlet hours1 = obj1.getHours();\n\t\t\tlet minutes1 = obj1.getMinutes();\n\t\t\tlet seconds1 = obj1.getSeconds();\n\t\t\tlet hours2 = obj2.getHours();\n\t\t\tlet minutes2 = obj2.getMinutes();\n\t\t\tlet seconds2 = obj2.getSeconds();\n\n\t\t\tlet diffseconds = (seconds1 - seconds2) + 60 * ((minutes1 - minutes2) + 60 * (hours1 - hours2));\n\n\t\t\tlet diffmilliseconds = obj1.getMilliseconds() - obj2.getMilliseconds();\n\n\t\t\tif (swap)\n\t\t\t{\n\t\t\t\tdiffdays = -diffdays;\n\t\t\t\tdiffseconds = -diffseconds;\n\t\t\t\tdiffmilliseconds = -diffmilliseconds;\n\t\t\t}\n\t\t\treturn new ul4.TimeDelta(diffdays, diffseconds, 1000*diffmilliseconds);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\n\t// Multiplication: num * num, int * str, str * int, int * list, list * int\n\tul4.MulAST = class MulAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__mul__) === \"function\")\n\t\t\t\treturn obj1.__mul__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rmul__) === \"function\")\n\t\t\t\treturn obj2.__rmul__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" * \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (ul4._isint(obj1) || ul4._isbool(obj1))\n\t\t\t{\n\t\t\t\tif (typeof(obj2) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj2))\n\t\t\t\t{\n\t\t\t\t\tif (obj1 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj2, obj1);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ul4._isint(obj2) || ul4._isbool(obj2))\n\t\t\t{\n\t\t\t\tif (typeof(obj1) === \"string\")\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._str_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t\telse if (ul4._islist(obj1))\n\t\t\t\t{\n\t\t\t\t\tif (obj2 < 0)\n\t\t\t\t\t\tthrow new ul4.ValueError(\"repetition counter must be positive\");\n\t\t\t\t\treturn ul4._list_repeat(obj1, obj2);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj1 * obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\tif (ul4._islist(obj1) && ul4._isint(obj2))\n\t\t\t{\n\t\t\t\tif (obj2 > 0)\n\t\t\t\t{\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\tlet targetsize = obj1.length * obj2;\n\t\t\t\t\twhile (obj1.length < targetsize)\n\t\t\t\t\t\tobj1.push(obj1[i++]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobj1.splice(0, obj1.length);\n\t\t\t\treturn obj1;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Truncating division\n\tul4.FloorDivAST = class FloorDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__floordiv__) === \"function\")\n\t\t\t\treturn obj1.__floordiv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rfloordiv__) === \"function\")\n\t\t\t\treturn obj2.__rfloordiv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" // \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn Math.floor(obj1 / obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// \"Real\" division\n\tul4.TrueDivAST = class TrueDivAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj1 && typeof(obj1.__truediv__) === \"function\")\n\t\t\t\treturn obj1.__truediv__(obj2);\n\t\t\telse if (obj2 && typeof(obj2.__rtruediv__) === \"function\")\n\t\t\t\treturn obj2.__rtruediv__(obj1);\n\t\t\tif (obj1 === null || obj2 === null)\n\t\t\t\tthrow new ul4.TypeError(ul4._type(obj1) + \" / \" + ul4._type(obj2) + \" not supported\");\n\t\t\telse if (typeof(obj1) === \"number\" && typeof(obj2) === \"number\" && obj2 === 0)\n\t\t\t\tthrow new ul4.ZeroDivisionError();\n\t\t\treturn obj1 / obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Modulo\n\tul4.ModAST = class ModAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\treturn ul4._mod(obj1, obj2);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise left shift\n\tul4.ShiftLeftAST = class ShiftLeftAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftRightAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 *= 2;\n\t\t\treturn obj1;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise right shift\n\tul4.ShiftRightAST = class ShiftRightAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\tif (obj2 < 0)\n\t\t\t\treturn ul4.ShiftLeftAST.prototype._do(obj1, -obj2);\n\t\t\tif (obj1 === false)\n\t\t\t\tobj1 = 0;\n\t\t\telse if (obj1 === true)\n\t\t\t\tobj1 = 1;\n\t\t\twhile (obj2--)\n\t\t\t\tobj1 /= 2;\n\t\t\treturn Math.floor(obj1);\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise and\n\tul4.BitAndAST = class BitAndAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 & obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise exclusive or\n\tul4.BitXOrAST = class BitXOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 ^ obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\t// Bitwise or\n\tul4.BitOrAST = class BitOrAST extends ul4.BinaryAST\n\t{\n\t\t_do(obj1, obj2)\n\t\t{\n\t\t\tif (obj2 === false)\n\t\t\t\tobj2 = 0;\n\t\t\telse if (obj2 === true)\n\t\t\t\tobj2 = 1;\n\t\t\treturn obj1 | obj2;\n\t\t}\n\n\t\t_ido(obj1, obj2)\n\t\t{\n\t\t\treturn this._do(obj1, obj2);\n\t\t}\n\t};\n\n\tul4.AndAST = class AndAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (!ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.OrAST = class OrAST extends ul4.BinaryAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj1 = this.obj1._handle_eval(context);\n\t\t\tif (ul4._bool(obj1))\n\t\t\t\treturn obj1;\n\t\t\tlet obj2 = this.obj2._handle_eval(context);\n\t\t\treturn obj2;\n\t\t}\n\t};\n\n\tul4.AttrAST = class AttrAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, attrname)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.attrname = attrname;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet result = this._get(obj, this.attrname);\n\t\t\treturn result;\n\t\t}\n\n\t\t_eval_set(context, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._set(obj, this.attrname, value);\n\t\t}\n\n\t\t_eval_modify(context, operator, value)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tthis._modify(operator, obj, this.attrname, value);\n\t\t}\n\n\t\t_get(object, attrname)\n\t\t{\n\t\t\tlet proto = ul4.Protocol.get(object);\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn proto.getattr(object, attrname);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.AttributeError && exc.obj === object)\n\t\t\t\t\treturn undefined;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_set(object, attrname, value)\n\t\t{\n\t\t\tif (typeof(object) === \"object\" && typeof(object.__setattr__) === \"function\")\n\t\t\t\tobject.__setattr__(attrname, value);\n\t\t\telse if (ul4._ismap(object))\n\t\t\t\tobject.set(attrname, value);\n\t\t\telse if (ul4._isobject(object))\n\t\t\t\tobject[attrname] = value;\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(ul4._type(object) + \" object has no writable attributes\");\n\t\t}\n\n\t\t_modify(operator, object, attrname, value)\n\t\t{\n\t\t\tlet oldvalue = this._get(object, attrname);\n\t\t\tlet newvalue = operator._ido(oldvalue, value);\n\t\t\tthis._set(object, attrname, newvalue);\n\t\t}\n\t};\n\n\tul4.AttrAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"attrname\"]);\n\n\tul4.CallAST = class CallAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.obj = obj;\n\t\t\tthis.args = args;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_makeargs(context)\n\t\t{\n\t\t\tlet args = [], kwargs = {};\n\t\t\tfor (let i = 0; i < this.args.length; ++i)\n\t\t\t{\n\t\t\t\tlet arg = this.args[i];\n\t\t\t\targ._handle_eval_call(context, args, kwargs);\n\t\t\t}\n\t\t\treturn {args: args, kwargs: kwargs};\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn this._eval(context);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet obj = this.obj._handle_eval(context);\n\t\t\tlet args = this._makeargs(context);\n\t\t\tlet result = ul4._call(context, obj, args.args, args.kwargs);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.CallAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"obj\", \"args\"]);\n\n\tul4.RenderAST = class RenderAST extends ul4.CallAST\n\t{\n\t\tconstructor(template, pos, obj, args)\n\t\t{\n\t\t\tsuper(template, pos, obj, args);\n\t\t\tthis.indent = null;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this._reprname);\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"render \");\n\t\t\tout.push(this.tag.code.replace(/\\r?\\n/g, ' '));\n\t\t\tif (this.indent !== null)\n\t\t\t{\n\t\t\t\tout.push(\" with indent \");\n\t\t\t\tout.push(ul4._repr(this.indent.text));\n\t\t\t}\n\t\t}\n\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tlet localcontext = context.withindent(this.indent !== null ? this.indent.text : null);\n\t\t\tlet obj = this.obj._handle_eval(localcontext);\n\t\t\tlet args = this._makeargs(localcontext);\n\t\t\tthis._handle_additional_arguments(localcontext, args);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlet result = ul4._callrender(localcontext, obj, args.args, args.kwargs);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tthis._decorate_exception(exc);\n\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t}\n\t};\n\n\tul4.RenderAST.prototype._ul4onattrs = ul4.CallAST.prototype._ul4onattrs.concat([\"indent\"]);\n\tul4.RenderAST.prototype._reprname = \"RenderAST\";\n\n\tul4.RenderXAST = class RenderXAST extends ul4.RenderAST\n\t{\n\t\t_handle_eval(context)\n\t\t{\n\t\t\tcontext.escapes.push(ul4._xmlescape);\n\n\t\t\tlet result = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresult = super._handle_eval(context);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcontext.escapes.splice(context.escapes.length-1, 1);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST = class RenderBlockAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tif (args.kwargs.hasOwnProperty(\"content\"))\n\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument content\");\n\t\t\tlet closure = new ul4.TemplateClosure(this.content, this.content.signature, context.vars);\n\t\t\targs.kwargs.content = closure;\n\t\t}\n\t};\n\n\tul4.RenderBlockAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.RenderBlocksAST = class RenderBlocksAST extends ul4.RenderAST\n\t{\n\t\t_handle_additional_arguments(context, args)\n\t\t{\n\t\t\tlet localcontext = context.inheritvars();\n\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\n\t\t\tfor (let key in localcontext.vars)\n\t\t\t{\n\t\t\t\tif (localcontext.vars.hasOwnProperty(key))\n\t\t\t\t{\n\t\t\t\t\tif (key in args.kwargs)\n\t\t\t\t\t\tthrow new ul4.ArgumentError(\"duplicate keyword argument \" + key);\n\t\t\t\t\targs.kwargs[key] = localcontext.get(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.RenderBlocksAST.prototype._ul4onattrs = ul4.RenderAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\t// Slice object\n\tul4.slice = class slice extends ul4.Proto\n\t{\n\t\tconstructor(start, stop)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.start = start;\n\t\t\tthis.stop = stop;\n\t\t}\n\n\t\tof(string)\n\t\t{\n\t\t\tlet start = this.start || 0;\n\t\t\tlet stop = this.stop === null ? string.length : this.stop;\n\t\t\treturn string.slice(start, stop);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn \"slice(\" + ul4._repr(this.start) + \", \" + ul4._repr(this.stop) + \", None)\";\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"start\":\n\t\t\t\t\treturn this.start;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\treturn this.stop;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\t};\n\n\n\t// List/String slice\n\tul4.SliceAST = class SliceAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, index1, index2)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.index1 = index1;\n\t\t\tthis.index2 = index2;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet index1 = this.index1 !== null ? this.index1._handle_eval(context) : null;\n\t\t\tlet index2 = this.index2 !== null ? this.index2._handle_eval(context) : null;\n\t\t\treturn new ul4.slice(index1, index2);\n\t\t}\n\t};\n\n\tul4.SliceAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"index1\", \"index2\"]);\n\n\tul4.SetVarAST = class SetVarAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos, lvalue, value)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.lvalue = lvalue;\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" lvalue=\");\n\t\t\tout.push(ul4._repr(this.lvalue));\n\t\t\tout.push(\" value=\");\n\t\t\tthis.value._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.SetVarAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"lvalue\", \"value\"]);\n\n\tul4.ModifyVarAST = class ModifyVarAST extends ul4.SetVarAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tlet value = this.value._handle_eval(context);\n\t\t\tlet items = ul4._unpackvar(this.lvalue, value);\n\t\t\tfor (let i = 0; i < items.length; ++i)\n\t\t\t{\n\t\t\t\tlet [lvalue, value] = items[i];\n\t\t\t\tlvalue._handle_eval_modify(context, this._operator, value);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.AddVarAST = class AddVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.AddVarAST.prototype._operator = ul4.AddAST.prototype;\n\n\tul4.SubVarAST = class SubVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.SubVarAST.prototype._operator = ul4.SubAST.prototype;\n\n\tul4.MulVarAST = class MulVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.MulVarAST.prototype._operator = ul4.MulAST.prototype;\n\n\tul4.TrueDivVarAST = class TrueDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.TrueDivVarAST.prototype._operator = ul4.TrueDivAST.prototype;\n\n\tul4.FloorDivVarAST = class FloorDivVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.FloorDivVarAST.prototype._operator = ul4.FloorDivAST.prototype;\n\n\tul4.ModVarAST = class ModVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ModVarAST.prototype._operator = ul4.ModAST.prototype;\n\n\tul4.ShiftLeftVarAST = class ShiftLeftVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftLeftVarAST.prototype._operator = ul4.ShiftLeftAST.prototype;\n\n\tul4.ShiftRightVarAST = class ShiftRightVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.ShiftRightVarAST.prototype._operator = ul4.ShiftRightAST.prototype;\n\n\tul4.BitAndVarAST = class BitAndVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitAndVarAST.prototype._operator = ul4.BitAndAST.prototype;\n\n\tul4.BitXOrVarAST = class BitXOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitXOrVarAST.prototype._operator = ul4.BitXOrAST.prototype;\n\n\tul4.BitOrVarAST = class BitOrVarAST extends ul4.ModifyVarAST\n\t{\n\t};\n\n\tul4.BitOrVarAST.prototype._operator = ul4.BitOrAST.prototype;\n\n\tul4.BlockAST = class BlockAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.content = [];\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = this.content[i];\n\t\t\t\titem._handle_eval(context);\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tif (this.content.length)\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = this.content[i];\n\t\t\t\t\titem._str(out);\n\t\t\t\t\tout.push(0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tout.push(\"pass\");\n\t\t\t\tout.push(0);\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.BlockAST.prototype._ul4onattrs = ul4.CodeAST.prototype._ul4onattrs.concat([\"content\"]);\n\n\tul4.ForBlockAST = class ForBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, varname, container)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.varname = varname;\n\t\t\tthis.container = container;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str_varname(out, varname)\n\t\t{\n\t\t\tif (ul4._islist(varname))\n\t\t\t{\n\t\t\t\tout.push(\"(\");\n\t\t\t\tfor (let i = 0; i < varname.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tif (i)\n\t\t\t\t\t\tout.push(\", \");\n\t\t\t\t\tthis._str_varname(out, varname[i]);\n\t\t\t\t}\n\t\t\t\tif (varname.length == 1)\n\t\t\t\t\tout.push(\",\");\n\t\t\t\tout.push(\")\");\n\t\t\t}\n\t\t\telse\n\t\t\t\tvarname._str(out);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet container = this.container._handle_eval(context);\n\n\t\t\tfor (let iter = ul4._iter(container);;)\n\t\t\t{\n\t\t\t\tlet value = iter.next();\n\t\t\t\tif (value.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet varitems = ul4._unpackvar(this.varname, value.value);\n\t\t\t\tfor (let i = 0; i < varitems.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet [lvalue, value] = varitems[i];\n\t\t\t\t\tlvalue._handle_eval_set(context, value);\n\t\t\t\t}\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"for \");\n\t\t\tthis._str_varname(out, this.varname);\n\t\t\tout.push(\" in \");\n\t\t\tthis.container._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\t};\n\n\tul4.ForBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"varname\", \"container\"]);\n\n\tul4.WhileBlockAST = class WhileBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"while \");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\t\tif (!ul4._bool(cond))\n\t\t\t\t\tbreak;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// We can't call _handle_eval() here, as this would in turn call this function again, leading to infinite recursion\n\t\t\t\t\t// But we don't have to, as wrapping the original exception in ``Error`` has already been done by the lower levels\n\t\t\t\t\tsuper._eval(context);\n\t\t\t\t}\n\t\t\t\tcatch (exc)\n\t\t\t\t{\n\t\t\t\t\tif (exc instanceof ul4.BreakException)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telse if (exc instanceof ul4.ContinueException)\n\t\t\t\t\t\t;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow exc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.WhileBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.BreakAST = class BreakAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.BreakException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"break\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.ContinueAST = class ContinueAST extends ul4.CodeAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tthrow new ul4.ContinueException();\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"continue\");\n\t\t\tout.push(0);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\t};\n\n\tul4.CondBlockAST = class CondBlockAST extends ul4.BlockAST\n\t{\n\t\t_eval(context)\n\t\t{\n\t\t\tfor (let i = 0; i < this.content.length; ++i)\n\t\t\t{\n\t\t\t\tlet block = this.content[i];\n\t\t\t\tlet execute = block._execute(context);\n\t\t\t\tif (execute)\n\t\t\t\t{\n\t\t\t\t\tblock._handle_eval(context);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST = class ConditionalBlockAST extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, condition)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.condition = condition;\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" condition=\");\n\t\t\tthis.condition._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(this._strname);\n\t\t\tout.push(\" \");\n\t\t\tthis.condition._str(out);\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\tlet cond = this.condition._handle_eval(context);\n\t\t\tlet result = ul4._bool(cond);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tul4.ConditionalBlockAST.prototype._ul4onattrs = ul4.BlockAST.prototype._ul4onattrs.concat([\"condition\"]);\n\n\tul4.IfBlockAST = class IfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.IfBlockAST.prototype._strname = \"if\";\n\n\tul4.ElIfBlockAST = class ElIfBlockAST extends ul4.ConditionalBlockAST\n\t{\n\t};\n\n\tul4.ElIfBlockAST.prototype._strname = \"else if\";\n\n\tul4.ElseBlockAST = class ElseBlockAST extends ul4.BlockAST\n\t{\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"else:\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_execute(context)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tul4.Template = class Template extends ul4.BlockAST\n\t{\n\t\tconstructor(template, pos, source, name, whitespace, startdelim, enddelim, signature)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis._source = source;\n\t\t\tthis.name = name;\n\t\t\tthis.whitespace = whitespace;\n\t\t\tthis.startdelim = startdelim;\n\t\t\tthis.enddelim = enddelim;\n\t\t\tthis.docpos = null;\n\t\t\tthis.signature = signature;\n\t\t\tthis._asts = null;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tthis.parenttemplate = null;\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"content\":\n\t\t\t\t\treturn this.content;\n\t\t\t\tcase \"source\":\n\t\t\t\t\treturn this.source;\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.name;\n\t\t\t\tcase \"whitespace\":\n\t\t\t\t\treturn this.whitespace;\n\t\t\t\tcase \"startdelim\":\n\t\t\t\t\treturn this.startdelim;\n\t\t\t\tcase \"enddelim\":\n\t\t\t\t\treturn this.enddelim;\n\t\t\t\tcase \"doc\":\n\t\t\t\t\treturn this.doc();\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tcase \"parenttemplate\":\n\t\t\t\t\treturn this.parenttemplate;\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tdefault:\n\t\t\t\t\treturn super.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tlet signature;\n\t\t\tencoder.dump(ul4.version);\n\t\t\tencoder.dump(this.name);\n\t\t\tencoder.dump(this._source);\n\t\t\tencoder.dump(this.whitespace);\n\t\t\tencoder.dump(this.startdelim);\n\t\t\tencoder.dump(this.enddelim);\n\t\t\tencoder.dump(this.docpos);\n\t\t\tencoder.dump(this.parenttemplate);\n\t\t\tif (this.signature === null || this.signature instanceof ul4.SignatureAST)\n\t\t\t\tsignature = this.signature;\n\t\t\telse\n\t\t\t{\n\t\t\t\tsignature = [];\n\t\t\t\tfor (let i = 0; i < this.signature.args.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet arg = this.signature.args[i];\n\t\t\t\t\tif (typeof(arg.defaultValue) === \"undefined\")\n\t\t\t\t\t\tsignature.push(arg.name);\n\t\t\t\t\telse\n\t\t\t\t\t\tsignature.push(arg.name+\"=\", arg.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (this.signature.remargs !== null)\n\t\t\t\t\tsignature.push(\"*\" + this.signature.remargs);\n\t\t\t\tif (this.signature.remkwargs !== null)\n\t\t\t\t\tsignature.push(\"**\" + this.signature.remkwargs);\n\t\t\t}\n\t\t\tencoder.dump(signature);\n\t\t\tsuper.ul4ondump(encoder);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tlet version = decoder.load();\n\t\t\tlet signature;\n\n\t\t\tif (version === null)\n\t\t\t\tthrow new ul4.ValueError(\"UL4ON doesn't support templates in 'source' format in Javascript implementation\");\n\n\t\t\tif (version !== ul4.version)\n\t\t\t\tthrow new ul4.ValueError(\"invalid version, expected \" + ul4.version + \", got \" + version);\n\n\t\t\tthis.name = decoder.load();\n\t\t\tthis._source = decoder.load();\n\t\t\tthis.whitespace = decoder.load();\n\t\t\tthis.startdelim = decoder.load();\n\t\t\tthis.enddelim = decoder.load();\n\t\t\tthis.docpos = decoder.load();\n\t\t\tthis.parenttemplate = decoder.load();\n\t\t\tsignature = decoder.load();\n\t\t\tif (ul4._islist(signature))\n\t\t\t\tsignature = new ul4.Signature(...signature);\n\t\t\tthis.signature = signature;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\tsuper.ul4onload(decoder);\n\t\t}\n\n\t\tloads(string)\n\t\t{\n\t\t\treturn ul4.loads(string);\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet signature = null;\n\t\t\tif (this.signature !== null)\n\t\t\t\tsignature = this.signature._handle_eval(context);\n\t\t\tlet closure = new ul4.TemplateClosure(this, signature, context.vars);\n\t\t\tcontext.set(this.name, closure);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"\")\n\t\t\t{\n\t\t\t\tout.push(\" enddelim=\");\n\t\t\t\tout.push(ul4._repr(this.enddelim));\n\t\t\t}\n\t\t\tout.push(\">\");\n\t\t}\n\n\t\t_str(out)\n\t\t{\n\t\t\tout.push(\"def \");\n\t\t\tout.push(this.name ? this.name : \"unnamed\");\n\t\t\tout.push(\":\");\n\t\t\tout.push(+1);\n\t\t\tul4.BlockAST.prototype._str.call(this, out);\n\t\t\tout.push(-1);\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (!(exc instanceof ul4.ReturnException))\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis._renderbound(context, vars);\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.replaceoutput();\n\t\t\tthis._renderbound(localcontext, vars);\n\t\t\treturn localcontext.getoutput();\n\t\t}\n\n\t\trenders(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._rendersbound(context, vars);\n\t\t}\n\n\t\tdoc()\n\t\t{\n\t\t\treturn this.docpos != null ? this.docpos.of(this._source) : null;\n\t\t}\n\n\t\t_callbound(context, vars)\n\t\t{\n\t\t\tlet localcontext = context.clone();\n\t\t\tlocalcontext.vars = vars;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tul4.BlockAST.prototype._eval.call(this, localcontext);\n\t\t\t}\n\t\t\tcatch (exc)\n\t\t\t{\n\t\t\t\tif (exc instanceof ul4.ReturnException)\n\t\t\t\t\treturn exc.result;\n\t\t\t\telse\n\t\t\t\t\tthrow exc;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tcall(vars)\n\t\t{\n\t\t\tvars = vars || {};\n\t\t\tlet context = new ul4.Context();\n\t\t\tif (this.signature !== null)\n\t\t\t\tvars = this.signature.bindObject(this.name, [], vars);\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this._callbound(context, vars);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.Template.prototype._ul4_callneedsobject = true;\n\tul4.Template.prototype._ul4_callneedscontext = true;\n\tul4.Template.prototype._ul4_renderneedsobject = true;\n\tul4.Template.prototype._ul4_renderneedscontext = true;\n\n\tul4.SignatureAST = class SignatureAST extends ul4.CodeAST\n\t{\n\t\tconstructor(template, pos)\n\t\t{\n\t\t\tsuper(template, pos);\n\t\t\tthis.params = [];\n\t\t}\n\n\t\tul4ondump(encoder)\n\t\t{\n\t\t\tsuper.ul4ondump(encoder);\n\n\t\t\tlet dump = [];\n\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\tdump.push(param[0]);\n\t\t\t\telse\n\t\t\t\t\tdump.push(param);\n\t\t\t}\n\t\t\tencoder.dump(dump);\n\t\t}\n\n\t\tul4onload(decoder)\n\t\t{\n\t\t\tsuper.ul4onload(decoder);\n\t\t\tlet dump = decoder.load();\n\t\t\tthis.params = [];\n\t\t\tfor (let i = 0; i < dump.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = dump[i];\n\t\t\t\tif (typeof(param) === \"string\")\n\t\t\t\t\tthis.params.push([param, null]);\n\t\t\t\telse\n\t\t\t\t\tthis.params.push(param);\n\t\t\t}\n\t\t}\n\n\t\t_eval(context)\n\t\t{\n\t\t\tlet args = [];\n\t\t\tfor (let i = 0; i < this.params.length; ++i)\n\t\t\t{\n\t\t\t\tlet param = this.params[i];\n\t\t\t\tif (param[1] === null)\n\t\t\t\t\targs.push(param[0]);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\targs.push(param[0] + \"=\");\n\t\t\t\t\targs.push(param[1]._handle_eval(context));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new ul4.Signature(...args);\n\t\t}\n\n\t\t_repr(out)\n\t\t{\n\t\t\tout.push(\"<\");\n\t\t\tout.push(this.constructor.name);\n\t\t\tout.push(\" params=\");\n\t\t\tthis.params._repr(out);\n\t\t\tout.push(\">\");\n\t\t}\n\t};\n\n\tul4.TemplateClosure = class TemplateClosure extends ul4.Proto\n\t{\n\t\tconstructor(template, signature, vars)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis.template = template;\n\t\t\tthis.signature = signature;\n\t\t\tthis.vars = vars;\n\t\t\tthis._ul4_callsignature = signature;\n\t\t\tthis._ul4_rendersignature = signature;\n\t\t\t// Copy over the required attribute from the template\n\t\t\tthis.name = template.name;\n\t\t\tthis.tag = template.tag;\n\t\t\tthis.endtag = template.endtag;\n\t\t\tthis._source = template._source;\n\t\t\tthis.startdelim = template.startdelim;\n\t\t\tthis.enddelim = template.enddelim;\n\t\t\tthis.docpos = template.docpos;\n\t\t\tthis.content = template.content;\n\t\t}\n\n\t\t__render__(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\trender(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__call__(context, vars)\n\t\t{\n\t\t\treturn this.template._callbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_renderbound(context, vars)\n\t\t{\n\t\t\tthis.template._renderbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t_rendersbound(context, vars)\n\t\t{\n\t\t\treturn this.template._rendersbound(context, ul4._inherit(this.vars, vars));\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"render\":\n\t\t\t\t\tlet render = function render(context, vars){ self._renderbound(context, vars); };\n\t\t\t\t\tul4.expose(render, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn render;\n\t\t\t\tcase \"renders\":\n\t\t\t\t\tlet renders = function renders(context, vars){ return self._rendersbound(context, vars); };\n\t\t\t\t\tul4.expose(renders, this.signature, {needscontext: true, needsobject: true});\n\t\t\t\t\treturn renders;\n\t\t\t\tcase \"signature\":\n\t\t\t\t\treturn this.signature;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.template.__getattr__(attrname);\n\t\t\t}\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"template\";\n\t\t}\n\t};\n\n\tul4.TemplateClosure.prototype._ul4_callneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_callneedscontext = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedsobject = true;\n\tul4.TemplateClosure.prototype._ul4_renderneedscontext = true;\n\n\t// Create a color object from the red, green, blue and alpha values ``r``, ``g``, ``b`` and ``b``\n\tul4._rgb = function _rgb(r, g, b, a)\n\t{\n\t\treturn new this.Color(255*r, 255*g, 255*b, 255*a);\n\t};\n\n\t// Convert ``obj`` to a string and escape the characters ``&``, ``<``, ``>``, ``'`` and ``\"`` with their XML character/entity reference\n\tul4._xmlescape = function _xmlescape(obj)\n\t{\n\t\tobj = ul4._str(obj);\n\t\tobj = obj.replace(/&/g, \"&\");\n\t\tobj = obj.replace(//g, \">\");\n\t\tobj = obj.replace(/'/g, \"'\");\n\t\tobj = obj.replace(/\"/g, \""\");\n\t\treturn obj;\n\t};\n\n\t// Convert ``obj`` to a string suitable for output into a CSV file\n\tul4._csv = function _csv(obj)\n\t{\n\t\tif (obj === null)\n\t\t\treturn \"\";\n\t\telse if (typeof(obj) !== \"string\")\n\t\t\tobj = ul4._repr(obj);\n\t\tif (obj.indexOf(\",\") !== -1 || obj.indexOf('\"') !== -1 || obj.indexOf(\"\\n\") !== -1)\n\t\t\tobj = '\"' + obj.replace(/\"/g, '\"\"') + '\"';\n\t\treturn obj;\n\t};\n\n\t// Return a string containing one character with the codepoint ``i``\n\tul4._chr = function _chr(i)\n\t{\n\t\tif (typeof(i) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"chr() requires an int\");\n\t\treturn String.fromCharCode(i);\n\t};\n\n\t// Return the codepoint for the one and only character in the string ``c``\n\tul4._ord = function _ord(c)\n\t{\n\t\tif (typeof(c) != \"string\" || c.length != 1)\n\t\t\tthrow new ul4.TypeError(\"ord() requires a string of length 1\");\n\t\treturn c.charCodeAt(0);\n\t};\n\n\t// Convert an integer to a hexadecimal string\n\tul4._hex = function _hex(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"hex() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0x\" + number.toString(16).substr(1);\n\t\telse\n\t\t\treturn \"0x\" + number.toString(16);\n\t};\n\n\t// Convert an integer to a octal string\n\tul4._oct = function _oct(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"oct() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0o\" + number.toString(8).substr(1);\n\t\telse\n\t\t\treturn \"0o\" + number.toString(8);\n\t};\n\n\t// Convert an integer to a binary string\n\tul4._bin = function _bin(number)\n\t{\n\t\tif (typeof(number) != \"number\")\n\t\t\tthrow new ul4.TypeError(\"bin() requires an int\");\n\t\tif (number < 0)\n\t\t\treturn \"-0b\" + number.toString(2).substr(1);\n\t\telse\n\t\t\treturn \"0b\" + number.toString(2);\n\t};\n\n\t// Return the minimum value\n\tul4._min = function _min(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"min() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"min() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value < result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the maximum value\n\tul4._max = function _max(obj)\n\t{\n\t\tif (obj.length == 0)\n\t\t\tthrow new ul4.ArgumentError(\"max() requires at least 1 argument, 0 given\");\n\t\telse if (obj.length == 1)\n\t\t\tobj = obj[0];\n\t\tlet iter = ul4._iter(obj);\n\t\tlet result;\n\t\tlet first = true;\n\t\twhile (true)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t{\n\t\t\t\tif (first)\n\t\t\t\t\tthrow new ul4.ValueError(\"max() argument is an empty sequence!\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tif (first || (item.value > result))\n\t\t\t\tresult = item.value;\n\t\t\tfirst = false;\n\t\t}\n\t};\n\n\t// Return the of the values from the iterable starting with ``start`` (default ``0``)\n\tul4._sum = function _sum(iterable, start=0)\n\t{\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tstart += item.value;\n\t\t}\n\t\treturn start;\n\t};\n\n\t// Return the first value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._first = function _first(iterable, defaultValue=null)\n\t{\n\t\tlet item = ul4._iter(iterable).next();\n\t\treturn item.done ? defaultValue : item.value;\n\t};\n\n\t// Return the last value produced by iterating through ``iterable`` (defaulting to ``defaultValue`` if the iterator is empty)\n\tul4._last = function _last(iterable, defaultValue=null)\n\t{\n\t\tlet value = defaultValue;\n\n\t\tfor (let iter = ul4._iter(iterable);;)\n\t\t{\n\t\t\tlet item = iter.next();\n\t\t\tif (item.done)\n\t\t\t\tbreak;\n\t\t\tvalue = item.value;\n\t\t}\n\t\treturn value;\n\t};\n\n\t// Return a sorted version of ``iterable``\n\tul4._sorted = function _sorted(context, iterable, key=null, reverse=false)\n\t{\n\t\tif (key === null)\n\t\t{\n\t\t\t// FIXME: stability\n\t\t\tlet cmp = reverse ? function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn -ul4._cmp(\"<=>\", a, b);\n\t\t\t} : function cmp(a, b)\n\t\t\t{\n\t\t\t\treturn ul4._cmp(\"<=>\", a, b);\n\t\t\t};\n\t\t\tlet result = ul4._list(iterable);\n\t\t\tresult.sort(cmp);\n\t\t\treturn result;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet sort = [];\n\n\t\t\tfor (let i = 0, iter = ul4._iter(iterable);;++i)\n\t\t\t{\n\t\t\t\tlet item = iter.next();\n\t\t\t\tif (item.done)\n\t\t\t\t\tbreak;\n\t\t\t\tlet keyvalue = ul4._call(context, key, [item.value], {});\n\t\t\t\t// For a stable sorting we have to use the nagative index if\n\t\t\t\t// reverse sorting is specified\n\t\t\t\tsort.push([keyvalue, reverse ? -i : i, item.value]);\n\t\t\t}\n\t\t\tcmp = function cmp(s1, s2)\n\t\t\t{\n\t\t\t\tlet res = ul4._cmp(\"<=>\", s1[0], s2[0]);\n\t\t\t\tif (res)\n\t\t\t\t\treturn reverse ? -res : res;\n\t\t\t\tres = ul4._cmp(\"<=>\", s1[1], s2[1]);\n\t\t\t\treturn reverse ? -res : res;\n\t\t\t};\n\n\t\t\tsort.sort(cmp);\n\n\t\t\tlet result = [];\n\t\t\tfor (let i = 0; i < sort.length; ++i)\n\t\t\t{\n\t\t\t\tlet item = sort[i];\n\t\t\t\tresult.push(item[2]);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n\n\t// Return a iterable object iterating from ``start`` up to (but not including) ``stop`` with a step size of ``step``\n\tul4._range = function _range(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required range() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"range() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet lower, higher;\n\t\tif (step === 0)\n\t\t\tthrow new ul4.ValueError(\"range() requires a step argument != 0\");\n\t\telse if (step > 0)\n\t\t{\n\t\t\tlower = start;\n\t\t\thigher = stop;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlower = stop;\n\t\t\thigher = start;\n\t\t}\n\t\tlet length = (lower < higher) ? Math.floor((higher - lower - 1)/Math.abs(step)) + 1 : 0;\n\n\t\treturn {\n\t\t\tindex: 0,\n\t\t\tnext: function()\n\t\t\t{\n\t\t\t\tif (this.index >= length)\n\t\t\t\t\treturn {done: true};\n\t\t\t\treturn {value: start + (this.index++) * step, done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return a iterable object returning a slice from the argument\n\tul4._slice = function _slice(args)\n\t{\n\t\tlet iterable, start, stop, step;\n\t\tif (args.length < 2)\n\t\t\tthrow new ul4.ArgumentError(\"required slice() argument missing\");\n\t\telse if (args.length > 4)\n\t\t\tthrow new ul4.ArgumentError(\"slice() expects at most 4 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = 0;\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 4)\n\t\t{\n\t\t\titerable = args[0];\n\t\t\tstart = args[1] !== null ? args[1] : 0;\n\t\t\tstop = args[2];\n\t\t\tstep = args[3] !== null ? args[3] : 1;\n\t\t}\n\t\tif (start < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a start argument >= 0\");\n\t\tif (stop < 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a stop argument >= 0\");\n\t\tif (step <= 0)\n\t\t\tthrow new ul4.ValueError(\"slice() requires a step argument > 0\");\n\n\t\tlet next = start, count = 0;\n\t\tlet iter = ul4._iter(iterable);\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet result;\n\t\t\t\twhile (count < next)\n\t\t\t\t{\n\t\t\t\t\tresult = iter.next();\n\t\t\t\t\tif (result.done)\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t\tif (stop !== null && count >= stop)\n\t\t\t\t\treturn {done: true};\n\t\t\t\tresult = iter.next();\n\t\t\t\tif (result.done)\n\t\t\t\t\treturn result;\n\t\t\t\t++count;\n\t\t\t\tnext += step;\n\t\t\t\tif (stop !== null && next > stop)\n\t\t\t\t\tnext = stop;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// ``%`` escape unsafe characters in the string ``string``\n\tul4._urlquote = function _urlquote(string)\n\t{\n\t\treturn encodeURIComponent(string);\n\t};\n\n\t// The inverse function of ``urlquote``\n\tul4._urlunquote = function _urlunquote(string)\n\t{\n\t\treturn decodeURIComponent(string);\n\t};\n\n\t// Return a reverse iterator over ``sequence``\n\tul4._reversed = function _reversed(sequence)\n\t{\n\t\tif (typeof(sequence) != \"string\" && !ul4._islist(sequence)) // We don't have to materialize strings or lists\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn {\n\t\t\tindex: sequence.length-1,\n\t\t\tnext: function() {\n\t\t\t\treturn this.index >= 0 ? {value: sequence[this.index--], done: false} : {done: true};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Returns a random number in the interval ``[0;1[``\n\tul4._random = function _random()\n\t{\n\t\treturn Math.random();\n\t};\n\n\t// Return a randomly select item from ``range(start, stop, step)``\n\tul4._randrange = function _randrange(args)\n\t{\n\t\tlet start, stop, step;\n\t\tif (args.length < 1)\n\t\t\tthrow new ul4.ArgumentError(\"required randrange() argument missing\");\n\t\telse if (args.length > 3)\n\t\t\tthrow new ul4.ArgumentError(\"randrange() expects at most 3 positional arguments, \" + args.length + \" given\");\n\t\telse if (args.length == 1)\n\t\t{\n\t\t\tstart = 0;\n\t\t\tstop = args[0];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 2)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = 1;\n\t\t}\n\t\telse if (args.length == 3)\n\t\t{\n\t\t\tstart = args[0];\n\t\t\tstop = args[1];\n\t\t\tstep = args[2];\n\t\t}\n\t\tlet width = stop-start;\n\n\t\tlet value = Math.random();\n\n\t\tlet n;\n\t\tif (step > 0)\n\t\t\tn = Math.floor((width + step - 1) / step);\n\t\telse if (step < 0)\n\t\t\tn = Math.floor((width + step + 1) / step);\n\t\telse\n\t\t\tthrow new ul4.ValueError(\"randrange() requires a step argument != 0\");\n\t\treturn start + step*Math.floor(value * n);\n\t};\n\n\t// Return a random item/char from the list/string ``sequence``\n\tul4._randchoice = function _randchoice(sequence)\n\t{\n\t\tlet iscolor = ul4._iscolor(sequence);\n\t\tif (typeof(sequence) !== \"string\" && !ul4._islist(sequence) && !iscolor)\n\t\t\tthrow new ul4.TypeError(\"randchoice() requires a string or list\");\n\t\tif (iscolor)\n\t\t\tsequence = ul4._list(sequence);\n\t\treturn sequence[Math.floor(Math.random() * sequence.length)];\n\t};\n\n\t// Round a number ``x`` to ``digits`` decimal places (may be negative)\n\tul4._round = function _round(x, digits=0)\n\t{\n\t\tif (digits)\n\t\t{\n\t\t\tlet threshold = Math.pow(10, digits);\n\t\t\treturn Math.round(x*threshold)/threshold;\n\t\t}\n\t\telse\n\t\t\treturn Math.round(x);\n\t};\n\n\t// Return a hex-encode MD5 hash of the argument\n\t// This uses the md5 function from https://github.com/blueimp/JavaScript-MD5\n\tif (iscommon)\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\tlet md5 = require('blueimp-md5');\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\telse\n\t{\n\t\tul4._md5 = function _md5(string)\n\t\t{\n\t\t\treturn md5(string);\n\t\t};\n\t}\n\n\t// Return an iterator over ``[index, item]`` lists from the iterable object ``iterable``. ``index`` starts at ``start`` (defaulting to 0)\n\tul4._enumerate = function _enumerate(iterable, start=0)\n\t{\n\t\treturn {\n\t\t\titer: ul4._iter(iterable),\n\t\t\tindex: start,\n\t\t\tnext: function() {\n\t\t\t\tlet item = this.iter.next();\n\t\t\t\treturn item.done ? item : {value: [this.index++, item.value], done: false};\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, false otherwise)\n\tul4._isfirst = function _isfirst(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = item.done ? item : {value: [isfirst, item.value], done: false};\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[islast, item]`` lists from the iterable object ``iterable`` (``islast`` is true for the last item, false otherwise)\n\tul4._islast = function _islast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._isfirstlast = function _isfirstlast(iterable)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over ``[index, isfirst, islast, item]`` lists from the iterable object ``iterable`` (``isfirst`` is true for the first item, ``islast`` is true for the last item. Both are false otherwise)\n\tul4._enumfl = function _enumfl(iterable, start=0)\n\t{\n\t\tlet iter = ul4._iter(iterable);\n\t\tlet i = start;\n\t\tlet isfirst = true;\n\t\tlet lastitem = iter.next();\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\tif (lastitem.done)\n\t\t\t\t\treturn lastitem;\n\t\t\t\tlet item = iter.next();\n\t\t\t\tlet result = {value: [i++, isfirst, item.done, lastitem.value], done: false};\n\t\t\t\tlastitem = item;\n\t\t\t\tisfirst = false;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t};\n\n\t// Return an iterator over lists, where the i'th list consists of all i'th items from the arguments (terminating when the shortest argument ends)\n\tul4._zip = function _zip(iterables)\n\t{\n\t\tlet result;\n\t\tif (iterables.length)\n\t\t{\n\t\t\tlet iters = [];\n\t\t\tfor (let i = 0; i < iterables.length; ++i)\n\t\t\t\titers.push(ul4._iter(iterables[i]));\n\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\tlet items = [];\n\t\t\t\t\tfor (let i = 0; i < iters.length; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet item = iters[i].next();\n\t\t\t\t\t\tif (item.done)\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\titems.push(item.value);\n\t\t\t\t\t}\n\t\t\t\t\treturn {value: items, done: false};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\t// Return the absolute value for the number ``number``\n\tul4._abs = function _abs(number)\n\t{\n\t\tif (number !== null && typeof(number.__abs__) === \"function\")\n\t\t\treturn number.__abs__();\n\t\treturn Math.abs(number);\n\t};\n\n\t// Return a ``Date`` object from the arguments passed in\n\tul4._date = function _date(year, month, day)\n\t{\n\t\treturn new ul4.Date(year, month, day);\n\t};\n\n\tul4._datetime = function _datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)\n\t{\n\t\treturn new Date(year, month-1, day, hour, minute, second, microsecond/1000);\n\t};\n\n\t// Return a ``TimeDelta`` object from the arguments passed in\n\tul4._timedelta = function _timedelta(days=0, seconds=0, microseconds=0)\n\t{\n\t\treturn new this.TimeDelta(days, seconds, microseconds);\n\t};\n\n\t// Return a ``MonthDelta`` object from the arguments passed in\n\tul4._monthdelta = function _monthdelta(months=0)\n\t{\n\t\treturn new this.MonthDelta(months);\n\t};\n\n\t// Return a ``Color`` object from the hue, luminescence, saturation and alpha values ``h``, ``l``, ``s`` and ``a`` (i.e. using the HLS color model)\n\tul4._hls = function _hls(h, l, s, a)\n\t{\n\t\tlet _v = function(m1, m2, hue)\n\t\t{\n\t\t\thue = hue % 1.0;\n\t\t\tif (hue < 1/6)\n\t\t\t\treturn m1 + (m2-m1)*hue*6.0;\n\t\t\telse if (hue < 0.5)\n\t\t\t\treturn m2;\n\t\t\telse if (hue < 2/3)\n\t\t\t\treturn m1 + (m2-m1)*(2/3-hue)*6.0;\n\t\t\treturn m1;\n\t\t};\n\n\t\tlet m1, m2;\n\t\tif (typeof(a) === \"undefined\")\n\t\t\ta = 1;\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(l, l, l, a);\n\t\tif (l <= 0.5)\n\t\t\tm2 = l * (1.0+s);\n\t\telse\n\t\t\tm2 = l+s-(l*s);\n\t\tm1 = 2.0*l - m2;\n\t\treturn ul4._rgb(_v(m1, m2, h+1/3), _v(m1, m2, h), _v(m1, m2, h-1/3), a);\n\t};\n\n\t// Return a ``Color`` object from the hue, saturation, value and alpha values ``h``, ``s``, ``v`` and ``a`` (i.e. using the HSV color model)\n\tul4._hsv = function _hsv(h, s, v, a)\n\t{\n\t\tif (s === 0.0)\n\t\t\treturn ul4._rgb(v, v, v, a);\n\t\tlet i = Math.floor(h*6.0);\n\t\tlet f = (h*6.0) - i;\n\t\tlet p = v*(1.0 - s);\n\t\tlet q = v*(1.0 - s*f);\n\t\tlet t = v*(1.0 - s*(1.0-f));\n\t\tswitch (i%6)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\treturn ul4._rgb(v, t, p, a);\n\t\t\tcase 1:\n\t\t\t\treturn ul4._rgb(q, v, p, a);\n\t\t\tcase 2:\n\t\t\t\treturn ul4._rgb(p, v, t, a);\n\t\t\tcase 3:\n\t\t\t\treturn ul4._rgb(p, q, v, a);\n\t\t\tcase 4:\n\t\t\t\treturn ul4._rgb(t, p, v, a);\n\t\t\tcase 5:\n\t\t\t\treturn ul4._rgb(v, p, q, a);\n\t\t}\n\t};\n\n\t// Return the item with the key ``key`` from the dict ``container``. If ``container`` doesn't have this key, return ``defaultvalue``\n\tul4._get = function _get(container, key, defaultvalue)\n\t{\n\t\tif (ul4._ismap(container))\n\t\t{\n\t\t\tif (container.has(key))\n\t\t\t\treturn container.get(key);\n\t\t\treturn defaultvalue;\n\t\t}\n\t\telse if (ul4._isobject(container))\n\t\t{\n\t\t\tlet result = container[key];\n\t\t\tif (typeof(result) === \"undefined\")\n\t\t\t\treturn defaultvalue;\n\t\t\treturn result;\n\t\t}\n\t\tthrow new ul4.TypeError(\"get() requires a dict\");\n\t};\n\n\t// Return a ``Date`` object for the current time\n\tul4.now = function now()\n\t{\n\t\treturn new Date();\n\t};\n\n\t// Return a ``Date`` object for the current time in UTC\n\tul4.utcnow = function utcnow()\n\t{\n\t\tlet now = new Date();\n\t\t// FIXME: The timezone is wrong for the new ``Date`` object.\n\t\treturn new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());\n\t};\n\n\t// Return an ``ul4.Date`` object for today\n\tul4.today = function today()\n\t{\n\t\tlet now = new Date();\n\t\treturn new ul4.Date(now.getFullYear(), now.getMonth()+1, now.getDate());\n\t};\n\n\tul4.functions = {\n\t\trepr: ul4._repr,\n\t\tascii: ul4._ascii,\n\t\tstr: ul4._str,\n\t\tint: ul4._int,\n\t\tfloat: ul4._float,\n\t\tlist: ul4._list,\n\t\tset: ul4._set,\n\t\tbool: ul4._bool,\n\t\tlen: ul4._len,\n\t\ttype: ul4._type,\n\t\tformat: ul4._format,\n\t\tany: ul4._any,\n\t\tall: ul4._all,\n\t\tzip: ul4._zip,\n\t\tgetattr: ul4._getattr,\n\t\thasattr: ul4._hasattr,\n\t\tdir: ul4._dir,\n\t\tisundefined: ul4._isundefined,\n\t\tisdefined: ul4._isdefined,\n\t\tisnone: ul4._isnone,\n\t\tisbool: ul4._isbool,\n\t\tisint: ul4._isint,\n\t\tisfloat: ul4._isfloat,\n\t\tisstr: ul4._isstr,\n\t\tisdate: ul4._isdate,\n\t\tisdatetime: ul4._isdatetime,\n\t\tiscolor: ul4._iscolor,\n\t\tistimedelta: ul4._istimedelta,\n\t\tismonthdelta: ul4._ismonthdelta,\n\t\tistemplate: ul4._istemplate,\n\t\tisfunction: ul4._isfunction,\n\t\tislist: ul4._islist,\n\t\tisset: ul4._isanyset,\n\t\tisdict: ul4._isdict,\n\t\tisexception: ul4._isexception,\n\t\tasjson: ul4._asjson,\n\t\tfromjson: ul4._fromjson,\n\t\tasul4on: ul4._asul4on,\n\t\tfromul4on: ul4._fromul4on,\n\t\tnow: ul4.now,\n\t\tutcnow: ul4.utcnow,\n\t\ttoday: ul4.today,\n\t\tenumerate: ul4._enumerate,\n\t\tisfirst: ul4._isfirst,\n\t\tislast: ul4._islast,\n\t\tisfirstlast: ul4._isfirstlast,\n\t\tenumfl: ul4._enumfl,\n\t\tabs: ul4._abs,\n\t\tdate: ul4._date,\n\t\tdatetime: ul4._datetime,\n\t\ttimedelta: ul4._timedelta,\n\t\tmonthdelta: ul4._monthdelta,\n\t\trgb: ul4._rgb,\n\t\thls: ul4._hls,\n\t\thsv: ul4._hsv,\n\t\txmlescape: ul4._xmlescape,\n\t\tcsv: ul4._csv,\n\t\tchr: ul4._chr,\n\t\tord: ul4._ord,\n\t\thex: ul4._hex,\n\t\toct: ul4._oct,\n\t\tbin: ul4._bin,\n\t\tmin: ul4._min,\n\t\tmax: ul4._max,\n\t\tsum: ul4._sum,\n\t\tfirst: ul4._first,\n\t\tlast: ul4._last,\n\t\tsorted: ul4._sorted,\n\t\trange: ul4._range,\n\t\tslice: ul4._slice,\n\t\turlquote: ul4._urlquote,\n\t\turlunquote: ul4._urlunquote,\n\t\treversed: ul4._reversed,\n\t\trandom: ul4._random,\n\t\trandrange: ul4._randrange,\n\t\trandchoice: ul4._randchoice,\n\t\tround: ul4._round,\n\t\tmd5: ul4._md5\n\t};\n\n\tul4.expose(ul4._repr, [\"obj\"], {name: \"repr\"});\n\tul4.expose(ul4._ascii, [\"obj\"], {name: \"ascii\"});\n\tul4.expose(ul4._str, [\"obj=\", \"\"], {name: \"str\"});\n\tul4.expose(ul4._int, [\"obj=\", 0, \"base=\", null], {name: \"int\"});\n\tul4.expose(ul4._float, [\"obj=\", 0.0], {name: \"float\"});\n\tul4.expose(ul4._list, [\"iterable=\", []], {name: \"list\"});\n\tul4.expose(ul4._set, [\"iterable=\", []], {name: \"set\"});\n\tul4.expose(ul4._bool, [\"obj=\", false], {name: \"bool\"});\n\tul4.expose(ul4._len, [\"sequence\"], {name: \"len\"});\n\tul4.expose(ul4._type, [\"obj\"], {name: \"type\"});\n\tul4.expose(ul4._format, [\"obj\", \"fmt\", \"lang=\", null], {name: \"format\"});\n\tul4.expose(ul4._any, [\"iterable\"], {name: \"any\"});\n\tul4.expose(ul4._all, [\"iterable\"], {name: \"all\"});\n\tul4.expose(ul4._zip, [\"*iterables\"], {name: \"zip\"});\n\tul4.expose(ul4._getattr, [\"obj\", \"attrname\", \"default=\", null], {name: \"getattr\"});\n\tul4.expose(ul4._hasattr, [\"obj\", \"attrname\"], {name: \"hasattr\"});\n\tul4.expose(ul4._dir, [\"obj\"], {name: \"dir\"});\n\tul4.expose(ul4._isundefined, [\"obj\"], {name: \"isundefined\"});\n\tul4.expose(ul4._isdefined, [\"obj\"], {name: \"isdefined\"});\n\tul4.expose(ul4._isnone, [\"obj\"], {name: \"isnone\"});\n\tul4.expose(ul4._isbool, [\"obj\"], {name: \"isbool\"});\n\tul4.expose(ul4._isint, [\"obj\"], {name: \"isint\"});\n\tul4.expose(ul4._isfloat, [\"obj\"], {name: \"isfloat\"});\n\tul4.expose(ul4._isstr, [\"obj\"], {name: \"isstr\"});\n\tul4.expose(ul4._isdate, [\"obj\"], {name: \"isdate\"});\n\tul4.expose(ul4._isdatetime, [\"obj\"], {name: \"isdatetime\"});\n\tul4.expose(ul4._iscolor, [\"obj\"], {name: \"iscolor\"});\n\tul4.expose(ul4._istimedelta, [\"obj\"], {name: \"istimedelta\"});\n\tul4.expose(ul4._ismonthdelta, [\"obj\"], {name: \"ismonthdelta\"});\n\tul4.expose(ul4._istemplate, [\"obj\"], {name: \"istemplate\"});\n\tul4.expose(ul4._isfunction, [\"obj\"], {name: \"isfunction\"});\n\tul4.expose(ul4._islist, [\"obj\"], {name: \"islist\"});\n\tul4.expose(ul4._isanyset, [\"obj\"], {name: \"isset\"});\n\tul4.expose(ul4._isdict, [\"obj\"], {name: \"isdict\"});\n\tul4.expose(ul4._isexception, [\"obj\"], {name: \"isexception\"});\n\tul4.expose(ul4._asjson, [\"obj\"], {name: \"asjson\"});\n\tul4.expose(ul4._fromjson, [\"string\"], {name: \"fromjson\"});\n\tul4.expose(ul4._asul4on, [\"obj\"], {name: \"asul4on\"});\n\tul4.expose(ul4._fromul4on, [\"string\"], {name: \"fromul4on\"});\n\tul4.expose(ul4.now, []);\n\tul4.expose(ul4.utcnow, []);\n\tul4.expose(ul4.today, []);\n\tul4.expose(ul4._enumerate, [\"iterable\", \"start=\", 0], {name: \"enumerate\"});\n\tul4.expose(ul4._isfirst, [\"iterable\"], {name: \"isfirst\"});\n\tul4.expose(ul4._islast, [\"iterable\"], {name: \"islast\"});\n\tul4.expose(ul4._isfirstlast, [\"iterable\"], {name: \"isfirstlast\"});\n\tul4.expose(ul4._enumfl, [\"iterable\", \"start=\", 0], {name: \"enumfl\"});\n\tul4.expose(ul4._abs, [\"number\"], {name: \"abs\"});\n\tul4.expose(ul4._date, [\"year\", \"month\", \"day\"], {name: \"date\"});\n\tul4.expose(ul4._datetime, [\"year\", \"month\", \"day\", \"hour=\", 0, \"minute=\", 0, \"second=\", 0, \"microsecond=\", 0], {name: \"datetime\"});\n\tul4.expose(ul4._timedelta, [\"days=\", 0, \"seconds=\", 0, \"microseconds=\", 0], {name: \"timedelta\"});\n\tul4.expose(ul4._monthdelta, [\"months=\", 0], {name: \"monthdelta\"});\n\tul4.expose(ul4._rgb, [\"r\", \"g\", \"b\", \"a=\", 1.0], {name: \"rgb\"});\n\tul4.expose(ul4._hls, [\"h\", \"l\", \"s\", \"a=\", 1.0], {name: \"hls\"});\n\tul4.expose(ul4._hsv, [\"h\", \"s\", \"v\", \"a=\", 1.0], {name: \"hsv\"});\n\tul4.expose(ul4._xmlescape, [\"obj\"], {name: \"xmlescape\"});\n\tul4.expose(ul4._csv, [\"obj\"], {name: \"csv\"});\n\tul4.expose(ul4._chr, [\"i\"], {name: \"chr\"});\n\tul4.expose(ul4._ord, [\"c\"], {name: \"ord\"});\n\tul4.expose(ul4._hex, [\"number\"], {name: \"hex\"});\n\tul4.expose(ul4._oct, [\"number\"], {name: \"oct\"});\n\tul4.expose(ul4._bin, [\"number\"], {name: \"bin\"});\n\tul4.expose(ul4._min, [\"*obj\"], {name: \"min\"});\n\tul4.expose(ul4._max, [\"*obj\"], {name: \"max\"});\n\tul4.expose(ul4._sum, [\"iterable\", \"start=\", 0], {name: \"sum\"});\n\tul4.expose(ul4._first, [\"iterable\", \"default=\", null], {name: \"first\"});\n\tul4.expose(ul4._last, [\"iterable\", \"default=\", null], {name: \"last\"});\n\tul4.expose(ul4._sorted, [\"iterable\", \"key=\", null, \"reverse=\", false], {name: \"sorted\", needscontext: true});\n\tul4.expose(ul4._range, [\"*args\"], {name: \"range\"});\n\tul4.expose(ul4._slice, [\"*args\"], {name: \"slice\"});\n\tul4.expose(ul4._urlquote, [\"string\"], {name: \"urlquote\"});\n\tul4.expose(ul4._urlunquote, [\"string\"], {name: \"urlunquote\"});\n\tul4.expose(ul4._reversed, [\"sequence\"], {name: \"reversed\"});\n\tul4.expose(ul4._random, [], {name: \"random\"});\n\tul4.expose(ul4._randrange, [\"*args\"], {name: \"randrange\"});\n\tul4.expose(ul4._randchoice, [\"sequence\"], {name: \"randchoice\"});\n\tul4.expose(ul4._round, [\"x\", \"digit=\", 0], {name: \"round\"});\n\tul4.expose(ul4._md5, [\"string\"], {name: \"md5\"});\n\n\t// Functions implementing UL4 methods\n\tul4._count = function _count(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\n\t\tlet isstr = ul4._isstr(obj);\n\n\t\tif (isstr && !sub.length)\n\t\t{\n\t\t\tif (end < 0 || start > obj.length || start > end)\n\t\t\t\treturn 0;\n\t\t\tlet result = end - start + 1;\n\t\t\tif (result > obj.length + 1)\n\t\t\t\tresult = obj.length + 1;\n\t\t\treturn result;\n\t\t}\n\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tlet count = 0;\n\t\tif (ul4._islist(obj))\n\t\t{\n\t\t\tfor (let i = start; i < end; ++i)\n\t\t\t{\n\t\t\t\tif (ul4._eq(obj[i], sub))\n\t\t\t\t\t++count;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t\telse // string\n\t\t{\n\t\t\tlet lastIndex = start;\n\n\t\t\tfor (;;)\n\t\t\t{\n\t\t\t\tlastIndex = obj.indexOf(sub, lastIndex);\n\t\t\t\tif (lastIndex == -1)\n\t\t\t\t\tbreak;\n\t\t\t\tif (lastIndex + sub.length > end)\n\t\t\t\t\tbreak;\n\t\t\t\t++count;\n\t\t\t\tlastIndex += sub.length;\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t};\n\n\tul4._find = function _find(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.indexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._rfind = function _rfind(obj, sub, start=null, end=null)\n\t{\n\t\tif (start < 0)\n\t\t\tstart += obj.length;\n\t\tif (start === null)\n\t\t\tstart = 0;\n\t\tif (end < 0)\n\t\t\tend += obj.length;\n\t\tif (end === null)\n\t\t\tend = obj.length;\n\t\tstart = ul4._bound(start, obj.length);\n\t\tend = ul4._bound(end, obj.length);\n\n\t\tif (start !== 0 || end !== obj.length)\n\t\t{\n\t\t\tif (typeof(obj) == \"string\")\n\t\t\t\tobj = obj.substring(start, end);\n\t\t\telse\n\t\t\t\tobj = obj.slice(start, end);\n\t\t}\n\t\tlet result = obj.lastIndexOf(sub);\n\t\tif (result !== -1)\n\t\t\tresult += start;\n\t\treturn result;\n\t};\n\n\tul4._week4format = function _week(obj, firstweekday=null)\n\t{\n\t\tif (firstweekday === null)\n\t\t\tfirstweekday = 0;\n\t\telse\n\t\t\tfirstweekday %= 7;\n\n\t\tlet yearday = ul4.DateTimeProtocol.yearday(obj)+6;\n\t\tlet jan1 = new Date(obj.getFullYear(), 0, 1);\n\t\tlet jan1weekday = jan1.getDay();\n\t\tif (--jan1weekday < 0)\n\t\t\tjan1weekday = 6;\n\n\t\twhile (jan1weekday != firstweekday)\n\t\t{\n\t\t\t--yearday;\n\t\t\tif (++jan1weekday == 7)\n\t\t\t\tjan1weekday = 0;\n\t\t}\n\t\treturn Math.floor(yearday/7);\n\t};\n\n\tul4._isleap = function _isleap(obj)\n\t{\n\t\treturn new Date(obj.getFullYear(), 1, 29).getMonth() === 1;\n\t};\n\n\tul4._update = function _update(obj, others, kwargs)\n\t{\n\t\tif (!ul4._isdict(obj))\n\t\t\tthrow new ul4.TypeError(\"update() requires a dict\");\n\t\tfor (let i = 0; i < others.length; ++i)\n\t\t{\n\t\t\tlet other = others[i];\n\t\t\tif (ul4._ismap(other))\n\t\t\t{\n\t\t\t\tother.forEach(function(value, key) {\n\t\t\t\t\tul4._setmap(obj, key, value);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (ul4._isobject(other))\n\t\t\t{\n\t\t\t\tfor (let key in other)\n\t\t\t\t\tul4._setmap(obj, key, other[key]);\n\t\t\t}\n\t\t\telse if (ul4._islist(other))\n\t\t\t{\n\t\t\t\tfor (let i = 0; i < other.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tlet item = other[i];\n\t\t\t\t\tif (!ul4._islist(item) || (item.length != 2))\n\t\t\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t\t\t\tul4._setmap(obj, item[0], item[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tthrow new ul4.TypeError(\"update() requires a dict or a list of (key, value) pairs\");\n\t\t}\n\t\tkwargs.forEach(function(value, key) {\n\t\t\tul4._setmap(obj, key, value);\n\t\t});\n\t\treturn null;\n\t};\n\n\tul4.Color = class Color extends ul4.Proto\n\t{\n\t\tconstructor(r=0, g=0, b=0, a=255)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._r = r;\n\t\t\tthis._g = g;\n\t\t\tthis._b = b;\n\t\t\tthis._a = a;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\tlet a = ul4._lpad(this._a.toString(16), \"0\", 2);\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1] && a[0] === a[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0] + a[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b + a;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._a !== 0xff)\n\t\t\t{\n\t\t\t\treturn \"rgba(\" + this._r + \", \" + this._g + \", \" + this._b + \", \" + (this._a/255) + \")\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlet r = ul4._lpad(this._r.toString(16), \"0\", 2);\n\t\t\t\tlet g = ul4._lpad(this._g.toString(16), \"0\", 2);\n\t\t\t\tlet b = ul4._lpad(this._b.toString(16), \"0\", 2);\n\t\t\t\tif (r[0] === r[1] && g[0] === g[1] && b[0] === b[1])\n\t\t\t\t\treturn \"#\" + r[0] + g[0] + b[0];\n\t\t\t\telse\n\t\t\t\t\treturn \"#\" + r + g + b;\n\t\t\t}\n\t\t}\n\n\t\t__iter__()\n\t\t{\n\t\t\treturn {\n\t\t\t\tobj: this,\n\t\t\t\tindex: 0,\n\t\t\t\tnext: function() {\n\t\t\t\t\tif (this.index == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._r, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._g, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._b, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.index == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\t++this.index;\n\t\t\t\t\t\treturn {value: this.obj._a, done: false};\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"r\":\n\t\t\t\t\tlet r = function r(){ return self._r; };\n\t\t\t\t\tul4.expose(r, []);\n\t\t\t\t\treturn r;\n\t\t\t\tcase \"g\":\n\t\t\t\t\tlet g = function g(){ return self._g; };\n\t\t\t\t\tul4.expose(g, []);\n\t\t\t\t\treturn g;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tlet b = function b(){ return self._b; };\n\t\t\t\t\tul4.expose(b, []);\n\t\t\t\t\treturn b;\n\t\t\t\tcase \"a\":\n\t\t\t\t\tlet a = function a(){ return self._a; };\n\t\t\t\t\tul4.expose(a, []);\n\t\t\t\t\treturn a;\n\t\t\t\tcase \"lum\":\n\t\t\t\t\tlet lum = function lum(){ return self.lum(); };\n\t\t\t\t\tul4.expose(lum, []);\n\t\t\t\t\treturn lum;\n\t\t\t\tcase \"hls\":\n\t\t\t\t\tlet hls = function hls(){ return self.hls(); };\n\t\t\t\t\tul4.expose(hls, []);\n\t\t\t\t\treturn hls;\n\t\t\t\tcase \"hlsa\":\n\t\t\t\t\tlet hlsa = function hlsa(){ return self.hlsa(); };\n\t\t\t\t\tul4.expose(hlsa, []);\n\t\t\t\t\treturn hlsa;\n\t\t\t\tcase \"hsv\":\n\t\t\t\t\tlet hsv = function hsv(){ return self.hsv(); };\n\t\t\t\t\tul4.expose(hsv, []);\n\t\t\t\t\treturn hsv;\n\t\t\t\tcase \"hsva\":\n\t\t\t\t\tlet hsva = function hsva(){ return self.hsva(); };\n\t\t\t\t\tul4.expose(hsva, []);\n\t\t\t\t\treturn hsva;\n\t\t\t\tcase \"witha\":\n\t\t\t\t\tlet witha = function witha(a){ return self.witha(a); };\n\t\t\t\t\tul4.expose(witha, [\"a\"]);\n\t\t\t\t\treturn witha;\n\t\t\t\tcase \"withlum\":\n\t\t\t\t\tlet withlum = function withlum(lum){ return self.withlum(lum); };\n\t\t\t\t\tul4.expose(withlum, [\"lum\"]);\n\t\t\t\t\treturn withlum;\n\t\t\t\tcase \"abslum\":\n\t\t\t\t\tlet abslum = function abslum(lum){ return self.abslum(lum); };\n\t\t\t\t\tul4.expose(abslum, [\"lum\"]);\n\t\t\t\t\treturn abslum;\n\t\t\t\tcase \"rellum\":\n\t\t\t\t\tlet rellum = function rellum(lum){ return self.rellum(lum); };\n\t\t\t\t\tul4.expose(rellum, [\"lum\"]);\n\t\t\t\t\treturn rellum;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\t__getitem__(key)\n\t\t{\n\t\t\tlet orgkey = key;\n\t\t\tif (key < 0)\n\t\t\t\tkey += 4;\n\t\t\tswitch (key)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\treturn this._r;\n\t\t\t\tcase 1:\n\t\t\t\t\treturn this._g;\n\t\t\t\tcase 2:\n\t\t\t\t\treturn this._b;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn this._a;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.IndexError(this, orgkey);\n\t\t\t}\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Color)\n\t\t\t\treturn this._r == other._r && this._g == other._g && this._b == other._b && this._a == other._a;\n\t\t\treturn false;\n\t\t}\n\n\t\tr()\n\t\t{\n\t\t\t\treturn this._r;\n\t\t}\n\n\t\tg()\n\t\t{\n\t\t\treturn this._g;\n\t\t}\n\n\t\tb()\n\t\t{\n\t\t\treturn this._b;\n\t\t}\n\n\t\ta()\n\t\t{\n\t\t\treturn this._a;\n\t\t}\n\n\t\tlum()\n\t\t{\n\t\t\treturn this.hls()[1];\n\t\t}\n\n\t\thls()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet h, l, s;\n\t\t\tlet rc, gc, bc;\n\n\t\t\tl = (minc+maxc)/2.0;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, l, 0.0];\n\t\t\tif (l <= 0.5)\n\t\t\t\ts = (maxc-minc) / (maxc+minc);\n\t\t\telse\n\t\t\t\ts = (maxc-minc) / (2.0-maxc-minc);\n\t\t\trc = (maxc-r) / (maxc-minc);\n\t\t\tgc = (maxc-g) / (maxc-minc);\n\t\t\tbc = (maxc-b) / (maxc-minc);\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, l, s];\n\t\t}\n\n\t\thlsa()\n\t\t{\n\t\t\tlet hls = this.hls();\n\t\t\treturn hls.concat(this._a/255.0);\n\t\t}\n\n\t\thsv()\n\t\t{\n\t\t\tlet r = this._r/255.0;\n\t\t\tlet g = this._g/255.0;\n\t\t\tlet b = this._b/255.0;\n\t\t\tlet maxc = Math.max(r, g, b);\n\t\t\tlet minc = Math.min(r, g, b);\n\t\t\tlet v = maxc;\n\t\t\tif (minc == maxc)\n\t\t\t\treturn [0.0, 0.0, v];\n\t\t\tlet s = (maxc-minc) / maxc;\n\t\t\tlet rc = (maxc-r) / (maxc-minc);\n\t\t\tlet gc = (maxc-g) / (maxc-minc);\n\t\t\tlet bc = (maxc-b) / (maxc-minc);\n\t\t\tlet h;\n\t\t\tif (r == maxc)\n\t\t\t\th = bc-gc;\n\t\t\telse if (g == maxc)\n\t\t\t\th = 2.0+rc-bc;\n\t\t\telse\n\t\t\t\th = 4.0+gc-rc;\n\t\t\th = (h/6.0) % 1.0;\n\t\t\treturn [h, s, v];\n\t\t}\n\n\t\thsva()\n\t\t{\n\t\t\tlet hsv = this.hsv();\n\t\t\treturn hsv.concat(this._a/255.0);\n\t\t}\n\n\t\twitha(a)\n\t\t{\n\t\t\tif (typeof(a) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\treturn new ul4.Color(this._r, this._g, this._b, a);\n\t\t}\n\n\t\twithlum(lum)\n\t\t{\n\t\t\tif (typeof(lum) !== \"number\")\n\t\t\t\tthrow new ul4.TypeError(\"witha() requires a number\");\n\t\t\tlet hlsa = this.hlsa();\n\t\t\treturn ul4._hls(hlsa[0], lum, hlsa[2], hlsa[3]);\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"color\";\n\t\t}\n\t};\n\n\tul4.expose(ul4.Color.prototype.r, []);\n\tul4.expose(ul4.Color.prototype.g, []);\n\tul4.expose(ul4.Color.prototype.b, []);\n\tul4.expose(ul4.Color.prototype.a, []);\n\tul4.expose(ul4.Color.prototype.lum, []);\n\tul4.expose(ul4.Color.prototype.hls, []);\n\tul4.expose(ul4.Color.prototype.hlsa, []);\n\tul4.expose(ul4.Color.prototype.hsv, []);\n\tul4.expose(ul4.Color.prototype.hsva, []);\n\tul4.expose(ul4.Color.prototype.witha, [\"a\"]);\n\tul4.expose(ul4.Color.prototype.withlum, [\"lum\"]);\n\n\tconst _js_Date = Date;\n\n\tul4.Date = class Date extends ul4.Proto\n\t{\n\t\tconstructor(year, month, day)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._date = new _js_Date(year, month-1, day);\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\treturn '@(' + this.__str__() + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\treturn ul4._lpad(this._date.getFullYear(), \"0\", 4) + \"-\" + ul4._lpad(this._date.getMonth()+1, \"0\", 2) + \"-\" + ul4._lpad(this._date.getDate(), \"0\", 2);\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date.getTime() === other._date.getTime();\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date < other._date;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date <= other._date;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date > other._date;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.Date)\n\t\t\t\treturn this._date >= other._date;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\tyear()\n\t\t{\n\t\t\treturn this._date.getFullYear();\n\t\t}\n\n\t\tmonth()\n\t\t{\n\t\t\treturn this._date.getMonth()+1;\n\t\t}\n\n\t\tday()\n\t\t{\n\t\t\treturn this._date.getDate();\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"date\";\n\t\t}\n\t};\n\n\n\tul4.TimeDelta = class TimeDelta extends ul4.Proto\n\t{\n\t\tconstructor(days=0, seconds=0, microseconds=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tlet total_microseconds = Math.floor((days * 86400 + seconds)*1000000 + microseconds);\n\n\t\t\tmicroseconds = ul4.ModAST.prototype._do(total_microseconds, 1000000);\n\t\t\tlet total_seconds = Math.floor(total_microseconds / 1000000);\n\t\t\tseconds = ul4.ModAST.prototype._do(total_seconds, 86400);\n\t\t\tdays = Math.floor(total_seconds / 86400);\n\t\t\tif (seconds < 0)\n\t\t\t{\n\t\t\t\tseconds += 86400;\n\t\t\t\t--days;\n\t\t\t}\n\n\t\t\tthis._microseconds = microseconds;\n\t\t\tthis._seconds = seconds;\n\t\t\tthis._days = days;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tlet v = [], first = true;\n\t\t\tv.push(\"timedelta(\");\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(\"days=\" + this._days);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._seconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"seconds=\" + this._seconds);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tif (!first)\n\t\t\t\t\tv.push(\", \");\n\t\t\t\tv.push(\"microseconds=\" + this._microseconds);\n\t\t\t}\n\t\t\tv.push(\")\");\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tlet v = [];\n\t\t\tif (this._days)\n\t\t\t{\n\t\t\t\tv.push(this._days + \" day\");\n\t\t\t\tif (this._days !== -1 && this._days !== 1)\n\t\t\t\t\tv.push(\"s\");\n\t\t\t\tv.push(\", \");\n\t\t\t}\n\t\t\tlet seconds = this._seconds % 60;\n\t\t\tlet minutes = Math.floor(this._seconds / 60);\n\t\t\tlet hours = Math.floor(minutes / 60);\n\t\t\tminutes = minutes % 60;\n\n\t\t\tv.push(\"\" + hours);\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(minutes.toString(), \"0\", 2));\n\t\t\tv.push(\":\");\n\t\t\tv.push(ul4._lpad(seconds.toString(), \"0\", 2));\n\t\t\tif (this._microseconds)\n\t\t\t{\n\t\t\t\tv.push(\".\");\n\t\t\t\tv.push(ul4._lpad(this._microseconds.toString(), \"0\", 6));\n\t\t\t}\n\t\t\treturn v.join(\"\");\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._days !== 0 || this._seconds !== 0 || this._microseconds !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._days < 0 ? new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn (this._days === other._days) && (this._seconds === other._seconds) && (this._microseconds === other._microseconds);\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds < other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days < other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds < other._seconds;\n\t\t\t\treturn this._microseconds <= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds > other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tif (this._days != other._days)\n\t\t\t\t\treturn this._days > other._days;\n\t\t\t\tif (this._seconds != other._seconds)\n\t\t\t\t\treturn this._seconds > other._seconds;\n\t\t\t\treturn this._microseconds >= other._microseconds;\n\t\t\t}\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.TimeDelta(-this._days, -this._seconds, -this._microseconds);\n\t\t}\n\n\t\tadddate(date, days)\n\t\t{\n\t\t\tlet year = date._date.getFullYear();\n\t\t\tlet month = date._date.getMonth();\n\t\t\tlet day = date._date.getDate() + days;\n\t\t\treturn new ul4.Date(year, month, day);\n\t\t}\n\n\t\t_adddatetime(date, days, seconds, microseconds)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth();\n\t\t\tlet day = date.getDate() + days;\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds() + seconds;\n\t\t\tlet millisecond = date.getMilliseconds() + microseconds/1000;\n\t\t\treturn new Date(year, month, day, hour, minute, second, millisecond);\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days + other._days, this._seconds + other._seconds, this._microseconds + other._microseconds);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._days, this._seconds, this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.TimeDelta)\n\t\t\t\treturn new ul4.TimeDelta(this._days - other._days, this._seconds - other._seconds, this._microseconds - other._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._days);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._days, -this._seconds, -this._microseconds);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.TimeDelta(this._days * other, this._seconds * other, this._microseconds * other);\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t{\n\t\t\t\treturn new ul4.TimeDelta(this._days / other, this._seconds / other, this._microseconds / other);\n\t\t\t}\n\t\t\telse if (other instanceof ul4.TimeDelta)\n\t\t\t{\n\t\t\t\tlet myValue = this._days;\n\t\t\t\tlet otherValue = other._days;\n\t\t\t\tlet hasSeconds = this._seconds || other._seconds;\n\t\t\t\tlet hasMicroseconds = this._microseconds || other._microseconds;\n\t\t\t\tif (hasSeconds || hasMicroseconds)\n\t\t\t\t{\n\t\t\t\t\tmyValue = myValue*86400+this._seconds;\n\t\t\t\t\totherValue = otherValue*86400 + other._seconds;\n\t\t\t\t\tif (hasMicroseconds)\n\t\t\t\t\t{\n\t\t\t\t\t\tmyValue = myValue * 1000000 + this._microseconds;\n\t\t\t\t\t\totherValue = otherValue * 1000000 + other._microseconds;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn myValue/otherValue;\n\t\t\t}\n\t\t\tthrow new ul4.TypeError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"days\":\n\t\t\t\t\tlet days = function days(){ return self._days; };\n\t\t\t\t\tul4.expose(days, []);\n\t\t\t\t\treturn days;\n\t\t\t\tcase \"seconds\":\n\t\t\t\t\tlet seconds = function seconds(){ return self._seconds; };\n\t\t\t\t\tul4.expose(seconds, []);\n\t\t\t\t\treturn seconds;\n\t\t\t\tcase \"microseconds\":\n\t\t\t\t\tlet microseconds = function microseconds(){ return self._microseconds; };\n\t\t\t\t\tul4.expose(microseconds, []);\n\t\t\t\t\treturn microseconds;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tdays()\n\t\t{\n\t\t\treturn this._days;\n\t\t}\n\n\t\tseconds()\n\t\t{\n\t\t\treturn this._seconds;\n\t\t}\n\n\t\tmicroseconds()\n\t\t{\n\t\t\treturn this._microseconds;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"timedelta\";\n\t\t}\n\t};\n\n\n\tul4.MonthDelta = class MonthDelta extends ul4.Proto\n\t{\n\t\tconstructor(months=0)\n\t\t{\n\t\t\tsuper();\n\t\t\tthis._months = months;\n\t\t}\n\n\t\t__repr__()\n\t\t{\n\t\t\tif (!this._months)\n\t\t\t\treturn \"monthdelta()\";\n\t\t\treturn \"monthdelta(\" + this._months + \")\";\n\t\t}\n\n\t\t__str__()\n\t\t{\n\t\t\tif (this._months)\n\t\t\t{\n\t\t\t\tif (this._months !== -1 && this._months !== 1)\n\t\t\t\t\treturn this._months + \" months\";\n\t\t\t\treturn this._months + \" month\";\n\t\t\t}\n\t\t\treturn \"0 months\";\n\t\t}\n\n\t\ttoString()\n\t\t{\n\t\t\treturn this.__str__();\n\t\t}\n\n\t\t__bool__()\n\t\t{\n\t\t\treturn this._months !== 0;\n\t\t}\n\n\t\t__abs__()\n\t\t{\n\t\t\treturn this._months < 0 ? new ul4.MonthDelta(-this._months) : this;\n\t\t}\n\n\t\t__eq__(other)\n\t\t{\n\t\t\tif (other instanceof MonthDelta)\n\t\t\t\treturn this._months === other._months;\n\t\t\treturn false;\n\t\t}\n\n\t\t__lt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months < other._months;\n\t\t\tul4._unorderable(\"<\", this, other);\n\t\t}\n\n\t\t__le__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months <= other._months;\n\t\t\tul4._unorderable(\"<=\", this, other);\n\t\t}\n\n\t\t__gt__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months > other._months;\n\t\t\tul4._unorderable(\">\", this, other);\n\t\t}\n\n\t\t__ge__(other)\n\t\t{\n\t\t\tif (other instanceof ul4.MonthDelta)\n\t\t\t\treturn this._months >= other._months;\n\t\t\tul4._unorderable(\">=\", this, other);\n\t\t}\n\n\t\t__neg__()\n\t\t{\n\t\t\treturn new ul4.MonthDelta(-this._months);\n\t\t}\n\n\t\t_adddate(date, months)\n\t\t{\n\t\t\tlet result = this._adddatetime(date._date, months);\n\t\t\treturn new ul4.Date(result.getFullYear(), result.getMonth()+1, result.getDate());\n\t\t}\n\n\t\t_adddatetime(date, months)\n\t\t{\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = date.getMonth() + months;\n\t\t\tlet day = date.getDate();\n\t\t\tlet hour = date.getHours();\n\t\t\tlet minute = date.getMinutes();\n\t\t\tlet second = date.getSeconds();\n\t\t\tlet millisecond = date.getMilliseconds();\n\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\t// As the month might be out of bounds, we have to find out, what the real target month is\n\t\t\t\tlet targetmonth = new Date(year, month, 1, hour, minute, second, millisecond).getMonth();\n\t\t\t\tlet result = new Date(year, month, day, hour, minute, second, millisecond);\n\t\t\t\tif (result.getMonth() === targetmonth)\n\t\t\t\t\treturn result;\n\t\t\t\t--day;\n\t\t\t}\n\t\t}\n\n\t\t__add__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months + other._months);\n\t\t\telse if (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__radd__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" + \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__sub__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn new ul4.MonthDelta(this._months - other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rsub__(other)\n\t\t{\n\t\t\tif (ul4._isdate(other))\n\t\t\t\treturn this._adddate(other, -this._months);\n\t\t\telse if (ul4._isdatetime(other))\n\t\t\t\treturn this._adddatetime(other, -this._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" - \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__mul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__rmul__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(this._months * Math.floor(other));\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" * \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__floordiv__(other)\n\t\t{\n\t\t\tif (typeof(other) === \"number\")\n\t\t\t\treturn new ul4.MonthDelta(Math.floor(this._months / other));\n\t\t\telse if (ul4._ismonthdelta(other))\n\t\t\t\treturn Math.floor(this._months / other._months);\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" // \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__truediv__(other)\n\t\t{\n\t\t\tif (ul4._ismonthdelta(other))\n\t\t\t\treturn this._months / other._months;\n\t\t\tthrow new ul4.ArgumentError(ul4._type(this) + \" / \" + ul4._type(other) + \" not supported\");\n\t\t}\n\n\t\t__getattr__(attrname)\n\t\t{\n\t\t\tlet self = this;\n\t\t\tswitch (attrname)\n\t\t\t{\n\t\t\t\tcase \"months\":\n\t\t\t\t\tlet months = function months(){ return self._months; };\n\t\t\t\t\tul4.expose(months, []);\n\t\t\t\t\treturn months;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ul4.AttributeError(this, attrname);\n\t\t\t}\n\t\t}\n\n\t\tmonths()\n\t\t{\n\t\t\treturn this._months;\n\t\t}\n\n\t\tul4type()\n\t\t{\n\t\t\treturn \"monthdelta\";\n\t\t}\n\t};\n\n\tconst classes = [\n\t\tul4.TextAST,\n\t\tul4.IndentAST,\n\t\tul4.LineEndAST,\n\t\tul4.ConstAST,\n\t\tul4.SeqItemAST,\n\t\tul4.UnpackSeqItemAST,\n\t\tul4.DictItemAST,\n\t\tul4.UnpackDictItemAST,\n\t\tul4.PosArgAST,\n\t\tul4.KeywordArgAST,\n\t\tul4.UnpackListArgAST,\n\t\tul4.UnpackDictArgAST,\n\t\tul4.ListAST,\n\t\tul4.ListCompAST,\n\t\tul4.DictAST,\n\t\tul4.DictCompAST,\n\t\tul4.SetAST,\n\t\tul4.SetCompAST,\n\t\tul4.GenExprAST,\n\t\tul4.VarAST,\n\t\tul4.NotAST,\n\t\tul4.NegAST,\n\t\tul4.BitNotAST,\n\t\tul4.IfAST,\n\t\tul4.ReturnAST,\n\t\tul4.PrintAST,\n\t\tul4.PrintXAST,\n\t\tul4.ItemAST,\n\t\tul4.IsAST,\n\t\tul4.IsNotAST,\n\t\tul4.EQAST,\n\t\tul4.NEAST,\n\t\tul4.LTAST,\n\t\tul4.LEAST,\n\t\tul4.GTAST,\n\t\tul4.GEAST,\n\t\tul4.NotContainsAST,\n\t\tul4.ContainsAST,\n\t\tul4.AddAST,\n\t\tul4.SubAST,\n\t\tul4.MulAST,\n\t\tul4.FloorDivAST,\n\t\tul4.TrueDivAST,\n\t\tul4.ModAST,\n\t\tul4.ShiftLeftAST,\n\t\tul4.ShiftRightAST,\n\t\tul4.BitAndAST,\n\t\tul4.BitXOrAST,\n\t\tul4.BitOrAST,\n\t\tul4.AndAST,\n\t\tul4.OrAST,\n\t\tul4.SliceAST,\n\t\tul4.AttrAST,\n\t\tul4.CallAST,\n\t\tul4.RenderAST,\n\t\tul4.RenderXAST,\n\t\tul4.RenderBlockAST,\n\t\tul4.RenderBlocksAST,\n\t\tul4.SetVarAST,\n\t\tul4.AddVarAST,\n\t\tul4.SubVarAST,\n\t\tul4.MulVarAST,\n\t\tul4.TrueDivVarAST,\n\t\tul4.FloorDivVarAST,\n\t\tul4.ModVarAST,\n\t\tul4.ShiftLeftVarAST,\n\t\tul4.ShiftRightVarAST,\n\t\tul4.BitAndVarAST,\n\t\tul4.BitXOrVarAST,\n\t\tul4.BitOrVarAST,\n\t\tul4.ForBlockAST,\n\t\tul4.WhileBlockAST,\n\t\tul4.BreakAST,\n\t\tul4.ContinueAST,\n\t\tul4.CondBlockAST,\n\t\tul4.IfBlockAST,\n\t\tul4.ElIfBlockAST,\n\t\tul4.ElseBlockAST,\n\t\tul4.SignatureAST,\n\t\tul4.Template\n\t];\n\n\tfor (let i = 0; i < classes.length; ++i)\n\t{\n\t\tlet constructor = classes[i];\n\t\tlet ul4onname = constructor.name;\n\t\tif (ul4onname.substr(ul4onname.length-3) === \"AST\")\n\t\t\tul4onname = ul4onname.substr(0, ul4onname.length-3);\n\t\tul4onname = ul4onname.toLowerCase();\n\t\tconstructor.prototype.type = ul4onname;\n\t\tul4.register(\"de.livinglogic.ul4.\" + ul4onname, constructor);\n\t}","import { ul4 } from './ul4';\n\nlet la = {};\n\n\nla.Base = class Base extends ul4.Proto\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tul4ondump(encoder)\n\t{\n\t\tfor (let i = 0; i < this._ul4onattrs.length; ++i)\n\t\t\tencoder.dump(this._dumpUL4ONAttr(this._ul4onattrs[i]));\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\treturn this[name];\n\t}\n\n\tul4onload(decoder)\n\t{\n\t\tlet i = 0;\n\t\tfor (let iter = decoder.loadcontent(); ; ++i)\n\t\t{\n\t\t\tlet iteritem = iter.next();\n\t\t\tif (iteritem.done)\n\t\t\t\tbreak;\n\t\t\tif (i < this._ul4onattrs.length)\n\t\t\t\tthis._loadUL4ONAttr(this._ul4onattrs[i], iteritem.value);\n\t\t}\n\t\tfor (; i < this._ul4onattrs.length; ++i)\n\t\t\tthis._setDefaultUL4ONAttr(this._ul4onattrs[i]);\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tthis[name] = value;\n\t}\n\n\t_setDefaultUL4ONAttr(name)\n\t{\n\t\tthis[name] = null;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (this._ul4attrs.has(name))\n\t\t{\n\t\t\tlet value = this[name];\n\t\t\tif (typeof(value) === \"function\")\n\t\t\t{\n\t\t\t\tlet realvalue = value.bind(this);\n\t\t\t\trealvalue._ul4_name = value._ul4_name || value.name;\n\t\t\t\trealvalue._ul4_signature = value._ul4_signature;\n\t\t\t\trealvalue._ul4_needsobject = value._ul4_needsobject;\n\t\t\t\trealvalue._ul4_needscontext = value._ul4_needscontext;\n\t\t\t\treturn realvalue;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tthrow new ul4.AttributeError(this, name);\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Handler = class Handler\n{\n\tsave(record)\n\t{\n\t}\n\n\tdelete(record)\n\t{\n\t}\n};\n\nla.Globals = class Globals extends la.Base\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis.version = null;\n\t\tthis.platform = null;\n\t\tthis.user = null;\n\t\tthis.maxdbactions = null;\n\t\tthis.maxtemplateruntime = null;\n\t\tthis.flashmessages = null;\n\t\tthis.handler = new la.Handler();\n\t}\n\n\t// distance between two geo coordinates (see https://de.wikipedia.org/wiki/Orthodrome#Genauere_Formel_zur_Abstandsberechnung_auf_der_Erde)\n\tstatic geodist(geo1, geo2)\n\t{\n\t\tlet sqsin = function sqsin(x) {x = Math.sin(x); return x*x};\n\t\tlet sqcos = function sqsos(x) {x = Math.cos(x); return x*x};\n\t\tconst deg2rad = Math.PI/180; // Conversion factor degree -> radians\n\t\tconst radius = 6378.137; // Equatorial radius of earth in km\n\t\tconst flat = 1/298.257223563; // Earth flattening\n\n\t\tconst lat1 = geo1.lat * deg2rad;\n\t\tconst long1 = geo1.long * deg2rad;\n\t\tconst lat2 = geo2.lat * deg2rad;\n\t\tconst long2 = geo2.long * deg2rad;\n\t\tconst F = (lat1 + lat2)/2;\n\t\tconst G = (lat1 - lat2)/2;\n\t\tconst l = (long1 - long2)/2;\n\t\tconst S = sqsin(G) * sqcos(l) + sqcos(F) * sqsin(l);\n\t\tconst C = sqcos(G) * sqcos(l) + sqsin(F) * sqsin(l);\n\t\tconst w = Math.atan(Math.sqrt(S/C));\n\t\tconst D = 2 * w * radius;\n\t\tconst T = Math.sqrt(S*C)/w;\n\t\tconst H1 = (3*T-1)/(2*C);\n\t\tconst H2 = (3*T+1)/(2*S);\n\t\tconst s = D * (1 + flat * H1 * sqsin(F) * sqcos(G) - flat * H2 * sqcos(F) * sqsin(G));\n\t\treturn s;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Globals.prototype._ul4onattrs = [\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\"];\nla.Globals.prototype._ul4attrs = ul4._makeset(\"version\", \"platform\", \"user\", \"maxdbactions\", \"maxtemplateruntime\", \"flashmessages\");\n\nla.FlashMessage = class FlashMessage extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.FlashMessage.prototype._ul4onattrs = [\"timestamp\", \"type\", \"title\", \"message\"];\nla.FlashMessage.prototype._ul4attrs = ul4._makeset(\"timestamp\", \"type\", \"title\", \"message\");\n\nla.App = class App extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\tinsert(values={})\n\t{\n\t\tlet record = this.__call__(values);\n\t\tthis.globals.handler.save(this);\n\t\treturn this.globals.Login._insert(this, values);\n\t}\n\n\t__call__(values={})\n\t{\n\t\tlet record = new la.Record(this);\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!record.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\trecord.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\t\treturn record;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t{\n\t\t\tif (!this.controls.has(name.substr(2)))\n\t\t\t\tthrow new ul4.AttributeError(this, name);\n\t\t\treturn this.controls.get(name.substr(2));\n\t\t}\n\t\telse\n\t\t\treturn super.__getattr__(name);\n\t}\n};\n\nla.App.prototype._ul4onattrs = [\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"basetable\", \"primarykey\", \"insertprocedure\", \"updateprocedure\", \"deleteprocedure\", \"templates\", \"createdat\", \"updatedat\", \"updatedby\"];\nla.App.prototype._ul4attrs = ul4._makeset(\"id\", \"globals\", \"name\", \"description\", \"language\", \"startlink\", \"iconlarge\", \"iconsmall\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"controls\", \"records\", \"recordcount\", \"installation\", \"categories\", \"params\", \"views\", \"datamanagement_identifier\", \"insert\");\nul4.expose(la.App.prototype.__call__, [\"**values\"], {\"needsobject\": true});\nul4.expose(la.App.prototype.insert, [\"**values\"], {\"needsobject\": true});\n\nla.View = class View extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.View.prototype._ul4onattrs = [\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\"];\nla.View.prototype._ul4attrs = ul4._makeset(\"id\", \"name\", \"app\", \"order\", \"width\", \"height\", \"start\", \"end\");\n\nla.DataSourceData = class DataSourceData extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.DataSourceData.prototype._ul4onattrs = [\"id\", \"identifier\", \"app\", \"apps\"];\nla.DataSourceData.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"app\", \"apps\");\n\nla.Record = class Record extends la.Base\n{\n\tconstructor(app)\n\t{\n\t\tsuper();\n\t\tthis.id = null;\n\t\tthis.app = app;\n\t\tthis.createdat = null;\n\t\tthis.createdby = null;\n\t\tthis.updatedat = null;\n\t\tthis.updatedby = null;\n\t\tthis.updatecount = 0;\n\t\tthis._sparsevalues = new Map();\n\t\tthis._values = null;\n\t\tthis._fields = null;\n\t\tthis.children = new Map();\n\t\tthis.attachments = null;\n\t\tthis.errors = [];\n\t\tthis._is_deleted = false;\n\t}\n\n\t\n\n\t__repr__()\n\t{\n\t\tlet v = [\"\")\n\t\treturn v.join(\"\");\n\t}\n\n\tget values()\n\t{\n\t\tif (this._values === null)\n\t\t{\n\t\t\tthis._values = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, control] of this.app.controls.entries())\n\t\t\t{\n\t\t\t\tlet fieldvalue = this._sparsevalues.get(identifier);\n\t\t\t\tif (typeof(fieldvalue) === \"undefined\")\n\t\t\t\t\tfieldvalue = null;\n\t\t\t\tthis._values.set(identifier, fieldvalue);\n\t\t\t}\n\t\t}\n\t\treturn this._values;\n\t}\n\n\tget fields()\n\t{\n\t\tif (this._fields === null)\n\t\t{\n\t\t\tthis._fields = ul4._havemap ? new Map() : {};\n\t\t\tfor (let [identifier, value] of this.values.entries())\n\t\t\t{\n\t\t\t\tlet field = new la.Field(this.app.controls.get(identifier), this, value);\n\t\t\t\tthis._fields.set(identifier, field);\n\t\t\t}\n\t\t}\n\t\treturn this._fields;\n\t}\n\n\tis_dirty()\n\t{\n\t\tif (this.id === null)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.is_dirty())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\thas_errors()\n\t{\n\t\tif (this.errors.length !== 0)\n\t\t\treturn true;\n\t\tfor (let field of this.fields.values())\n\t\t{\n\t\t\tif (field.has_errors())\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdelete()\n\t{\n\t\treturn this.app.globals.handler.delete(this);\n\t}\n\n\tsave()\n\t{\n\t\tthis.app.globals.handler.save(this);\n\t}\n\n\tupdate(values={})\n\t{\n\t\tif (ul4._ismap(values))\n\t\t{\n\t\t\tfor (let [key, value] of values.entries())\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\tthis.fields.get(key).value = value;\n\t\t\t}\n\t\t}\n\t\telse if (ul4._isobject(values))\n\t\t{\n\t\t\tfor (let key in values)\n\t\t\t{\n\t\t\t\tif (!this.fields.has(key))\n\t\t\t\t\tthrow new ul4.ArgumentError(\"update() get an unexpected keyword argument \" + ul4._repr(key));\n\t\t\t\tthis.fields.get(key).value = values[key];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tthrow new ul4.TypeError(\"values must be an object or a Map\");\n\n\t\tthis.app.globals.handler.save(this);\n\t\treturn this.app.globals.Login._update(this, values);\n\t}\n\n\tsearch(search)\n\t{\n\t\tfor (let identifier in search)\n\t\t{\n\t\t\tlet fieldsearch = search[identifier];\n\t\t\tif (ul4._bool(fieldsearch))\n\t\t\t{\n\t\t\t\tif (!this.fields.get(identifier).search(fieldsearch))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"values\")\n\t\t\treturn this._sparsevalues;\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"values\")\n\t\t{\n\t\t\tthis._sparsevalues = value;\n\t\t\tthis._values = null;\n\t\t\tthis._fields = null;\n\t\t}\n\t\telse\n\t\t\tthis[name] = value;\n\t}\n\n\t__getattr__(name)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\treturn this.children.get(name.substr(2))\n\t\telse if (name.startsWith(\"f_\"))\n\t\t\treturn this.fields.get(name.substr(2))\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\treturn this.values.get(name.substr(2))\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t__setattr__(name, value)\n\t{\n\t\tif (name.startsWith(\"c_\"))\n\t\t\tthis.children[name.substr(2)] = value;\n\t\telse if (name.startsWith(\"v_\"))\n\t\t\tthis.fields.get(name.substr(2)).value = value;\n\t\telse\n\t\t\tthrow new ul4.AttributeError(this, name);\n\t}\n};\n\nla.Record.prototype._ul4onattrs = [\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\"];\nla.Record.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"createdat\", \"createdby\", \"updatedat\", \"updatedby\", \"updatecount\", \"values\", \"attachments\", \"children\");\nul4.expose(la.Record.prototype.is_dirty, []);\nul4.expose(la.Record.prototype.has_errors, []);\nul4.expose(la.Record.prototype.delete, []);\nul4.expose(la.Record.prototype.save, []);\nul4.expose(la.Record.prototype.update, [\"**values\"], {\"needsobject\": true});\n\nla.Control = class Control extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n\n\t_logsearch(value, search)\n\t{\n\t\t//console.log(\"Searching for \" + ul4._repr(search.value) + \" in \" + ul4._repr(this) + \" with operator \" + search.operator + \" in value \" + ul4._repr(value));\n\t}\n\n\n\tasjson(value) {\n\t\treturn value;\n\t}\n\n\t// base implemntation, always returns ``false`` (i.e. \"not found\")\n\t// ``value`` is the value of the field\n\t// ``search`` is an object with information what we're searching for\n\t// keys in ``search`` are: ``operator`` (and ``value`` (if required by the operator))\n\tsearch(value, search)\n\t{\n\t\treturn false;\n\t}\n};\n\nla.Control.prototype.type = null;\nla.Control.prototype.subtype = null;\nla.Control.prototype._ul4onattrs = [\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\"];\nla.Control.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"field\", \"app\", \"label\", \"priority\", \"order\", \"default\", \"ininsertprocedure\", \"inupdateprocedure\");\n\nla.BoolControl = class BoolControl extends la.Control\n{\n\t// ``search`` must by ``null``, ``false`` or ``true``\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.BoolControl.prototype.type = \"bool\";\n\nla.IntControl = class IntControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.IntControl.prototype.type = \"int\";\n\nla.NumberControl = class NumberControl extends la.Control\n{\n\t// ``search.value`` must by ``null`` or an integer\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"range\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn false;\n\t\t\treturn (search.minvalue === null || search.minvalue <= value) && (search.maxvalue === null || value < search.maxvalue);\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.NumberControl.prototype.type = \"number\";\n\nla.StringControl = class StringControl extends la.Control\n{\n\n\tasjson(value) {\n\t\treturn value;\n\t}\n\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\t\tif (search.operator === \"equals\")\n\t\t\treturn search.value === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (search.value === null || value === null)\n\t\t\t\treturn search.value === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(search.value.toLowerCase()) >= 0;\n\t\t}\n\t}\n};\n\nla.StringControl.prototype.type = \"string\";\n\nla.TextControl = class TextControl extends la.StringControl\n{\n};\n\nla.TextControl.prototype.subtype = \"text\";\n\nla.EmailControl = class EmailControl extends la.StringControl\n{\n};\n\nla.EmailControl.prototype.subtype = \"email\";\n\nla.URLControl = class URLControl extends la.StringControl\n{\n};\n\nla.URLControl.prototype.subtype = \"url\";\n\nla.TelControl = class TelControl extends la.StringControl\n{\n};\n\nla.TelControl.prototype.subtype = \"tel\";\n\nla.PasswordControl = class PasswordControl extends la.StringControl\n{\n};\n\nla.PasswordControl.prototype.subtype = \"password\";\n\nla.TextAreaControl = class TextAreaControl extends la.StringControl\n{\n};\n\nla.TextAreaControl.prototype.subtype = \"textarea\";\nla.TextAreaControl.prototype._ul4onattrs = la.StringControl.prototype._ul4onattrs.concat([\"encrypted\"]);\nla.TextAreaControl.prototype._ul4attrs = ul4._makeset(...la.StringControl.prototype._ul4attrs, \"encrypted\");\n\nla.DateControl = class DateControl extends la.Control\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y\";\n\t}\n\n\tasjson(value) {\n\t\treturn value;\n\t}\n\n\t// searchvalue must be ``null``, a ``Date`` object or a string\n\tsearch(value, search)\n\t{\n\t\tthis._logsearch(value, search);\n\n\t\tlet searchvalue = search.value;\n\t\tif (Object.prototype.toString.call(searchvalue) == \"[object Date]\")\n\t\t\tsearchvalue = ul4._format(searchvalue, this.formatstring(), this.app.language);\n\t\tif (value !== null)\n\t\t\tvalue = ul4._format(value, this.formatstring(), this.app.language);\n\n\t\tif (search.operator === \"equals\")\n\t\t\treturn searchvalue === value;\n\t\telse if (search.operator === \"contains\")\n\t\t{\n\t\t\tif (searchvalue === null || value === null)\n\t\t\t\treturn searchvalue === value;\n\t\t\telse\n\t\t\t\treturn value.toLowerCase().indexOf(searchvalue.toLowerCase()) >= 0;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.DateControl.prototype.type = \"date\";\nla.DateControl.prototype.subtype = \"date\";\n\nla.DatetimeMinuteControl = class DatetimeMinuteControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M\";\n\t}\n};\n\nla.DatetimeMinuteControl.prototype.subtype = \"datetimeminute\";\n\nla.DatetimeSecondControl = class DatetimeSecondControl extends la.DateControl\n{\n\tformatstring(language)\n\t{\n\t\tlanguage = language || this.app.language;\n\n\t\tif (language === \"de\")\n\t\t\treturn \"%d.%m.%Y %H:%M:%S\";\n\t\telse\n\t\t\treturn \"%m/%d/%Y %H:%M:%S\";\n\t}\n};\n\nla.DatetimeSecondControl.prototype.subtype = \"datetimesecond\";\n\nla.LookupControl = class LookupControl extends la.Control\n{\n\t// ``search.value`` must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (value === null)\n\t\t\t\treturn search.value === null;\n\t\t\telse\n\t\t\t\treturn value.key === search.value;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.LookupControl.prototype.type = \"lookup\";\nla.LookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupdata\"]);\nla.LookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupdata\");\n\nla.LookupSelectControl = class LookupSelectControl extends la.LookupControl\n{\n};\n\nla.LookupSelectControl.prototype.subtype = \"select\";\n\nla.LookupRadioControl = class LookupRadioControl extends la.LookupControl\n{\n};\n\nla.LookupRadioControl.prototype.subtype = \"radio\";\n\nla.LookupChoiceControl = class LookupChoiceControl extends la.LookupControl\n{\n};\n\nla.LookupChoiceControl.prototype.subtype = \"choice\";\n\nla.AppLookupControl = class AppLookupControl extends la.Control\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (value === null || search.value === null)\n\t\t\treturn value === search.value;\n\t\telse\n\t\t\treturn value.search(search);\n\t}\n};\n\nla.AppLookupControl.prototype.type = \"applookup\";\nla.AppLookupControl.prototype._ul4onattrs = la.Control.prototype._ul4onattrs.concat([\"lookupapp\", \"lookupcontrols\"]);\nla.AppLookupControl.prototype._ul4attrs = ul4._makeset(...la.Control.prototype._ul4attrs, \"lookupapp\", \"lookupcontrols\");\n\nla.AppLookupSelectControl = class AppLookupSelectControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupSelectControl.prototype.subtype = \"select\";\n\nla.AppLookupRadioControl = class AppLookupRadioControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupRadioControl.prototype.subtype = \"radio\";\n\nla.AppLookupChoiceControl = class AppLookupChoiceControl extends la.AppLookupControl\n{\n};\n\nla.AppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleLookupControl = class MultipleLookupControl extends la.LookupControl\n{\n\t// search.value must be ``null`` or a ``LookupItem`` key\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tfor (let item of value)\n\t\t\t{\n\t\t\t\tif (item.key === search.value)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleLookupControl.prototype.subtype = \"multiplelookup\";\n\nla.MultipleLookupSelectControl = class MultipleLookupSelectControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleLookupCheckboxControl = class MultipleLookupCheckboxControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleLookupChoiceControl = class MultipleLookupChoiceControl extends la.MultipleLookupControl\n{\n};\n\nla.MultipleLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.MultipleAppLookupControl = class MultipleAppLookupControl extends la.AppLookupControl\n{\n\t// ``search.value`` must be an object containing the search criteria for the referenced record\n\tsearch(value, search)\n\t{\n\t\tif (search.operator === \"equals\")\n\t\t{\n\t\t\tif (search.value === null)\n\t\t\t\treturn value.length === 0;\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (let item of value)\n\t\t\t\t{\n\t\t\t\t\tif (item.search(search.value))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n};\n\nla.MultipleAppLookupControl.prototype.type = \"multipleapplookup\";\n\nla.MultipleAppLookupSelectControl = class MultipleAppLookupSelectControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupSelectControl.prototype.subtype = \"select\";\n\nla.MultipleAppLookupCheckboxControl = class MultipleAppLookupCheckboxControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupCheckboxControl.prototype.subtype = \"checkbox\";\n\nla.MultipleAppLookupChoiceControl = class MultipleAppLookupChoiceControl extends la.MultipleAppLookupControl\n{\n};\n\nla.MultipleAppLookupChoiceControl.prototype.subtype = \"choice\";\n\nla.GeoControl = class GeoControl extends la.Control\n{\n\tasjson (value) {\n\t\tif (value instanceof la.Geo)\n\t\t\tvalue = `${value.lat}, ${value.long}, ${value.info}`;\n\t\treturn value;\n\t}\n};\n\nla.GeoControl.prototype.type = \"geo\";\n\nla.FileControl = class FileControl extends la.Control\n{\n};\n\nla.FileControl.prototype.type = \"file\";\n\nla.ButtonControl = class ButtonControl extends la.Control\n{\n};\n\nla.ButtonControl.prototype.type = \"button\";\n\nla.Field = class Field extends la.Base\n{\n\tconstructor(control, record, value)\n\t{\n\t\tsuper();\n\t\tthis.control = control;\n\t\tthis.record = record;\n\t\tthis._value = value;\n\t\tthis._dirty = false;\n\t\tthis.errors = [];\n\t}\n\n\tget value()\n\t{\n\t\treturn this._value;\n\t}\n\n\tset value(value)\n\t{\n\t\tlet oldvalue = this._value;\n\n\t\tif (ul4._ne(oldvalue, value))\n\t\t{\n\t\t\tthis.record.values.set(this.control.identifier, value);\n\t\t\tthis._value = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t}\n\n\tis_empty()\n\t{\n\t\treturn this._value === null || (ul4._islist(this._value) && this._value.length === 0);\n\t}\n\n\tis_dirty()\n\t{\n\t\treturn this._dirty;\n\t}\n\n\thas_errors()\n\t{\n\t\treturn this.errors.length !== 0;\n\t}\n\n\tsearch(searchvalue)\n\t{\n\t\treturn this.control.search(this.value, searchvalue);\n\t}\n\n\t__repr__()\n\t{\n\t\tlet s = \"\"\n\t\treturn s;\n\t}\n};\n\nla.LookupItem = class LookupItem extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.LookupItem.prototype._ul4onattrs = [\"key\", \"label\"];\nla.LookupItem.prototype._ul4attrs = ul4._makeset(\"key\", \"label\");\n\nla.User = class User extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.User.prototype._ul4onattrs = [\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\"];\nla.User.prototype._ul4attrs = ul4._makeset(\"_id\", \"id\", \"gender\", \"firstname\", \"surname\", \"initials\", \"email\", \"language\", \"avatarsmall\", \"avatarlarge\", \"keyviews\");\n\nla.File = class File extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.File.prototype._ul4onattrs = [\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"internalid\", \"createdat\", \"size\"];\nla.File.prototype._ul4attrs = ul4._makeset(\"id\", \"url\", \"filename\", \"mimetype\", \"width\", \"height\", \"size\", \"createdat\");\n\nla.Geo = class Geo extends la.Base\n{\n\tconstructor(lat, long, info)\n\t{\n\t\tsuper();\n\t\tthis.lat = lat;\n\t\tthis.long = long;\n\t\tthis.info = info;\n\t}\n\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Geo.prototype._ul4onattrs = [\"lat\", \"long\", \"info\"];\nla.Geo.prototype._ul4attrs = ul4._makeset(\"lat\", \"long\", \"info\");\n\nla.Attachment = class Attachment extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Attachment.prototype._ul4onattrs = [\"id\", \"record\", \"label\", \"active\"];\nla.Attachment.prototype._ul4attrs = ul4._makeset(\"id\", \"record\", \"label\", \"active\");\n\nla.NoteAttachment = class NoteAttachment extends la.Attachment\n{\n};\n\nla.NoteAttachment.prototype.type = \"noteattachment\";\nla.NoteAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.NoteAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.URLAttachment = class URLAttachment extends la.Attachment\n{\n};\n\nla.URLAttachment.prototype.type = \"urlattachment\";\nla.URLAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.URLAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.FileAttachment = class FileAttachment extends la.Attachment\n{\n};\n\nla.FileAttachment.prototype.type = \"fileattachment\";\nla.FileAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.FileAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.ImageAttachment = class ImageAttachment extends la.Attachment\n{\n};\n\nla.ImageAttachment.prototype.type = \"imageattachment\";\nla.ImageAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"original\", \"thumb\", \"small\", \"medium\", \"large\"]);\nla.ImageAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"original\", \"thumb\", \"small\", \"medium\", \"large\");\n\nla.JSONAttachment = class JSONAttachment extends la.Attachment\n{\n\t_dumpUL4ONAttr(name)\n\t{\n\t\tif (name === \"value\")\n\t\t\treturn ul4._asjson(this.value);\n\t\telse\n\t\t\treturn this[name];\n\t}\n\n\t_loadUL4ONAttr(name, value)\n\t{\n\t\tif (name === \"value\")\n\t\t\tthis.value = ul4._fromjson(value);\n\t\telse\n\t\t\tthis[name] = value\n\t}\n};\n\nla.JSONAttachment.prototype.type = \"jsonattachment\";\nla.JSONAttachment.prototype._ul4onattrs = la.Attachment.prototype._ul4onattrs.concat([\"value\"]);\nla.JSONAttachment.prototype._ul4attrs = ul4._makeset(...la.Attachment.prototype._ul4onattrs, \"value\");\n\nla.Installation = class Installation extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.Installation.prototype._ul4onattrs = [\"id\", \"name\"];\nla.Installation.prototype._ul4attrs = ul4._makeset(\"id\", \"name\");\n\nla.Category = class Category extends la.Base\n{\n\t__repr__()\n\t{\n\t\tlet v = [];\n\t\tlet category = this;\n\t\twhile (category !== null)\n\t\t{\n\t\t\tv.splice(0, 0, category.identifier);\n\t\t\tcategory = category.parent;\n\t\t}\n\t\treturn \"\";\n\t}\n};\n\nla.Category.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\"];\nla.Category.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"order\", \"parent\", \"children\", \"apps\");\n\nla.KeyView = class KeyView extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.KeyView.prototype._ul4onattrs = [\"id\", \"identifier\", \"name\", \"key\", \"user\"];\nla.KeyView.prototype._ul4attrs = ul4._makeset(\"id\", \"identifier\", \"name\", \"key\", \"user\");\n\nla.AppParameter = class AppParameter extends la.Base\n{\n\t__repr__()\n\t{\n\t\treturn \"\";\n\t}\n};\n\nla.AppParameter.prototype._ul4onattrs = [\"id\", \"app\", \"identifier\", \"description\", \"value\"];\nla.AppParameter.prototype._ul4attrs = ul4._makeset(\"id\", \"app\", \"identifier\", \"description\", \"value\");\n\nlet classes = [\n\tla.Globals,\n\tla.App,\n\tla.View,\n\tla.DataSourceData,\n\tla.Record,\n\tla.BoolControl,\n\tla.IntControl,\n\tla.NumberControl,\n\tla.TextControl,\n\tla.EmailControl,\n\tla.URLControl,\n\tla.TelControl,\n\tla.PasswordControl,\n\tla.TextAreaControl,\n\tla.DateControl,\n\tla.DatetimeMinuteControl,\n\tla.DatetimeSecondControl,\n\tla.LookupControl,\n\tla.LookupSelectControl,\n\tla.LookupRadioControl,\n\tla.LookupChoiceControl,\n\tla.AppLookupControl,\n\tla.AppLookupSelectControl,\n\tla.AppLookupRadioControl,\n\tla.AppLookupChoiceControl,\n\tla.MultipleLookupControl,\n\tla.MultipleLookupSelectControl,\n\tla.MultipleLookupCheckboxControl,\n\tla.MultipleLookupChoiceControl,\n\tla.MultipleAppLookupControl,\n\tla.MultipleAppLookupSelectControl,\n\tla.MultipleAppLookupCheckboxControl,\n\tla.MultipleAppLookupChoiceControl,\n\tla.GeoControl,\n\tla.FileControl,\n\tla.ButtonControl,\n\tla.Field,\n\tla.LookupItem,\n\tla.User,\n\tla.File,\n\tla.Geo,\n\tla.NoteAttachment,\n\tla.URLAttachment,\n\tla.FileAttachment,\n\tla.ImageAttachment,\n\tla.JSONAttachment,\n\tla.Installation,\n\tla.Category,\n\tla.KeyView,\n\tla.AppParameter\n];\n\nfor (let constructor of classes)\n{\n\t// Register under the old name\n\tul4.register(\"de.livingapps.appdd.\" + constructor.name.toLowerCase(), constructor);\n\t// Register under the new name\n\tul4.register(\"de.livinglogic.livingapi.\" + constructor.name.toLowerCase(), constructor);\n}\nexport default la;","import axios, { AxiosResponse } from 'axios';\n///@ts-ignore\nimport livingApi from './modules/livingapi';\n///@ts-ignore\nimport { ul4 } from './modules/ul4';\nimport * as https from 'https';\n\nexport type Auth_Token = string;\nexport type LivingApi = any;\nexport type LAPIRecord = any;\nlet commonjs = (typeof module === 'object' && module.exports);\nexport interface LivingSDKOptions {\n\turl?: string;\n\tloginRequired?: boolean;\n}\n\nexport class LivingSDK {\n\tprivate _password: string;\n\tprivate _userName: string;\n\tprivate _options: LivingSDKOptions\n\tprivate hostName: string;\n\tprivate session: Promise;\n\tconstructor(options: LivingSDKOptions = {}, username?: string, password?: string) {\n\t\t/** @type {String} */\n\t\tthis._password = password || '';\n\t\t/** @type {String} */\n\t\tthis._userName = username || '';\n\t\t/** @type {Object} */\n\t\tthis._options = {\n\t\t\t/** @type {String} */\n\t\t\turl: options.url || 'https://my.living-apps.de',\n\t\t\t/** @type {Boolean} */\n\t\t\tloginRequired: options.loginRequired !== undefined ? options.loginRequired : true\n\t\t};\n\t\tthis._options.url = this._options.url.lastIndexOf('/') === this._options.url.length - 1 ? this._options.url : `${this._options.url}/`;\n\t\tthis.hostName = this._options.url.split('//')[1].substr(0, this._options.url.split('//')[1].length - 1);\n\t\tif (this._options.loginRequired && !this._userName) {\n\t\t\tthrow new Error('[LivingSDK] You want to login without a username')\n\t\t}\n\t\tthis.session = this.login();\n\t}\n\n\t/**\n\t * get token for Session\n\t * @return {Promise.}\n\t */\n\tlogin(): Promise {\n\t\tif (!this._options.loginRequired) {\n\t\t\treturn Promise.resolve(undefined);\n\t\t}\n\t\tlet url = `https://${this.hostName}/gateway/login`;\n\t\treturn axios.post(url, {\n\t\t\tusername: this._userName,\n\t\t\tpassword: this._password\n\t\t}, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then((a: any) => a.data.auth_token);\n\t}\n\n\tget(appId: string, templateName?: string): Promise {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.get(`https://${this.hostName}/gateway/apps/${appId}${templateName !== undefined ? '?template=' + templateName : ''}`,\n\t\t\t\t{\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\tAccept: 'application/la-ul4on'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet dump: any;\n\t\t\t\t\tdump = ul4.loads(res.data);\n\t\t\t\t\tdump.get('globals').Login = this;\n\t\t\t\t\treturn dump;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_insert(app: any, values: any): Promise {\n\t\treturn this.session.then((auth_token) => {\n\n\t\t\tlet fields: any = {};\n\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`insert() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfields[ident] = app.controls.get(ident).asjson(values[ident]);\n\t\t\t}\n\t\t\tlet data: any = {}; {\n\t\t\t}\n\t\t\tdata.id = app.id; \n\t\t\tdata.data = [{ 'fields': fields }];\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: res.data.id,\n\t\t\t\t\t\tRecord: new livingApi.Record({\n\t\t\t\t\t\t\tid: res.data.id,\n\t\t\t\t\t\t\tcreatedat: new Date(Date.now()),\n\t\t\t\t\t\t\tupdatedat: null,\n\t\t\t\t\t\t\tupdatedby: null,\n\t\t\t\t\t\t\tupdatecount: 0\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t})\n\n\t}\n\n\t_update(record: LAPIRecord, values: any) {\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\tlet fields: any = {};\n\t\t\tlet app = record.app;\n\t\t\tfor (let ident in values) {\n\t\t\t\tif (!app.controls.has(ident)) {\n\t\t\t\t\tthrow new Error(`update() got an unexpected keyword argument ${ident}`);\n\t\t\t\t}\n\t\t\t\tfields[ident] = values[ident];\n\t\t\t}\n\t\t\tlet data: any = {};\n\t\t\tdata.id = app.id;\n\t\t\tdata.data = [{ 'id': record.id, 'fields': fields }];\n\t\t\tconsole.log(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`);\n\t\t\treturn axios.post(`https://${this.hostName}/gateway/v1/appdd/${app.id}.json`, {\n\t\t\t\tappdd: data\n\t\t\t}, {\n\t\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t\t}) : undefined,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then((res: AxiosResponse) => {\n\t\t\t\t\tlet body = res.data;\n\t\t\t\t\tfor (let ident in values)\n\t\t\t\t\t\trecord.fields.get(ident).value = values[ident];\n\t\t\t\t\tlet returnObj = {\n\t\t\t\t\t\tHTTPstatusCode: res.status,\n\t\t\t\t\t\trecordid: body.id,\n\t\t\t\t\t\tRecord: record\n\t\t\t\t\t};\n\t\t\t\t\treturn returnObj;\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_delete(record: LAPIRecord) {\n\t\tlet app = record.app;\n\t\treturn this.session.then((auth_token: Auth_Token | undefined) => {\n\t\t\treturn axios.delete(`https://${this.hostName}/gateway/v1/appdd/${app.id}/${record.id}.json`, {\n\t\t\t\thttpsAgent: commonjs ? new https.Agent({\n\t\t\t\t\tecdhCurve: 'auto'\n\t\t\t\t}) : undefined,\n\t\t\t\theaders: {\n\t\t\t\t\t'X-La-Auth-Token': auth_token !== undefined ? auth_token : '',\n\t\t\t\t}\n\t\t\n\t\t\t})\n\t\t})\n\t}\n}\n\t\nexport default LivingSDK;"],"names":["ul4","iscommon","module","exports","version","_registry","_havemap","Map","prototype","forEach","_havemapconstructor","size","error","_haveset","Set","_havesetconstructor","_makemap","map","i","arguments","length","key","value","set","_setmap","__proto__","_emptymap","_getmap","get","_emptyset","_Set","_makeset","add","register","name","f","ul4onname","dumps","obj","indent","encoder","Encoder","dump","finish","loads","data","registry","Decoder","load","_level","_strings2index","_ids2index","_backrefs","line","this","push","oldindent","join","_line","type","Math","round","index","_str_repr","replace","_iscolor","r","g","b","a","_isdate","year","month","day","_isdatetime","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","_istimedelta","days","seconds","microseconds","_ismonthdelta","months","slice","start","stop","ul4ondump","__id__","_islist","_ismap","_isdict","_isset","ValueError","_repr","pos","backrefs","stack","charAt","re_white","c","match","result","substring","re_digits","readcharoreof","parseFloat","isNaN","oldpos","escapechar","chars","read","codepoint","parseInt","String","fromCharCode","typecode","readblackchar","readnumber","readchar","delimiter","c2","_readescape","Color","_r","_g","_b","_a","Date","setFullYear","setDate","setMonth","setHours","setMinutes","setSeconds","setMilliseconds","TimeDelta","_days","_seconds","_microseconds","MonthDelta","_months","backup","pop","_beginfakeloading","constructor","_endfakeloading","ul4onload","self","next","done","_rvalidchars","_rvalidescape","_rvalidtokens","_rvalidbraces","_inherit","baseobj","attrs","Object","assign","create","_map2object","newobj","TypeError","_bound","upper","_stacktrace","exc","output","Exception","toString","context","_internal_call","functioncontext","signature","needscontext","needsobject","args","kwargs","finalargs","ArgumentError","bindObject","bindArray","unshift","apply","_callfunction","_ul4_name","_ul4_signature","_ul4_needsobject","_ul4_needscontext","_callobject","_ul4_callsignature","_ul4_callneedsobject","_ul4_callneedscontext","__call__","_callrender","_ul4_rendersignature","_ul4_renderneedsobject","_ul4_renderneedscontext","__render__","_call","_type","_unpackvar","lvalue","newvalue","iter","_iter","item","concat","_formatsource","out","finalout","level","needlf","part","j","_eq","obj1","obj2","numbertypes","__eq__","indexOf","getTime","_isobject","hasOwnProperty","has","_ne","__ne__","_unorderable","operator","_cmp","v1","v2","res","_isul4set","in1only","in2only","_lt","__lt__","items","_le","__le__","_gt","__gt__","_ge","__ge__","_isiter","__iter__","keys","values","str","ascii","squote","dquote","quote","code","charCodeAt","escape","test","_lpad","_date_repr","_date","_datetime_repr","hour","minute","second","ms","_map_repr","v","_repr_internal","_list_repr","_set_repr","_object_repr","_typeof","__repr__","_ascii","_date_str","_datetime_str","_str","__str__","_bool","__bool__","_int","base","_isint","floor","_float","_list","_set","_len","sequence","ul4type","Protocol","_mod","div","mod","_getattr","attrname","default_","proto","getattr","AttributeError","_hasattr","hasattr","_dir","dir","_any","iterable","_all","_isundefined","_isdefined","_isnone","_isbool","_isfloat","_isstr","call","_istemplate","Template","TemplateClosure","_isfunction","_isexception","_isanyset","__type__","Proto","_str_repeat","rep","_list_repeat","list","_str_json","_asjson","_fromjson","string","StrProtocol","strip","root","JSON","parse","Function","_asul4on","_fromul4on","_format_datetime","fmt","lang","translation","de","ml","ws","wl","xf","Xf","cf","en","fr","es","it","da","sv","nl","pt","cs","sk","pl","hr","sr","ro","hu","tr","ru","zh","ko","ja","inspec","getDay","_format","DateTimeProtocol","yearday","_week4format","_format_int","work","fill","align","sign","alternate","minimumwidth","minimumwidthStr","exec","neg","toUpperCase","pad","padBefore","padAfter","translations","toLowerCase","split","len","_rpad","_nextid","other","Signature","argNames","remargs","nextDefault","lastArgname","remkwargs","argName","defaultValue","substr","_this","decname","arg","prefix","argObject","expose","count","options","ListProtocol","DateProtocol","SetProtocol","MapProtocol","ObjectProtocol","__getattr__","attr","realattr","object","sub","end","_count","_find","_rfind","old","new_","sep","splice","lstrip","lastIndexOf","rstrip","keepends","startpos","lineendlen","endpos","resultlist","singlepre","suffix","singlesuf","find","rfind","rsplit","splitlines","lower","capitalize","startswith","endswith","append","insert","_update","clear","update","weekday","firstweekday","mindaysinfirstweek","calendar","d","week","mimeformat","isoformat","offset","refDate","weekDayDiff","weekStartYear","weekStartMonth","weekStartDay","weekStart","diff","SubAST","_do","leap","_isleap","microsecond","realresult","Context","vars","indents","escapes","_output","message","fileName","lineNumber","instance","Error","setPrototypeOf","getPrototypeOf","enumerable","writable","configurable","InternalException","ReturnException","BreakException","ContinueException","SyntaxError","LValueRequiredError","NotSubscriptableError","ZeroDivisionError","IndexError","LocationError","location","template","parenttemplate","first","templateprefix","_templateprefix","sourceprefix","source","sourcesuffix","text","underline","col","AST","_col","_ul4onattrs","undefined","_eval","_decorate_exception","_eval_set","_eval_modify","decoder","_source","of","outerstartpos","innerstartpos","fullsource","maxprefix","preprefix","outerstoppos","innerstoppos","maxsuffix","postsuffix","_calculateLineCol","TextAST","IndentAST","_text","LineEndAST","CodeAST","ConstAST","ItemArgBase","_eval_list","_eval_dict","_eval_call","SeqItemAST","_handle_eval","UnpackSeqItemAST","DictItemAST","UnpackDictItemAST","subitem","PosArgAST","KeywordArgAST","UnpackListArgAST","UnpackDictArgAST","ListAST","_handle_eval_list","ListCompAST","varname","container","condition","localcontext","inheritvars","varitems","_handle_eval_set","SetAST","SetCompAST","DictAST","_handle_eval_dict","DictCompAST","GenExprAST","VarAST","_get","_modify","functions","_ido","UnaryAST","NegAST","__neg__","BitNotAST","NotAST","IfAST","objif","objcond","objelse","condvalue","ReturnAST","PrintAST","PrintXAST","_xmlescape","BinaryAST","ItemAST","orgkey","__getitem__","__setitem__","IsAST","IsNotAST","EQAST","NEAST","LTAST","LEAST","GTAST","GEAST","ContainsAST","__contains__","NotContainsAST","AddAST","__add__","__radd__","__sub__","__rsub__","_date_sub","_datetime_sub","swap","t","year1","yearday1","year2","yearday2","diffdays","hours1","minutes1","seconds1","hours2","minutes2","diffseconds","diffmilliseconds","MulAST","__mul__","__rmul__","targetsize","FloorDivAST","__floordiv__","__rfloordiv__","TrueDivAST","__truediv__","__rtruediv__","ModAST","ShiftLeftAST","ShiftRightAST","BitAndAST","BitXOrAST","BitOrAST","AndAST","OrAST","AttrAST","__setattr__","oldvalue","CallAST","_handle_eval_call","_makeargs","RenderAST","_reprname","tag","withindent","_handle_additional_arguments","RenderXAST","RenderBlockAST","closure","content","RenderBlocksAST","BlockAST","SliceAST","index1","index2","SetVarAST","ModifyVarAST","_handle_eval_modify","_operator","AddVarAST","SubVarAST","MulVarAST","TrueDivVarAST","FloorDivVarAST","ModVarAST","ShiftLeftVarAST","ShiftRightVarAST","BitAndVarAST","BitXOrVarAST","BitOrVarAST","ForBlockAST","_str_varname","WhileBlockAST","cond","BreakAST","ContinueAST","CondBlockAST","block","_execute","ConditionalBlockAST","_strname","IfBlockAST","ElIfBlockAST","ElseBlockAST","whitespace","startdelim","enddelim","docpos","_asts","doc","render","_renderbound","renders","_rendersbound","SignatureAST","clone","replaceoutput","getoutput","_callbound","params","param","endtag","_rgb","_csv","_chr","_ord","_hex","number","_oct","_bin","_min","_max","_sum","_first","_last","_sorted","reverse","cmp","sort","keyvalue","s1","s2","_range","step","higher","abs","_slice","_urlquote","encodeURIComponent","_urlunquote","decodeURIComponent","_reversed","_random","random","_randrange","n","width","_randchoice","iscolor","_round","x","digits","threshold","pow","_md5","require","md5","_enumerate","_isfirst","isfirst","_islast","lastitem","_isfirstlast","_enumfl","_zip","iterables","iters","_abs","__abs__","_datetime","_timedelta","_monthdelta","_hls","h","l","s","m1","m2","_v","hue","_hsv","p","q","defaultvalue","now","utcnow","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","today","repr","int","float","bool","format","any","all","zip","isundefined","isdefined","isnone","isbool","isint","isfloat","isstr","isdate","isdatetime","istimedelta","ismonthdelta","istemplate","isfunction","islist","isset","isdict","isexception","asjson","fromjson","asul4on","fromul4on","enumerate","islast","isfirstlast","enumfl","date","datetime","timedelta","monthdelta","rgb","hls","hsv","xmlescape","csv","chr","ord","hex","oct","bin","min","max","sum","last","sorted","range","urlquote","urlunquote","reversed","randrange","randchoice","lastIndex","jan1weekday","others","lum","hlsa","hsva","witha","withlum","abslum","rellum","rc","gc","bc","maxc","minc","_js_Date","total_microseconds","total_seconds","minutes","hours","millisecond","_adddate","_adddatetime","myValue","otherValue","hasSeconds","hasMicroseconds","targetmonth","classes","la","Base","_dumpUL4ONAttr","loadcontent","iteritem","_loadUL4ONAttr","_setDefaultUL4ONAttr","_ul4attrs","realvalue","bind","Handler","record","Globals","platform","user","maxdbactions","maxtemplateruntime","flashmessages","handler","geo1","geo2","sqsin","sin","sqcos","cos","deg2rad","PI","flat","lat1","lat","long1","long","lat2","F","G","S","C","w","atan","sqrt","D","T","H2","FlashMessage","title","App","id","globals","save","Login","_insert","Record","entries","fields","startsWith","controls","View","DataSourceData","identifier","app","createdat","createdby","updatedat","updatedby","updatecount","_sparsevalues","_values","_fields","children","attachments","errors","_is_deleted","field","control","priority","is_dirty","has_errors","delete","search","fieldsearch","fieldvalue","Field","Control","subtype","BoolControl","_logsearch","IntControl","NumberControl","minvalue","maxvalue","StringControl","TextControl","EmailControl","URLControl","TelControl","PasswordControl","TextAreaControl","DateControl","language","searchvalue","formatstring","DatetimeMinuteControl","DatetimeSecondControl","LookupControl","LookupSelectControl","LookupRadioControl","LookupChoiceControl","AppLookupControl","AppLookupSelectControl","AppLookupRadioControl","AppLookupChoiceControl","MultipleLookupControl","MultipleLookupSelectControl","MultipleLookupCheckboxControl","MultipleLookupChoiceControl","MultipleAppLookupControl","MultipleAppLookupSelectControl","MultipleAppLookupCheckboxControl","MultipleAppLookupChoiceControl","GeoControl","Geo","info","FileControl","ButtonControl","_value","_dirty","LookupItem","label","User","firstname","surname","email","File","url","filename","Attachment","NoteAttachment","URLAttachment","FileAttachment","ImageAttachment","JSONAttachment","Installation","Category","category","parent","KeyView","AppParameter","username","loginRequired","_userName","ecdhCurve","commonjs","ident","httpsAgent"],"mappings":"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"} \ No newline at end of file